From 499e068e4f90756bcc833d504c6e063b12683ee3 Mon Sep 17 00:00:00 2001 From: Hoang Huu Date: Tue, 10 Sep 2019 11:27:33 +0700 Subject: [PATCH] Origin commit --- .DS_Store | Bin 0 -> 10244 bytes .../_clearfix.scssc | Bin 0 -> 4038 bytes .../_grid-framework.scssc | Bin 0 -> 29049 bytes .../_grid.scssc | Bin 0 -> 30230 bytes .../_opacity.scssc | Bin 0 -> 2900 bytes .../_size.scssc | Bin 0 -> 2480 bytes .../_vendor-prefixes.scssc | Bin 0 -> 53003 bytes .../_collapsible_ui.scssc | Bin 0 -> 13015 bytes .../_context_metaboxes.scssc | Bin 0 -> 17041 bytes .../_display.scssc | Bin 0 -> 7026 bytes .../_front.scssc | Bin 0 -> 11754 bytes .../_jquery_ui.scssc | Bin 0 -> 90435 bytes .../_main_wrap.scssc | Bin 0 -> 136408 bytes .../_misc.scssc | Bin 0 -> 5715 bytes .../_mixins.scssc | Bin 0 -> 10017 bytes .../_new_term.scssc | Bin 0 -> 5735 bytes .../_options-page.scssc | Bin 0 -> 14857 bytes .../_post_metaboxes.scssc | Bin 0 -> 15530 bytes .../_sidebar_placements.scssc | Bin 0 -> 722 bytes .../_variables.scssc | Bin 0 -> 5891 bytes .../_3rd.scssc | Bin 0 -> 152139 bytes .../_agency-loop.scssc | Bin 0 -> 34156 bytes .../_archive.scssc | Bin 0 -> 19674 bytes .../_dashboard.scssc | Bin 0 -> 50493 bytes .../_elements.scssc | Bin 0 -> 212847 bytes .../_form.scssc | Bin 0 -> 107408 bytes .../_layout.scssc | Bin 0 -> 864 bytes .../_modules.scssc | Bin 0 -> 15443 bytes .../_page.scssc | Bin 0 -> 21778 bytes .../_properties-loop.scssc | Bin 0 -> 156107 bytes .../_shortcodes.scssc | Bin 0 -> 37216 bytes .../_single.scssc | Bin 0 -> 224434 bytes .../_styles.scssc | Bin 0 -> 4085 bytes .../_vars.scssc | Bin 0 -> 6247 bytes .../_functions.scssc | Bin 0 -> 184195 bytes .../_rtl.scssc | Bin 0 -> 73696 bytes .../_template-mixins.scssc | Bin 0 -> 63632 bytes .../cmb2-display.scssc | Bin 0 -> 896 bytes .../cmb2-front.scssc | Bin 0 -> 14404 bytes .../cmb2.scssc | Bin 0 -> 2176 bytes .../_grid.scssc | Bin 0 -> 5421 bytes .../_mixins.scssc | Bin 0 -> 1630 bytes .../_variables.scssc | Bin 0 -> 160276 bytes .../admin.scssc | Bin 0 -> 45306 bytes .../cmb2-front.scssc | Bin 0 -> 1252 bytes .../opalestate.scssc | Bin 0 -> 5683 bytes .../submission.scssc | Bin 0 -> 69008 bytes .../_mixins.scssc | Bin 0 -> 1328 bytes .../_variables.scssc | Bin 0 -> 6013 bytes assets/.DS_Store | Bin 0 -> 8196 bytes assets/3rd/datepicker.css | 356 + assets/3rd/fontawesome/css/all.min.css | 5 + .../fontawesome/webfonts/fa-brands-400.eot | Bin 0 -> 129352 bytes .../fontawesome/webfonts/fa-brands-400.svg | 3442 +++++++ .../fontawesome/webfonts/fa-brands-400.ttf | Bin 0 -> 129048 bytes .../fontawesome/webfonts/fa-brands-400.woff | Bin 0 -> 87352 bytes .../fontawesome/webfonts/fa-brands-400.woff2 | Bin 0 -> 74508 bytes .../fontawesome/webfonts/fa-regular-400.eot | Bin 0 -> 34388 bytes .../fontawesome/webfonts/fa-regular-400.svg | 803 ++ .../fontawesome/webfonts/fa-regular-400.ttf | Bin 0 -> 34092 bytes .../fontawesome/webfonts/fa-regular-400.woff | Bin 0 -> 16804 bytes .../fontawesome/webfonts/fa-regular-400.woff2 | Bin 0 -> 13580 bytes .../3rd/fontawesome/webfonts/fa-solid-900.eot | Bin 0 -> 192116 bytes .../3rd/fontawesome/webfonts/fa-solid-900.svg | 4649 ++++++++++ .../3rd/fontawesome/webfonts/fa-solid-900.ttf | Bin 0 -> 191832 bytes .../fontawesome/webfonts/fa-solid-900.woff | Bin 0 -> 98020 bytes .../fontawesome/webfonts/fa-solid-900.woff2 | Bin 0 -> 75440 bytes assets/3rd/index.html | 0 .../jquery.magnific-popup.min.js | 4 + assets/3rd/select2/css/select2.css | 484 + assets/3rd/select2/css/select2.min.css | 1 + assets/3rd/select2/js/i18n/af.js | 3 + assets/3rd/select2/js/i18n/ar.js | 3 + assets/3rd/select2/js/i18n/az.js | 3 + assets/3rd/select2/js/i18n/bg.js | 3 + assets/3rd/select2/js/i18n/bn.js | 3 + assets/3rd/select2/js/i18n/bs.js | 3 + assets/3rd/select2/js/i18n/ca.js | 3 + assets/3rd/select2/js/i18n/cs.js | 3 + assets/3rd/select2/js/i18n/da.js | 3 + assets/3rd/select2/js/i18n/de.js | 3 + assets/3rd/select2/js/i18n/dsb.js | 3 + assets/3rd/select2/js/i18n/el.js | 3 + assets/3rd/select2/js/i18n/en.js | 3 + assets/3rd/select2/js/i18n/es.js | 3 + assets/3rd/select2/js/i18n/et.js | 3 + assets/3rd/select2/js/i18n/eu.js | 3 + assets/3rd/select2/js/i18n/fa.js | 3 + assets/3rd/select2/js/i18n/fi.js | 3 + assets/3rd/select2/js/i18n/fr.js | 3 + assets/3rd/select2/js/i18n/gl.js | 3 + assets/3rd/select2/js/i18n/he.js | 3 + assets/3rd/select2/js/i18n/hi.js | 3 + assets/3rd/select2/js/i18n/hr.js | 3 + assets/3rd/select2/js/i18n/hsb.js | 3 + assets/3rd/select2/js/i18n/hu.js | 3 + assets/3rd/select2/js/i18n/hy.js | 3 + assets/3rd/select2/js/i18n/id.js | 3 + assets/3rd/select2/js/i18n/is.js | 3 + assets/3rd/select2/js/i18n/it.js | 3 + assets/3rd/select2/js/i18n/ja.js | 3 + assets/3rd/select2/js/i18n/ka.js | 3 + assets/3rd/select2/js/i18n/km.js | 3 + assets/3rd/select2/js/i18n/ko.js | 3 + assets/3rd/select2/js/i18n/lt.js | 3 + assets/3rd/select2/js/i18n/lv.js | 3 + assets/3rd/select2/js/i18n/mk.js | 3 + assets/3rd/select2/js/i18n/ms.js | 3 + assets/3rd/select2/js/i18n/nb.js | 3 + assets/3rd/select2/js/i18n/ne.js | 3 + assets/3rd/select2/js/i18n/nl.js | 3 + assets/3rd/select2/js/i18n/pl.js | 3 + assets/3rd/select2/js/i18n/ps.js | 3 + assets/3rd/select2/js/i18n/pt-BR.js | 3 + assets/3rd/select2/js/i18n/pt.js | 3 + assets/3rd/select2/js/i18n/ro.js | 3 + assets/3rd/select2/js/i18n/ru.js | 3 + assets/3rd/select2/js/i18n/sk.js | 3 + assets/3rd/select2/js/i18n/sl.js | 3 + assets/3rd/select2/js/i18n/sq.js | 3 + assets/3rd/select2/js/i18n/sr-Cyrl.js | 3 + assets/3rd/select2/js/i18n/sr.js | 3 + assets/3rd/select2/js/i18n/sv.js | 3 + assets/3rd/select2/js/i18n/th.js | 3 + assets/3rd/select2/js/i18n/tk.js | 3 + assets/3rd/select2/js/i18n/tr.js | 3 + assets/3rd/select2/js/i18n/uk.js | 3 + assets/3rd/select2/js/i18n/vi.js | 3 + assets/3rd/select2/js/i18n/zh-CN.js | 3 + assets/3rd/select2/js/i18n/zh-TW.js | 3 + assets/3rd/select2/js/select2.full.js | 6597 +++++++++++++ assets/3rd/select2/js/select2.full.min.js | 2 + assets/3rd/select2/js/select2.js | 5885 ++++++++++++ assets/3rd/select2/js/select2.min.js | 2 + assets/3rd/sticky/jquery.sticky-kit.min.js | 9 + assets/3rd/swiper/css/swiper.css | 618 ++ assets/3rd/swiper/css/swiper.min.css | 12 + assets/3rd/swiper/js/swiper.esm.bundle.js | 7151 +++++++++++++++ assets/3rd/swiper/js/swiper.esm.js | 7133 +++++++++++++++ assets/3rd/swiper/js/swiper.js | 8124 +++++++++++++++++ assets/3rd/swiper/js/swiper.min.js | 13 + assets/3rd/swiper/js/swiper.min.js.map | 1 + assets/3rd/toast/jquery.toast.js | 359 + .../css/tooltipster.bundle.min.css | 1 + .../tooltipster/js/tooltipster.bundle.min.js | 2 + assets/admin.css | 209 + assets/cluster-icon.png | Bin 0 -> 4175 bytes assets/cmb2-front.css | 1303 +++ assets/cmb2/cmb2-display.css | 31 + assets/cmb2/cmb2-front.css | 1303 +++ assets/cmb2/cmb2.css | 1277 +++ assets/font-awesome.min.css | 4 + assets/hint.min.css | 5 + assets/images/1.png | Bin 0 -> 2669 bytes assets/images/10.png | Bin 0 -> 1581 bytes assets/images/11.png | Bin 0 -> 1431 bytes assets/images/12.png | Bin 0 -> 1559 bytes assets/images/13.png | Bin 0 -> 3392 bytes assets/images/14.png | Bin 0 -> 1814 bytes assets/images/15.png | Bin 0 -> 2688 bytes assets/images/16.png | Bin 0 -> 2708 bytes assets/images/17.png | Bin 0 -> 2653 bytes assets/images/18.png | Bin 0 -> 1867 bytes assets/images/19.png | Bin 0 -> 1780 bytes assets/images/2.png | Bin 0 -> 2796 bytes assets/images/3.png | Bin 0 -> 3953 bytes assets/images/4.png | Bin 0 -> 3549 bytes assets/images/5.png | Bin 0 -> 4317 bytes assets/images/6.png | Bin 0 -> 3362 bytes assets/images/7.png | Bin 0 -> 2555 bytes assets/images/8.png | Bin 0 -> 1981 bytes assets/images/9.png | Bin 0 -> 2649 bytes assets/images/avatar-placeholder.jpg | Bin 0 -> 2637 bytes assets/images/placeholder.png | Bin 0 -> 3333 bytes assets/images/spinner.gif | Bin 0 -> 3656 bytes assets/images/walk-score.png | Bin 0 -> 2179 bytes assets/js/admin.js | 157 + assets/js/chart.min.js | 7 + assets/js/country-select.js | 113 + assets/js/frontend/dashboard.js | 186 + assets/js/frontend/elementor.js | 86 + assets/js/frontend/googlemaps.js | 621 ++ assets/js/frontend/property.js | 263 + assets/js/frontend/submission.js | 245 + assets/js/frontend/uploader.js | 193 + assets/js/infobox.js | 772 ++ assets/js/jquery.fitvids.js | 83 + assets/js/markerclusterer.js | 1642 ++++ assets/js/mortgage.js | 51 + assets/js/nouislider.min.js | 340 + assets/js/opalestate.js | 573 ++ assets/map/apartment-icon.png | Bin 0 -> 1398 bytes assets/map/close.png | Bin 0 -> 1355 bytes assets/map/cluster-icon.png | Bin 0 -> 1230 bytes assets/map/hospital.png | Bin 0 -> 1269 bytes assets/map/libraries.png | Bin 0 -> 1119 bytes assets/map/market_icon.png | Bin 0 -> 4399 bytes assets/map/pharmacy.png | Bin 0 -> 1134 bytes assets/map/school.png | Bin 0 -> 1182 bytes assets/map/supermarket.png | Bin 0 -> 1252 bytes assets/map/transportation.png | Bin 0 -> 1226 bytes assets/mortgage.css | 105 + assets/opalestate.css | 4598 ++++++++++ assets/scss/admin.scss | 200 + assets/scss/bootstrap/_grid.scss | 31 + assets/scss/bootstrap/_mixins.scss | 7 + assets/scss/bootstrap/_unlities.scss | 55 + assets/scss/bootstrap/_variables.scss | 887 ++ assets/scss/bootstrap/mixins/_clearfix.scss | 22 + .../bootstrap/mixins/_grid-framework.scss | 79 + assets/scss/bootstrap/mixins/_grid.scss | 122 + assets/scss/bootstrap/mixins/_opacity.scss | 8 + assets/scss/bootstrap/mixins/_resize.scss | 6 + assets/scss/bootstrap/mixins/_size.scss | 10 + .../bootstrap/mixins/_vendor-prefixes.scss | 222 + assets/scss/cmb2-front.scss | 6 + assets/scss/cmb2/cmb2-display.scss | 1 + assets/scss/cmb2/cmb2-front.scss | 77 + assets/scss/cmb2/cmb2.scss | 12 + assets/scss/cmb2/index.html | 1 + assets/scss/cmb2/index.php | 2 + .../scss/cmb2/partials/_collapsible_ui.scss | 56 + .../cmb2/partials/_context_metaboxes.scss | 107 + assets/scss/cmb2/partials/_display.scss | 34 + assets/scss/cmb2/partials/_front.scss | 56 + assets/scss/cmb2/partials/_jquery_ui.scss | 457 + assets/scss/cmb2/partials/_main_wrap.scss | 678 ++ assets/scss/cmb2/partials/_misc.scss | 29 + assets/scss/cmb2/partials/_mixins.scss | 51 + assets/scss/cmb2/partials/_new_term.scss | 31 + assets/scss/cmb2/partials/_options-page.scss | 71 + .../scss/cmb2/partials/_post_metaboxes.scss | 84 + .../cmb2/partials/_sidebar_placements.scss | 0 assets/scss/cmb2/partials/_variables.scss | 25 + assets/scss/cmb2/partials/index.php | 2 + assets/scss/components/_grid.scss | 0 assets/scss/components/_mixins.scss | 6 + assets/scss/components/_variables.scss | 32 + assets/scss/components/mixins/_functions.scss | 699 ++ assets/scss/components/mixins/_rtl.scss | 259 + .../components/mixins/_template-mixins.scss | 278 + assets/scss/components/vars/_elements.scss | 244 + assets/scss/components/vars/_form.scss | 114 + assets/scss/components/vars/_layout.scss | 91 + assets/scss/components/vars/_nav.scss | 95 + assets/scss/components/vars/_widget.scss | 88 + assets/scss/opalestate.scss | 41 + assets/scss/opalestate/_3rd.scss | 497 + assets/scss/opalestate/_agency-loop.scss | 150 + assets/scss/opalestate/_archive.scss | 88 + assets/scss/opalestate/_dashboard.scss | 253 + assets/scss/opalestate/_elements.scss | 975 ++ assets/scss/opalestate/_form.scss | 481 + assets/scss/opalestate/_layout.scss | 1 + assets/scss/opalestate/_modules.scss | 70 + assets/scss/opalestate/_page.scss | 100 + assets/scss/opalestate/_properties-loop.scss | 696 ++ assets/scss/opalestate/_shortcodes.scss | 164 + assets/scss/opalestate/_single.scss | 1065 +++ assets/scss/opalestate/_styles.scss | 14 + assets/scss/opalestate/_vars.scss | 23 + assets/scss/submission.scss | 302 + assets/submission.css | 431 + changelog.txt | 2 + config.rb | 25 + inc/.DS_Store | Bin 0 -> 10244 bytes inc/admin/agency/class-agency.php | 156 + inc/admin/agent/class-agent.php | 123 + inc/admin/class-admin.php | 101 + inc/admin/class-api-keys-table.php | 327 + inc/admin/class-user.php | 187 + inc/admin/cron-jobs-functions.php | 0 inc/admin/functions.php | 599 ++ inc/admin/property/class-property.php | 163 + inc/admin/rating/class-rating.php | 101 + inc/admin/register-settings.php | 306 + inc/admin/settings/3rd_party.php | 137 + inc/admin/settings/api_keys.php | 46 + inc/admin/settings/base.php | 47 + inc/admin/settings/email.php | 38 + inc/admin/settings/general.php | 257 + inc/admin/settings/property.php | 446 + inc/admin/views/addons/list.php | 348 + inc/agency/class-opalestate-agency-front.php | 482 + .../class-opalestate-agency-metabox.php | 389 + .../class-opalestate-agency-posttype.php | 103 + inc/agency/class-opalestate-agency-query.php | 20 + inc/agency/class-opalestate-agency.php | 306 + inc/agency/functions.php | 0 inc/agent/class-opalestate-agent-front.php | 508 ++ inc/agent/class-opalestate-agent-metabox.php | 225 + inc/agent/class-opalestate-agent-posttype.php | 103 + inc/agent/class-opalestate-agent-query.php | 20 + inc/agent/class-opalestate-agent.php | 277 + inc/agent/functions.php | 0 inc/ajax-functions.php | 301 + inc/api/class-opalestate-api.php | 1367 +++ inc/class-no-captcha-recaptcha.php | 160 + inc/class-opalestate-email.php | 458 + inc/class-opalestate-enqueue.php | 216 + inc/class-opalestate-html.php | 395 + inc/class-opalestate-install.php | 252 + inc/class-opalestate-roles.php | 273 + inc/class-template-loader.php | 142 + inc/classes/class-opalestate-abs-query.php | 141 + inc/classes/class-opalestate-cache.php | 686 ++ inc/classes/class-opalestate-geolocation.php | 111 + inc/classes/class-opalestate-metabox-user.php | 290 + inc/classes/class-opalestate-multilingual.php | 157 + inc/classes/class-opalestate-session.php | 299 + inc/classes/class-opalestate-walkscore.php | 185 + inc/classes/class-opalestate-yelp.php | 250 + inc/cli/export.php | 646 ++ inc/email/class-opalesate-approve.php | 110 + .../class-opalestate-abs-email-template.php | 125 + .../class-opalestate-email-notifycation.php | 74 + inc/email/class-opalestate-new-submitted.php | 110 + .../class-opalestate-request-viewing.php | 70 + inc/function-search-fields.php | 129 + inc/libraries/array2xml.php | 149 + inc/libraries/wp-session.php | 178 + inc/libraries/wp_session/class-wp-session.php | 341 + inc/libraries/wp_session/wp-session.php | 118 + inc/message/class-opalestate-message.php | 757 ++ .../class-opalestate-request-reviewing.php | 141 + inc/message/functions.php | 46 + inc/mixes-functions.php | 1134 +++ inc/property/class-metabox-property-admin.php | 690 ++ inc/property/class-opalestate-favorite.php | 150 + inc/property/class-opalestate-posttype.php | 79 + .../class-opalestate-property-query.php | 71 + inc/property/class-opalestate-property.php | 727 ++ inc/property/class-opalestate-query.php | 402 + inc/property/class-opalestate-search.php | 484 + inc/property/class-opalestate-shortcodes.php | 125 + inc/property/class-opalestate-view-stats.php | 155 + inc/property/functions.php | 0 inc/query-functions.php | 84 + ...ss-opalestate-rating-features-posttype.php | 87 + inc/rating/class-opalestate-rating-helper.php | 169 + inc/rating/class-opalestate-rating-init.php | 245 + .../class-opalestate-rating-metabox.php | 175 + inc/rating/class-opalestate-rating.php | 102 + inc/rating/rating-functions.php | 107 + inc/rating/rating-hook-functions.php | 13 + .../class-metabox-property-submission.php | 679 ++ .../class-opalestate-submission.php | 701 ++ inc/submission/function.php | 3 + inc/taxonomies/class-taxomony-amenities.php | 93 + inc/taxonomies/class-taxonomy-categories.php | 116 + inc/taxonomies/class-taxonomy-city.php | 152 + inc/taxonomies/class-taxonomy-labels.php | 150 + inc/taxonomies/class-taxonomy-locations.php | 152 + .../class-taxonomy-neighborhood.php | 114 + inc/taxonomies/class-taxonomy-state.php | 145 + inc/taxonomies/class-taxonomy-status.php | 159 + inc/taxonomies/class-taxonomy-types.php | 136 + inc/template-functions.php | 1050 +++ inc/template-hook-functions.php | 310 + .../class-opalestate-user-form-handler.php | 327 + inc/user/class-opalestate-user-search.php | 222 + inc/user/class-opalestate-user.php | 717 ++ inc/user/class-user-statistics.php | 29 + inc/user/functions.php | 261 + inc/vendors/.DS_Store | Bin 0 -> 8196 bytes inc/vendors/cmb2-plugins/.DS_Store | Bin 0 -> 10244 bytes .../cmb2-plugins/CMB2-Switch-Button/README.md | 52 + .../CMB2-Switch-Button/cmb2-switch-button.php | 105 + .../CMB2-Switch-Button/example_screenshot.gif | Bin 0 -> 509648 bytes .../assets/css/bootstrap-popovers.css | 2 + .../assets/css/cmb2-fixes.css | 3 + .../assets/css/font-awesome.min.css | 4 + .../assets/css/fontawesome-iconpicker.min.css | 9 + .../assets/js/fontawesome-iconpicker.min.js | 1 + .../assets/js/fontawesome-picker-init.js | 7 + .../cmb2-fontawesome-picker.php | 73 + .../resources/bootstrap-popovers.scss | 18 + .../cmb2-tabs/assets/css/cmb2-tabs.css | 207 + .../cmb2-tabs/assets/js/cmb2-tabs.js | 10 + .../cmb2-plugins/cmb2-tabs/autoloader.php | 11 + .../cmb2-tabs/inc/assets.class.php | 21 + .../cmb2-tabs/inc/cmb2-tabs.class.php | 141 + inc/vendors/cmb2-plugins/cmb2-tabs/plugin.php | 22 + inc/vendors/cmb2-plugins/cmb2/bootstrap.php | 84 + .../cmb2/css/cmb2-display-rtl.css | 45 + .../cmb2/css/cmb2-display-rtl.min.css | 2 + .../cmb2-plugins/cmb2/css/cmb2-display.css | 45 + .../cmb2/css/cmb2-display.css.map | 7 + .../cmb2/css/cmb2-display.min.css | 2 + .../cmb2-plugins/cmb2/css/cmb2-front-rtl.css | 1331 +++ .../cmb2/css/cmb2-front-rtl.min.css | 2 + .../cmb2-plugins/cmb2/css/cmb2-front.css | 1331 +++ .../cmb2-plugins/cmb2/css/cmb2-front.min.css | 2 + .../cmb2-plugins/cmb2/css/cmb2-rtl.css | 2098 +++++ .../cmb2-plugins/cmb2/css/cmb2-rtl.min.css | 2 + inc/vendors/cmb2-plugins/cmb2/css/cmb2.css | 2098 +++++ .../cmb2-plugins/cmb2/css/cmb2.min.css | 2 + inc/vendors/cmb2-plugins/cmb2/css/index.php | 2 + .../cmb2/custom-fields/map/.DS_Store | Bin 0 -> 8196 bytes .../cmb2/custom-fields/map/composer.json | 13 + .../cmb2/custom-fields/map/css/style.css | 17 + .../cmb2/custom-fields/map/js/script.js | 109 + .../cmb2/custom-fields/map/map.php | 116 + .../cmb2/custom-fields/map/readme.md | 39 + .../cmb2/custom-fields/map/screenshot-1.png | Bin 0 -> 89047 bytes .../cmb2/custom-fields/user/assets/script.js | 49 + .../cmb2/custom-fields/user/assets/style.css | 29 + .../cmb2/custom-fields/user/user.php | 100 + .../cmb2-plugins/cmb2/images/ico-delete.png | Bin 0 -> 715 bytes .../cmb2-plugins/cmb2/images/index.php | 2 + .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../cmb2/images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../cmb2/images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../cmb2/images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../cmb2/images/ui-icons_888888_256x240.png | Bin 0 -> 5355 bytes .../cmb2/images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../cmb2-plugins/cmb2/includes/CMB2.php | 1764 ++++ .../cmb2-plugins/cmb2/includes/CMB2_Ajax.php | 323 + .../cmb2-plugins/cmb2/includes/CMB2_Base.php | 533 ++ .../cmb2-plugins/cmb2/includes/CMB2_Boxes.php | 139 + .../cmb2-plugins/cmb2/includes/CMB2_Field.php | 1618 ++++ .../cmb2/includes/CMB2_Field_Display.php | 484 + .../cmb2/includes/CMB2_Hookup_Base.php | 105 + .../cmb2-plugins/cmb2/includes/CMB2_JS.php | 245 + .../cmb2/includes/CMB2_Options.php | 250 + .../cmb2/includes/CMB2_Options_Hookup.php | 360 + .../cmb2/includes/CMB2_Sanitize.php | 587 ++ .../cmb2/includes/CMB2_Show_Filters.php | 179 + .../cmb2-plugins/cmb2/includes/CMB2_Types.php | 662 ++ .../cmb2-plugins/cmb2/includes/CMB2_Utils.php | 669 ++ .../cmb2/includes/CMB2_hookup.php | 933 ++ .../cmb2/includes/helper-functions.php | 426 + .../cmb2-plugins/cmb2/includes/index.php | 2 + .../cmb2/includes/rest-api/CMB2_REST.php | 794 ++ .../rest-api/CMB2_REST_Controller.php | 448 + .../rest-api/CMB2_REST_Controller_Boxes.php | 270 + .../rest-api/CMB2_REST_Controller_Fields.php | 502 + .../cmb2/includes/shim/WP_REST_Controller.php | 541 ++ .../cmb2/includes/types/CMB2_Type_Base.php | 177 + .../includes/types/CMB2_Type_Checkbox.php | 65 + .../includes/types/CMB2_Type_Colorpicker.php | 79 + .../cmb2/includes/types/CMB2_Type_File.php | 169 + .../includes/types/CMB2_Type_File_Base.php | 210 + .../includes/types/CMB2_Type_File_List.php | 86 + .../includes/types/CMB2_Type_Multi_Base.php | 110 + .../includes/types/CMB2_Type_Multicheck.php | 39 + .../cmb2/includes/types/CMB2_Type_Oembed.php | 41 + .../includes/types/CMB2_Type_Picker_Base.php | 56 + .../cmb2/includes/types/CMB2_Type_Radio.php | 52 + .../cmb2/includes/types/CMB2_Type_Select.php | 30 + .../types/CMB2_Type_Select_Timezone.php | 29 + .../types/CMB2_Type_Taxonomy_Base.php | 173 + .../types/CMB2_Type_Taxonomy_Multicheck.php | 76 + ..._Type_Taxonomy_Multicheck_Hierarchical.php | 42 + .../types/CMB2_Type_Taxonomy_Radio.php | 92 + .../CMB2_Type_Taxonomy_Radio_Hierarchical.php | 41 + .../types/CMB2_Type_Taxonomy_Select.php | 79 + .../cmb2/includes/types/CMB2_Type_Text.php | 58 + .../includes/types/CMB2_Type_Text_Date.php | 30 + .../CMB2_Type_Text_Datetime_Timestamp.php | 73 + ..._Type_Text_Datetime_Timestamp_Timezone.php | 61 + .../includes/types/CMB2_Type_Text_Time.php | 25 + .../includes/types/CMB2_Type_Textarea.php | 38 + .../types/CMB2_Type_Textarea_Code.php | 39 + .../cmb2/includes/types/CMB2_Type_Title.php | 47 + .../cmb2/includes/types/CMB2_Type_Wysiwyg.php | 93 + inc/vendors/cmb2-plugins/cmb2/index.php | 1 + inc/vendors/cmb2-plugins/cmb2/init.php | 193 + .../cmb2-plugins/cmb2/js/cmb2-wysiwyg.js | 345 + inc/vendors/cmb2-plugins/cmb2/js/cmb2.js | 1344 +++ inc/vendors/cmb2-plugins/cmb2/js/cmb2.min.js | 1 + inc/vendors/cmb2-plugins/cmb2/js/index.php | 2 + .../cmb2/js/jquery-ui-timepicker-addon.min.js | 5 + .../cmb2/js/wp-color-picker-alpha.js | 496 + .../cmb2/js/wp-color-picker-alpha.min.js | 11 + inc/vendors/cmb2-plugins/init.php | 40 + .../cmb2-plugins/uploader/uploader.php | 173 + .../class-opalestate-elementor-extended.php | 116 + ...class-opalestate-elementor-widget-base.php | 470 + .../widgets/opalestate-account-button.php | 568 ++ .../widgets/opalestate-agency-collection.php | 380 + .../widgets/opalestate-agent-collection.php | 380 + .../widgets/opalestate-category-list.php | 238 + .../widgets/opalestate-city-list.php | 238 + .../widgets/opalestate-form-builder.php | 141 + .../widgets/opalestate-map-top-search.php | 163 + .../opalestate-property-collection.php | 483 + .../widgets/opalestate-search-agency.php | 160 + .../widgets/opalestate-search-agents.php | 160 + .../opalestate-search-property-results.php | 466 + .../widgets/opalestate-searchbox.php | 386 + .../widgets/opalestate-split-maps-search.php | 131 + inc/vendors/index.html | 0 inc/vendors/opalmembership/free-package.php | 114 + inc/vendors/opalmembership/functions.php | 201 + inc/vendors/opalmembership/membership.php | 630 ++ .../Facebook/Authentication/AccessToken.php | 160 + .../Authentication/AccessTokenMetadata.php | 390 + .../Facebook/Authentication/OAuth2Client.php | 292 + .../FacebookAuthenticationException.php | 33 + .../FacebookAuthorizationException.php | 33 + .../Exceptions/FacebookClientException.php | 33 + .../Exceptions/FacebookOtherException.php | 33 + .../Exceptions/FacebookResponseException.php | 225 + .../FacebookResumableUploadException.php | 68 + .../Exceptions/FacebookSDKException.php | 33 + .../Exceptions/FacebookServerException.php | 33 + .../Exceptions/FacebookThrottleException.php | 33 + .../social-login/Facebook/Facebook.php | 635 ++ .../social-login/Facebook/FacebookApp.php | 110 + .../Facebook/FacebookBatchRequest.php | 322 + .../Facebook/FacebookBatchResponse.php | 174 + .../social-login/Facebook/FacebookClient.php | 250 + .../social-login/Facebook/FacebookRequest.php | 534 ++ .../Facebook/FacebookResponse.php | 410 + .../Facebook/FileUpload/FacebookFile.php | 169 + .../FileUpload/FacebookResumableUploader.php | 177 + .../FileUpload/FacebookTransferChunk.php | 141 + .../Facebook/FileUpload/FacebookVideo.php | 33 + .../Facebook/FileUpload/Mimetypes.php | 988 ++ .../Facebook/GraphNodes/Birthday.php | 85 + .../Facebook/GraphNodes/Collection.php | 242 + .../Facebook/GraphNodes/GraphAchievement.php | 112 + .../Facebook/GraphNodes/GraphAlbum.php | 183 + .../Facebook/GraphNodes/GraphApplication.php | 43 + .../Facebook/GraphNodes/GraphCoverPhoto.php | 72 + .../Facebook/GraphNodes/GraphEdge.php | 252 + .../Facebook/GraphNodes/GraphEvent.php | 242 + .../Facebook/GraphNodes/GraphGroup.php | 170 + .../Facebook/GraphNodes/GraphList.php | 36 + .../Facebook/GraphNodes/GraphLocation.php | 102 + .../Facebook/GraphNodes/GraphNode.php | 198 + .../Facebook/GraphNodes/GraphNodeFactory.php | 394 + .../Facebook/GraphNodes/GraphObject.php | 36 + .../GraphNodes/GraphObjectFactory.php | 88 + .../Facebook/GraphNodes/GraphPage.php | 157 + .../Facebook/GraphNodes/GraphPicture.php | 72 + .../Facebook/GraphNodes/GraphSessionInfo.php | 102 + .../Facebook/GraphNodes/GraphUser.php | 172 + .../Facebook/Helpers/FacebookCanvasHelper.php | 52 + .../Helpers/FacebookJavaScriptHelper.php | 42 + .../Helpers/FacebookPageTabHelper.php | 95 + .../Helpers/FacebookRedirectLoginHelper.php | 333 + .../FacebookSignedRequestFromInputHelper.php | 166 + .../Facebook/Http/GraphRawResponse.php | 138 + .../Facebook/Http/RequestBodyInterface.php | 39 + .../Facebook/Http/RequestBodyMultipart.php | 170 + .../Facebook/Http/RequestBodyUrlEncoded.php | 55 + .../Facebook/HttpClients/FacebookCurl.php | 129 + .../HttpClients/FacebookCurlHttpClient.php | 163 + .../HttpClients/FacebookGuzzleHttpClient.php | 97 + .../FacebookHttpClientInterface.php | 47 + .../Facebook/HttpClients/FacebookStream.php | 81 + .../HttpClients/FacebookStreamHttpClient.php | 94 + .../HttpClients/HttpClientsFactory.php | 99 + .../certs/DigiCertHighAssuranceEVRootCA.pem | 23 + .../FacebookMemoryPersistentDataHandler.php | 53 + .../FacebookSessionPersistentDataHandler.php | 76 + .../PersistentData/PersistentDataFactory.php | 65 + .../PersistentDataInterface.php | 49 + .../McryptPseudoRandomStringGenerator.php | 68 + .../OpenSslPseudoRandomStringGenerator.php | 67 + .../PseudoRandomStringGeneratorFactory.php | 101 + .../PseudoRandomStringGeneratorInterface.php | 45 + .../PseudoRandomStringGeneratorTrait.php | 58 + ...RandomBytesPseudoRandomStringGenerator.php | 59 + .../UrandomPseudoRandomStringGenerator.php | 89 + .../social-login/Facebook/SignedRequest.php | 326 + .../Url/FacebookUrlDetectionHandler.php | 182 + .../Facebook/Url/FacebookUrlManipulator.php | 167 + .../Facebook/Url/UrlDetectionInterface.php | 39 + .../social-login/Facebook/autoload.php | 81 + .../social-login/Facebook/polyfills.php | 49 + inc/vendors/social-login/Google/apiClient.php | 366 + .../social-login/Google/auth/apiAuth.php | 33 + .../social-login/Google/auth/apiAuthNone.php | 45 + .../Google/auth/apiLoginTicket.php | 55 + .../social-login/Google/auth/apiOAuth.php | 236 + .../social-login/Google/auth/apiOAuth2.php | 385 + .../social-login/Google/auth/apiP12Signer.php | 62 + .../Google/auth/apiPemVerifier.php | 55 + .../social-login/Google/auth/apiSigner.php | 26 + .../social-login/Google/auth/apiVerifier.php | 27 + .../social-login/Google/cache/apiApcCache.php | 93 + .../social-login/Google/cache/apiCache.php | 48 + .../Google/cache/apiFileCache.php | 135 + .../Google/cache/apiMemcacheCache.php | 122 + inc/vendors/social-login/Google/config.php | 89 + .../Google/contrib/apiAdsenseService.php | 1135 +++ .../Google/contrib/apiAnalyticsService.php | 1553 ++++ .../Google/contrib/apiBigqueryService.php | 1702 ++++ .../Google/contrib/apiBloggerService.php | 1074 +++ .../Google/contrib/apiBooksService.php | 1820 ++++ .../Google/contrib/apiCalendarService.php | 1812 ++++ .../Google/contrib/apiCustomsearchService.php | 479 + .../Google/contrib/apiFreebaseService.php | 153 + .../Google/contrib/apiGanService.php | 1510 +++ .../Google/contrib/apiLatitudeService.php | 270 + .../Google/contrib/apiModeratorService.php | 1850 ++++ .../Google/contrib/apiOauth2Service.php | 296 + .../Google/contrib/apiOrkutService.php | 2474 +++++ .../contrib/apiPagespeedonlineService.php | 473 + .../Google/contrib/apiPlusService.php | 1505 +++ .../Google/contrib/apiPredictionService.php | 418 + .../Google/contrib/apiShoppingService.php | 1249 +++ .../contrib/apiSiteVerificationService.php | 277 + .../Google/contrib/apiTasksService.php | 546 ++ .../Google/contrib/apiTranslateService.php | 242 + .../Google/contrib/apiUrlshortenerService.php | 320 + .../Google/contrib/apiWebfontsService.php | 129 + .../social-login/Google/external/OAuth.php | 482 + .../Google/external/URITemplateParser.php | 209 + inc/vendors/social-login/Google/index.html | 0 .../social-login/Google/io/apiCacheParser.php | 167 + .../social-login/Google/io/apiCurlIO.php | 248 + .../social-login/Google/io/apiHttpRequest.php | 256 + inc/vendors/social-login/Google/io/apiIO.php | 39 + .../social-login/Google/io/apiREST.php | 143 + inc/vendors/social-login/Google/io/apiRPC.php | 59 + .../social-login/Google/io/cacerts.pem | 714 ++ .../social-login/Google/service/apiBatch.php | 35 + .../Google/service/apiMediaFileUpload.php | 85 + .../social-login/Google/service/apiModel.php | 109 + .../Google/service/apiService.php | 58 + .../Google/service/apiServiceRequest.php | 130 + .../Google/service/apiServiceResource.php | 202 + .../social-login/Google/service/apiUtils.php | 111 + .../class-opalestate-facebook-login.php | 315 + .../class-opalestate-google-login.php | 309 + .../class-opalestate-social-login.php | 144 + inc/widgets/featured-properties.php | 83 + inc/widgets/mortgage-calculator.php | 62 + inc/widgets/profile-info.php | 103 + inc/widgets/sameprice-properties.php | 92 + inc/widgets/search-properties.php | 153 + inc/widgets/similar-properties.php | 82 + ...opalestate-pro-backup-201909030250570.pot~ | 6515 +++++++++++++ languages/opalestate-pro.pot | 6511 +++++++++++++ license.txt | 280 + opal-estate-pro.php | 491 + project.json | 54 + readme.txt | 96 + templates/.DS_Store | Bin 0 -> 6148 bytes templates/archive-opalestate_agency.php | 82 + templates/archive-opalestate_agent.php | 70 + templates/archive-opalestate_property.php | 65 + templates/content-agency-grid.php | 69 + templates/content-agency-list.php | 65 + templates/content-agent-grid-v2.php | 33 + templates/content-agent-grid.php | 115 + templates/content-agent-list.php | 78 + templates/content-no-results.php | 8 + templates/content-property-featured-v1.php | 67 + templates/content-property-grid-v2.php | 52 + templates/content-property-grid-v3.php | 52 + templates/content-property-grid.php | 61 + templates/content-property-list-v2.php | 37 + templates/content-property-list.php | 68 + templates/content-property-mark-hover.php | 26 + templates/content-property.php | 18 + templates/content-single-agency.php | 148 + templates/content-single-agent.php | 112 + templates/content-single-property-print.php | 83 + templates/content-single-property-v2.php | 166 + templates/content-single-property-v3.php | 113 + templates/content-single-property-v4.php | 108 + templates/content-single-property-v5.php | 136 + templates/content-single-property.php | 112 + templates/content-user-grid.php | 148 + .../opalestate-agency-collection.php | 59 + .../opalestate-agent-collection.php | 62 + .../opalestate-category-list.php | 66 + .../opalestate-city-list.php | 66 + .../opalestate-form-builder.php | 30 + .../opalestate-map-top-search.php | 18 + .../opalestate-office-agent-search.php | 34 + .../opalestate-property-collection.php | 54 + .../opalestate-search-agency.php | 11 + .../opalestate-search-agents.php | 10 + .../opalestate-search-property-results.php | 14 + .../opalestate-searchbox.php | 9 + .../opalestate-split-maps-search.php | 37 + templates/emails/contact.php | 11 + templates/emails/enquiry.php | 12 + templates/emails/publish_property.php | 15 + templates/emails/request-reviewing.php | 15 + templates/fullwidth-page.php | 47 + templates/messages/contact-form.php | 44 + templates/messages/enquiry-form.php | 45 + templates/messages/request-reviewing-form.php | 14 + templates/notices/error.php | 27 + templates/notices/success.php | 24 + templates/notices/warning.php | 24 + templates/parts/archive-search-block.php | 12 + templates/parts/archive-simple-bars.php | 17 + templates/parts/collection-navigator.php | 29 + templates/parts/featured-label.php | 9 + templates/parts/has-warning.php | 5 + templates/parts/membership-pricing-info.php | 27 + templates/parts/membership-warning.php | 6 + templates/parts/modules/carousel.php | 39 + templates/parts/mortgage-calculator.php | 180 + templates/parts/not-allowed.php | 9 + templates/parts/pagination.php | 23 + templates/parts/property-categories.php | 6 + templates/parts/property-label.php | 19 + templates/parts/property-loop-price.php | 36 + templates/parts/property-loop-short-meta.php | 33 + templates/parts/property-status.php | 16 + templates/parts/property-types.php | 5 + .../parts/search-agency-form-address.php | 44 + templates/parts/search-agency-form.php | 32 + .../parts/search-agents-form-address.php | 40 + templates/parts/search-agents-form.php | 59 + templates/rating/opalestate-ratings.php | 294 + templates/rating/review-meta.php | 27 + templates/rating/review-rating.php | 46 + templates/rating/review.php | 53 + templates/search-box/advanced-v2.php | 89 + templates/search-box/advanced-v3.php | 73 + templates/search-box/advanced-v4.php | 83 + templates/search-box/advanced-v5.php | 70 + templates/search-box/advanced-v6.php | 42 + templates/search-box/collapse-city.php | 87 + templates/search-box/collapse-keyword.php | 109 + templates/search-box/fields/areasize.php | 1 + templates/search-box/fields/city-select.php | 3 + .../search-box/fields/country-select.php | 3 + templates/search-box/fields/group-info.php | 21 + templates/search-box/fields/location.php | 2 + templates/search-box/fields/more-options.php | 33 + templates/search-box/fields/price.php | 20 + templates/search-box/fields/radius.php | 15 + .../search-box/fields/search-city-text.php | 44 + templates/search-box/fields/search-text.php | 2 + templates/search-box/fields/state-select.php | 3 + templates/search-box/fields/status-bar.php | 28 + templates/search-box/fields/status.php | 4 + templates/search-box/fields/submit-button.php | 3 + templates/search-box/fields/types.php | 9 + templates/search-box/search-form-h.php | 77 + templates/search-box/search-form-v.php | 58 + templates/search-box/search-form-v2.php | 63 + templates/search-box/search-form-v3.php | 80 + templates/search-box/simple-city.php | 64 + templates/search-box/simple-keyword.php | 64 + .../shortcodes/ajax-map-quick-search.php | 53 + .../shortcodes/ajax-map-search-result.php | 75 + templates/shortcodes/ajax-map-search.php | 119 + templates/shortcodes/search-agents.php | 44 + .../shortcodes/search-map-properties.php | 8 + .../shortcodes/search-properties-result.php | 73 + templates/shortcodes/search-properties-v.php | 5 + templates/shortcodes/search-properties.php | 20 + templates/shortcodes/submission-form.php | 61 + templates/single-agency/author-box.php | 162 + templates/single-agency/gallery.php | 17 + templates/single-agency/index.html | 1 + templates/single-agency/properties.php | 39 + templates/single-agency/summary.php | 53 + templates/single-agency/tabs.php | 40 + templates/single-agency/team.php | 26 + templates/single-agent/author-box.php | 130 + templates/single-agent/box.php | 1 + .../single-agent/featured-properties.php | 33 + templates/single-agent/form.php | 25 + templates/single-agent/properties.php | 29 + templates/single-agent/summary.php | 54 + templates/single-opalestate_agency.php | 25 + templates/single-opalestate_agent.php | 32 + templates/single-opalestate_property.php | 33 + templates/single-property/amenities.php | 25 + templates/single-property/apartments.php | 55 + templates/single-property/attachments.php | 27 + templates/single-property/author-v2.php | 51 + templates/single-property/author-v3.php | 50 + templates/single-property/author.php | 60 + templates/single-property/content.php | 17 + templates/single-property/facilities.php | 26 + templates/single-property/features.php | 51 + templates/single-property/floor-plans.php | 86 + templates/single-property/information.php | 36 + templates/single-property/location.php | 19 + templates/single-property/map-v2.php | 95 + templates/single-property/map.php | 98 + templates/single-property/meta.php | 37 + templates/single-property/nearby.php | 53 + templates/single-property/preview.php | 100 + .../single-property/preview/gallery-metro.php | 87 + .../preview/gallery-slider.php | 78 + templates/single-property/preview/map.php | 56 + .../single-property/preview/mark-picture.php | 32 + templates/single-property/preview/tabs.php | 97 + .../single-property/preview/virtualtour.php | 15 + templates/single-property/price.php | 13 + templates/single-property/sameagent.php | 21 + templates/single-property/sharebox.php | 81 + templates/single-property/short-meta.php | 31 + .../user/author-member-box.php | 123 + .../user/author-user-box-list.php | 110 + .../single-property/user/author-user-box.php | 153 + templates/single-property/video.php | 19 + .../single-property/views-statistics.php | 83 + templates/single-property/virtualtour.php | 15 + templates/single-property/walkscore.php | 56 + templates/submission/completed.php | 27 + templates/submission/require-login.php | 14 + templates/submission/submission-completed.php | 14 + templates/submission/submission-form.php | 49 + templates/user-management.php | 125 + templates/user-search/content-savedsearch.php | 43 + templates/user-search/render-form.php | 41 + templates/user/agency/agency-team.php | 79 + templates/user/agency/profile-agency.php | 40 + templates/user/agent/profile-agent.php | 27 + templates/user/content-property.php | 100 + templates/user/dashboard.php | 146 + templates/user/favorite-button.php | 14 + templates/user/favorite-properties.php | 29 + templates/user/login-form.php | 63 + templates/user/messages.php | 46 + templates/user/my-account-popup.php | 30 + templates/user/my-account.php | 30 + templates/user/my-properties.php | 54 + templates/user/profile.php | 60 + templates/user/property-ratings.php | 99 + templates/user/read-messages.php | 50 + templates/user/register-form.php | 98 + templates/user/share-search-form.php | 58 + .../user/social-login/facebook-button.php | 21 + templates/user/social-login/google-button.php | 21 + templates/user/social-login/social-login.php | 22 + templates/widgets/featured-properties.php | 73 + templates/widgets/sameprice-properties.php | 126 + templates/widgets/similar-properties.php | 111 + uninstall.php | 10 + wpml-config.xml | 40 + 844 files changed, 188705 insertions(+) create mode 100755 .DS_Store create mode 100755 .sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_clearfix.scssc create mode 100755 .sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_grid-framework.scssc create mode 100755 .sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_grid.scssc create mode 100755 .sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_opacity.scssc create mode 100755 .sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_size.scssc create mode 100755 .sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_vendor-prefixes.scssc create mode 100644 .sass-cache/3576b663924608e39840956c643af6db831a264b/_collapsible_ui.scssc create mode 100644 .sass-cache/3576b663924608e39840956c643af6db831a264b/_context_metaboxes.scssc create mode 100644 .sass-cache/3576b663924608e39840956c643af6db831a264b/_display.scssc create mode 100644 .sass-cache/3576b663924608e39840956c643af6db831a264b/_front.scssc create mode 100644 .sass-cache/3576b663924608e39840956c643af6db831a264b/_jquery_ui.scssc create mode 100644 .sass-cache/3576b663924608e39840956c643af6db831a264b/_main_wrap.scssc create mode 100644 .sass-cache/3576b663924608e39840956c643af6db831a264b/_misc.scssc create mode 100644 .sass-cache/3576b663924608e39840956c643af6db831a264b/_mixins.scssc create mode 100644 .sass-cache/3576b663924608e39840956c643af6db831a264b/_new_term.scssc create mode 100644 .sass-cache/3576b663924608e39840956c643af6db831a264b/_options-page.scssc create mode 100644 .sass-cache/3576b663924608e39840956c643af6db831a264b/_post_metaboxes.scssc create mode 100644 .sass-cache/3576b663924608e39840956c643af6db831a264b/_sidebar_placements.scssc create mode 100644 .sass-cache/3576b663924608e39840956c643af6db831a264b/_variables.scssc create mode 100755 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_3rd.scssc create mode 100755 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_agency-loop.scssc create mode 100755 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_archive.scssc create mode 100755 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_dashboard.scssc create mode 100644 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_elements.scssc create mode 100644 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_form.scssc create mode 100755 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_layout.scssc create mode 100755 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_modules.scssc create mode 100755 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_page.scssc create mode 100755 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_properties-loop.scssc create mode 100755 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_shortcodes.scssc create mode 100644 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_single.scssc create mode 100755 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_styles.scssc create mode 100755 .sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_vars.scssc create mode 100755 .sass-cache/89d4189bdcf0dcae9ab52aa7cc9459d0e9ac7109/_functions.scssc create mode 100755 .sass-cache/89d4189bdcf0dcae9ab52aa7cc9459d0e9ac7109/_rtl.scssc create mode 100755 .sass-cache/89d4189bdcf0dcae9ab52aa7cc9459d0e9ac7109/_template-mixins.scssc create mode 100644 .sass-cache/99848c0c56d474befdaf34ec4dac5d06223608ca/cmb2-display.scssc create mode 100644 .sass-cache/99848c0c56d474befdaf34ec4dac5d06223608ca/cmb2-front.scssc create mode 100644 .sass-cache/99848c0c56d474befdaf34ec4dac5d06223608ca/cmb2.scssc create mode 100755 .sass-cache/bad35fbdbd98634079887c6e2cfb73376fdcb26d/_grid.scssc create mode 100755 .sass-cache/bad35fbdbd98634079887c6e2cfb73376fdcb26d/_mixins.scssc create mode 100755 .sass-cache/bad35fbdbd98634079887c6e2cfb73376fdcb26d/_variables.scssc create mode 100644 .sass-cache/c8d4f7249a62e232d9642ac78c611abb8f19f1ca/admin.scssc create mode 100644 .sass-cache/c8d4f7249a62e232d9642ac78c611abb8f19f1ca/cmb2-front.scssc create mode 100755 .sass-cache/c8d4f7249a62e232d9642ac78c611abb8f19f1ca/opalestate.scssc create mode 100755 .sass-cache/c8d4f7249a62e232d9642ac78c611abb8f19f1ca/submission.scssc create mode 100755 .sass-cache/f0cbe895c687b32732395abffe5c1daa8c9ae272/_mixins.scssc create mode 100755 .sass-cache/f0cbe895c687b32732395abffe5c1daa8c9ae272/_variables.scssc create mode 100644 assets/.DS_Store create mode 100755 assets/3rd/datepicker.css create mode 100755 assets/3rd/fontawesome/css/all.min.css create mode 100755 assets/3rd/fontawesome/webfonts/fa-brands-400.eot create mode 100755 assets/3rd/fontawesome/webfonts/fa-brands-400.svg create mode 100755 assets/3rd/fontawesome/webfonts/fa-brands-400.ttf create mode 100755 assets/3rd/fontawesome/webfonts/fa-brands-400.woff create mode 100755 assets/3rd/fontawesome/webfonts/fa-brands-400.woff2 create mode 100755 assets/3rd/fontawesome/webfonts/fa-regular-400.eot create mode 100755 assets/3rd/fontawesome/webfonts/fa-regular-400.svg create mode 100755 assets/3rd/fontawesome/webfonts/fa-regular-400.ttf create mode 100755 assets/3rd/fontawesome/webfonts/fa-regular-400.woff create mode 100755 assets/3rd/fontawesome/webfonts/fa-regular-400.woff2 create mode 100755 assets/3rd/fontawesome/webfonts/fa-solid-900.eot create mode 100755 assets/3rd/fontawesome/webfonts/fa-solid-900.svg create mode 100755 assets/3rd/fontawesome/webfonts/fa-solid-900.ttf create mode 100755 assets/3rd/fontawesome/webfonts/fa-solid-900.woff create mode 100755 assets/3rd/fontawesome/webfonts/fa-solid-900.woff2 create mode 100755 assets/3rd/index.html create mode 100755 assets/3rd/magnific-popup/jquery.magnific-popup.min.js create mode 100755 assets/3rd/select2/css/select2.css create mode 100755 assets/3rd/select2/css/select2.min.css create mode 100755 assets/3rd/select2/js/i18n/af.js create mode 100755 assets/3rd/select2/js/i18n/ar.js create mode 100755 assets/3rd/select2/js/i18n/az.js create mode 100755 assets/3rd/select2/js/i18n/bg.js create mode 100755 assets/3rd/select2/js/i18n/bn.js create mode 100755 assets/3rd/select2/js/i18n/bs.js create mode 100755 assets/3rd/select2/js/i18n/ca.js create mode 100755 assets/3rd/select2/js/i18n/cs.js create mode 100755 assets/3rd/select2/js/i18n/da.js create mode 100755 assets/3rd/select2/js/i18n/de.js create mode 100755 assets/3rd/select2/js/i18n/dsb.js create mode 100755 assets/3rd/select2/js/i18n/el.js create mode 100755 assets/3rd/select2/js/i18n/en.js create mode 100755 assets/3rd/select2/js/i18n/es.js create mode 100755 assets/3rd/select2/js/i18n/et.js create mode 100755 assets/3rd/select2/js/i18n/eu.js create mode 100755 assets/3rd/select2/js/i18n/fa.js create mode 100755 assets/3rd/select2/js/i18n/fi.js create mode 100755 assets/3rd/select2/js/i18n/fr.js create mode 100755 assets/3rd/select2/js/i18n/gl.js create mode 100755 assets/3rd/select2/js/i18n/he.js create mode 100755 assets/3rd/select2/js/i18n/hi.js create mode 100755 assets/3rd/select2/js/i18n/hr.js create mode 100755 assets/3rd/select2/js/i18n/hsb.js create mode 100755 assets/3rd/select2/js/i18n/hu.js create mode 100755 assets/3rd/select2/js/i18n/hy.js create mode 100755 assets/3rd/select2/js/i18n/id.js create mode 100755 assets/3rd/select2/js/i18n/is.js create mode 100755 assets/3rd/select2/js/i18n/it.js create mode 100755 assets/3rd/select2/js/i18n/ja.js create mode 100755 assets/3rd/select2/js/i18n/ka.js create mode 100755 assets/3rd/select2/js/i18n/km.js create mode 100755 assets/3rd/select2/js/i18n/ko.js create mode 100755 assets/3rd/select2/js/i18n/lt.js create mode 100755 assets/3rd/select2/js/i18n/lv.js create mode 100755 assets/3rd/select2/js/i18n/mk.js create mode 100755 assets/3rd/select2/js/i18n/ms.js create mode 100755 assets/3rd/select2/js/i18n/nb.js create mode 100755 assets/3rd/select2/js/i18n/ne.js create mode 100755 assets/3rd/select2/js/i18n/nl.js create mode 100755 assets/3rd/select2/js/i18n/pl.js create mode 100755 assets/3rd/select2/js/i18n/ps.js create mode 100755 assets/3rd/select2/js/i18n/pt-BR.js create mode 100755 assets/3rd/select2/js/i18n/pt.js create mode 100755 assets/3rd/select2/js/i18n/ro.js create mode 100755 assets/3rd/select2/js/i18n/ru.js create mode 100755 assets/3rd/select2/js/i18n/sk.js create mode 100755 assets/3rd/select2/js/i18n/sl.js create mode 100755 assets/3rd/select2/js/i18n/sq.js create mode 100755 assets/3rd/select2/js/i18n/sr-Cyrl.js create mode 100755 assets/3rd/select2/js/i18n/sr.js create mode 100755 assets/3rd/select2/js/i18n/sv.js create mode 100755 assets/3rd/select2/js/i18n/th.js create mode 100755 assets/3rd/select2/js/i18n/tk.js create mode 100755 assets/3rd/select2/js/i18n/tr.js create mode 100755 assets/3rd/select2/js/i18n/uk.js create mode 100755 assets/3rd/select2/js/i18n/vi.js create mode 100755 assets/3rd/select2/js/i18n/zh-CN.js create mode 100755 assets/3rd/select2/js/i18n/zh-TW.js create mode 100755 assets/3rd/select2/js/select2.full.js create mode 100755 assets/3rd/select2/js/select2.full.min.js create mode 100755 assets/3rd/select2/js/select2.js create mode 100755 assets/3rd/select2/js/select2.min.js create mode 100755 assets/3rd/sticky/jquery.sticky-kit.min.js create mode 100755 assets/3rd/swiper/css/swiper.css create mode 100755 assets/3rd/swiper/css/swiper.min.css create mode 100755 assets/3rd/swiper/js/swiper.esm.bundle.js create mode 100755 assets/3rd/swiper/js/swiper.esm.js create mode 100755 assets/3rd/swiper/js/swiper.js create mode 100755 assets/3rd/swiper/js/swiper.min.js create mode 100755 assets/3rd/swiper/js/swiper.min.js.map create mode 100755 assets/3rd/toast/jquery.toast.js create mode 100755 assets/3rd/tooltipster/css/tooltipster.bundle.min.css create mode 100755 assets/3rd/tooltipster/js/tooltipster.bundle.min.js create mode 100755 assets/admin.css create mode 100755 assets/cluster-icon.png create mode 100755 assets/cmb2-front.css create mode 100755 assets/cmb2/cmb2-display.css create mode 100755 assets/cmb2/cmb2-front.css create mode 100755 assets/cmb2/cmb2.css create mode 100755 assets/font-awesome.min.css create mode 100755 assets/hint.min.css create mode 100755 assets/images/1.png create mode 100755 assets/images/10.png create mode 100755 assets/images/11.png create mode 100755 assets/images/12.png create mode 100755 assets/images/13.png create mode 100755 assets/images/14.png create mode 100755 assets/images/15.png create mode 100755 assets/images/16.png create mode 100755 assets/images/17.png create mode 100755 assets/images/18.png create mode 100755 assets/images/19.png create mode 100755 assets/images/2.png create mode 100755 assets/images/3.png create mode 100755 assets/images/4.png create mode 100755 assets/images/5.png create mode 100755 assets/images/6.png create mode 100755 assets/images/7.png create mode 100755 assets/images/8.png create mode 100755 assets/images/9.png create mode 100644 assets/images/avatar-placeholder.jpg create mode 100644 assets/images/placeholder.png create mode 100755 assets/images/spinner.gif create mode 100644 assets/images/walk-score.png create mode 100755 assets/js/admin.js create mode 100755 assets/js/chart.min.js create mode 100755 assets/js/country-select.js create mode 100755 assets/js/frontend/dashboard.js create mode 100755 assets/js/frontend/elementor.js create mode 100755 assets/js/frontend/googlemaps.js create mode 100755 assets/js/frontend/property.js create mode 100755 assets/js/frontend/submission.js create mode 100755 assets/js/frontend/uploader.js create mode 100755 assets/js/infobox.js create mode 100755 assets/js/jquery.fitvids.js create mode 100755 assets/js/markerclusterer.js create mode 100755 assets/js/mortgage.js create mode 100755 assets/js/nouislider.min.js create mode 100755 assets/js/opalestate.js create mode 100755 assets/map/apartment-icon.png create mode 100644 assets/map/close.png create mode 100755 assets/map/cluster-icon.png create mode 100755 assets/map/hospital.png create mode 100755 assets/map/libraries.png create mode 100755 assets/map/market_icon.png create mode 100755 assets/map/pharmacy.png create mode 100755 assets/map/school.png create mode 100755 assets/map/supermarket.png create mode 100755 assets/map/transportation.png create mode 100755 assets/mortgage.css create mode 100755 assets/opalestate.css create mode 100755 assets/scss/admin.scss create mode 100755 assets/scss/bootstrap/_grid.scss create mode 100755 assets/scss/bootstrap/_mixins.scss create mode 100755 assets/scss/bootstrap/_unlities.scss create mode 100755 assets/scss/bootstrap/_variables.scss create mode 100755 assets/scss/bootstrap/mixins/_clearfix.scss create mode 100755 assets/scss/bootstrap/mixins/_grid-framework.scss create mode 100755 assets/scss/bootstrap/mixins/_grid.scss create mode 100755 assets/scss/bootstrap/mixins/_opacity.scss create mode 100755 assets/scss/bootstrap/mixins/_resize.scss create mode 100755 assets/scss/bootstrap/mixins/_size.scss create mode 100755 assets/scss/bootstrap/mixins/_vendor-prefixes.scss create mode 100755 assets/scss/cmb2-front.scss create mode 100755 assets/scss/cmb2/cmb2-display.scss create mode 100755 assets/scss/cmb2/cmb2-front.scss create mode 100755 assets/scss/cmb2/cmb2.scss create mode 100755 assets/scss/cmb2/index.html create mode 100755 assets/scss/cmb2/index.php create mode 100755 assets/scss/cmb2/partials/_collapsible_ui.scss create mode 100755 assets/scss/cmb2/partials/_context_metaboxes.scss create mode 100755 assets/scss/cmb2/partials/_display.scss create mode 100755 assets/scss/cmb2/partials/_front.scss create mode 100755 assets/scss/cmb2/partials/_jquery_ui.scss create mode 100755 assets/scss/cmb2/partials/_main_wrap.scss create mode 100755 assets/scss/cmb2/partials/_misc.scss create mode 100755 assets/scss/cmb2/partials/_mixins.scss create mode 100755 assets/scss/cmb2/partials/_new_term.scss create mode 100755 assets/scss/cmb2/partials/_options-page.scss create mode 100755 assets/scss/cmb2/partials/_post_metaboxes.scss create mode 100755 assets/scss/cmb2/partials/_sidebar_placements.scss create mode 100755 assets/scss/cmb2/partials/_variables.scss create mode 100755 assets/scss/cmb2/partials/index.php create mode 100755 assets/scss/components/_grid.scss create mode 100755 assets/scss/components/_mixins.scss create mode 100755 assets/scss/components/_variables.scss create mode 100755 assets/scss/components/mixins/_functions.scss create mode 100755 assets/scss/components/mixins/_rtl.scss create mode 100755 assets/scss/components/mixins/_template-mixins.scss create mode 100755 assets/scss/components/vars/_elements.scss create mode 100755 assets/scss/components/vars/_form.scss create mode 100755 assets/scss/components/vars/_layout.scss create mode 100755 assets/scss/components/vars/_nav.scss create mode 100755 assets/scss/components/vars/_widget.scss create mode 100755 assets/scss/opalestate.scss create mode 100755 assets/scss/opalestate/_3rd.scss create mode 100755 assets/scss/opalestate/_agency-loop.scss create mode 100755 assets/scss/opalestate/_archive.scss create mode 100755 assets/scss/opalestate/_dashboard.scss create mode 100755 assets/scss/opalestate/_elements.scss create mode 100755 assets/scss/opalestate/_form.scss create mode 100755 assets/scss/opalestate/_layout.scss create mode 100755 assets/scss/opalestate/_modules.scss create mode 100755 assets/scss/opalestate/_page.scss create mode 100755 assets/scss/opalestate/_properties-loop.scss create mode 100755 assets/scss/opalestate/_shortcodes.scss create mode 100755 assets/scss/opalestate/_single.scss create mode 100755 assets/scss/opalestate/_styles.scss create mode 100755 assets/scss/opalestate/_vars.scss create mode 100755 assets/scss/submission.scss create mode 100755 assets/submission.css create mode 100755 changelog.txt create mode 100755 config.rb create mode 100755 inc/.DS_Store create mode 100755 inc/admin/agency/class-agency.php create mode 100755 inc/admin/agent/class-agent.php create mode 100755 inc/admin/class-admin.php create mode 100755 inc/admin/class-api-keys-table.php create mode 100755 inc/admin/class-user.php create mode 100755 inc/admin/cron-jobs-functions.php create mode 100755 inc/admin/functions.php create mode 100755 inc/admin/property/class-property.php create mode 100755 inc/admin/rating/class-rating.php create mode 100755 inc/admin/register-settings.php create mode 100755 inc/admin/settings/3rd_party.php create mode 100755 inc/admin/settings/api_keys.php create mode 100755 inc/admin/settings/base.php create mode 100755 inc/admin/settings/email.php create mode 100755 inc/admin/settings/general.php create mode 100755 inc/admin/settings/property.php create mode 100755 inc/admin/views/addons/list.php create mode 100755 inc/agency/class-opalestate-agency-front.php create mode 100755 inc/agency/class-opalestate-agency-metabox.php create mode 100755 inc/agency/class-opalestate-agency-posttype.php create mode 100755 inc/agency/class-opalestate-agency-query.php create mode 100755 inc/agency/class-opalestate-agency.php create mode 100755 inc/agency/functions.php create mode 100755 inc/agent/class-opalestate-agent-front.php create mode 100755 inc/agent/class-opalestate-agent-metabox.php create mode 100755 inc/agent/class-opalestate-agent-posttype.php create mode 100755 inc/agent/class-opalestate-agent-query.php create mode 100755 inc/agent/class-opalestate-agent.php create mode 100755 inc/agent/functions.php create mode 100755 inc/ajax-functions.php create mode 100755 inc/api/class-opalestate-api.php create mode 100755 inc/class-no-captcha-recaptcha.php create mode 100755 inc/class-opalestate-email.php create mode 100755 inc/class-opalestate-enqueue.php create mode 100755 inc/class-opalestate-html.php create mode 100755 inc/class-opalestate-install.php create mode 100755 inc/class-opalestate-roles.php create mode 100755 inc/class-template-loader.php create mode 100755 inc/classes/class-opalestate-abs-query.php create mode 100755 inc/classes/class-opalestate-cache.php create mode 100755 inc/classes/class-opalestate-geolocation.php create mode 100755 inc/classes/class-opalestate-metabox-user.php create mode 100755 inc/classes/class-opalestate-multilingual.php create mode 100755 inc/classes/class-opalestate-session.php create mode 100755 inc/classes/class-opalestate-walkscore.php create mode 100755 inc/classes/class-opalestate-yelp.php create mode 100755 inc/cli/export.php create mode 100755 inc/email/class-opalesate-approve.php create mode 100755 inc/email/class-opalestate-abs-email-template.php create mode 100755 inc/email/class-opalestate-email-notifycation.php create mode 100755 inc/email/class-opalestate-new-submitted.php create mode 100755 inc/email/class-opalestate-request-viewing.php create mode 100755 inc/function-search-fields.php create mode 100755 inc/libraries/array2xml.php create mode 100755 inc/libraries/wp-session.php create mode 100755 inc/libraries/wp_session/class-wp-session.php create mode 100755 inc/libraries/wp_session/wp-session.php create mode 100755 inc/message/class-opalestate-message.php create mode 100755 inc/message/class-opalestate-request-reviewing.php create mode 100755 inc/message/functions.php create mode 100755 inc/mixes-functions.php create mode 100755 inc/property/class-metabox-property-admin.php create mode 100755 inc/property/class-opalestate-favorite.php create mode 100755 inc/property/class-opalestate-posttype.php create mode 100755 inc/property/class-opalestate-property-query.php create mode 100755 inc/property/class-opalestate-property.php create mode 100755 inc/property/class-opalestate-query.php create mode 100755 inc/property/class-opalestate-search.php create mode 100755 inc/property/class-opalestate-shortcodes.php create mode 100755 inc/property/class-opalestate-view-stats.php create mode 100755 inc/property/functions.php create mode 100755 inc/query-functions.php create mode 100755 inc/rating/class-opalestate-rating-features-posttype.php create mode 100755 inc/rating/class-opalestate-rating-helper.php create mode 100755 inc/rating/class-opalestate-rating-init.php create mode 100755 inc/rating/class-opalestate-rating-metabox.php create mode 100755 inc/rating/class-opalestate-rating.php create mode 100755 inc/rating/rating-functions.php create mode 100755 inc/rating/rating-hook-functions.php create mode 100755 inc/submission/class-metabox-property-submission.php create mode 100755 inc/submission/class-opalestate-submission.php create mode 100755 inc/submission/function.php create mode 100755 inc/taxonomies/class-taxomony-amenities.php create mode 100755 inc/taxonomies/class-taxonomy-categories.php create mode 100755 inc/taxonomies/class-taxonomy-city.php create mode 100755 inc/taxonomies/class-taxonomy-labels.php create mode 100755 inc/taxonomies/class-taxonomy-locations.php create mode 100755 inc/taxonomies/class-taxonomy-neighborhood.php create mode 100755 inc/taxonomies/class-taxonomy-state.php create mode 100755 inc/taxonomies/class-taxonomy-status.php create mode 100755 inc/taxonomies/class-taxonomy-types.php create mode 100755 inc/template-functions.php create mode 100755 inc/template-hook-functions.php create mode 100755 inc/user/class-opalestate-user-form-handler.php create mode 100755 inc/user/class-opalestate-user-search.php create mode 100755 inc/user/class-opalestate-user.php create mode 100755 inc/user/class-user-statistics.php create mode 100755 inc/user/functions.php create mode 100644 inc/vendors/.DS_Store create mode 100644 inc/vendors/cmb2-plugins/.DS_Store create mode 100755 inc/vendors/cmb2-plugins/CMB2-Switch-Button/README.md create mode 100755 inc/vendors/cmb2-plugins/CMB2-Switch-Button/cmb2-switch-button.php create mode 100755 inc/vendors/cmb2-plugins/CMB2-Switch-Button/example_screenshot.gif create mode 100755 inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/bootstrap-popovers.css create mode 100755 inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/cmb2-fixes.css create mode 100755 inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/font-awesome.min.css create mode 100755 inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/fontawesome-iconpicker.min.css create mode 100755 inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/js/fontawesome-iconpicker.min.js create mode 100755 inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/js/fontawesome-picker-init.js create mode 100755 inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/cmb2-fontawesome-picker.php create mode 100755 inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/resources/bootstrap-popovers.scss create mode 100755 inc/vendors/cmb2-plugins/cmb2-tabs/assets/css/cmb2-tabs.css create mode 100755 inc/vendors/cmb2-plugins/cmb2-tabs/assets/js/cmb2-tabs.js create mode 100755 inc/vendors/cmb2-plugins/cmb2-tabs/autoloader.php create mode 100755 inc/vendors/cmb2-plugins/cmb2-tabs/inc/assets.class.php create mode 100755 inc/vendors/cmb2-plugins/cmb2-tabs/inc/cmb2-tabs.class.php create mode 100755 inc/vendors/cmb2-plugins/cmb2-tabs/plugin.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/bootstrap.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/cmb2-display-rtl.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/cmb2-display-rtl.min.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/cmb2-display.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/cmb2-display.css.map create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/cmb2-display.min.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/cmb2-front-rtl.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/cmb2-front-rtl.min.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/cmb2-front.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/cmb2-front.min.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/cmb2-rtl.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/cmb2-rtl.min.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/cmb2.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/cmb2.min.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/css/index.php create mode 100644 inc/vendors/cmb2-plugins/cmb2/custom-fields/map/.DS_Store create mode 100755 inc/vendors/cmb2-plugins/cmb2/custom-fields/map/composer.json create mode 100755 inc/vendors/cmb2-plugins/cmb2/custom-fields/map/css/style.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/custom-fields/map/js/script.js create mode 100755 inc/vendors/cmb2-plugins/cmb2/custom-fields/map/map.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/custom-fields/map/readme.md create mode 100755 inc/vendors/cmb2-plugins/cmb2/custom-fields/map/screenshot-1.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/custom-fields/user/assets/script.js create mode 100755 inc/vendors/cmb2-plugins/cmb2/custom-fields/user/assets/style.css create mode 100755 inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ico-delete.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/index.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ui-bg_flat_75_ffffff_40x100.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ui-bg_glass_65_ffffff_1x400.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ui-bg_glass_75_dadada_1x400.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ui-icons_222222_256x240.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ui-icons_2e83ff_256x240.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ui-icons_454545_256x240.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ui-icons_888888_256x240.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/images/ui-icons_cd0a0a_256x240.png create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Ajax.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Base.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Boxes.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Field.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Field_Display.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Hookup_Base.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_JS.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Options.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Options_Hookup.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Sanitize.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Show_Filters.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Types.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Utils.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/CMB2_hookup.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/helper-functions.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/index.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/rest-api/CMB2_REST.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/rest-api/CMB2_REST_Controller.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/rest-api/CMB2_REST_Controller_Boxes.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/rest-api/CMB2_REST_Controller_Fields.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/shim/WP_REST_Controller.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Base.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Checkbox.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Colorpicker.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_File.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_File_Base.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_File_List.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Multi_Base.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Multicheck.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Oembed.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Picker_Base.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Radio.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Select.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Select_Timezone.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Base.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Multicheck.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Multicheck_Hierarchical.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Radio.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Radio_Hierarchical.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Select.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Date.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Datetime_Timestamp.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Datetime_Timestamp_Timezone.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Time.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Textarea.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Textarea_Code.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Title.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Wysiwyg.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/index.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/init.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/js/cmb2-wysiwyg.js create mode 100755 inc/vendors/cmb2-plugins/cmb2/js/cmb2.js create mode 100755 inc/vendors/cmb2-plugins/cmb2/js/cmb2.min.js create mode 100755 inc/vendors/cmb2-plugins/cmb2/js/index.php create mode 100755 inc/vendors/cmb2-plugins/cmb2/js/jquery-ui-timepicker-addon.min.js create mode 100755 inc/vendors/cmb2-plugins/cmb2/js/wp-color-picker-alpha.js create mode 100755 inc/vendors/cmb2-plugins/cmb2/js/wp-color-picker-alpha.min.js create mode 100755 inc/vendors/cmb2-plugins/init.php create mode 100755 inc/vendors/cmb2-plugins/uploader/uploader.php create mode 100755 inc/vendors/elementor/class-opalestate-elementor-extended.php create mode 100755 inc/vendors/elementor/class-opalestate-elementor-widget-base.php create mode 100755 inc/vendors/elementor/widgets/opalestate-account-button.php create mode 100755 inc/vendors/elementor/widgets/opalestate-agency-collection.php create mode 100755 inc/vendors/elementor/widgets/opalestate-agent-collection.php create mode 100755 inc/vendors/elementor/widgets/opalestate-category-list.php create mode 100755 inc/vendors/elementor/widgets/opalestate-city-list.php create mode 100755 inc/vendors/elementor/widgets/opalestate-form-builder.php create mode 100755 inc/vendors/elementor/widgets/opalestate-map-top-search.php create mode 100755 inc/vendors/elementor/widgets/opalestate-property-collection.php create mode 100755 inc/vendors/elementor/widgets/opalestate-search-agency.php create mode 100755 inc/vendors/elementor/widgets/opalestate-search-agents.php create mode 100755 inc/vendors/elementor/widgets/opalestate-search-property-results.php create mode 100755 inc/vendors/elementor/widgets/opalestate-searchbox.php create mode 100755 inc/vendors/elementor/widgets/opalestate-split-maps-search.php create mode 100755 inc/vendors/index.html create mode 100755 inc/vendors/opalmembership/free-package.php create mode 100755 inc/vendors/opalmembership/functions.php create mode 100755 inc/vendors/opalmembership/membership.php create mode 100755 inc/vendors/social-login/Facebook/Authentication/AccessToken.php create mode 100755 inc/vendors/social-login/Facebook/Authentication/AccessTokenMetadata.php create mode 100755 inc/vendors/social-login/Facebook/Authentication/OAuth2Client.php create mode 100755 inc/vendors/social-login/Facebook/Exceptions/FacebookAuthenticationException.php create mode 100755 inc/vendors/social-login/Facebook/Exceptions/FacebookAuthorizationException.php create mode 100755 inc/vendors/social-login/Facebook/Exceptions/FacebookClientException.php create mode 100755 inc/vendors/social-login/Facebook/Exceptions/FacebookOtherException.php create mode 100755 inc/vendors/social-login/Facebook/Exceptions/FacebookResponseException.php create mode 100755 inc/vendors/social-login/Facebook/Exceptions/FacebookResumableUploadException.php create mode 100755 inc/vendors/social-login/Facebook/Exceptions/FacebookSDKException.php create mode 100755 inc/vendors/social-login/Facebook/Exceptions/FacebookServerException.php create mode 100755 inc/vendors/social-login/Facebook/Exceptions/FacebookThrottleException.php create mode 100755 inc/vendors/social-login/Facebook/Facebook.php create mode 100755 inc/vendors/social-login/Facebook/FacebookApp.php create mode 100755 inc/vendors/social-login/Facebook/FacebookBatchRequest.php create mode 100755 inc/vendors/social-login/Facebook/FacebookBatchResponse.php create mode 100755 inc/vendors/social-login/Facebook/FacebookClient.php create mode 100755 inc/vendors/social-login/Facebook/FacebookRequest.php create mode 100755 inc/vendors/social-login/Facebook/FacebookResponse.php create mode 100755 inc/vendors/social-login/Facebook/FileUpload/FacebookFile.php create mode 100755 inc/vendors/social-login/Facebook/FileUpload/FacebookResumableUploader.php create mode 100755 inc/vendors/social-login/Facebook/FileUpload/FacebookTransferChunk.php create mode 100755 inc/vendors/social-login/Facebook/FileUpload/FacebookVideo.php create mode 100755 inc/vendors/social-login/Facebook/FileUpload/Mimetypes.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/Birthday.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/Collection.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphAchievement.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphAlbum.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphApplication.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphCoverPhoto.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphEdge.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphEvent.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphGroup.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphList.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphLocation.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphNode.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphNodeFactory.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphObject.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphObjectFactory.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphPage.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphPicture.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphSessionInfo.php create mode 100755 inc/vendors/social-login/Facebook/GraphNodes/GraphUser.php create mode 100755 inc/vendors/social-login/Facebook/Helpers/FacebookCanvasHelper.php create mode 100755 inc/vendors/social-login/Facebook/Helpers/FacebookJavaScriptHelper.php create mode 100755 inc/vendors/social-login/Facebook/Helpers/FacebookPageTabHelper.php create mode 100755 inc/vendors/social-login/Facebook/Helpers/FacebookRedirectLoginHelper.php create mode 100755 inc/vendors/social-login/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php create mode 100755 inc/vendors/social-login/Facebook/Http/GraphRawResponse.php create mode 100755 inc/vendors/social-login/Facebook/Http/RequestBodyInterface.php create mode 100755 inc/vendors/social-login/Facebook/Http/RequestBodyMultipart.php create mode 100755 inc/vendors/social-login/Facebook/Http/RequestBodyUrlEncoded.php create mode 100755 inc/vendors/social-login/Facebook/HttpClients/FacebookCurl.php create mode 100755 inc/vendors/social-login/Facebook/HttpClients/FacebookCurlHttpClient.php create mode 100755 inc/vendors/social-login/Facebook/HttpClients/FacebookGuzzleHttpClient.php create mode 100755 inc/vendors/social-login/Facebook/HttpClients/FacebookHttpClientInterface.php create mode 100755 inc/vendors/social-login/Facebook/HttpClients/FacebookStream.php create mode 100755 inc/vendors/social-login/Facebook/HttpClients/FacebookStreamHttpClient.php create mode 100755 inc/vendors/social-login/Facebook/HttpClients/HttpClientsFactory.php create mode 100755 inc/vendors/social-login/Facebook/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem create mode 100755 inc/vendors/social-login/Facebook/PersistentData/FacebookMemoryPersistentDataHandler.php create mode 100755 inc/vendors/social-login/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php create mode 100755 inc/vendors/social-login/Facebook/PersistentData/PersistentDataFactory.php create mode 100755 inc/vendors/social-login/Facebook/PersistentData/PersistentDataInterface.php create mode 100755 inc/vendors/social-login/Facebook/PseudoRandomString/McryptPseudoRandomStringGenerator.php create mode 100755 inc/vendors/social-login/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php create mode 100755 inc/vendors/social-login/Facebook/PseudoRandomString/PseudoRandomStringGeneratorFactory.php create mode 100755 inc/vendors/social-login/Facebook/PseudoRandomString/PseudoRandomStringGeneratorInterface.php create mode 100755 inc/vendors/social-login/Facebook/PseudoRandomString/PseudoRandomStringGeneratorTrait.php create mode 100755 inc/vendors/social-login/Facebook/PseudoRandomString/RandomBytesPseudoRandomStringGenerator.php create mode 100755 inc/vendors/social-login/Facebook/PseudoRandomString/UrandomPseudoRandomStringGenerator.php create mode 100755 inc/vendors/social-login/Facebook/SignedRequest.php create mode 100755 inc/vendors/social-login/Facebook/Url/FacebookUrlDetectionHandler.php create mode 100755 inc/vendors/social-login/Facebook/Url/FacebookUrlManipulator.php create mode 100755 inc/vendors/social-login/Facebook/Url/UrlDetectionInterface.php create mode 100755 inc/vendors/social-login/Facebook/autoload.php create mode 100755 inc/vendors/social-login/Facebook/polyfills.php create mode 100755 inc/vendors/social-login/Google/apiClient.php create mode 100755 inc/vendors/social-login/Google/auth/apiAuth.php create mode 100755 inc/vendors/social-login/Google/auth/apiAuthNone.php create mode 100755 inc/vendors/social-login/Google/auth/apiLoginTicket.php create mode 100755 inc/vendors/social-login/Google/auth/apiOAuth.php create mode 100755 inc/vendors/social-login/Google/auth/apiOAuth2.php create mode 100755 inc/vendors/social-login/Google/auth/apiP12Signer.php create mode 100755 inc/vendors/social-login/Google/auth/apiPemVerifier.php create mode 100755 inc/vendors/social-login/Google/auth/apiSigner.php create mode 100755 inc/vendors/social-login/Google/auth/apiVerifier.php create mode 100755 inc/vendors/social-login/Google/cache/apiApcCache.php create mode 100755 inc/vendors/social-login/Google/cache/apiCache.php create mode 100755 inc/vendors/social-login/Google/cache/apiFileCache.php create mode 100755 inc/vendors/social-login/Google/cache/apiMemcacheCache.php create mode 100755 inc/vendors/social-login/Google/config.php create mode 100755 inc/vendors/social-login/Google/contrib/apiAdsenseService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiAnalyticsService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiBigqueryService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiBloggerService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiBooksService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiCalendarService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiCustomsearchService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiFreebaseService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiGanService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiLatitudeService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiModeratorService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiOauth2Service.php create mode 100755 inc/vendors/social-login/Google/contrib/apiOrkutService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiPagespeedonlineService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiPlusService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiPredictionService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiShoppingService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiSiteVerificationService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiTasksService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiTranslateService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiUrlshortenerService.php create mode 100755 inc/vendors/social-login/Google/contrib/apiWebfontsService.php create mode 100755 inc/vendors/social-login/Google/external/OAuth.php create mode 100755 inc/vendors/social-login/Google/external/URITemplateParser.php create mode 100755 inc/vendors/social-login/Google/index.html create mode 100755 inc/vendors/social-login/Google/io/apiCacheParser.php create mode 100755 inc/vendors/social-login/Google/io/apiCurlIO.php create mode 100755 inc/vendors/social-login/Google/io/apiHttpRequest.php create mode 100755 inc/vendors/social-login/Google/io/apiIO.php create mode 100755 inc/vendors/social-login/Google/io/apiREST.php create mode 100755 inc/vendors/social-login/Google/io/apiRPC.php create mode 100755 inc/vendors/social-login/Google/io/cacerts.pem create mode 100755 inc/vendors/social-login/Google/service/apiBatch.php create mode 100755 inc/vendors/social-login/Google/service/apiMediaFileUpload.php create mode 100755 inc/vendors/social-login/Google/service/apiModel.php create mode 100755 inc/vendors/social-login/Google/service/apiService.php create mode 100755 inc/vendors/social-login/Google/service/apiServiceRequest.php create mode 100755 inc/vendors/social-login/Google/service/apiServiceResource.php create mode 100755 inc/vendors/social-login/Google/service/apiUtils.php create mode 100755 inc/vendors/social-login/class-opalestate-facebook-login.php create mode 100755 inc/vendors/social-login/class-opalestate-google-login.php create mode 100755 inc/vendors/social-login/class-opalestate-social-login.php create mode 100755 inc/widgets/featured-properties.php create mode 100755 inc/widgets/mortgage-calculator.php create mode 100755 inc/widgets/profile-info.php create mode 100755 inc/widgets/sameprice-properties.php create mode 100755 inc/widgets/search-properties.php create mode 100755 inc/widgets/similar-properties.php create mode 100644 languages/opalestate-pro-backup-201909030250570.pot~ create mode 100755 languages/opalestate-pro.pot create mode 100755 license.txt create mode 100755 opal-estate-pro.php create mode 100755 project.json create mode 100755 readme.txt create mode 100755 templates/.DS_Store create mode 100755 templates/archive-opalestate_agency.php create mode 100755 templates/archive-opalestate_agent.php create mode 100755 templates/archive-opalestate_property.php create mode 100755 templates/content-agency-grid.php create mode 100755 templates/content-agency-list.php create mode 100755 templates/content-agent-grid-v2.php create mode 100755 templates/content-agent-grid.php create mode 100755 templates/content-agent-list.php create mode 100755 templates/content-no-results.php create mode 100755 templates/content-property-featured-v1.php create mode 100755 templates/content-property-grid-v2.php create mode 100755 templates/content-property-grid-v3.php create mode 100755 templates/content-property-grid.php create mode 100755 templates/content-property-list-v2.php create mode 100755 templates/content-property-list.php create mode 100755 templates/content-property-mark-hover.php create mode 100755 templates/content-property.php create mode 100755 templates/content-single-agency.php create mode 100755 templates/content-single-agent.php create mode 100755 templates/content-single-property-print.php create mode 100755 templates/content-single-property-v2.php create mode 100755 templates/content-single-property-v3.php create mode 100755 templates/content-single-property-v4.php create mode 100755 templates/content-single-property-v5.php create mode 100755 templates/content-single-property.php create mode 100755 templates/content-user-grid.php create mode 100755 templates/elementor-templates/opalestate-agency-collection.php create mode 100755 templates/elementor-templates/opalestate-agent-collection.php create mode 100755 templates/elementor-templates/opalestate-category-list.php create mode 100755 templates/elementor-templates/opalestate-city-list.php create mode 100755 templates/elementor-templates/opalestate-form-builder.php create mode 100755 templates/elementor-templates/opalestate-map-top-search.php create mode 100755 templates/elementor-templates/opalestate-office-agent-search.php create mode 100755 templates/elementor-templates/opalestate-property-collection.php create mode 100755 templates/elementor-templates/opalestate-search-agency.php create mode 100755 templates/elementor-templates/opalestate-search-agents.php create mode 100755 templates/elementor-templates/opalestate-search-property-results.php create mode 100755 templates/elementor-templates/opalestate-searchbox.php create mode 100755 templates/elementor-templates/opalestate-split-maps-search.php create mode 100755 templates/emails/contact.php create mode 100755 templates/emails/enquiry.php create mode 100755 templates/emails/publish_property.php create mode 100755 templates/emails/request-reviewing.php create mode 100755 templates/fullwidth-page.php create mode 100755 templates/messages/contact-form.php create mode 100755 templates/messages/enquiry-form.php create mode 100755 templates/messages/request-reviewing-form.php create mode 100755 templates/notices/error.php create mode 100755 templates/notices/success.php create mode 100755 templates/notices/warning.php create mode 100755 templates/parts/archive-search-block.php create mode 100755 templates/parts/archive-simple-bars.php create mode 100755 templates/parts/collection-navigator.php create mode 100755 templates/parts/featured-label.php create mode 100755 templates/parts/has-warning.php create mode 100755 templates/parts/membership-pricing-info.php create mode 100755 templates/parts/membership-warning.php create mode 100755 templates/parts/modules/carousel.php create mode 100755 templates/parts/mortgage-calculator.php create mode 100755 templates/parts/not-allowed.php create mode 100755 templates/parts/pagination.php create mode 100755 templates/parts/property-categories.php create mode 100755 templates/parts/property-label.php create mode 100755 templates/parts/property-loop-price.php create mode 100755 templates/parts/property-loop-short-meta.php create mode 100755 templates/parts/property-status.php create mode 100755 templates/parts/property-types.php create mode 100755 templates/parts/search-agency-form-address.php create mode 100755 templates/parts/search-agency-form.php create mode 100755 templates/parts/search-agents-form-address.php create mode 100755 templates/parts/search-agents-form.php create mode 100755 templates/rating/opalestate-ratings.php create mode 100755 templates/rating/review-meta.php create mode 100755 templates/rating/review-rating.php create mode 100755 templates/rating/review.php create mode 100755 templates/search-box/advanced-v2.php create mode 100755 templates/search-box/advanced-v3.php create mode 100755 templates/search-box/advanced-v4.php create mode 100755 templates/search-box/advanced-v5.php create mode 100755 templates/search-box/advanced-v6.php create mode 100755 templates/search-box/collapse-city.php create mode 100755 templates/search-box/collapse-keyword.php create mode 100755 templates/search-box/fields/areasize.php create mode 100755 templates/search-box/fields/city-select.php create mode 100755 templates/search-box/fields/country-select.php create mode 100755 templates/search-box/fields/group-info.php create mode 100755 templates/search-box/fields/location.php create mode 100755 templates/search-box/fields/more-options.php create mode 100755 templates/search-box/fields/price.php create mode 100755 templates/search-box/fields/radius.php create mode 100755 templates/search-box/fields/search-city-text.php create mode 100755 templates/search-box/fields/search-text.php create mode 100755 templates/search-box/fields/state-select.php create mode 100755 templates/search-box/fields/status-bar.php create mode 100755 templates/search-box/fields/status.php create mode 100755 templates/search-box/fields/submit-button.php create mode 100755 templates/search-box/fields/types.php create mode 100755 templates/search-box/search-form-h.php create mode 100755 templates/search-box/search-form-v.php create mode 100755 templates/search-box/search-form-v2.php create mode 100755 templates/search-box/search-form-v3.php create mode 100755 templates/search-box/simple-city.php create mode 100755 templates/search-box/simple-keyword.php create mode 100755 templates/shortcodes/ajax-map-quick-search.php create mode 100755 templates/shortcodes/ajax-map-search-result.php create mode 100755 templates/shortcodes/ajax-map-search.php create mode 100755 templates/shortcodes/search-agents.php create mode 100755 templates/shortcodes/search-map-properties.php create mode 100755 templates/shortcodes/search-properties-result.php create mode 100755 templates/shortcodes/search-properties-v.php create mode 100755 templates/shortcodes/search-properties.php create mode 100755 templates/shortcodes/submission-form.php create mode 100755 templates/single-agency/author-box.php create mode 100755 templates/single-agency/gallery.php create mode 100755 templates/single-agency/index.html create mode 100755 templates/single-agency/properties.php create mode 100755 templates/single-agency/summary.php create mode 100755 templates/single-agency/tabs.php create mode 100755 templates/single-agency/team.php create mode 100755 templates/single-agent/author-box.php create mode 100755 templates/single-agent/box.php create mode 100755 templates/single-agent/featured-properties.php create mode 100755 templates/single-agent/form.php create mode 100755 templates/single-agent/properties.php create mode 100755 templates/single-agent/summary.php create mode 100755 templates/single-opalestate_agency.php create mode 100755 templates/single-opalestate_agent.php create mode 100755 templates/single-opalestate_property.php create mode 100755 templates/single-property/amenities.php create mode 100755 templates/single-property/apartments.php create mode 100755 templates/single-property/attachments.php create mode 100755 templates/single-property/author-v2.php create mode 100755 templates/single-property/author-v3.php create mode 100755 templates/single-property/author.php create mode 100755 templates/single-property/content.php create mode 100755 templates/single-property/facilities.php create mode 100755 templates/single-property/features.php create mode 100755 templates/single-property/floor-plans.php create mode 100755 templates/single-property/information.php create mode 100755 templates/single-property/location.php create mode 100755 templates/single-property/map-v2.php create mode 100755 templates/single-property/map.php create mode 100755 templates/single-property/meta.php create mode 100755 templates/single-property/nearby.php create mode 100755 templates/single-property/preview.php create mode 100755 templates/single-property/preview/gallery-metro.php create mode 100755 templates/single-property/preview/gallery-slider.php create mode 100755 templates/single-property/preview/map.php create mode 100755 templates/single-property/preview/mark-picture.php create mode 100755 templates/single-property/preview/tabs.php create mode 100755 templates/single-property/preview/virtualtour.php create mode 100755 templates/single-property/price.php create mode 100755 templates/single-property/sameagent.php create mode 100755 templates/single-property/sharebox.php create mode 100755 templates/single-property/short-meta.php create mode 100755 templates/single-property/user/author-member-box.php create mode 100755 templates/single-property/user/author-user-box-list.php create mode 100755 templates/single-property/user/author-user-box.php create mode 100755 templates/single-property/video.php create mode 100755 templates/single-property/views-statistics.php create mode 100755 templates/single-property/virtualtour.php create mode 100755 templates/single-property/walkscore.php create mode 100755 templates/submission/completed.php create mode 100755 templates/submission/require-login.php create mode 100755 templates/submission/submission-completed.php create mode 100755 templates/submission/submission-form.php create mode 100755 templates/user-management.php create mode 100755 templates/user-search/content-savedsearch.php create mode 100755 templates/user-search/render-form.php create mode 100755 templates/user/agency/agency-team.php create mode 100755 templates/user/agency/profile-agency.php create mode 100755 templates/user/agent/profile-agent.php create mode 100755 templates/user/content-property.php create mode 100755 templates/user/dashboard.php create mode 100755 templates/user/favorite-button.php create mode 100755 templates/user/favorite-properties.php create mode 100755 templates/user/login-form.php create mode 100755 templates/user/messages.php create mode 100755 templates/user/my-account-popup.php create mode 100755 templates/user/my-account.php create mode 100755 templates/user/my-properties.php create mode 100755 templates/user/profile.php create mode 100755 templates/user/property-ratings.php create mode 100755 templates/user/read-messages.php create mode 100755 templates/user/register-form.php create mode 100755 templates/user/share-search-form.php create mode 100755 templates/user/social-login/facebook-button.php create mode 100755 templates/user/social-login/google-button.php create mode 100755 templates/user/social-login/social-login.php create mode 100755 templates/widgets/featured-properties.php create mode 100755 templates/widgets/sameprice-properties.php create mode 100755 templates/widgets/similar-properties.php create mode 100755 uninstall.php create mode 100755 wpml-config.xml diff --git a/.DS_Store b/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..5205550ec55a868556a464d8fe77db273b15d65a GIT binary patch literal 10244 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 MCGjh2@D$+x0ld29a{vGU literal 0 HcmV?d00001 diff --git a/.sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_grid.scssc b/.sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_grid.scssc new file mode 100755 index 0000000000000000000000000000000000000000..06e40323ff17b8c67bb42f35acdec3df2bf59146 GIT binary patch literal 30230 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 literal 0 HcmV?d00001 diff --git a/.sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_opacity.scssc b/.sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_opacity.scssc new file mode 100755 index 0000000000000000000000000000000000000000..78ecec9913f92aef194cf816bfa6e0a223131f28 GIT binary patch literal 2900 zcmcguZF3tn5DqhpW1pQkEhJ5WrdQKK5}KToIHZw=L4`ImnIUZkhYn0W9P*uPYkGG& zBsnj1`jvmc|7CS=&RyLOU*MB1-R|nyN6+qRZ@ag>yKk@eS-?EaFPPoe?1F7ry7g4iEO(-nZWFfb9>4z1^O_XMJ23=x(1Xh0vK~456Qe&@Y6~ zT4<4YV;=aDMd$MZeR0$1M-hfB%Iuotf(8?IUOVpGb~f#oG4;549GC_?V!VcK6D20nW3HsphzYcs9^Owj0i)S% zpf*vOO6|r%3G{i{m|oYev=>C^N$2zZpS5$I32v`fR zRa{rdB=VV5o{-E>fK?1WBXE1}MHV1O-31laaa-V}2EHXy;nhKS%lOk9t9y8vwDAgA z!Y%k+Ak8jn5*35Ox==QaN}--g5t}5J@R}*Tn;GJ|!1g=f@q>z0$G~b-U^M{Ntpb)= z-L1j`Ry7?cK8J1*kag^;>qyfpRFBxDsc+os8uaf8UY{Kt-AS&>Efs#k7x|{-(azzZ z)wJ=6%Rbj^hKBftn)p8NL ztixPGi4Kj9+L;8mILlPXu7Ew%nWey&F_TFPT7WJf%p&r4{{5vkE3lgYbfsX?tk!ba zxz?uV>=xaoU#g0qI50&63)Gdjquk(?82|{qn1ll+!GLok0JKb^NoW!g(w#(HE9m`q zh|eMs@~E^6NlFeqlLkhUv*14{!GBo52N6THOp8$<1_nw=%tfqBU53U+De9vfmB0_PvTUXTOVsr)Z|TTAnnWHAg0@kKMT2-u z6Z8A$HGv;5;4Oij50Kv168d5T*DKX+D$qi04s>fiOtP!B^3W*hV_4x>uOF8gD` zVSIy)A-+}7O{=6Evzqp(lz6vwVBs2I@Z!!`$h8r)GB011O6xTPiQ<3y$tMJ7|CYJz+v7IB26Z zVT><8B0=%JXw0*QQLPASM$`S=2_9oGY2ExSc$Rf{;1!-8W;mH=)8CGhKm06v!u9vp*a58_Ujjk)3a2*aYusGlq5k4SFTAivaefz0>V(7>Bf~keyV^dUn8fH{8JL Yt(BA!y#Feyu0eX!WYbkXd4D+j2iY?uXaE2J literal 0 HcmV?d00001 diff --git a/.sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_size.scssc b/.sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_size.scssc new file mode 100755 index 0000000000000000000000000000000000000000..3f0e744e5c4a41b1eafa666ad426b14f1c10497a GIT binary patch literal 2480 zcmcguOK;mo5LSUgmMBYd+{E#tc4);o&R=>b#$y&v?^VbR4JNEtY&UkCW4psY@o;FXk&xP(Xk{NeMO6H$ zi!7q=BZex92Vjefy#j<7m<1iPCaMwjFnObTQt zxwWSoP_z#Q%)QcVTmtM8e6<_D|A)|HNOd9^4cz}J+9pvT5Z9>0y`?e)bwQa+9j1$r z@`$R@=fVepcIO3pWvG1521dy>xMhsnjj~}j&cGs64pncZw<6H~R4|_8kxtv-S1LK} z2W%DZwHwwg_w^_?+#r+CXHt1WGC#(YJKiQxHuq*~oWgB__DZ-e@LCx^5sBPNAh&h= zbZ)hYpOHG=AZvIPeygO?1a#Pr5mZKu4@cTS!29jS{Iclq-kdbS7%%A{#u@dA26ph+TE z-G`dqp;E|h&9uO)O~VRsxy*TKxpVY9uDzQZBXJ$bSNiE!H#_(n?JP zK9~|UUzm)k`ORg;vlh6rfSt7roLN0jBc;;7-|+(e9{-T%WtpQHFL_6Yi5khfT%cMO z=qRVwDJ1efJI{)-OxVTDsge21)Ck5ow5yvwD_wziYo@;{>dy(4acANeJ)_2{?6Zb7 zqMt2dg;f_=t3srwSzNQ)O5>)iHStR$_M$-BkA{U&d)Y7lxO17cP? zi$K04zh!QBb8Z`pZsD!?gWa1a2?pd|lHxC#2MB!>a!do5e*P7WR-nP)o(r#znWgaF zmdTh#4+Wsd9Knzsy4h%$>$_!;X8JOjW~H7r>#{n{^kM2WqvyCgwS!FHNi);Qyv2Vz z&ZEx?%Odf6X`7jTco0wMAMJx=P9E70mTkv-$WG2MY$S)Ull;Nf=b4vSfrkgiTVhRk j=mis>O#_$%@E@NW!*~?KC&fbXi;&MOyJVG)_2ce805P3r literal 0 HcmV?d00001 diff --git a/.sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_vendor-prefixes.scssc b/.sass-cache/1d21e5e780fad030823ad74a2af6d1a27bcd8d48/_vendor-prefixes.scssc new file mode 100755 index 0000000000000000000000000000000000000000..f298c72de03adcfabdc350a546b6d028b0d30e91 GIT binary patch literal 53003 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 RaKDIdALS*zHwT_A`o9RH!~p;R literal 0 HcmV?d00001 diff --git a/.sass-cache/3576b663924608e39840956c643af6db831a264b/_collapsible_ui.scssc b/.sass-cache/3576b663924608e39840956c643af6db831a264b/_collapsible_ui.scssc new file mode 100644 index 0000000000000000000000000000000000000000..ae6afd0274e016db4425c26395b1feb82d4f4760 GIT binary patch literal 13015 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 literal 0 HcmV?d00001 diff --git a/.sass-cache/3576b663924608e39840956c643af6db831a264b/_display.scssc b/.sass-cache/3576b663924608e39840956c643af6db831a264b/_display.scssc new file mode 100644 index 0000000000000000000000000000000000000000..9a9916e548ac5ce340b3bb8d86250d240661bff3 GIT binary patch literal 7026 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 A9{>OV literal 0 HcmV?d00001 diff --git a/.sass-cache/3576b663924608e39840956c643af6db831a264b/_jquery_ui.scssc b/.sass-cache/3576b663924608e39840956c643af6db831a264b/_jquery_ui.scssc new file mode 100644 index 0000000000000000000000000000000000000000..0e380588e32fa2b1c5419233f793cc6245cc9c3a GIT binary patch literal 90435 zcmd6Q3z%G2ai-@2l4c~2WLviUc3ZM7TUO8XJT#KJjk&UoZDAV=B-tj0C_UYGW*YTO z58XYMWaG^Xf&-h72k?c5*?f=y0X7gI-!3G)5+DiLkie3VEXjtD0Qm@H6T$*XHpy0< zS5=*RZr|=6f%t5XyY4-wPF0=1>eM;++;e9pW+$fi6>dD5G?QAl@kmlQ+D#rwZW>!i z_Lrt+>(dJd57ejTYSS~bQwy^PtM#dav-R1zsp|gPY*OD}TNr!lrdIi~qt#BQTt3!L zl5+XEtycHht$MPhJRaAU8qIn;S$X)9R{2U^==Rp~at&B|W z87u55yzn_|N&8IU_~F9sM~@cnY*&|)Q?2&N!qmipiK#g#frV~wt)6K&7MHq(>C)8H z-ol~d$L_xWxko3ur@Mt4m%826^5o?swbs1}tKP9zZ5Eo1TC&nf z>V>tHdeSa*my*JLhmRFn?ZRD0?kzl!v^$N~N@3cT>r7xx!FQt7UYs;+j8Nu&y;bW> z=*Csk#}7{)TS}H2D~pqdjvO{+A8fVjN7_lJ17<(dOge>Xy|vl}ffm}W<-$%f!X4Fa zvf8Mf1S!!T3m~GayVFY50d*G}-KDj8)ncc+*6nta_T;J6V%^m*cAzDYLQ62Yp}gUl z$I4@I_snWi-n`OkFIStD4G*6Oowv|vCM#g~Qu+KCqykfP9yqa5SDR~#jg`)1Yqi=eCLm-tDXz9#lYr!;+nMat zpk8fxetL2h#BWraoyilrH%|bT@a~4n=rOQTV|lgJ1}nG91+Cp-a{(OUP88=%r<*Kq z0_oe}7>9TM(05UICDPWoom87AzDKQH8g~F9ClDtmPF340fGp_fO-GaN22gpa+F5%1 zygU5}vDQp5LTp8&z;AT?z35oW&B6rQya>??&_ z6&os7f_*AmTa|62l?z%L?i&E^8!FowwXt$>sd9;B)~f6>Qka;kqc%H7L?)e z&QY`~8m)4@tzNmIRN39D?M{XYb&%Wd({0M z;eIu?%9ZbYAzx9*r+65fUlDftyP5Zw#rS2-pxx14ns;+fRKp}{M^z95FUw|b&;W~Ey_UEZ{koWcPBKwH7q!~8ae`IUDl*agfT z-z93CZzU*Sst5l-6@z~xetfsBLXvH_n#KnmciDv(VhB26(~x7%`*o`FK(*bd&g)<_ zj=5sp>i# z7m(UvZBo8Gh9T+1BSs+`ic6I(@m7dEi)+<(J*k&qkX>xH=Bv$;?BY;M)WxEuR%O33 z)%XI4zJy9CX%84XRSsHfRLYNyRx02x04p7(*Buh)o5{rr^OW@_a&|ykh-dm zZU}K9Ed-ZV<*Kcft1*1uni};fU)?KHf&%6QbXUoKO{-Ga1jF*iR%Is+;v38W3A7$> zLgUd@5Jv3%3)4KuL0gD`c|)ZfrmuBFk*W+lj6@)b8M1RE%589$>k-TnN}@r(k>S;v z60JN#v;rf-Rq8)5&&?ulxe6pAgCG?<#K1rUA!o8xDVia3%WAb=hv823;3kM3I51Ww z)#$gOq^_#LuTrW^;iz`C2hXd4{Wd2iQWuEErYkct#)TLVG9`mqtyetqUeUt1Yhj;I z+{hA-yw4UOJvT2`+c44SSIuiYHLn51wmKn@5`%XorDli$sVNyaH9sa=aD#J2s%d12 zM?Rib^YY@UWd3BMTbzek7v$^hYQ3?h=1ADBd7WGEv@U?2S38-Iy2dt%DN9=G5ChU$ zGH_b|v1s8+*MijA$P$nIi7h~#yQ8?=dUQCIuk}>E7L>fg34|006jV9HfK-+YoXTGo zEzqzeRW`E3BVS3YeBn?XywlTmC+J6m3sNqX33qUa0ck54IBmb}w8aA3tuh|0jV$rV zcWeRb;EU(0wUdkO7Az3K$^qnhAwM47wXm>|j##@qop*r@mpO@$q5(D7!yyKwvt(d( zjy8>mCdjO^i;XaGG&+*jdb951kgk_Zt)4D)TFpkiu&cg+|D+Ya&Qtt4P?cgBQU%*) zxU)kHNO8%)DSjC#jwP~!m=Pw9E)OWa)quO(S`8^by3$(F>8==>uJ`o49-6<%^#W4V z3&D;KF(7><1E=pE(icn6=qEec2opy)2lU-RQTueUvjnS;r;Og^>*Rb#Pnhm)bh>69 zi_5!anWppbsGTKwGhZ`HdiENwzQ8mJLN{2hd~v+8whWWuZmWG_ZKcuez^A0lwsEa!<2vUjrj78@!kud?wQ94u6{oPH z?ZtVO(!=}}G7svTic(&6K;=%*_pUfPFoIh5wCf%r&&|F(dU8A*>!M)omR-yoPjuO! zQkMklsUA`xx+=Je0c8mBFb)Pjv_cxlsp8yy|0K8YU5(pXV}K2uFnE(^c7J;ZBWXA zZKNaPVHq|m&swM5b_$(#_0p-ATZdF3h@&buoK4m@3aM}E!8(o_BRSzBB>T;x0hqY! zMP|FAbx*5u@5ah~kDXU}HvD&gsdA*G-800C1|qZrg*W5smFHBRn_XGrI$b%Kp@gI$ z-fNPaLN>KOSynehLUyC)&No5}w4#XA zCC>gqbwdnDUCF?y`)8ysmY{jMOvsEdarD2Kx^^XO!ycuLUD1M-EU}^m^mUu`lbk(+ zFHg}^BvpC5u?L0{^;53n>;dUXTck#Xxi&mJMl+;A*Kuz4`sQX}e}VH2q%IVVr4~3s z4CslKWZ?Sd->7e}#8%gY>>DFY9Q`}%8@pn)Z2=w~7Z<9_jpmsU7_Z!U|7x-V8SqMH z=iWjG{#WcI?M7gNwAZu2UJ!|f0;Kjj0fYDqF(4aA2F?cKkux)vxX3jjZD53nqpguG zLA|}cWuBs^cM-(6#tDTKCDlQ_Lkvi7$-wD-4e5;~Xwoh9Hp0YFA)xm<7J4Q;r6)j! zE1l9vkwihILkvi1$-pUHBBim!<+dxmwGSgq98Cq39&V{;($jYmn&08{MT+vApuQmn zq_1S)^gTrSVu_10^fki7(QQs&dYrh&N*+i5hvJ2de{;v^vBelX9&YOOfF1$+#!;M> zv9jtx{Pf`Ad$U`HSCz*b(-6MZPZ_?aL4OM0NYPpd8hisLcs8hwtDx3_=}0J~jZWDa zu^3-xtf9<<$r)&a(h8(<7Cb@>sEZ{7*TqZJ#aJRMoiM^cn&!Hg)E#g&e%4cT7TTqU z4oHy{K`e(DkfM@-Q}hfeiY2n1Iv8Q%=+Tg(*-LmCt62LyUH1uHk)kE>nPp)HrY z4*@oU$tgx61ruXW0En(i78zX+ikfAh272CNc$X1}K%iTDN z)YZLV8Dc=Nlnfj!KSemg5;RmxSQ=sC=now%S&$t#_T1v>dJ8m7aTckZ*b`zvx=IF4 z*S{oPu|!tvF~Y>r7XrGD4f<5*>7J@jhnDH#2vU@o2cu1h0jVk(I930FRK*gM5Xf#d z!o<-(22|DapHqCNn|QEmb`PrWbb-4ly8=B?G7O$WxrNUjk0rY>fGc%4pLKc)x&jak9U@%pCR`d?zr50=w6~Wa`@l#twdd0Ux zg9lhJv59Y3*$<`{K``|t9ES~0eZ+B^%WMEM!xIA544Ckc`VaWXFnS2eQUFG(=**9> z-|#SO8z`E+B3tPxtg@ZAqhMPXwxGj`HoRz{w_pnN-DdmH#L?TJt?dpPNagG;2r(e^ zNd^vmQ-nS&L2DWkeMXo#ns(?TwJ)H&Cj8*Jx8k>Zir)@$&@*?Wa`KuG15#WvaEjkX ziem|i+fs2OOdQ=FP<(T3t=$Q$yk)heHoc~!%pIP(cR=ejh9E^bRxq%J7?8S>fm8P= zsf#7D#tq z??PvXRR!bhsxtC0e5AAA1!c+Ek)p>C+S#`d>Ia;n-EEC$-1~0ePTh`F&J-=gfVy2W zaNYhW^%IuJ>UJXxJhpP(PKx$gIo&)}f_)Z&ZE%M@bq^~Aw;Sb=%0YRE0jVn)ICWn^ z>SBqkRVTx(rk@aJ}|T>NPBpg;OI;9Q|L`YgXS2 zjlT1(ZnveMlX|K1XjtXvcq%^!B)HT`jFcR}QxEAv3`k|kz^VMSr-~-%8Lf0pBTO7^ zc&eK+xLoRfD|sA!nJg%AF?Wn|ue+#xlgi5!h38&s360)AfLBJ7N79RED-a)quVgNv z;j3^SJ5_PKaeQ#60UVlqOjQORd5dUX^G@zQn#V;mO6riJbkH^rKC6C8pFJ*WJ^+-Q z|BEHG^Wn{5^_H+QiwEEH+X?KEf)_8&7iI!2BfQG;B53(?a(yFA z9K9f*>sa;{mawWn;Hmlp&@wF(B1I!YP}L9vQdKf=sxFhNSRyO=HNwQvic^&$>TxT1 z9PK4`(#v^7y%%S*Z0*UL+_C_hUC6~P`yAGfw?OL&aCo8X1t7jH;e|wO-$Z0AHQ-~7 z8(law`Ged?I5Ms9aDP#5v01g!Ge-NlW&gXTW1!D@$3)-g1cnk;QmX5Pb`t;*+!T+`sD!JUtlGVqt_5S zX&?^w*=&4!c|b9}SnR{vJ&DT(?R*|4a3M!7>rfh@DvvkjGeGN_zbc)@FzJCoo)BqZ z!cHIqOe+KcQ~i{{oCom?|?blOcv~0`eMKdy>VE#J!>#oR}itI4N`Kd zkxGI?3<#5wfy3nI2t-%{=0U-c)d&+ue;UB#ypiOEIiIKt!-P(3g?rcN*lWw#+v zHf+}#P&O0{Ehv%7N%ukw2$Yh61LfG$+{_G1WaR}$m^j+}GzVKZGh4Kh$I<^IP)g%) zP#*9CC3au|p7N}uk%?opx}~h>0~3O#U7yf7KsGR&d6?)0Osq^z>7|fS6j({67DD>s zPY?OAHF(Hx;-IQL-e?-&!zm%*jS-%DEP=^wJ`H)A)13|VkUza!f)qS^^V9>EQgTX{ zYC>6Zsb!$#R#6e=x6~W>woGuBZbkyKV$o^*Y6V)LZOKT{mcn4Z9b!O!B^fxsx}W?C zOVD^Cr%^_jI64yWtEQDajt&t!X(8@cmwJBX@L~N10=U2FJm@#B;&|gl>+u^^8F?5! zvg2O_cA<_(%3myCIEB4k;<87g&0t`O9rmnAEAE2 z5?SHY2op!A0^R;1D|s9(5j$z0Ufu47<3YRKRUB`ut*6^nW#nP_$ZlT)yHK|yHB`5= z!BzD8Bi4GR-yeYnXnKuQ&U_=pfcjlBaQ*%ybrhD!>USed9KA8n?`u}_IC>?qlLq4b zeoMgJ%kv4GAef{FQtVrEGdPrjtEr*X%~rF=nlm^Wx)cA*Ib7xPkxsH!Z*7LdkJNcn zaOPy~ggSe0tcJ&j;a2I*S~?T}-iCx%A4~8ur9H_D-+n~a1J1)~HlZp5kBsy&OEZRg zrCH_Z=E||kaZldL1EtD?eTkSJX(2^4BcT=1swzF>3?PR*<58e?x@1ew#Ls6F9^Bro zy3$)Yy;dLf2nT1bo}R=dsKV|#9M;!>;}JW%RR!TMk6F|ie|Zd=r8C8llFI?9xlo7! z`HN)W{N=L*a4eBE7c#=c(H}d1Aq!k!&Y3A@P5n0Q4?XmGv8V8hp?%ssgH+B#pAZ95 zSTb-5e~A>v5)^}EK464_M;rl#2Y$}}xTosl&@#nBq;kf<5Cc+GGH|MXi&VuDS+URv z6Gz_;soGghs`~IQ58fGB-hc8`{ZB$wq;gaZF(6eX1E=anT3*2tS*jXg;%L(b>(B(_ zE9^-P`hAUMI7@UX z!KGvZEI~V$C9sV!adcV01XrrVc3Pd&#e5r#FSe^^I&dgL;K|U4AB*4u&d|4;*rv#w za2Do4X7G48JKRKeP(^6#p)`cL2_nT2ybx+ufCvl&KTR0%qY+%-POiut=!bbQm60X! za4MIX%2*@|{#GP-C>Bt8@P|bseprGFd{J4E6k&r{5A$F;BTM4pbiRk_j773mmaRze zfXwNP$qkOZnCH0N$Dg2RDMx&s>Rpqa>Zv%8mFZ{YJZyqD@*|ke z|EoV>2ATN44W9WZ(ocQZTyTpy={c1BY}x(%1vt?>km!v3s5QEc20sd|(nY4AfEuuigAKfU>^P$J$XvZ}lQj$Q7Y4F$!*b=3 zm-K@hEHpfBRBeFFOAt4T@Nn}Ii5n!z5ISWZ2sisexOu6yy6wT2LNg3ENYdLhVcZ0H zFx*HU4mVG-UdAGsxG^HZ#4?1Nmsky8X3028b8+0<9f&u2iM{6pQxp+_2>>Nlo*cmP zo-d6&(GSe9(10+z!A;6k6Ns=U@@9^nu;>lq!NXY+Ha&yf9S~MYjCy-M@dV(6W|1R5 z2_!tLHjkRpJ^`oX*Bag6g6gKy#Qt=eIr4IgChHF`hbEXmAW0)<*dKyCm_JA!&L2L@ z(2GSf{lSO?6UUH0JYhA6qfao7(p20ZDteK^^NMAdfiJ;QOYr6yIMqJS1u`~Oj{KCu zd~jdCYE$tAz+$-pVNc5?x;ApjhJ8N*dJ9EP?|$SF7bdNWp1Mt;uM z`{$Gd4);jr3u8H8;fLiyb&pmo)OS{;B~T*pZ8V%d1#zg%HTeq0Eb;Y z$b+dYc{r8tXDVZnOjkD|!K1=}%DtY8UeH)kuW`&bTQ$9;CKiB4UgazQDiDK>=Sa#o z;nO$|@?gqK9!~imV#;HY%<jno1o#->7Y6CW2hX7H82awl+<(S$?QV`Gpfi>`=d1Ja4K!S%= zkG$R*%jPk!hZb0HLy}ha!T<^KV5pWn96)}R>4il|FK-+(BE`|W96(6ryyFQr&6NW0 zQ;xjB*ZU110lnS>_w&cGAP=UuS|RRdigEb)r#=C`Yp1nk@UM7*81$=)$7Ih(4N?lw^}RNetxU$XC!Ho5FWdNJXj}6 z9C>w>s5B^eXgz$9L17sg z-eTq5&?1XnNcJ0hg1lI7N?r~^@9>JyGM$&37}4VBoen~0f6V$d-ypvR7GS{`$sxzA zAZs>eA?wtbRq4AcgX~#XBKve#y2JTLg7rPk)Ahr{P>>hvXDN$=!XJ4>GNTFBSHsY! z85Hak^zs|LF{Rt8o3}5r<3eC>usXqQ6MUq!v$g==dd7{kBky66!au#rwPMN*7$zXP z+K~lY(XCllUYK|f=+A70ByD2TBMS=?+22*tUnbdXb32oC!H3AX^AK>$Z9APq_6QBDDeCx^8GoHbeXF0?qW71P8UD z&u=KBO?;QMnUva0r!Id!gisXLF+2ww#t+ zVz+lF3pPXho8b$s7d3XdPCL8JTu0czW_I^#roT`Y)aFLn3~kpwyV~rP%}l1WSyw0v zYPL@{IhSg(-%u9h&H^QN&+vgV$ejgB!8-!`VC^g?gz17 zht}A`A|&ZpsiFNb*bKclJ%Y_p_IY-jq3`jiW@!EqXr{j)7Sx7im#EEI$S#A;u zNoSYq3Sz+~nO|X(Q_imf2DD=uOK9BJIKlkp@wHtkKz1zuKyvo%a-XA^fZX@@;GQ4E zg7P1fE%;%wM-U6LV`)7K{B$R9I*0}9d%l~l9}Z$cUMxaMSzHi%%9zximNmR|4C{kv zar9JrOac>BvlHSy78r5#x0!QN@x<_5RO3ljLoRml)xIlIt9|`U>4OWz@9%R0kL3oO zz{7)GJAqfVVGi(qoCql5=2m6fXypRyJnsjSvZY}pDTL|?JbMWsbDfVb5^veHP+BO} zLc0n+U=41Y{{XbdMoc8-GGlsyILL$bp5);`207Ap-fHGZX+(;n$q>liZ#94qqA`xr zZX7b{Ckt?jJ08go=UeKH03uOB!NSn>IgHM{M?4?#<8$r4GL#f76&kOu>fZ5~002VVX z1h6*o*W2px14sJQK`s_Rq_3uEK){21=p-FoTXC_hJhXij%ClgFB*Z%LcE&i(&vVe0 z^DOJPY=2qA{T8&w5Qij9%)^Ka@?eOQJRIU)#_)kfG7)D)ilZkS;z<1-kMXiLFaNf$ z^KV1zY~>wE+RhW!Immj`WTfRle)!2{T{y8Yw6@*f8==u>Ya zNapQf4)S2iOCC=74>0Ai2%Y8c1y>_d9Q{T>`Run-MyqSxR$x5&gs<`^pmDaX6G=)# z!~GrP!Bmz!oXWq?RK_Bi+d7R%ar8d|D)-v6K9;pv{dat=e+SxU8^4gGi^DE$0FoVo^u`U5uKxP%fv(}prXq-$7ezO ziOoqe`)Z1o1vfx9?4^8G)m8#qsl6og51>3tGLfXmq6ikb|F-ul!21I5{FLoni^oqv z6D$fNnU`e+c`$fN9uA&|7(B5^W-u}$!3Uv3@caX-K^)C6j?z>J&y8Cun;wQIQ`b!H zDcqrFFooM&%~rc`w6>HiCxtze%0Oe4&0yB^5JP4$=hLGZhh3lu4+NhBJ21CHlE$=DG|T}(z1r6AP&yE}D;flUYE5Uo{!gJj1_C7e z1woJ(1A*k_K=3BkWmqH=1V*$tdUFT_pR=08(W@9oX+I8vy<)jXopHanAg)#6R7mql z7Yh>@ven5TIV(V)9~>iW1qf>s40T)ze=lOBuZHCM53IvlFsj;s!_S{Zt!Qx>^8gn9 zLRxKi=?$|r3e=DNXbTIrR1BzvKBicCKK6Mi&wLC?+E$=_3_7@&{nb|;XfITO7Cnjw z+rU-rYkzJLYJKg`p%;^-^R*T^8fCJ5n| zI{(5~{V$+#Hv301Z-Nly!Bmz!oXX#3Dq|4}rrw;$h!jWPaVjGUO?vcss{wrJfN_-2 z;o)TmZbj`jmXp;+?IgU|P;cnZx7bJm1C2Oi$Ymgy@(1bxl)uoASI`T_=oQS_Rc*z^ zvhuv*3s9bU1(I?FPJ9b_sBcS-{FODM^?|>FRxY9`9Fnvo6;3vSJQxrp4+n&+x5#F) zJ~0V0Dv{#o8h6ku<+~f}O_f0R=tlEMz!cO;!xsndIyNAv+R$rX#DJyco4r#g8l97Jvpl{HIOl8T#sr+)LG8V~H*@zTJuL!8z%R$FW1^frroC7O7 zf9q@hw;%%>R*;krF4Nl_f;^b!l84j$^-Oatk~ypxk>cnLPIH!De93AMM<*Fa=@vY{ z*jVrP1#44Kd-Ye><<+V-IP_Q1s}ahXTe4`%# zQd+tJEDio>0jO##E|!%Cz;8f#stv8Bw>q&5q1V_knvvT5lQpi5ApZnyFbE=<2f-i@ z76K&?2f>Tz+qffGBol&0q&V8{X0GIQLuT^d^!5HGNWe0AB=a))AP=Uu zGBbH2QXE~+^tLJO?g@=X`0RB9zAb)cZ^2&Zz=n(!Sdx)D{p_+GOL@(*n&hKW3xMOd z`a!mwX+th)k*#VYm#iuN#ims$Y`^X9aC0H_s2cOOZ?|>}q(+)_=eVb_u1bHwENFL4t39|qe zp*?e+1&l~>v=Fes4)d`VTf2}Xk;1D5K^{zV$-`;>GNw5ep>;G*b0ZS$Vhm{BBPYLD zuaOicW|L+0ComKHS6}~s1xeVDiX<&^hxHHgVERiQPXAwE`eTvIA=QWkI~tw-EUWvL z)c{^XWgKO&6gk>AsK(P+4Vkcr8egCq+gMg7mt1*`t6YVVUv_SE6(||I_|22R9TV01 za$}{ajs_{J#}uls{M;`!9$pfzH{OV%k-^7AT75RvH6O=K4o_Hye*#+5G7nKtz-<qKpNe!2+XbX$h){qpDs$O!mNFDDkp@RI|eb#ib4=b);9z0l z%*>xgU>*Ldsh)qrSZuK{iQRvyQD02pBL{GJYSMy1n+I7(O?YD!W^iD>hWFeEhsSZHzE!)<&=x&7Y8hoXhqB z69fA|lU^UdMb0658q%~IAhiaNvl)RuBn|CIi8hRQ8sHT^G0`+7G(De@X0f9L*k|WP zlCAVfL0u+mmZI;fH{`a_26{lVerkwjbw~e>Fs7a*dFW>QO?pJ@@ZOYYbO>z1gCYwG zT^-;6KlI2#0YVJd?i znFbr=hlMyqE->(@GMR`}cNHQR9U{pv1MlaEwx&z~S1{w=ZcU=-oQF+WY?$gE8>jjy zrn)NQ)T+qI4z{5Li=)$2hMW;VR};G!5KFF|^+6rS%q z*s^QibhTEispLa!lZke?0B45)xFSYHMdz%2WwBvHg2%=U314H;Tb0Qi4Xt2t^!3n? z05)@>`hPQ~p6z(3URTn7`4DJiNxQBN0DvF*Z#q?iTLK1(Cf)l<+9eET_aB^_4}9Mx zy22UH!T_!a7$`aq1{rJ^3_Lat1{cw`QWPfp36s97lA`UjU4=3Ou#tno(->3Fb_fIe z*3Hx5t($bFUU+P*u%|FOU#*>7Y`5TG@p55T>EPV#f!PY)c-*~{Q{LQZG+`x6zL^tU z?F6wVg)5>v3rM>s)D%(e3E4eThQRp+(as?N$)*XqIzSPA=)Y+|!Y!eJqWvw4kh|Nl zK^^R>U$!$l^>JxOUtn9ut)fsfyty`Gwz6vojp>13q^pCjyX=6FT3F54>29j_TE@Yd zk$mI_2m09=J8Kzjtx0bTfQ$UG9~SaIuAVnflFqNe8yEwwOCc4m@Xw$`iq3iThlPyi zS-`7m^aQ|XcVQ=F9JQ$o#XW$Bi+j&yOg-4};cuvOmn-lgfrs%;wCG0k zKAVsCI9pj4955?~1p(_UsvXmyZPs6RhBCrg6itgugN~G=yOKn2yOG(_P0q*`;&4TH zilXKI`_v=iD1!}yi^s;n<+ZG5RhdjrQFoQ6ye!C$9ZKMem~kmOZ^o6uhRwJsvmR4rGGUe-IN;4D2KD-Qt(Ht|)}{oy8K#@Sy}WOncQn63_}gCF{D8hda{U{BG5Js*?vzS{ok zz5@pX^S+AfF^fI8BCx0EJnUt#AtOW{8;89`1`|~#6MO2e!rqd@-g@SJx1>~uE8ihERpvz4p9d(Q&;D|vpQbJ%H8`4k(4L3Zfmt!?dX>^bMx}cd0sB-g6G6TxIEz4 zrslf3=Hs||sQ{D_skx%%8pyd%%@3g+>>NCtxvC<=r{=mk80nBp-uze@OwIdiHZwIh ziuIG4_t#QpYR(kIn5;<;3vf}S=8FElNX>5>!Vy?%uB(IEx4GUODmBj+qi1T)#K1n# zq}K;?t}Adl_uV2-pyRv&CWW4h9odCKG$=t_nfVbl6)@YJOizb+{r@ zb4BN+<{505>K+@X`f;YZDnrr5OU>0?m6|``RA;FMM=KrQGvI^hUMIcxEoDg5Nx62#06SdUSQo$8qx# z0VpF9b45!}IQNP9bI}gH6LVE$_{3aS2O~Y#rEY$t3?}CNHJh238^!ub%=>F;$_;WD zk=gquOhJsun)I*$7e!*O=Ww*(9nO+)A4iTU*0^ug)S zn)&mb@hlABihzNl^I(v{hQYvN<6!WQtjAQDOc=^HV%8&(p%ZOOeXfMU~#n59T>Wv#QX2nLm@7IjG0$MbRQK38 z)u);2stiRJFELklRboElRA-4fz{9!SMU1Hj8#X& zg?o#{yj4r8`V%#|>*eAVaHF8IT%_bU2q}J zj)!nXjE9QO8xJ$sutC9N;|7JdviPmaWR8dGuFA#U78(@5W-eI2mNE5g$Ak5{Qu4+S zXk;n5t_}czANp@PErMGD28yOZ(}m??_N%sXE5Y3K{@Q_1TJ%C^JPQN3B4D8CJQ!rK zVKDI6I2e42^_VJ?2?KRk!Qc-=FaR4l7<_~=^=!vsaF$Z?WW9xFS+=MdzjD8Ely99vkO&Tj{jkNR^@J;-%#3u1d+b zk$C_%W*ZB@!@1o*FnfBi5$QE#7Ou`2R>#XYL>{#wdR%b9{0k2UFG0WONPT+uz!@`w6AnJM$gCiY$C z^x-G4lRf;hU*-``YeRSp%inc%u+N%y4KNhvXW zH^@jA@-;^0bWkKxMcQr0G)8!8(t{^lSc7=jQ}=X zfGZ+hP;_3pkimwHnI0QAX1gv$-@I(Ji=ZkPl06@_&-w|IeXU76vV2=7!XC*3~ zAfU+E%6tM(lBNRBkzVW!XCVMr`0KinqUD4+{TwNS4TFHk#zEjCthZDddco9#fVvCs z5y#O-9RvpOf=m-Uo-zSk5niC^JTJ&#!%X0@aVGdQGl44O)bn3_Rdn@* z1v#gy^8l;k<)Wev%voHWy{wKmml5tQCTz|AcQ%PHrekN=EwUjwoV+vv{ z)})68xF{xTiuNaKaOS_AxPR}C(S2eFM__X>T^-bZ!u9S@lb?Jsdd|U^7}y7z^!flU zit+F#k(Mc;+Gbenckw*ghyMh|!aNPgo(K&JU^5r2&oHK*?Rc=hr2_|n*SurE;VT9!-6dRC2;Mzozp!SfG5*0pKhnv{Pw@!mom!$=RUHJNPz48!V+ES@>gtM*J>}IydcQ*M5T}(Fo$`Ijn0A9}gEFEU zXpucPfQ!Nnei~`{DFERHy>g;``$F)4r2~zHKU@(xk)jE2_}nTz8_QtB;P0_<@c$4) zsw$J26REo@C;BjnLpc%H%EABLjHzcc4*zvMLj1WQf-!r9sH;QA!w>y8Ju84)qWcw1 z_8IgM;^?je2Mz>6;LkhDSq#7x5dsx0)1fp5GT1N-cx)U7zQnpqmB|c&>aGfbUk+ga z4CFBIImXm89LK=2ciw%s(QPIe{KTPj^<<&C*6aorTUXo3Bjx#Iq19HkJZ>w=>8`n} z3~ys59N`&WfAxZ*lEwzb*9?I;_RvCC2duru4*!9*PrCr6U(M4CQ2Fhq1Kk(}I#u0I zBXONsA4O+O+rN_77=5n}DHxpX%f)FW@mpmFA3A1GBGRA+GI+a1liB9CaAVzIY$VFin$TWNKX#wxIt zi&K+~sb@1Dr-nS2^2s4$23tJV)uGGbhyI%$rQnw6ctr;mkL`TvyL>L?8;8)ColB{! zgRXD1Q8M*lIqO`?{#wpFmy)%Nw$`NQWN=X&wWsKty@mSzpVW-*3Li}TUmQLy+~JBi zYERMfth97Skimu>wdb*Mp7!I+DO4G9YR}WuU3JvnOG2Io26CRZ#+Z7Bq3ESaASJ!+THxDjQM!-eUXa8izH#;L+xWE+w7e(j6 zC4&uvi^s;nY9(^=AjtMh{ah&!%SK{ojlh&X?}&fefTgKRb)ViXA1_pIvD9!?8pSEtXwkT&^oe$)Tk)EuvoheKV>;p}DeE=6l!uJlO*RwdgZ*G2i|E$tL9tQJH7xL`D z0$0S!grf5nXEWHajNfD929}*LREVZCS0=1rakPs*e@z)b*vtj*?To2sJ085(wL0~# zA<)QHr*w4y0Q}H@(|JGK5-?CS&4^MHzT9WlGjsc9g0CLG+ZoUH1zZs@P;?#)GT1N} zcx)UD4znIpWinx)?m`j}N6!ku0Bq!7P+?3x+i@72rTr4`9Rd(+BB-kS!%fDHwf>qS zvwQm`bag--{Lp{X*n?XFdx~Dqeu>%Hxr6&c8{FULddy-Et_bWYIuCmpY{&?a$Hrmr z41TpG@wX1**I1 z*}yBD>M#wn8{7dN&h1VzrXFlWx(%6ytMg5k)_WO;r~{d)tMf@#$IDo`d&|RMFvW(C z5D#-0jHn8J^Zp?mo=q=xbR_Y~ zxYW&$l)=Qjzh*NNbE8;4iFto5WhUlKL5#?n^soRIMPjb#?~BCzH->NomYD16p!RRL z-W@72&ljU-V$Q_CKG3As2XIl0ioc2UdJ^;5T6KD^8c57P=mMP`72%2)6%{RGL3)8O zgAE%RJT`7<_zxDvRhi6DQQcLe;(5@kX3ci%$(k(l?_6q(&i%yo4@9sJOL z)7XPs0(**HPh!4rVSZ+R=pdqxyB@RHgDV1iiq6Ac1{*R$FQBsm>B}fQNItyBSjt zHX_M}%)-_AG>h0?#v$rJX6ov^mDTYwR#&Gy9(R*vI5EAO9Nrnd>8i;+_}Rf1K4&dy zpD7$aT)6${(ZZeW>T+_b)jnC6nm8~qH3ucI(Cw|&Gi}`VT$nCRP3!Z{14+BnXsr~cZMn__))agvTJ6P2!^Q|@?$=wj&V+7UHGTZ>qpv2r&BoEJ=07&g=)RE+693Y+O6fnPBOwBV4c-Q?IcKv_JA!g z1y^^cm8t{kE;hPLYxAnbPIs-_?I!KXQ>(?gs}Ea2&NM*^Ey3j27;3cKEKJmv=ckLX zM{yZG@rYY%mXhXb(k|ATunBRYaT-1oIl7dfvCC7}SH>P68@ujQlAKJ`_aYZ&@t?}r zbqk=(5`NSfKO$MGmg>{?V!hfv2^VLkXZFw3_(fNG|4g-785>IpLbC6bQmWT3=`KpR zTCLYXxpJXY85>=$wig>K`gieEGJmqsEt)6Q%w8Zc=;(C=5U=o@&&)OCZz!WEt!_x(5v;Ei}3S`%jAt)#XO>Ou4Z0 z{?%lqaJ0J8*}1pSf&UddNxOk6FoE0PDMfC+QP{*9w4X7GC=9R}?N;ZTiIPRN-f27v zXqf`#u_4}P&Z@?0mLZtFSzYZwE&B^D;cy;^PKw^hLe{Dr^N&DvVK(`uIst1Vc% zNZR3c)mApuj4-Ejj;Ru$3_WBtq?zfES=}KJD-uvdIeuZvTBg*fw&<{wXoXiG`bL<%Y}9V zgGb{LbgWV3Wu`eR^^B3)_=6!WU|7$1O)&wo3psgg2rwYB>~j^uR*LGiaivx>S?KDx z6ySi3g-yaZs1dOzivpl+CCvvVQMZ&J^+pE8xZ*DjCB? zQ3~4S>2(S6F*kL?5Wi4D^g&1hR!>i2?-q8~tDU7rt+mqGji4~VFKXNF*I@LZ-&swn zFhJQ5U?a2+QOm7XcS(&a)s=1ofM12I0XeJK*Xo=u`sEhe)ia%1wW&ZUfoF%&f(Jwo zDO^p^qzi6VF6@5(!p!UxDwTnb>{|OWY7zc=T3rK-vu~|dYmF`dq%^VL2o!va!M@`V zyotN~RZm(Q%|LPiF_3+YdXVrq-=ZUt=dU!6EZJM_a1|vE-uc@ z%-}5(pddl4)>Q$Ir|Nw>BFvRkXzea(R^px;Er_KmB|5FsGA_vbeW2RIR@NPzpz*a_O18K&cd958N=*SZ*(w2tY_%R!p=TZ8@_9Qhkk1S zri4wH8y&5|R4aim*AJf)mJ2kQu|hic=Ut^cUe%9Y&0BN(9VY z6w-4H8}Yl1WiuBn)*Fu~HhT2YiL^;}>P_umyr0eZ%wtMnVh(2q;74_xRzatU!5o7j zP65lVGK)wsX(<(;!xaN?3E-lG1xw@=81$dnk_zrJQ5+pL*qSQY+lmwZL6t{u_U3uT zd6?I>Rv?AZvj~#M>5^6&Wt-3yi>qzO_uFS+Hfb(&0Pri&gC-;q!;%r+Xvl(514AoQ{`*>Xw=HQ&k&$-#8NsP?G zLv&}+5E&?GoWzt&xrqjB*te`pcs>EF;9t)&SoYi+X4k&yDs1=09#jy{u*$C4{Rijf zO@;wwCnpOcP|&OZ?g)GCDjl4gJ%G^@E9o|j=iz|FrYnGQcYy^SnPM?^e$+7<^cupY zWbj3KgIrxT)jj&-J4k)cmWuU(*hCViziuGd*ecWlk#xQ3~elN`tcoEf%hZI;TP)l#ohqIAE%#_e%0yaA6!>g1D z_~5sTuG;{g-=aQ@s9$rcvtPcK#>BR~p+_GV;cOIKC9q2f*~cVk#@3?n0={FIHTJ>_ z+O7=Rl}}H#(d&)%%*MSU(X+??=Tt zeI=J>+u%92hu$tkie^M)y`6-L^~mhTDFC-HY;b${HDxye%^myy DGVLz@ literal 0 HcmV?d00001 diff --git a/.sass-cache/3576b663924608e39840956c643af6db831a264b/_main_wrap.scssc b/.sass-cache/3576b663924608e39840956c643af6db831a264b/_main_wrap.scssc new file mode 100644 index 0000000000000000000000000000000000000000..d9787dcb6a9de81f40f46c389b5fef0daaa566b9 GIT binary patch literal 136408 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 literal 0 HcmV?d00001 diff --git a/.sass-cache/3576b663924608e39840956c643af6db831a264b/_new_term.scssc b/.sass-cache/3576b663924608e39840956c643af6db831a264b/_new_term.scssc new file mode 100644 index 0000000000000000000000000000000000000000..6465e8d09760c34e6a28f8bac930d5dfc8f20db0 GIT binary patch literal 5735 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 literal 0 HcmV?d00001 diff --git a/.sass-cache/3576b663924608e39840956c643af6db831a264b/_variables.scssc b/.sass-cache/3576b663924608e39840956c643af6db831a264b/_variables.scssc new file mode 100644 index 0000000000000000000000000000000000000000..1191f8a74c4675ed36c5aef94e85c36b67b005cd GIT binary patch literal 5891 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 JRaes|{{a+HZbAS6 literal 0 HcmV?d00001 diff --git a/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_3rd.scssc b/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_3rd.scssc new file mode 100755 index 0000000000000000000000000000000000000000..8b6e39385959b30cb4069c0763e97af7907cacc3 GIT binary patch literal 152139 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

C{*6nUKX6YX2-p27TRH_{jz1=U2bh% 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 literal 0 HcmV?d00001 diff --git a/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_archive.scssc b/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_archive.scssc new file mode 100755 index 0000000000000000000000000000000000000000..2776df2bc8b291bb535c3e76124961eb320c8fac GIT binary patch literal 19674 zcmcg!O>i7ZR<>$~R(DHk{n)bQ{~lT6zj3SeV~_2s8Bfj_&x{DquE+Aude(=YQg=xz zrq$KcRq_uL27=|f%Yo$t!E%5j5pX1c^AZ6^SdK(+V7c&ff(QsAcrPn6U%l#VwR+6p zu*1r#mtVfWeEITame!ZAFR$IGUfvAaK{E-T2Gz|Zcp6+OH*c+9_qVsN`){qZZr@tF zvF)$i3bt;pt*+h(*4A#{ywPgizHzI$T7InE`?wKsn-Dqzw=qS1g@zihc2Tuwci{<*&>eYI|E!=zLmPPWS8@Lm3*alLs z@Z<;}ZezpW3s&4I5p|O=>cn3i0n&EZ3BrOqC*o+o*9;mxzq1oW?m{}~rhEvz;nR{k zE#k!QC5>(rNA77(@*s*sgdO)PfHx_k?d>>7;KwNubXu~DHz!|uN5dkFj2vw&j{SQ5 zy>7Q1Hhsxc{qcJrKX_1o?(cQGND$X|lUCG>>(8QItJ@3WxZd`YU^m(e>d(5hX4FYQ z#(KBCzY})idersXwE&n*f?Bs1)j_>M64&D<^uu@Qt9rxlfrg(3%lM+;l^%hD!o6

LGbDS*hke!Tng$On0k-ERlzvD2s&_!%8>YFX)4$}lIoelHGM4SWrFi^^x@ ztciNAi~j6y24C(6on}x3U)c-xwt`;#q!77h^Te8N+lNo-&b;rF)oFei5)-S`vmOsil5J%qWf_Da#;7v!~Ov#&#$ejz`u}rJt z&98XJR}`51PvM>xv68&Ordt+o9Hs~1VGHoYw0B(00MCiP6^BP)P8TBY?6h|dRX)E= zu3g&={1&R-J0E$~qEvymm@3S>kgCL6Dtd2hEFQDw-LYSB>r=^*a@Ctj7GKN z=ytrKQ5(Z^Pe?Dec$4^u^_bTjxC`l`VdN_~cCLhzU>Nx$cj-y6F3nbKeErn#h5lAMn8eUj zi33>KTYm2a_HmC3z<@=e8TDWereQlra!SBT-gv4&^a_T`tK^hd0d*}H*|4>!dG{tE z&f*-jD$xc+O5{LViDNI>NaPz_i;5>P_N$r|QsZPRjJs`LY686_>ocY8c94l%+Fzz~ zB2R;mGlmgt9n<63MYREts2sqE`Xe@iS+qPZs^UeA{g!5dM4j>5;ZCOpk$X>OWqENY znhIjUjQ+hPJz%~F9m;)Gre_{kif;lq+7g+Hk#{NJPkigS> zu$b)z;m&Si3kl`7uCsMXi#wYWcNT^}YM8;+f*#8*t_^_1S@9?gP%%2j7R}NF1CtGi@&yiLtoe6rq$zEz z+-y}miLsw)0+M(-37#i4Ic06mJ8-fd%gKEVBqi^~){xcA20-$103+`|8F`Ul&}3D- zh_RoOygJP;bcgt=-l?ZG0o>i(YX`VnFX5V&c84uAu3vH2ZwBZD^P{`(xN%?E88H+N zci(xClhlH(k`_uv1-XaNsfjhS=4;IjYb-jRv*vLahn81tonfQ)P1%&R;14mscQdtfN_PvbyYMR3m7Nho z;c)9NFzaF~Z{2a4s-p*|lUg|{SPGWHNYI%H)fNe9@qFPp)dGbB=QwhNZma}v-ER@e(a}49-duf zrq@89JgWMX5LurlYR4#AI^sR*FM~_Yr%a!ZN&WNFKxa*w<Q3_5-pqQVhzS6jQ?aP2*$~kq@!nuHMep zq;&58dQSA$frAsqjj+X&)V}rB20$Wn03-5`No1rT?egSbF(aJcF(T8vIzX;U)TW1@EpJx{?Ex$NHHj&DrSW97Z$@`(3}hBj|q-z zC~NpreGzXv>ZR4*p{75X4|t|)CA>7c@nJ5hcqcm}hQi^-zXZA=<710wy@e;4csJSg zTP?kVh4S>0tsZtij1yJE#sfjfPH-m?BhH)U!A0$F@8j_a5I`9amNR!=boTe45S~Q6 z#(pORfFn>dhU#_%r3d!3BBEXh#dW_8dzBT)bw2=6FKg2&r@IW2k<(#|c2cnXLnauh zz3=gzUf8Pb>?csLsXYr@$*xSFA$gE*8tIz`y^-02Z9Li=;&^YEbws6|cqkdbDH96g zmgUCE8;Heu@58cJOKeQh#NkYtiSuvd=}0kX;@~@AN;v;+CeBEU#M-KDk+_mG+Z7mv z771((StM)#Br*puA|G+gI)oGyj`$*>m=VsHL$=h(*CoxlaQ>Dw$R|`bnVK~8O*1&J z!e=AP*=%HqVG6c`baffFwM(<9GnwGh*Siv48$G_9Gx0@sMhu0+RhAiZ@oQJNcScrJCzC7=`8@wuV#{Z2%M$Ie>ARE95jtF{rGlm=VrZ<1{o+ zhSiOyuuNWqTL{w3ta7}Z6M7kVIA%NvTRf2WrBgNl5}E@Tp5P_ux9nNqWInK0V5;kV8s~rFO8L7R;F~S8}#ofkDWY z*c#%%HUNrx9KhJJLAFGSLAF%P2R97YF)}Cjw~L;OJO0(t4Mk-` z>CFNo(U!BM}#9_8e>$a6} zE$0(!Fb7gM0#quu5Z zGiA+MSh%HCsh0m+Fb?I6*cy^E+5l*Ra{%KsKP9Un#h{!~F(aJ6vN+96&AD*?jNrJQ zvQBf2=uZ``WwBZk4Lc3u6*ybpO6a|c)5y+

Iq(HP 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 Xe?{9}Ha9o^cSkqocgt<}`N#e@g4|2( literal 0 HcmV?d00001 diff --git a/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_form.scssc b/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_form.scssc new file mode 100644 index 0000000000000000000000000000000000000000..bab1a6818d7c6bb8557a8f2ba3e3f3772ae7176a GIT binary patch literal 107408 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 z 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 IzVqJyAH4HmF#rGn literal 0 HcmV?d00001 diff --git a/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_layout.scssc b/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_layout.scssc new file mode 100755 index 0000000000000000000000000000000000000000..890378ea64c783c131bb6ba31b2ed87c54391517 GIT binary patch literal 864 zcmcgqO>Y`85T#PJeDjP*Hhsfr85ga=@&%*8JAF}Cp=wCwX~q;5z@C0K_4*B zLEqzQd@Ixj=FzxwM!Ma$lFqlgT@umg*b#W z?nfy=mDC_3+Tsp3Hig6ry#l1?$KBIIF;Fb3724#^3+oeu4(Xf6kO?|jjD5yV!n``i zEOX$)vB5zv4^LR@&}7eLD{L+pjXO_%ky~SwOvQl{`Fi_lG9lkZZcG7iWbK!jI>78z{X^OZN=erhL9HN#DSQ}rS`YJAEtnVnvnI0B3OmEUmPhQx UquWc~WUu&XNM4wp{K@_7HVzBZV57a!Y~E>h z?%WCQHaEjto1M*Iv%L}C+1V_8P>8*=&x17eyzL|mJ?}eloP8_qgk^8RZ|_IlP7?NC zRATS^DAD665$hr4yf^2+3cADa#q3sX(SI4f-A#gCn7T9G%#-b{+KF@!_4{E`--(k> zn9Q)^wpa4AU?+{H*vyNWya2;)h-@oBl)&FFX0~dxS}N#~w-2yM*a{z~gPqdg>kbQ~s!x1pU1*_RdHN_>Zt*_-oOt_-Pg-S!)mji)EAKS)4{$6!&LYHJb6t ze!RPzh8g@h?}z;kpTf@bhwMUBfTdByCWs0Oh?6W#nlN#eof7|uKfPr?Y4 z3}%poY1-%pS-2nf!p7@Cy&d;6PM`@cbPxm{QMBn-N(-_mMl z{1nWug*MoF9VGpzzn8}B>TM8VDk1 ze;Uj<9&k%~H|16R{;&tLGqB5HKgwX0ty-ZI?(v0B`<<{K_oDvD^C>X&IElcPf-Z=8 z^LA5GbE995^9Ft1Fz8F{qJM$aeAip@!LVAdf+Pxdx>~bMcFMm1D?nI8a|Y*>k@UM+ z)CC}*!k`=dFzkF03}(G!NY_fU1os5c6#ZT>fPd%wbO1ikL;~2dy_OiV8^R^Wg*Dzu5yzvVC@HK?vDRgtBKsO)fTekD{PV-=Ai3I+AV@6d; z;++vm!!l(gTmTIJftq5G%s*#vhv*_V<2Z)TmP%mTYU;gh41qaZGZ3X_G@k;Dii%I{ z$#^f4Bc>M!Jv=|M0$SGD#?{^66_`&Jx;w)xi~H`?hP3hQ?I85#QVjQ*soA-l1apQ2 zI6AE*U~?5##-+}$<93Bf_O_nIdwbomu2$wgI3Kfx0?$!wQDiiBOy;bme9n5*g&^V$GKukaYe6B}2+RY>CO8U_t^9sa*tXs+Mlmb{MIn-MX;0S4aOsukgx_@Nrj z=Qd*=Bw5zxfTQzTF7P+>ppBT_oMj)qn_{=%zuQf=*)%uU#*-2u@&qjjQ;pf0461YO zVUotYKtd4L3X|jCa~>gztguxp58?5aqIHHwqK41`!W(D5P2_n>gX1 z1@%z`6&ujtE-mEnFMxCvjUPv+l&pMT?y$QiSQ`TZYclYJ3HZ~0Xsj@=S73&XNLl>p zKT-s-_J{H}z5V!=1U||7XQ>#H)r#jm3!tXW3Q!28!`Y$r4+3pS4??lHbV5RAdQb)Sh7^sXic*tK zG9Yd)qPlxGZwVO5$LV|;+3N5dGH-Af z)JL>_EE!mHK?6E4c~P=q&Em(aM8kdaLU{eB3CA=t-wC4R^tBJSaG5~~9vu8k2H zF#;w=%7~r9v>|m_OKn=QRG#k?r!|E(3WFI#ZDlIqYcUUr9C%$_-g33# z%oWZLs`@GZ$5@;@HV8T$I2)*U!(A2bM57?n+DvmC`-Pk&7hr8VAHdNe`OLOWe`|pHN+<)56Q>$vKlCWybMRwsS4A9D5AT|9yBKrcO~d64>g)q zr9$a2tH7O#ARIv=ABk9F6}ycA?VZU$8_l24ZXv~jUcxjQDU9#@NE;0SElVE}t`xK1 zE3;>qg5ggdJ*>^;SKU^xBdtipQF`^wZh0r_nm$XAjF{w_)XUE|1&iR?% zA@l=`$!N+_ufFq|*qQb_>dq@ff05|TtU2n=zo~?I`RJ}p36oE*MwbCU|I>8k%b+hR z2ym27n5CFKUtrr`YgSxSij_{j2J0?qGsMxV_CS@R{(o7~w&EpY#j9g09-0*oZ1k#d z!V`AfgUatKIW=4X;9$H`DLA^Qg~GTx7VB&b$dgP4+LQi`Oc^N_^%7>RlfwAUzgs-X zrcTNTxPeq;pogerP&`Wga4n~vYruA1s|QCEr>*L-F(4^T23kG;P3l34xe4l#!uZbr zX!Q`xk!CKJ@`}Mwyi?{O>Aq_Hujim%=irnj;K*!3$1K6dfS{TTG}NM_wTTpyx+W=% z@01*+41!w7;(^L|{N(t6g0P-LS?7x?lsKZZGV6xg7!XR6fkwGRD3L<`i=i1fy0FM^{wn8GV&Jo)K+~C?lGTwBLM5euET~ zT1F|9@4U45jZM+yu&C(Kj7a`=Lm~H_$0UYnkfZ)~X0&C5!$<7OdHg-JT|7O~E{;yD zMz@ddXJ>V*$R{HY$;b4w+W?&W3`hEHfjn?ppj>ibJv9#(x8m+l+~hE`=cdx3bgNBR zhN3Nw4moJBF`&&e8EC8dGukesnADL-VSMM$wbjJzA-|eZh8<}~*;~GUmelasdcXv5Z<9zIH4#Zsp1djBA_IDmO1|+e`KyTgO(AFV^zVwhQ38XN-^S2{g zr%KtQ6h2-Kr3Z`BjTRgoQux>y5K5DQM)^xZi4>CxA1RFQ{G$csg}sx{Wyp9V_2GQYT$_8L0Pxe#(=Pz3^dkX z5muxi4>7A*DU9#@+Jd!`g>SMtTy)#B9zf2u;Z@w|6&BTx-OnMu&oQdliX%vX2c1IN z7!YEUfks^ZhVI9Zf?5O*W~0L~?!6xdTdZF~UP zKW3lKvCq7+d^^cs#*c9MohJKTMS8^7uHf+UOc~eV%ZVj(cS;@rU{Vl{=wLz=DCvZke;;*;;MfTm9UA`kcSoPaGZMtu_W!SDFm;es0iyA_c`hb3dgpzH@VAKUJD3 zcOvMK0#PI6pdO3*c)Pp4(~a9N$3Z{Lfqn=w(D4$E%${fLP{GE4K${FS=tl$^DJFrI z!a&t)0bQCLjW?1|-2FAmh);4*KjAB@{l(EC5z5AZpqdOc)NO)_6q6#96vlVHYk_)D zG`3@Xl*9T6mZoYKM<-QSu$N3W287jQps|L86)7g2El6Q}XV-%D1l*c~n{04xequyk z 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 literal 0 HcmV?d00001 diff --git a/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_properties-loop.scssc b/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_properties-loop.scssc new file mode 100755 index 0000000000000000000000000000000000000000..da47921a6c3304a7cc790b018ba59e818ce818a3 GIT binary patch literal 156107 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Ⓢ{tIT8GgF4+{&@>z%ScM*<861fHmnC8inL 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 literal 0 HcmV?d00001 diff --git a/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_shortcodes.scssc b/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_shortcodes.scssc new file mode 100755 index 0000000000000000000000000000000000000000..395eace6a978160b1f0c2228236109ac0c884dc3 GIT binary patch literal 37216 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 literal 0 HcmV?d00001 diff --git a/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_single.scssc b/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_single.scssc new file mode 100644 index 0000000000000000000000000000000000000000..b63cfb625790cd58001e362762cfacc57ef5162e GIT binary patch literal 224434 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 literal 0 HcmV?d00001 diff --git a/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_styles.scssc b/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_styles.scssc new file mode 100755 index 0000000000000000000000000000000000000000..6c6eb3384a5a723aec258819ea0035adb60b20ee GIT binary patch literal 4085 zcmcgv>rNX-6b7kUuNPwjAwVEd*GWjy*4PjNWJYQyiW&*2tx%29O8nR^>oH8V-r4S~ zximtR+NbEV^a=#%uE*&AzbTIEOUKi=6nbLKneeCM*ywsyC6o;RQLxX0Z{T<~Tu z;urj>#drB&u>0a!_jG%Iu)DMO>|keme`nv>+uPaZyW4&K{NVKYp3AKdOiAwb9Hj_3 z4ml^}8!4l&WuMnbow?`2>xbMwsf-JaJdQ#QVzCgOPmIIX-7Oh79#@eQ@wP7`ZV=;( zW3s>kCse#|qnwhY6<-!3mLVapUv*yWAwRY{-YFJX9x!B){k-& zx@eNwmV{$N1Jc7qr#{IrNLRa-BT@y=iHA3tHR4`wL5f8g~kS@f3@grGdO4CG!b^#w< zsnUBg*JsfCw^qw^{jfFtbLV9cc*1oMmFj%=@~fkx&XqF^0=!vu&ZE9`Rp(NM{UGE@ zbv$6fxg7G&Wzcq|A8|kG1m5UOz-e@MJ0VIC$_@mBN2;S-IG2Z_W2@*IbZ_B%142SK zBx%NeI!w$2*1pF3uT{i{7|;;dd)WH^KSYa2Aa)^lJo|sTZG|adpN$l>FP+dA{+W{W zu0fZOZ5E51QzfRTF_ET6p$srh=ja?}Xng>IXe;p(*G9~+3&$G)KNF|++)xBjS_i%q zKqJR9>E?vM8$3oxFA4!km2Muk%op89TIVd2fu_jYDFk*MaMBQc2)-By9+DR8bKnQi z2nvD#R)m2KnJ)kc$RJxQbXndeWCaL5pAiyQi*%i>(hasoABrh5&wxRJt*-sZxgw^| zFToE}$o!}5@jLWY%Jq?DT@Ol_-rdZBI%fW=nS$IGMFpKW z3hcAO1-0ygZXrqu6!v+xp9R23QL~jyl>u0xuEb%4atVdgPJ7Lrz7p9>1DocWunjn)YVeiEx!Mrkven z3UWh>3Q|KaGDC4cPoJWp2^4lYX=ojdXQH!=FSlINhDTF*9D;}^N`tZB6klY_1wZ8E95K4O$lQTIF-4k1x z3LKYXj@92kLCq{d^9ekNP23L6n!xCx05Sf*mk|UQVbs>;=;=S2 z3qx@_wk2~FAx933%aI8qn;H!U;tK6+fPH16ijVqohAcAOykLBHZQU>}7spd{m)q92`W$1bsv--nM4SB5Z=#GeCN)Q&~%Ty&Me9BN-AO4C6M z13WjD&vV*>v~=NWC$nb(njRK|(gt0oXd!bag;RW|+C_y=Y4 ztyRrNSOOy_wW@lEA~-Nn>&Ci0Fo1LuetFj=O>D7LzfJlRX=443UuBh?G_h>QFFg@! vK~0n8A>YIO+r%WzhZBU0HKOE=#&BcZ=)AxD6j^4EUeXG^(owf(`&2g*rhoT_c7u5F& zx%3z#e zC#c^rJ{$!FQux~?Y+<*qCx{-QT=YHe2J*OGX9o z%BC0$d=~KMATD#P@DpP*Tr{3?9Znu_8&tRWQ{zk5wRxY0lp5cE`SrVZjaxc)UEJU| zMu8>ze&a@Xmg_O!Z`d?oBQa);8@JvEbu%Yuxb_67`3>PxyUsw!fYm|k4KObY{D$9$ z?{Fn z)b9SDPTMkl@Z&BzbN7aN4!W`+#R~>bTrx-0AN{m&PIgRC7^*J30div#)Q6VBkIf2L zdpMz<#jGayz|a;wYB!C-)q+uL8Y|{wbPnT*Fg7%!DpG$~GPb5hy0L9mj2#p9Ev*>E zPHmk#?j)#>qI(4}2LZ`Om-l77HH8^s;Q`1hH@kE6$We#2f zN313X<7itRY`kn5HIQMiY3ygj&qGPYS5Tz*8G^h?W7roa={V)0{XK^ZdT>m=#_i>8;%J7#Y~Pp&T#a)Msbyn89*}!Lq^tM-O3;hmtZtloYTU?5zxXqX|1*dWe`5Ky zz4P<)SooEU@GEf8dZKk17VJ%mOcN=idPku)}X;65l({o z&hODkTfrw8e7HP6vODZypss!qUA2D%+=kXpcw=hwe=_T9>MoIW+}HI34@+?9?=*8v zUHJdl^j&Ctnz#Wf^kFv|Vu;JP(19Y4k;oHQ7TC%$mxhfaDfuq#v-`2sdpd)aSEb}R zO&Xc-Dkd;8GOf${cseZA^1{;JUF>+F*IWj@3LH3AOBkPrHQMIT<5qn*380;;-*77! zg(3Hkom#lkjaItpN~pq(OnBM=37;n_#8G2Lg~{1R%1x4?Ds~+-P#${f>4={7bV&^Q zdQ!Cbb!40b$6Wl6B3%0UoXRozI&QV_+|(vGI+7fvP3}>q8vpn1jcM9(ngFU94Oij3 zG&tkvAsH_ZCFP)?NDgaI{r1^|@-|jb3y`)KjMsxg3kyIjd*hV7l_9VNB0ov2fTK;R zzB!dg9!g3;L6HQi(5w7dABpR1^$|I|Qr&}_E920)w=<&ZIyS%$|mkUVuQ96f&kk35u=hl&!tBSCzG2RTfM@P_!P`e;AtF{WN%i4O0aMrnWg z^$6$O+hkJaoI9dNFDx@Fw?xNhi)4Q4;ehB0v{5SU$DKCObv@ejuP6{-PP)ftGn7& z)s|!v2upYmNZ1KO0)a``X4oEt3?%H#gkgX{m|+X=m#}5RkL5i`U>@)Y^Lyu<@4M%m zyH!;$N<2L07q#o&?|$dr`@iR&bMCq4-tW}$)5lMq89#EVTCYyGYtL23FSV=BRqq(O z>%_@(C(fRoK6lsYGbc_~&rYAOlun*FJw02RzU%b)la=b})1^{rYI^A91C8=6mnyAR zxqP`n`OSF6u7s|!~iZj^7;g&t_k&sP`na>MC!mHJZk%KD23 z9-cTleqm_=n$lQk4UHciFE0Ck<3}gfm)AdZxjdA%Z!A{J!>w8!s!G;hSqCke#YAPk zS}KpGjYX>Fg>_K0UR$Wv)|WS@t;SMwx;ojcEL^QN$~&`0U!qLt8|Ds{H>9n0rP-cb zY_uBX-FA`38?73W?N7#l-bmV*oo!Xy@N+b+F3iv?$!2`mpKPfmP&2mZ;(@-enYeFp zv0j_5P@5*6yzkM+AD_5hnO|JQ07NB%%V!n1AOHa-k z#E)Z%^~vC6K&l4Cn(b<{Q6A5Fcrnj_k-mUUy3uM^=Let%O&IZu2cEu(9iS#{NSoD4 zee&~E+s?EFY%+B}eIEtRHDfeC7R310K#*w9U*?O(jhLV-$)mC{N6XT6p z_&@SoYrL{BGfqbYr8uN6+_1k<%Wm&Z1x#1N;!yiw8zcw`hEaQtZW*{ww{B^8S2M zO*d2>`CLxI3~32^HRkkc z4EnL1dxfcerdP=b^bW8nK^v2CYR4cpn&8@h@qi=_#3=8#C?E1Dmxt5VBFya)Ko3Az zqV=K5^c*5M3J5|^TF7|o8##D5_>JeD%Y^~ZXA4q4aAgn;9!JyPY zL^T&DtIsagfG430BDBH5euITQrfy+`08)Uzk=%jpN{&+HL(SUNxwcfF+?gDU(cQ(! zBV8HO5Z&RaM!VgZ?~U-dMOcP3M0l`Xo$ax`hb^*qIyj&bs-nPXH=5<4)?#J4nh?{4 zAl+t>I>w}OcFtJMny_ZB(S*hMwjO3W=!K!QdL1;1%NCjHN6lTS*EeAKp&Crc>jdDw z-e${2hZi=&DDC8iV``7va5D+BNszz{%zqIQA%goXg8N;9Fgu>9-asV_!hUZymtNPd z)yw6_8qN7iz4m-{=F!Sxe|Zy@o6ID23oMAibiT6q!n)+P5QZ@!md6)K5*I!&^74TzFv$;uq{eF& zL13UYG76|PFtIRmqLHi{P1bi4&@ADBYseN0$>*G-B7zx6kWIE}O>MG~+9t8dHfx(~ zV}Ak0;X?}}9kZ-_=Hin%7iYXoHk=V~$q@e<27Oc8 zoQyV-vCQy64%rMGvOU=hW{^qkOtz$B$yP87cEf*fO}8d{BI41gRZ#I{m3hT-<@(st z{8Y6$l|@I@@HfY>zf*+-gwKZBTNsJWy{}qeru26_Cp)cUK_zBM6oeTs`>C0z&y(zSjYw=IgIKW*EJe?e;l@$2IS*_mEUGH z<%rt>(~yjKCjZ?D7b1JqBI^w=Ot@q(Oc$^Qc+w>MK~Ww^$CKOCObF4QuxOXK$=OUu z4kou}c=NmIBat@@^B(~dwLduu#=xEM56sbG$swT-+h-9w!PT#bmhC$LzxQwx4cz7a>az}7X~lZyUVg`5bTFCd zJSV(YO2GE^((3VMV-aoLjkug|ln;drqKmYGX~5zPjH1n8M@&^`VZB*Go+Fb)$8pG<*g}tFD9X(lhchl2=pyZdJ`|wpjYL=1@H}#79-gfYW8NU**mOe!yH_h zGznF-$ExUnRS_^{FVZAL_Mk=fkW02_X%eD+hei7+(>CmFqzS*9_I+jK6~o<8al$n6 z>4i*mi$&~Cu0JP+^SCnAs;vV>2CKNm$<~d9cIA3`V4->qlq9=r*Co44!~`S2q_zQs zwb&fMwE&-zyUcQ-lJS)Gy~}DCGfjDCW(rOE@7TRc`@Wq!!~UqyQg?{gKe)>0r7o-@ zz-KpUdU!cH{r93%#d1ucw;}WO*x9h!v@>X>x5HV*LRSGp<0HeAw~FmFD)xdeL|i&- z5f2XrI`7gOR&zF+g=b_el)o?UOZvQdMO=d+Cz`kh(TR41Un*Z#e$yWTzv+Ebtww#R zU1c{XxIb6vL;bw^MRz-6z8ktLo!<*7@rx#V#>jmM(~$a1Dt6x$boTY&QQYU$v=3;D zuM$(c8D`_F1fK+O5h%4?+5~0 za*JSskO!~3=QKq1kVRGeVaACCtGZMD$!V~;&cHwD^jXJU5+W+I2b;>`LKr)QxQs0# zF7sJ4cHvkba(1)XxVB1G=Iwx)8u(Jt_9%~6h%RRYb_9%Tz00luZ#s~106Piv-|-{0 zg}G|8*1p43McKNV%s_+}THq5KKXRfv&t)-ZZ8jWkbC~NkfLp-715*CP0?#z;($%Z^ z#2S=|HO6?+Gmzg-4hit1PMx5{)fB_jI5V`FVp4}ak-{n>RKo#gZmhv$ZnfbsL_=YE zpio3d29YsL!zB@I_X8H) zS25ij^}OAY#f)*H3;@GG4+2gU(DVIOa`E@zO&I_Nr>2k9LJ&M`HT6+$Y6d|jf%8>0 z+81|%Xn3^pOm)1q)U1xT=c?n(n&Y(=?%CC5qPuW+It&W-S53qiri!NirR03!W4C8M z-ov3K&FdB_%^U3K9U*raIeIhI_Vwx5m3r-P~nnFKSHoqAa)H z^4G4=JMujrTT|cj*4i=gJ@3@M=biltJWOt>?S`6P@;(1A?0b%FW+w?(C-A=(QQKtotd_>2mgs5GGG@$u^n#B zgw>k!+_AhhH_hK1ZO~?`LFGV$Xaf%&`U4A%cD!d@2!*#1-?|r7OsRBbEV{^Gg&|7` ztuwmrC?@u*y#I1={FLXrT z=-@Ss{sKsx@X6b*wHoy>E!liTue{v`}+@0zHtEI3W&Z)-sHoy%8 z8-RJVC=JE!jpWEc9BpG;-wtb~!-we&06jUhtT3+;*ov~9$fp2<9o%+I-D28~d>3<3 z+kk|K3d}aqxM%vJ)r@W2jINI9ybtNa=9NZL+=z}gK=}D$9{mK&ZV*n64<-QP`jdhp z>|2#E$l$aC&uI%DOkt1#P3YtV@cqf;lnq6QfIwjrIGx2aq;KSo<8$tKa>j~x$eWU0 zF%8Ij*$=&(f-tFSvxxm!*^ZgJbhp=-C^fb>7RiwXVa$0fETM;cbjjcdme3{}pbgt@ zP7dv3oplgC3tg7I8cgACX@)S)ab)t)JdY9+Zbo9KU1DF*y}a$&7Gwy6ZOjDN>@!xg zK?E-=nsk|QWZCfLZlG-BBoW0~_K&f_cUuicb)aK>jtt@C13&idvx6t#m;;UKQP5*| zrVu6y(G8dh{DgWS1kNiga30{gGCg3bqWH^pZN8dE$uOn#t&#V01_Q}U4b0@i5Nrq3 zW_;PeRSLV2jeS2g;)rmSdsLiX6kP z3n3%N`o7I-weYYl$na%o6YfN^mh2Gm3X)|Pggh?7nT^`?QoYhFX3`Eqy~#GBDA?rw zk>ml0pUg#(urEf-WX?_ipCCHt2%vM&oI~7jOyM@FC4hS4j}T!o#gH%tm1Kl7#?9%L z_t_4?+`b~eFK8;<|J{yatKDw4UKlJ7Kwv%W8xLKDLp}@eV{i%r!7-y!U!1GVt}j8P zK@+3BTi`sV2#JdaHnt&V6rvW;pG=%R0z+V10@%Ql77iE_qMMssOdjqPLwVP*Y%qw{ zverT^+7ND0c=h{b8*XwCtx{;wU|LlM!?e3Beb2A)()YY9ef^-?^DxA>zBre@FCBDR z!O}MxR2w$u%#sdd3G8bu!J#^5<(CT{v($j-Gd@zX;?T46j+j9nl$cCR!B%1(wo6jc zih1Q2G$x~hEb--o{IZGC0b`K@P4SNl|Rsef)-Li;|-9l7#gKU&4rxn46DIByY~$GfF`~bZ!=U zA6wesp3G*hUkDBM+VU9Pzi3bdA9fmQ_95p)P;{1aq zj&gi{2`)^Ss*b~%2fQ}{CiJm!g7nyUCN{?#&2i-2;}rWv0S|DY2pxXU!ZaY%$_mpc zLKM$d-i*i8!@L;}b~ywH*y8SB3Bwm4%pgQ)EJBC_;6tHk5+8|?gs(B7V2KV+eI;x* zU4T17#?eVNUL0>$=hr4+^C2fT?ICD_H0T1PBw*9NA;R4H!UxVr!Ee;6!kHU_-inZ3 zzd(6-+&lY4A%w4T>V6f}b_>VlVJa3Its?VA0GX256n>~8IaiJq@f`qs zJxsQ>@kF(~l(S}1THdkiEM_{~^NUW;!6RG)7g~NV2c|g4-`rqfyw?je5H@{rG6c56`hw!R~P~&%7jlY$NX5o~k?aK2` z48WAq!p6P`g>bVdL^NwwTG-YXZE~lsKeJR1{S1+jej=G=_cKIN z`iUe}KM#&(@fAbFGsKdI%t;%~IG{{)l7{+m2Ljl9Qa6%dN^X%cGno$Z;3|s(0bsmN zN5?BfUf2}LGn--{_XqdiWDi*mQFM<%Andlk@WdK>#-0$*82U~4A~g!Fdjf35moDw- z?It+n|NozQ#>|0`ePD#3KWv4!YCzx^-Kz0~vrs}V+{r6FOkqe87`sRlI(&1?oE;X z{HxTU`Q|nNu3xY#PGH|n-~Nf9V)@yLux2OWMn8TGT<2M#>)UJpi$5Ris@qGpK?zR`FAP1yg zY=Zp7Z+wqBf;_+X@uU~EW1rVpMsSbutlSE&a3c*fk9ybpVu2SOs~g!*?!3Vi?yrE5 z0Lz=qM!vfeorN6N!(_l2Y3}mFmvPG>dwDnf7g|`t+cBdzmnYzrhB$bT@8`@Sf4^}V z+v+CZCyJL$?kHE^)W#<%lvK^Qdt zP2j%S8MQZCqlPKm3AZ@i#ILQx>s|9Ofy}zd#*cqTE09<*tN`!TvMS(vwIb_FS)Xsf znYW_#IR?Ik`YuO3uxYrm)FJ|JV?^(}-Lv#@77g}GIX7~D@<==$0cd=(UmuXl0`fxb zk{}hV0)zdWcB$Jp`F*Eh@|I~BY^NUYPbR=7E5W}LrQ~FO0U?vfg%4ILERHEW1!Ire zsZw&fWb<^0jPSHYW+^#Vn0WDVWlxi=xy{5i=VA+M6;lCIteIaFHdDm`yaFv0 zn+a0_crLS-r+q^ei1x(_zF^un)HKn)*tCH59a6{Vm_RDg>h^0!%{h_q#%ztKU#6Qg z5z-X(i>VUpzHAnNS)kM}zwfk5-pbo`bFEZvhU$i>aO}oO?uKblcPlkSRW!Oqbq%f5 zDQBKcLF;9nV9Jv%#xhl_iNNkhh_DC@BbE7FlOb|z6 zEPc$nASsuU#4(yeWCUW1Opj~MGiJ?sxWk$g<3V}rBj*|1_7K*`6dszSt*RG={JiAw z#U*H=C@f4#d}_XV)f-=g2+IZBNceUG1Pmnwq~F}x9BPmRNn(S%>xqND?Bw_rb!Bge z>L@Q}EUFX-qSu@d2Xew&bDr#F&3V}wwaeD1VTwav4Y<9HT8OZW8WQ$KEjiUlPWRJ2 zpfsZ?{DziyA!33!67vv8NdObtf;dD*AhyYHv}P#YL*lbA-a~?(%9k(xGiugn+W1=nz^xb#fbr=o`Jh0TjU(Lu zlhDfOT$UoqaM!(~x2)-m9;>}2GNUO7;4L8WUZjo?K9~dwHA#o=>9?i&)S0a-0KJd^=Z~tfM=%z*5|t43v_=Mm{!{ zRKpRnGiaQiafbgHpgh9$U}~GG2ZtZWDcM&_#xErMFC+&pB)8Ft_(PN*B`Exa1TB6_ z4x83y4!n$&_;-|~@Dh^5(+?IeS%>}@)KF*bwh19P^heAg7i`;YhYbY93HS^-;X%_7 z*j^ZcNDXJm@iH?yhuE=6GR{br$GPK@*UU>(<6Zf}*I_by9`OzwYx#WjiyB^T_`?(~ zA86AfrpH(PO(4ab*>0MhK`WCv$EulwmPx20rtpq7YjXyG`NDl6XiK(V7Hako8)MjP z{IHQU`+!;WA-XX zJ{CQGKi%%PHpc=N9Z9?hbxTX0g_Il%%s-F<7n|Vif^=YG-<1J5UbJz#0Z;J5hgCiS z1Fa2)~vIXY7!jmK)_` zWacV_%zX%-f99`As*gW=vlRO10si z6V(>x{c^OIr6k;S3x{RKY9ZPZc8j#p66_805G@HVMp_~kJ769nBbZxc4CeZ-tu+FD z$pL){nlI;IF(u3xV)TIk=%;efL$pPIAZ-CEpVd)D57CmKd!%)k2e1R^Au4GDo9&Jm-WvRJn=?o^s-cT|(opt+9Lanz%Q2>kSKX zZ(f5T+6POM7vUMFmqO!L?cTguvB=~Vy5`6zWF^sYm_qx<@(O|XgJZVn6E9IhB1Di7 z3OkEXmv19`*Iya$%(8C_$8$+)Vxtq!%;U^`d)-0dIy83|OF&HRbsJBIoq(t^o$;`f znALkYgHhWZ$Bi74-4KB(!v<`vXJU;AR!LSl9Y^^khpMH4;0 z#+vB)PMYX>7{r(E4*k~?acpn2-BeBVyd#5=l|&O^3Ri`;JPT@~5Fyb-NQifujLhw- ziHu){Z^2uwE|U36XJnafrjK55uy_F)EuT8Zl!t{;8%hHO^ihbgEE|w8UIb%-YzS)w z6w*f_(nncVBk2<^>8L&m(X#vR(^|eh3e_U|$ZBy<`Uv0HW%}4%A7OFml&z1x;l-+t zluIJ0ko5B|8tJWTtdZW@Nh7@#P(JX|+UQ?RFxTf%BfZs;!pKUZkuc>clJMFnL`XCe z5<+K&Ro)v6>lgHb2xBrOuY)Pdtmq1}5}z+=kmh0z_Il~RbXxDSyq?jBn3 z7{c9@Qi!x{#UN?iim^yXl~Rb7-G86f@|9Ak7Ewx8i+fT^_=be};#rhA(Za_+nb=_Mzqq9H+>El+hoRj~Gli)iv8hkE z)T7ENOiu1qqQ?5icp?dND~mTiBK&wWByw zovkd@&F$nWKxq(9vr<3^#5YKS0tWiN!mal!Z0^ORY|G~Rdg|)q4O5lrXRbCI@a=k2 zg`3r(BE`s9kr(iyDl)#6USeLty^^RGcpeCQ$*)|7>rC$3kU+@D2KriHtzBzmm%78{ zI(ax26v;MVvoMx{N*yjebAwp=zS4#EE1_12H-+bVYd70|H8%mvFa^deNLWHfh_Ju? z%~4G~HOzlMv=_e~VgmU%S(vWG{8GC(j?0N{ePXFz#jE!5L{$@hQwZXrGO;#d3#J#{ zzdtjHPg`acIE0?OzE>#z%s{>$8%~$8As?8RjcF8}id5H^~a{b9= ze12R0=}CEBn_sL~O{rlh1z)$>?Us6+z9cySR$OaocD8mM@0#oTDnKMuwpCr4X$-?x zDO)$-gOtB^%m%K34cO_*)+hB z>|UST`qp(99F|)TEG9w(Q=`eYQnHd;_EEGv$!l*yK%13-2kIB8|jA;Y%1&B?H0r?>X2o{mgEI5GVO-l&?A286x?!rM{WeywR_z606!wa{Vtjt3=i z-#23jUqcShRclx0GQA9=s*@Rm2P=^6U#g&!3N~L-1_cE4RjLDd39cpbxT9*fKMSY? z2F-QhRO5QFHCLHwT+87zx)4H?wJsd0Ex>X%pbfvyh4JeEMx_lgDbv_!Llx(wKGnhT zd?xC-FGyV?`rx?^Pg)b|heReIby1jWLS0!#NS!a7n@pdY!pJ>gQ!{A@%awQcrB^cXy)RDRMiEj6|Nm^DQ-uBgsT- zhD;LTUw9M)S_uLq_X;LwVk~7o1)+3U(0@PF9^0-D(pB>b+m)JjHIm0SB(HVN_vDF2 za%q5!?c{Zt(Ve_LGpmy~3?xrd|KEw0bMn-1^2X$fZ4W1JDkX2`GRYU0lF1dByjTMw z{m$$UB%ZbnxOYNVRL?LOFmAi84||gsU++qcuZP;y#KxqA)S7vfN#>3cBS=`ODzE#qbT^l5=p`_3!|1yIGlJ`xet=v*`X7s8Q`xVA5X`XNy*_Z;i`kbg|K@u>%*? z@<0NAGq>$%vs$mTYtLoAaq9qL-?zH;e=AfdC;s4hb`e5m*@b;8K^n@quxYSwW*-f7I^KT**UiqE%f4@OyZmiXxtytj=h^)f zow^*Pp}K6-;4T+lE?kL4#N=|ioHr>gyzJ%DWo2*D?E}=eUhK_xx%Q^K&h{pjS-HJQ zZ-c%0F0?l(;n#z@UD+JE-3dHOPU! zK1}k*2_sI^APpsUY#KbMN7SHV5xmpd<4?}0X`4FXJJv_mIW2+~kJw`p+C>#FBiB)Tz>Hz_U5tDa};>Y>(jCBJll zwp@EP(7)5|_IE-9B=oKilQI&S`5*Mg*o&DUS%n0W-Dl7=ikZ!Vk$Za~b^n_zRdm^zm!7y&)oXl9>|wuRyMxUhW> z)TI_>yV z)`q49!iNwhfVe#X0UZzW_L{k(q%TNa`K^$;>$lR5f>~(m$&-E!l-;ol57=FJrNeu= zk`;8}RW|jD4)vgR0PJ8k1`(OC$whC!LFu0sKKSyU=6$fHSKBqc#%;JbBZ99x{4cMw zGnnQXS{%?+vtYKwau2iYal4Uka2jcduO5vj?TX&yRn+55OADViW1^-(_j&dfyZ!~Q z{#DJhhE0931NF4Ps=Gw!o?6-yneSivlN&Zd6Np}yQ%_GX*hbtdOKxP#2^ zu%-WgcTZf9uF_{H4{u1jIDF+@Mj54rUCL6nm;LBYQ$7t23hQYP?R~CKLtbZ}29{a5 zPlMhD3HUw~gOqT58t;S7E1w1?U7rR7kEkAs+ocz;&HLRR%In-iEVJ?+(%aCv_hSz! z;q>tR&?Pn6n3Oed=Cx5y$S&)+5nATu3m#jley?E{;|2X*s7Y<;Vp4Vp!(PZB4RsR0 zrojujulpjIWmrVqCC(ByZxTdseUV{!W59J-$aS}WAoW+; z)L+$sdJkGYSj9!Vibp$C(OJs}sXt~@7n`!fDlxOAgXGjkA&&Or+*n`B2j6%2(tAH& zN;>>+O?O)u2Wxq)-RUQ}mHr9~x&KTD?myF+`=7FFdb3y4+S$0lo<3vO-|*^R756XN z)SvA@eWl#rw5xcoLlrCF{%baMF)CNa{a9qp{RpqcdDTYWiW!wI79Ms8;Om<`WAPv=bn+Es&%T?d8NVM;HlhVRhEVJ)}kpce?Zm0i)-Dynj zFtaPd>OmT+(>4w6^f#+cW07d5^CqQ*Z{bekA|2-}tg?UH?ZJ-&EkzoWvc%RNlF{3> z0F5~i;Edn6cY3d0nXb+?>Ts+70EQb|k{H_bq2)Uf#^iJzy-idMDaVQMA-ji|++dB- zdOUBMZHZb+g={4kJJqlig~0ucN^WZr|5S_*c%Q4;61v9?gJ zEmTDSEmv{vFv2@06rRjKZ(3y(>d!;-mHxscuXQ7Q9i*WUv1u@0|EfX(i$wW4Z&F(L zFU;4y>93s*1d+M@3oZt~U}J#ELl)oo#~y<;6b3d8#^B=$11u87Aa7Dy_`_vlu#ME1 z%S^T&|3w#oU$grq@+PH)zgi{$J5Zac{)gwmFS!u> zk_`bSyUl|j4F!QsgCY251pyX`LXbBpEqrd75O}i09{yi;`~J&z-!a)up$BQGzS}go z?<4)P3d17NzUNI!3#0u!6GgWEoZEw+16m4JOiB!%)@_?^SFAxMZd|`5Go-{kG(r1( zWci8=f=Ou#8F~TyBj&xd za7YcI-7vi<+y~csJOP(5EmX!YEjDX#y~m@q>u`|Oe9(F*8FuvSubV22X8Ls-1WfKR zAeg1zo+i~%Y*8IWiFeD_euEMyJ+Rcwu9ScXY5tvg%RcH>{ZXjvkZ>v{z0cC9i!|(* zXrOOrbg1M`yApB0<}Nu^$SzWAFvXjl|G*p4)V+#%a)Rter=?>R#Le(lN4U^sUcaVmf2sRCt zUsc8YSOhP4%K~?tHF(~nv@px^OKcb&msy*yT+PDe0fNlo$lOVrBU!8_=lR_GTP_^G z1r1ZtnV6Ja5##F(d8;x`3euBHVEd4ss76CCyygwkQZU=J80IfiFk=z1uN|22AztNL zcv}GGor=}mQwtfY_B@SD+>g2VeheyA0dSb)J6O!jidaoSS_%)F7US`a3J)y8axii5 z$eWfHzA1o*k{Q5j`MI6WQsuYZzW+AVzEOl0Cgtjm&b$z$rTT8u;=cb|)psl+D>|p| zdDGIu`vQH};*C46Ghy&`GMftj)$RU&g$Ag5+Az73ML_572WhG9+qAg*KcTvhMK*GE zPWSVsrG*c0_mwvwD7}@%gwp##CapF3trJI&j>DBX^AL608lTU#_|XZ{L_^6d9X0;D zE@Zz8lvPETWcD>`d`I>rz+(0KbbV>2S~TApv#t~|*W1lhtKbvMuI9+|COIz~x8HXg z@%vD#5{a0Uz|MT!lrl6`;cY^0Rh-wMs^c<4u&Ocx>sPg`duoFHQU`UhGA~3f*TKN` z<^+g;g)K&;nfSC!Fc=6JS(qRZwEw_G`wyTQ>N+7zdJ4!0AX5*+s_Nmq4C-J#a$jv9 z)^oyz+SIcwoP#x;ltIOs{NskQffRh-K}14FJIjqAtwFmjLW||bKPb6@%@rx_$PIi5 zO-l>^$Z|tC#f(n9I?Hz2iuvT@E}wjy+Qs1;n3N!t92GNurX|c1aXtywBbV*>VLcOT z!Y9F+R8R%hbdOt;+Gq^EFJI)Nmfq{VA2zjuv=pCUTZ9(#$t?rIN?2qoSLg5vK7^)0 znB9OWB79w9iAx)R%U=?s= zp6OjM7Od%nU6Txs5eOnsg6}(s_yQ@+C_!3^QLxuSiy0+RjDkgE@4#UcdRs^91~%x(QY@g(+MlJ5rF}9i+{Ye+Pu`>W1dBvX1bj#)!gmJv#LTX>F%kaQWt2aLx|Kr2oqJ|#YEWYmuhMhi1ake1>CY>UuhMtOx(Bx)ky`(z@d%qYr42x>58BA^D7C9aqVw>Tz( zaN0_3guigP>@T2drBE>GDHOG`UxtkktV%5d8h3R;F(4#LC1^^Leom z{?di|FQE-eBVuwbY=mGvYDlpjZ%9|PI1JXLYy_;y8&Tyy4!-XoB6_{E29Ah;L$q`6Nh7F#)zkXfdDs zl2at=Zo>D;-So@MC(1+!DllatpaOf$*r4jWCR^#tTh*E3bfdWdA3LJ`e~84AW&Loo zGE-a19>AWDPG%d`f8(;%-#}gJk^xM55mbJt+%6N&o*ONyT44HYn_gEQY|G!eZTVZM zT!lhl@-V|-7$Q8NL0W3GY+5{^f9w?5%hfr4=DcZX;ZJx#MMXedH=NH}4HTboq4*5+ zUBwMz($fkNmwS+w>ZeVMq4(L4`hHk!Xlt-ZZ$NcF6FJFvYfFV^u)>oeRX@K~vPF$e8pLKm>>&Ed_*4 zi-FjpfWRUWx9-f2ylH7+YXAsiK&?nd{Jo39-$Of;ae&Ev27I$S7eOINOQB%XViXQ4 z6tGCtILMop7H(%0l+X`KUM2KV@`|*Rb>ZgedbQGoqav;L4ZbKdKR66m2IY4b^9x2KV_<)n_cSfmzp?QF)Wn!eiWL z#Y_L-_TV3Ymf|H$-pZtfmo^YD&DI-vXgeR|Q;akuk9)-PU)PrJ*Q?AGNV4b^3v26y>6 z)nzOa?Q-6vv~Z2PtXSxCZVx^Ov=j?rQYOBz&{n>Fv#14kN>yH_-AFtBRroy1?Ny&co%bkF#RoLw5~NwFZcQdIr>aOfzsZJGOV((umcml zu3&P=F-+gDV4^a6VldHDI5d$KejotTPBduO8l^Atx&=9U9af;U=gEtp6d|Wja>y}C zKc!HjGNLtX0h%=k7K&-%rvoVM0AqKpL0a#D1UZ&aptL6xA|OS`DUcj;4AQSEkf=;- zX;h%6uxx|#;Q^3>QfD<+j+^qMnm1@k2c2DM2yNM$+>WvKK=s4>FrO%nRb+PFpX2)!D}N_=rTBDW5#cdVRt4TBggbrT4hGsW<8*k#sZ16?~axCRXX;1k@gjj@}8X1QikIa*5 zWT=dI|D35pPaz}{zJnJSnT;?quUV`%EAi2YH1eE`232vtaHF~53M~Q0lp@s&^%x14ukYicYl=dQm zRG`LAse86ouY-u5;bW-sY!aVM^0SV$%T95DYG=7)Cbz16i`2eQ$)N#@NU|q6yJMZN zk|Crz>pUXWuc3rhDY zk|N|3UJg0N>$?_Ws{B}?q-r}JKIo7I>(!H(0Xy>5poJLha5xpSp^xDi7waZDJ|FjE&v&=r*0- zQ$)xqz#MW6*j5D?m5C}zdP+)iTL3VTLN{ST?(xuq9Lv>6>0Vup5poJGha97IyF!b~ zL|u*alw6I60%+~_jeK5EumqFUMv)(OT!ifNV1gWrsVLp6f{c(;FgfHHrn3qrDidWY zdP+=nE&vnkiCKm{!?1FU#yyN6$6_T)_qy2=A*V2M$T3E*R2Wg2C@axZVx?CFFrvF& zMO3W;MEgC6Ajh(^D1FRGO|yQE*jW*B3L=LbL-eGAh{{CmEP6_I)>8q9wp+q{4G=ou zAp|)(dayw0J9|VZLQWy%kYj{u3Lz>J3n9!JMArnqC4f*!)U14t-R8jqIT+=^4hBje z=@Fg?IR%eHj^TM;!9!)_x_ZaKKu@88Y2gKiM{O5^^Tu(rkvm7Z*(m)a_ek7q8^QP2 zTC7gDYtI=Mn~Guao`Qh)@-i3GA+HUPW1&jv9)ha*j&QeWJmg*z;>|kjH4AbqflBFK z_l6_n)L=X0c(A`i4K|gD3RHSZ0`=WI*kbx^MeoR3Aale+26C)jb4trKt(}eH2swp} zLynR8_X-&*6WukZr?hMSLjh#6d)3zhnmasbAV)_X7bq=Zs-2;UkWidhR_j(WgAjy1_C?M?EC?v0RBz&PX>nBP#qP?@Ocq^Bf0 zKN>QeLd7A+sC+`9LS-cO(qR{RN+)wZ$*3rW z5)tM~p^z{a*?2rF2*e^_X1+isrOM9T9gO|vOKQ+6l3 zc0rE*Fnxj2-X2B1pQ65#dXUx-U7E{Gxq_yi^qLAecv(7IJCyF#!4@H>nA0K0%=xlW zr%Exf9Og6)Obag`H71KFzyl!5ZX#Z%JiH*s8d^$wLmLrs5poJIhaBUzRpCWtWVShY z(bFR+`?m$~I&2p6Hxabc9%zt*H}5c$QQAM&7~ZpskW-*Ji^@bdIO!>EaGqnZl)8wBL!~ZA z9EyyQ^~Z+FB79*0RK;{)`QbhUGvCe1f;A4eIDqsO7rRx z-LP%+gOiiBr0lf>a`aK60;R>{)Y){5kW+)}kmJF9of=#!6FXOwHHgmrzn%wI#4W5h z(8*70hVEI$|Dp?y`#qQ;$69ba zfN72nF`q{mY+jwJiCV zeQ_?U8>&#Ljy1>$>H^guTeqf$>`d8kBblHj)kdo30qIZ4d<UOkpUI=2$|*!h%1L@G5%@Zc>BojvrLBVt)dzp{Xa)y2Qnw1o zr@HSpYaHIGSax^RYK};HhPLU>SiN?2uDwug@ueB79h{58s#NvktM856VU-OI2gMtJ zOq&(6hgd&?|0SozPp!Viazk6z;x~FE&y|w9obQ&#cvGDhAw-#&nTnfh)%$SH2PY$# zsZ+Tif)CK;UkY*OE}-Sj=S*C@(wl;iWBJP|?fc8)JR2dY_FIUgtkjJ07s4z;Okrjd z6GK*i(hCIhe zFBiZ{M<0Y=e}d+gbqc=lu-ARa!AlKzm?*u`)Dtn_BV<&!9WvbQSEz1N8L_tV{rqe#r+rNf(RJ}heL+pcwE6jWuja_ zPl*d&%Wxr6qjKSZzJqg^?N{y` ziG4oo!pq(igdEE*r1Wy^!U#!a7ZSV zJtceaZv)*9PK{;Rf=_x-K#s);lolsncw$7zC@35<48=NSg;SX*2hdaEfIhj7jK8mr z){qmGLH3cd1)sp4*|wkwiP$o6bh@#4gYGhygSO81)eCR(s(>8J`AF$aW@<~w#leZA zt);2)xhh)I-g)37JRm}tJm9dKM{?bv%Vc$g8iH3bfuL!Z|!yNlm`gpSerAH=8=i4 zb0cIF5Dpmz0$7WgfXYNSW#}nw%G@6SVsN&x;C(Fhjv@TS?)~t$R(P_IVAmhGvMzZL zqAL25hb|r%I9nk(&9u30}vsj0C31K0AHm5pfcRK!~uYwZbAUw&SgZt4bOw~yS5PQe`&ll&OC1S zzv}fLa`ere1xib#K)C-AGOGU$8SekLss2+LHpSfj(^I%o6s|H1^nVPZEQ{A_Gwrz$ z1Vbkx{h#&v4>@=bEekVBck6$IjOxEbhWr2hs{d3*Hq z1kqd-w^>7MxE^hY%cO^gk~@=Qq%NQFnguzQ1fsM|i?9TWkWm0TWEkK-Rsd6(s05;? zB!T{f0hW%(Zx9alyYBTHax4p*(lQys{f>}P{dUN3zdxh;O=Y5%H9dvWaNWP^ced6U z!?lk7P8DptDiiOdSY7LHr_s+Xyn)kavNTvs^BxqCV{MvHT0BX)%@y)+uLlEC7OoM> z3LT=%5s5OI1M0iddeuJ|z74vt;PnA=w$xO>5T(1ZafFO&utSE2bDP|@jg8q-8;;2d zdI}9o3)`8yq~jygV06OvR%inEA2<-0!40qLkYm|Ul$IFGFegXIsIEI?xa)^h*QpG1 zscS>fQ?j8B2fE%_hgPOqjrvkMv^ZS!5P%#@hf=zm4vmme2smUIfpZE0D#N{V5um4} zL+|1;GWZ>C(%%IuvT;D5HZ!g^K?CgYtOo|s};(~k%_LaZpo_ya;!Qi&6bhz)#*L`xyEz( zCnADhJP_v?5AfD0a0L~~ZzNB_Y^3~2%=g@8*Sv;8j-}Ko&H9G7!otHFA*Y7dA;-ge zT@5dli7Iz`O3M8P53dM>fKd(JHSlrjpic;VR4TvkQ@PI9{-cv8?*dUl{-f(2Mv!A| z?^9Zi2xr>fs^gqrMgJN0P(^BhW5vc{LNy3W25Kk^>Bb$b=R251@CXd82rz0_NF;Ng;>b*`wOFs*paPJuO;ewOz0&_OuVs*9St*njtiq!nA*1%A95OuW|5=SX zm5~v3bPhcwE9Fj~soQ;X7~IrL=TjW?Fpp2sc1)?B06o?dFV;@gp5Lrj9J; zO@AHAaZX}3`2yRg25rjFdSAeP?_iwiJrm)P76mE2Bm)^ zoU0-Oh^u6uSWn60FeM+aEL7{Qq4A^R#n}Jiv-BMvo{(eB(syFo-@}Jb=@p-Yj~7&O zKgYf+gAzQd7r{7;>g#gZRQh_aTF9|1SW1h1X{M6Yu_NDj4=gXtqwoqNQn#`^sqQmu z6#8{GE0ZsB_6bA5oX$)4;L=ZBp-pYrO=M3%Z~ zA{fk*pM6l(21olFywQdn>xL6b%eSREPud7MHEA7kJZY!Yq@^;^8&2pc-EcC^leUpO zz9D%neoSTCq49gikK+``2ZU^;CmPA6f#mWP@ZY|!AN~tc?e)W1`V9lgleB*Lraqkd zUtCHi8_DkV$*pf)cfr~CU2jc4O!X(*O38M4{o;Z3_hN-izP#&FrPV5zFIDSs6<4EK zEJ+Hz|HI zYZmQ=5wXHr(?}iMpp(Zi70rW?IQkY3B*?L@`J;5v6%7%CB0^4qK{;dLu%7~NK zvFYh4UGw+807xAqlo62mr-W&?c9fgn>VX3}R;&`G{UZb61y6*W0>>f8;QWLFhssEd zjsp%orI@7;C~%C#+Ir`BCb0D0ge$Q6L9*OwNtUE4LPWm_)BasONitd7pb!D;)CiI6 z^^6WvbA$+#*-}#=QCheIv0jhTR;CH5#bU(Wtj&<1p89rg)FH=;Qm3@|-8;*T2sw4j zmP3w5{SVZrQyE#1IipTb>9)U*^QbH15)jM7iqgWbDWVRN<;&_F5Y_z7SEzR!5sqf4 z;V#jKnn_&t3hBdl_ryhF3_JReUib822d?d{KH)h>^<}REzrv5~FKBazYvGZl`Y0_6 zPmgOm$gQp%`yL)Eqj(|5vZE>O+0hXp9wDbV)*;6nJEUR>sf={k;aGY~mw*h5%ThcP zfEIJ#=M?ujC~EH8%GTIyqXA!u>e(3kuGKLgy&hw}4QO|%_5io^R-MgzN@8ZOXLOjF z!+TK1;yp^sP%!VAiM#hsqZR7)%3`aUrKTD)nS0cm!7&8^JbWEZ4?1=2v!1{M@9{0ZOrH}H3w8EW2qrZi}A>y8a1>t-}Rho zv>_B#S!8Umb)DDW&9lJFYsj%KJEwH7(WMb`YF<0!cwRrL<~5a(jW=gr)6?ujVWD{q zpz*wZSP^x=v@{WLFTZn4z2k7T^-g4UFB+sktL!Um)}kcIu6-PvT7m&vD4v=j4&HY~ zeJu>mEX>ZNnYPrj+#dCUUriYoJ_g#YFUEk~B2sxIkkJ4iH z;6%J9xfg6g9l#VJBVwoEkYV2c8pU!{ChFp&r{v=MTIT(weZ3*P>NT)JIq&J|Ip>~ z_H=1s2Cn0thSrrIq~KYaQJy4CkJ6Zb7H)@#%BLB7_+llMLP_~R4TEAxwsSfDjA z*Pdxiw#kBbMMzKI>6CT&QY)k=Nx^Hkf;v<3V|>}0qF27KUBwY?s?JXdMW zfeQ;@!qGv_OmU1Gi^$il7uE@9pJe4NytD%dN)n}J#Kph4f z4$>e?CJ=5rHb~kKA3DtG01N$87?Kep=0?pMGsql^;yidh{2Jc7y)=Y zfwnG{cVs-2Nq~#9kHLo@3nwj`$|s%$DSaw+v4QdGjfKtSku-}pE|mx2#^jlmNtmR+7Xbr>x(S#cSz7_Kp;iEj zEMPWj0kfq)p~uPA+O2@#i%`G-UN1HQ15Nro3K*zu*#c&hC18fr$}G(BQh7&uZ4P8f zYY{$PKbdj-1<;8qlL}raZ%Z2xZCzWa)ay5Bhv-6iYl@0+5~A|6U7PY2C%uV<3QVc; z-~uR)WM8@?87t*1wy}|H8pP?Zm=4SZE4?S#o^DEZq??ny=_XLKa0yNeWE9TqR;j!@ zZRPI!NlX9wbO&N|Q4~UqZ4Jfl^jxhz1DEVv8FGZm<8XUA3YCq?2ySK2I<+-dnQ2^G zkCU9m@WGI1d8F2A=MsAaDuD*mowne~cg1!l;f!=oie7j0_>crM9l204lCWU3RpB) zRov-UQ35PuU>hY`1SJag5$JFja)Lcqq8n;}bh|cNt2VnT(m2@1oK~LTR%T$M@mK}! z$Kfmw(TvS!QUqCd^n_rJY;qKsep8BH2AFK!SZG(Smj@QA*OEJ7DX_OhQ#IaP2=li< zW$M6qXwn4cWBP#e&NkCUkY{Aa1YWW#!3c#1%}b5sSUw%`5?pj~$c%*1OpcEv6S!MO zW1F1d*^-=u{+&t>C#Urk_%Uw^K+e`09Jnz1P&g z64r~<0gfqy6V-8q>sUVPMXG=}VXF!j6gYh{0pAnrMaZ9Y$e-gLc&rzp;NmP4IHH&^eT1ZGbR%1qwlzX$~v zXQ9xU|03iR|51O19P{6YoHmPOarlo2;67O2hfTMH|L8vc)$-m?c)SNWu=JD`Qd(94 z8LGx8R4(4Qwwv9%`TnD_qFY4a{_v%`Bt0Jre_{)~%=Rr({$H>v6aHW?-+f9cft1#{IH5>*@x!ld$NZ?2_O&@m^Ml&cmGLqbZtFUaa zj>7!N*q`k9W9cDWZqQB^@$?UPJPkRUU=_wbVoKj?YR{d_hTW7pi1T!$4&}(EIu3Ci z%jfAx6^ET}O!!rF;_2jg&dCw-C5QYOCZBO~GLe*W|9gaji?dM3F-T6p=$%YXC8uEx zE!-I)r??YJY^n*lGuci;`i#?L5msmIy#{(8ng{DPkMaCf*h*OM2R+tV z*VMlf){E4!&#B`G*Rg!oi&SxkQ^g6tik?_6LjI&f{v4C{ST91s#aSqHX1xeG#d=U; z6Rg6_wv=JLzHe~ayqk+Syhj9}eJL#5Jmw3o!dAk6|IXt-$k_y|Fy=o>?>9|Y3I9dv zIN;QAC)crj{)<#`%&FqEUqw&+7a@PfAzxWSU&GX zsyO0QQSz(kiT5JpPdMbyGI@{pA{1Plg+gcEi;z>i2PHPaD$J98f8w-x7Z-7Oj|f2f z(!M|CA`*8BQA~NPnH9CA;>IY>={&6BHo&TEVv(6Ez~d6mNcH$&ybHaUR^Ou zjYo&9H2w)MmYoWzP&wx%4t+K8#3P5wa!bq;&UrW(PC5?<2ch{q+=nqnxRE?HoV+o) zg6GwSPN__5q8LNT;nHHTqBi{emXI|^pvg+`6S0R z3I^_+cY-=McE055XFWI|$2z(|X*55_!9ZmsPTqlmp3;$pzhM~E zff?Wx4paUuMbzOTD@#3{}|yY#X@32Tf*2L}d*6E8eg}j&)Z8 zrM*jLB343#oVriQA;-ghRSi3pfum@-xOIk|p3+?jbApPjtN<=nk54J04vdznlWCe3 zPN{dCd1k#6k>pA}lGaGM8>k-5Csqzj9Gw`?)^X$cwI<`avW#Dz@@w2PqX{9$x;%x_ zxa&+twmE3DJ6|y76%}o*JS=ydC{7All)vuP4>?q+?zwmH`1>amP3 zBXy}|Bh_`z^wr$UsOr)OfS@}%*|CoEPJd(s14~m<`Lc$A;*I2CzZUQGSLgF=qX)L^+6U~fQVGpL@nuUvvmjc(z; zVOnhUY)t|NX(t))>dL74{2gx|LymRD5~cm+S$G~t$jMy@1&18Z2^THN@sHZcRffT$GT97(&EtStN(fT8AQmb1w4@x?-RrFkb;HEL}8()1j_}6 zMfv++qVa-enfFc$clRa$ts_E_IlPlZloiSpo}GuC=Eg_UqxmD2|zF)Z9jB; z1`hDRNwfvH!s+VOdgiAz8q>fP(wNkoMt(=g)({nLWG5MnowSjJV>%X+D1D(arWWe5 za_3T)WyY_q4E{Ltp;>-HjwORB-Kz|akW&K3A;&Z8Yt$s5GEo^!Pe}%UEzhjAl)-=K zK>|6Ju%Wb!NM{)wA*Ud5$T1}ER*+DcsIZ}@By8RjfMjiC@c-$-0y!2el2QK>9>4hJ4@HPZ;rMk5`^CUt4wR{uxLBSt<#j>YwqX7^lVjTs@Mgn&ba zg}|RGCZjS@Zl|Zj?SB^Hc7Tn!{dW{m2R_ZYtFSo!WOWt?y&kYQdLtXPII`D)vEWDc z*Z0)JBa6K#Ei-#9Ee>iqiM9eWM0rN-R74&4Ed2q`_??%z?+BOa zS$Gyq+FA>5Zki!a&=r$x<~K(0E!6k5;YuFZ>!^-kWRKNGxB>u=*3;SlQu0VC87M*A)NH+S zwM8L6-P`Z$BJj=`rRcYR!1HdEZ*|-IPY!PxQaKa(S zVEnoQgUUp~pr-`JZ!j2YjSFnW_Qnq@q7HjmHVTMuey6J5am2W`QHGCCRc7*)Rm|50 z0y&#pLsAxI!)I0?o8e%!ndI5)86BqP%q=Km=_5*ue<{;PYHq2JiRDkI&oX*uLP3t@ zQKPgBXy*wPAtyqw;E-b;`g=8WR7QI2OelIv9<~3$JR}pUi= z=02tQ<3J|nBeIZ=kW+9tWn(^E40*UOg@z{)|-K*nM`JwB~4cDTx# zQjy3P@e>y)@@0-4+c>#QT+u%GKvNB_CFP)^{E$dIsObOkK!+UdmM&15O)?Wyv>B^u z71!br%0GHdfE;VwDebunRjiNVr4VODYETirRKp3zG@ody1~=FuswE?JonkAwKy}3; zd_nY)tqa@Zqlb=XAmf^#v5Mf<|JMT;a;(@+N=vY>ku#lxTO(wZ&LXmMg*TG*4}DM} z*`_ZzFL_IVWe0ZtbGCHteCUG;Epr8{HmI`KVamgg?61Gpfk#$gC#5^sZHlQ`x2U`j zqkqmDX~?k-eNbBDnHgzB*+1ztMW|>LciI6E z`X=u#hd%zrg9CD`Lm!m3{Z~E=5i$w}hYZ8eR4`DPXbcoRr9&SrhCvx;z$>gtE-9i8 z4_TT-=4V>CSH0s*FzcO&^itY~q?g1*cGNyyLt6U^rd!4Wf*ecxP&%f4>`2y?-Jkz5 zuL+Q2X&*|jLibl3P%R2(OX4>cF9>9=e zX&*{2SNlZBD(ypLyJ;UPq_mIoQl@=C>KKRi>IBjkd00S>b?k=Hf<;&^N64sdIAmBL z{fv?WR3>`thMq#yVp{lF7Dxhv(nG!KruAOmA;;naN{fW-teYa_l>5LT#~A#E!hp(1 z)S9E4=qa5r`KZFc_#&5Wi1ZggqIYxmQK6L^BH8O;g20dLuWyLJBg+t>v?yq{xD3yS z2HO=sQHeC*4LjsmA-I(8^@K@;oSOCyIUe@Us$r)xynuB-VNXw?bXxd39(JXR0WQ|X zpHf5}7%jaj(kdZ}IIjz*u+mk0t9OG}G34l7h61IzV&er+Yqb@B$um;7I^jZfcRF=qzJa-{k7Gva zRVPuX-iJM{EoXO@{mscposWp6Ky}KOi*j*X$}9z?618&_vJa0WNAP2`cMK))_vl~( zdtpPZM!lAO=g1D4*yN2ilq^8vhwuz&G7ZJ<2}mux+B z@xZ`|JPndCQj?mCRFix(*3{JFSBE3?)#uuYzAxvBa64IMyhTVT*%l!Ywh|)bl$GF+ zV^R6g4&eeS6a5qsJ%t9Qg$oc#V9uS9hJ;}sI5d7d=)BmSNeT0PY4a%p8avP=+2hIl z@uc-QgKCS%H;{uNqg#!*qO`2+j4{#Kr4b=J?2xs*`WFwZqjvkA4Qhgdo6?62O!-EQ zarnSJk^}I0ydYegGPvM7Gw@L`15%bbsWLNYwtCP&j&(AM(!N)@Gc*yh3UMOKOEsLP z5T#v&MN9szzhKvLPRKu{RJ4X#I3a%=;)F=M)ar`bCD#=6#t9L!M}!lI?EO5N)ZG{- zP+8@9rZimY@5Uw@i)&l{O}~|XT6UYq1CV3wPEp$8W0Im_NfIHaY;A`eOOm%MNkV0W z?HpU1p3?5rSF;OZ}mz7nEG0v}{fA&>Ok5 z2HzUp<&8V!Sl=3@wC8V&?D9p(DbeJRW6|_qltiF1;wo}P6FuFJM$WH=M3an5TKE}7 z)B)2HO)`umf9iFjNIbkYhP`DD5wN!nQ_)oDxzFIiAo1JEi+nMq=BY2~AJQ z!86G2##Q+?Z}TvK94nH8(n@;3Ji=9L7=s8og@HqkF}OuxKxLwl9Q2eTId&-wjBj&& zg(O9X0G&3)t>)#L6tH>_{hP~lU8>m0>~&bG!;kE*@4AFXR_q(4;ryXxNOy_Pab^@S zwv&_1vD>{dg&fOYO=;gi36E)noKjQ{IUdt{)tFM5sK1(?lE3;DfiYdSzxq%w{%R_; z%t2Qh=h^Ep-0&m&>km3Svi#MQUZ%f#V|xxh9$2(QYnGRNgOS)h8~DTCz(dZKnu_0{ zbgu#}LQd@-JLGuaXVkz`8R@el(C8^NFfCMh;ML*@0Ar8!>lIN4NXy!QnZ@sv)H}|M zv)+j)TV#ksJ9KOo?1N&f z_I&t+)~U0(-_Le77P(8tNd!5TrlPb&M}%i`gp6_$Ib?W1-==V+GEoghPf0_4IS;6G ze-u80UBl1q64#=ybwGTrqs=OQi}$$<8XJM*9s-bKAwcPF`;QSaN|rff7=dq62vC_Q z0`!y+_~rlt8`{zWu_ELrQl;AVNkV;E-Vi z-se^&TTITRHVsP)?++lbWwA0d1K+5I-3y!3PuuR7R$pg8@CI0Lz~YVL)6!7r(;Cbb}a-EiJ;g?x!pHMcFnpobZ5v9193a z+rAJ#J}5#)0pXBgApVmAg33gJpr-`HM*=`>n6EV98^dsq!D5IJ=rb|!eOWL#hmt#! zV`QzJ^g0hY)=Z$ZY>0%VVT6q8yhDaN|GTR5R3g;ur`+5Fw)=aL6zOpH>i18A02b2=o+=TBU_QR}dI;eeBTj7Anl*NgDo` z*$##=A9OmM8FyKn{fK@W%rJVmOrs7~8Ya>{dp)DW)SkAFW}}rB&Yh5(=V(`&cHvg7SE!=xK5eC=R6c3XG={rpVI6H66AYO zv_biLmsca?SbH#(?j~F!WK_c)GK~9O3U?|aOH~JVdP;jQ=N0ZoxNJRc+vXib3?JRu z5_kz@!TA;V2w?Z$NS5sNj1E(CBnyyMz=qc%rFXl3G57Lf%$KhP`LV32uXnSPGQqo=f|^X&l$dXV{pC&G)Xdp!&w z2Lt8U44||f2I8+NB4iW>4jIPa2NVWWM%Hl-2J{pfmKJ_6fWZh{@~{ZIFEq0qAHxs@ zq|g(4QSl0|_mE>rMM_JP!jm9EM)lqy!@d7$)q5(#J#(cZJte95Auc0Qar97mstSwB z-Y~^g?nlOGwVSQHpsCS4U`tx!t4_vqgw8eVfMLI z1*}q;=%Rt1(xPDx8ybQD1O><3lEKx|Lte)r$FiO%-EE;BA)`9(kl~IORmZ6ecgj^9 z^pvcp<6NeZWb<0ID5136v(Ym{M<^?Fh_Xx- zP%fz7Gfl(WK_62h#!)WTb`Y4_{LVG?j$?vz{2c^vZ#q6xZA~|8i@duL^JVcubEEqP zwD#f(R+;J+mhAP64pV#D_Fq96Yh6KUn?2X#=ev!n>EgdSaaYho`7lFhoJf#kX^PLBIFbX4mrl)>l6l5ChFs)ryvQ^ z!aD*OY{ZYn!47ck>Riwm9Xw^Eq`l~P)B^%?EM}mzz3BIsToEz~0EY|%@SO?(DidV_ zdP+?2T?~NoQi2d+iFrj4b%cv0Wx>70@4QAyS;y_ArR-j_xXJEM%Pv%-uZR+}8IcQy zU-Uk}$9r1sP^p!#cCyz&0zY2Jo6_m45nhvqq)WX1>fR!}KTW)=m{R^n)gsi2S<=xA zkf|vYUW;jWX9Lui5sjVJU$M((pWs0^dI55*xld`~!?2wgA)~yH4jE?o|E9Q;%0%Zp zJ*7GSJ0X?_w3vNAqKG=E0sEGBWj82ZZdR-1@}t$6TII3EOmz%ya(s5F+PraP1TN|V z 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 literal 0 HcmV?d00001 diff --git a/.sass-cache/89d4189bdcf0dcae9ab52aa7cc9459d0e9ac7109/_rtl.scssc b/.sass-cache/89d4189bdcf0dcae9ab52aa7cc9459d0e9ac7109/_rtl.scssc new file mode 100755 index 0000000000000000000000000000000000000000..58b93b61c4266eb0acc69aff8e1cdb778990a02c GIT binary patch literal 73696 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 literal 0 HcmV?d00001 diff --git a/.sass-cache/89d4189bdcf0dcae9ab52aa7cc9459d0e9ac7109/_template-mixins.scssc b/.sass-cache/89d4189bdcf0dcae9ab52aa7cc9459d0e9ac7109/_template-mixins.scssc new file mode 100755 index 0000000000000000000000000000000000000000..aa88a9628dde051dc483e8339db591629d5b5cd2 GIT binary patch literal 63632 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 literal 0 HcmV?d00001 diff --git a/.sass-cache/99848c0c56d474befdaf34ec4dac5d06223608ca/cmb2-display.scssc b/.sass-cache/99848c0c56d474befdaf34ec4dac5d06223608ca/cmb2-display.scssc new file mode 100644 index 0000000000000000000000000000000000000000..3f5e87b144c1e52e2a3a308795db27583441d8f9 GIT binary patch literal 896 zcmcgrO>Yx16f6>2l5IYqrJ{&S*b^KQZ?+^&?2CJ#QVyVqS%$qm97`z)Kqu!eZl#p3|2fc-bJ9ryTC;51ES&T=JKrzgQmy;x! z6cCTI)o=xIGMyG-bV7%}=2R$XpukDV~tFd#^=h zQ5dkiBm-8LRc7&sQJjb9B!tr98l(jm>3d&{pbP zX)p$PmmjlvV zI!pG}YKeQh&Uem(cJsRSIv$L3t>I*AH@8{z zSi1=~7GML{@`jnsx1(!(da!Aiz?g(FIi?|L&7#-)qh9oPAR`j`hI}eWN0M%nJe9wK X5RlV9cF$>toYAh!qa#fZ|6=(Abc-r` literal 0 HcmV?d00001 diff --git a/.sass-cache/99848c0c56d474befdaf34ec4dac5d06223608ca/cmb2-front.scssc b/.sass-cache/99848c0c56d474befdaf34ec4dac5d06223608ca/cmb2-front.scssc new file mode 100644 index 0000000000000000000000000000000000000000..6e70c7068e4698c54799c5404a14158ff73e66e0 GIT binary patch literal 14404 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 Xu-OfMFw7;vv2ZUjCwLTtusrMY5LqV=6!AQ|Wu7 zF&!7~SVlAy?u7D)aS+1Qg^y_h?u4~Mno3Be%i@c3k_wkH9JfH#D51qTbydSb3Ri^c zy)YSdvY#CdEmRq*PRx4Bsn?tyc-nH{YEVa7|5~VKEvjm{8d%>s{fE_NB{h5wI1c`k z+NLj*j{f<% zRc7nmV)z`4$EcPBss#a!UK<3S<^m~90tq}ZlGjS)wF0?DuMFg?Ie9`vXe6$ei0cJn zjb0jvn>n!{5sWYo)O8m^qOJ<_j2k7HMnOiS4+fcA8-+BEF%v{xz`+GEo@BWsv0RYQ z$Yi72J^1nS0{Hcx*jGyID+P9q?(RXppnd1j>BHG}H=Vp|`NzaT_WkH|*;U9Cn{TV} z&EmEhQ|@hxG3&0|jR|wN8iU$x#=w2I7}JW=Hm2m$Qqjx~>YG>^k)?)Wcwi-#N>SPE_ z`7Qm8?Jwx=>4jt^A+#w2SZD9;e*4|Gdw1U3+27ecP&SU4#ah03&Xi-HowLny+c-R9 z2gV_LvIoOyB3SAMgptF ztkqKs@+|>$N4HtCIu_wB(BTt!*D@Vu79jn$X)!cu04mWt`xPjbkG$u#FqhIX^9wMc ztBdZ{z%$5I$d5EncRGxd`7p426PU$!hslI0eBJXkmxGI?w8;?{rf+hmNT&e7sLI=I z!F+feQ<-DPDRfbONS90`A0ajXD&);QpLq?ONGtM%)3JajIvy}VCrWg(SuNq>K&p}H zod%uebf!ROAqhIi>HIKV;7Ob*diUCBhAubgz3Xv8KV(T2Qij~qQaoh+6;uA^=yJ0< z_(%PT>sn?@$LvM@rzbCtj_Pl8+jTKRQSbT&Z;AQ^_YBu#LewqYXI*Zy`h{C-amQzl zUw5ru$AsB(JsGgRJNTv~;~pnUuo%sdODKtF z82nQB%tpC*Ft=I#%rXs{xYs^)q1((86h% zle+;yL8HLJ1=fRJF`}O9R!{bUR((r(u6rG(Ai-s23x1WS-0Inm*j55X!-LxsT?VhZ zW5Baz38l?F#qTo3l9LT4Ui;it40dj|m?BGRN7<@}Me1L=jEo4ZP#?ezfaak{xGVMZ zb^tV4%t*NiB~y;2Hw>c_x~x8+_tZ5`AB@s9Y+^qH_!rDDd-iS7zYjNEryC(yx~XCf zjb=cOra+Fv=w%F&gpDkqA5rQ^{x}&?p?i9lr{!j~uz~!9;O?wR_T6)UkpE9!%0wMdj8t(CA{rqX&9 zP8y}q+$y34+n7@mb`27cVwqKYjsZJLi+g}H==q_UCTuMF#L-F&5pn{Qus^(Jm)JXD$GI0!_@i%HguLXQty|{r%y^-@MKXnU z8nj1j0&fS%uxjfrypE{Cg@)Te1LzSQEf}VyoQG>Pg{vCj;&g8UNtlgEfF3RzgiLq; zMm$t9JX9d_^*A1mHlujBwzygcoIWbjLue0=;qR*kC5?0rc|MaI(C1d9L&18_yK$xU%aTM2W$ZS%g^vhHk+D24{bT=+e%{J0imlrUpIt+N@sw+n8k}fdX zuPIwrp5%Ew%6vAH`7DG^Y70l%+WN4j@_Z)ijy`W+7kN3%WpbE<2uWSw=;P}m&u5YY z`i$!$(Qe+VCfdbSjkQbZzmV%fCgBC}oX8bNHQv;-KPN7aIpzamniP&DjS~N@F?&dYs=%CJhfP+@M}Fs_?H$7`V#IWutOF4 z?%qcpcX8q*ox~ICl&c#C?AJAmwS6fOI6iEbl0!tH(J!28ggLy}RRQm8j2=e`dN|F% zz7O{(R}+_xufHKBhh3!i%{+gle1Bw4Ub}Oyi0a^9sVUPDfn+|oUF6J3<5vg&j^=Rs zbx6>JkFI#qUGfhirtV|64w-u|E6YIel@r{hl#TetLzMfeYs6-lzM`n6 z)3SO7Q{t2BhOjrObd&dKbgq536`UM{=~o}Z5}c*pi^Vo>f+e>4V8~!Ud~ZmrbCZy< z)m6C+zh%|N7O14!o+SBtHzP^|sY&XWC|Intd?o7@zv=4#wknZ2HsL~CAN1rO{=AEV literal 0 HcmV?d00001 diff --git a/.sass-cache/bad35fbdbd98634079887c6e2cfb73376fdcb26d/_mixins.scssc b/.sass-cache/bad35fbdbd98634079887c6e2cfb73376fdcb26d/_mixins.scssc new file mode 100755 index 0000000000000000000000000000000000000000..50829c8a90bf5ee53377ae03ad774cc4de0450f3 GIT binary patch literal 1630 zcmcgsU2oGc6de*u+w^N+h`}bPB7tC1=XRsruwODECRGA7(LEsTp_t^RwMgU0cDoe> ze~G_{ohGHt$|F2p=jNPq&pr0Z(W|55PUA%%LhuxuLZh!>3NP)`*B+d7;5cY^AUHem zf>RmC$csI&IqOw%fjM-!F3fs86ND_(}j^{E>6@f%{OwHP;)l&=(M0S2*5Z zZt9I=E|Rt?e(18K0)G&&5F$E;p0hJ%w=9x~$JAqLW?}2?6|t^2G-%e;!c~{Yit$K( zH|Gk*aYz-kuI!Dn~yyF7Qrf(>#AIP6}00>^Ylh1SR_hM!bn1v0J3< z+N9Fbc_@$?C-oB9n?0lS~VPIZ2`(EEgd-9oalI}F7f zLve+{RL_?g@WJvOd&9?Louc_&EW1-0PT<<=Ia}zk@s7^;L^TdkvK8A^vlwt$n(L>Q zRa99iC!wTCt;LY0s%H{1<95>ty%4C-!>u*X&f(fCqnYYyhP!0m;}m)*nBNS9UaY=B zU)K_pa|GoT0#iL(Ly#@q5Uho*Pt1qUj3`z%T(YW literal 0 HcmV?d00001 diff --git a/.sass-cache/bad35fbdbd98634079887c6e2cfb73376fdcb26d/_variables.scssc b/.sass-cache/bad35fbdbd98634079887c6e2cfb73376fdcb26d/_variables.scssc new file mode 100755 index 0000000000000000000000000000000000000000..78754984ee9e34abec4b91633076d50d5b9e6cc2 GIT binary patch literal 160276 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 R1m@thX*)^jwbSbJ{||$~lGFeI literal 0 HcmV?d00001 diff --git a/.sass-cache/c8d4f7249a62e232d9642ac78c611abb8f19f1ca/cmb2-front.scssc b/.sass-cache/c8d4f7249a62e232d9642ac78c611abb8f19f1ca/cmb2-front.scssc new file mode 100644 index 0000000000000000000000000000000000000000..b3a7e8c93e46c697d748ff7b5ecd11e2f5d490d8 GIT binary patch literal 1252 zcmcgsJ#X7E5Y14?wi4TIKF|~`P(xkX!I2W%aZE1C&;TA<1ht0(8B|(2*#sn!AeoP% z?SJo4iXF%B+K$J&dwloqk-d}t$=RUuaRM2{hTlPFV&D!wx&2^tJ{w-7gVSCTur#?C z4SR7Az>tm3Mzb^?3|VhD>YutV>VmwPFs%uhDgZ*h31Pm91olWPj2Aph6cjfNLEf$x zjdLkfS=J=4LtaLZL@CdpU^$Gv;~BzeqnPyXnBr`ffp&=Vc}ks|9YkJM2BaAZX}Bo# zFMDnvml-n<5I4+t0o)<`p%%9)hDfnu4uTw4L?-1S^0lW8(hjv@%0yD=71w3Swb0yN zQKL=7+Y3dSYB0QocSDhsE%a5Hr2G5>-fY>8z2E+&lo^j%Nzea&`Q`fBe_*+kHn07K zNkpvud!Z7kKx^L;Ux*z1d)bXeVW2R+%x>qr(7uo?>jH8#(3MK~s5lty>lpjue0J7N z6?UB1*rAOnO7WC?KzBoz z?geOu8f^*MZqS#a+J6oA-=YU=QHLIeEqWBT>AMy7q1|P*N^9=z(C!Ab`wZGf@3%o) zE3ElpE9>12=-p?~Hd=>X4LtT99>wZ-PwK2*r$^l_=}J7zxt*u<#{BD@8~i<5PJqvD YgR_Gyot4s6^r$pGc-(HZ{ClQ<0g%9eAOHXW literal 0 HcmV?d00001 diff --git a/.sass-cache/c8d4f7249a62e232d9642ac78c611abb8f19f1ca/opalestate.scssc b/.sass-cache/c8d4f7249a62e232d9642ac78c611abb8f19f1ca/opalestate.scssc new file mode 100755 index 0000000000000000000000000000000000000000..c42e8b43be313dec275d172fcc69567ff6e1d21b GIT binary patch literal 5683 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 literal 0 HcmV?d00001 diff --git a/.sass-cache/f0cbe895c687b32732395abffe5c1daa8c9ae272/_mixins.scssc b/.sass-cache/f0cbe895c687b32732395abffe5c1daa8c9ae272/_mixins.scssc new file mode 100755 index 0000000000000000000000000000000000000000..b0be5004f8e3235e1fd63c878f0adb8217705db0 GIT binary patch literal 1328 zcmcgs!EVz)5G@iivC}lArBEnPD+dCR(se>Y(eA|+qLL4wisXRQgIVlJW6AbfyPLEX zLj84S<0LdG2QF~3XLdaA&6~G=d(=DX_TAS5NFmb66x@M^DZFvK<6gHD_j`O4M_#AX z?Lp7$9QWTt4A6;=d!wk&yS)F-xnB|V>3}Om=}-bt`b7x+S;VkOxBO_Fq_Kqj+!plt z?V=AN%OIcERsAVXCva{BjTULO9Jl2LSs|o$BZ1Ex3*9M~3ICpg!c$^V>*J6*zP>Ji zR&yaUo-*rv0})3_3OUcfqcvX?IuW`0v4N#&l0#zA9bbuwj3AUezW_n^OHzYb61khK zP3ykWTyKYe69JA$Fon^jybHb-NZ&@!zgInyCEk< zktPwJaUx$&KAoMBE1ngFDNtmrV-YEGDP&woP>Q5n!&qcME{k>~a*ZmGBAr|$xgw(A zX&aEFhISzZLHR)|q9XimshJ{SmRw=^k;z-k9-=&99>1sAgeS>7gZTRu^pBW)DSa5gRSC#U9;? zp0Pc@&K~>QbaxfW6YNEey$l+AbFk4Q#|w-0UV~(Z2FY1Na#oN`=;voi~rd07uH{#0RR91 literal 0 HcmV?d00001 diff --git a/.sass-cache/f0cbe895c687b32732395abffe5c1daa8c9ae272/_variables.scssc b/.sass-cache/f0cbe895c687b32732395abffe5c1daa8c9ae272/_variables.scssc new file mode 100755 index 0000000000000000000000000000000000000000..df692ac2c9d41c559aded20a5ddf13830a691517 GIT binary patch literal 6013 zcmcgwTW{OQ6^^@wVo|buNqmVLZ)jQBByJ?qkuNa^Ex1^$7Y4eEv^Ex9tEpzp1jcytUk5$(^I=YI%3C1C%SE&^iTAIBdYvzksD7g zXc!vCWx$wW{DJf6J8rY4(K4;EYdE<`9yxW`84;bg7yhn&>HDr@QGrSO)}+5)Gt9I2j+u_1>8_$YUjxV@Y@+;xeX&WSp?_-`0u>^r~e^x z0cqI`7pK+q1IAnLW0;Em$ke*VarxfVnD5FO@f(dzk zNxmpSud*Vcqm>-=hfT7GxoKP5SK;(|Hprq{+~q-tX$hT#4#FH16%}ffz&5~eEmH_b zTV;imn=wR7K^Eg#l8lm|N@C_KL;!*bcNh(mMo|!csvC;|vz>(>4dn{bv4?-vhY)1q z5q14Bg|zh;4j(2QKrB+zdAq)Mc6KJVZ8^;n>?QzxoWaIX278XiRaT_NXl3^f`Jqd# z4+Zk%WlE8}`cx2VPe_r^Y|=?H!$f;%bnDcq4!!l6~-(1QKeG7dP}Nq3*ap~{NnfL6Xpt#Fb? zcpD;I&`?J_P;EA%Q#VpYs>>psyeP)_Y6yr9 zTvr`3bs92Th)7{9Rt;TleSrLN3wLd=*OPiSih5RI*)K5qv&0hXxjKaUfdx=7Kt`A! zfeZfzLE+bH{FNLakaURu5=kGGBz*+*H!=V?x=;L7S&@>Wm0bMAG&XZ#(G3}tKlXew zFM-Qjpz?!c@}}SK9~~x4HcCu3VAtJ@363(i&IyhxE0PIXIVd}1E6*f3MhO*Tx0uZ1 znmH{sns`Z;kB6~gPCf8%XmLpGqJ~Kq4W!HAvTHe;CB~b8PG0^vlD8vV^5P<|xE`y_ zNXlp?cRj|=+sIQM^K14~f%qc^;@`k~4e7nn=xG z%4upP&E?y9Dsddr;C6l}F8mAW`~&DXl8#N^9v`Q{_@qSVNr4WI?n9@_ill>9?$B9= zF6hI3a>Lx4b-M(Ay8s_Y-Biap-l(!7;iHw~)Jp1&$74n@xec$195iuOmWObE+Fi#R zap52x3TW{NisR&wI2cb$@Snm~PqI{iqfWXpR=@GV(C^fZRc0jqf|(Tm>InL&`z7Z) z4rpR&BdeR85{Vsvy_u1~QC62^KDf)F%8KMrup%$J-@s*ei7k)%Ee)U>eXYKuwhcWC zcI(|)Kk||*6%A^Mi3-?d(Xb1ncIu8y$M{rE#P)^5IHRZfZaNvV0Qw4N58Y|3o8EK+ zeOSbU!PIl25NrB}{ztTBY(ih<@rmQ*rt!-H4;)}iT_`jAdb}3WY`X-%4S;1d;pjeB zWR(@^2()tNid>6D@MG-@Dv*PWDtVKmM*7gR9TxHLmGJKs@Z;z{_^Yf){AeYIKP@p= zAdp7zVMDe~<$|(P0@ndUGB$A3D#ykqTI`PK#Bpy+l|!5+*7FO7G>jW8NETvZ5WhLd zCPd13Uc&KQ$dWeFIO?T1WXibPYF3$%DxsMZX(sOFS|)so@$pm8dHWat{A~6oF{M-f z7@?Ma4E2Tlp7285O^Ojxd=oqI(u?ZMH#M!?1uGrVwASlr!%(r4%G_Xg5{`g3b^rIW9%kwRQ6%Pkb803-=NRRzMR zMO={PmgiA-(-tc)zM`#&t^mC0R1$R_6Y^<4UDd zx~749N8Zg4Z~1EwCPgejI1tbed|Z9Ez{ISprJJfAUkHfJP%%a4X%w<$)e6`^BqM}Z p&L9Y~@EFsBw62Qm3!j5aX`%)vTBfUblzwkp!!M14^rQIYe*q`l(VGAO literal 0 HcmV?d00001 diff --git a/assets/.DS_Store b/assets/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2a5e01d6bd57ec98d4c778fa723fdb807ec885c4 GIT binary patch literal 8196 zcmeHMS!~os7@ltl!A=ZuAe(Hsc4;^S3J{WrfW)ymI08XLY(m0OHr}|VjLEXOje_0IEqB{RvWu~B9)H#6yuXDlZ}l|RjlTc+!^w0w`qyo&ji z3nZyZs#;j}Xll%vOnI7DaJ#hp34YhFd1INNJV2iXZkM&pQPY@At99Lu?P;cMk?VA=B2K$u6g0>#pBUN;o7*mgKY=o0{6%v8_4L*3mlMoS5q9XlYKgw{4xCmZgR@ zTXy!2oBS2JpEb$S?0LW}hviOmi`hrsD$V|8Y4&newX!g} zZ+~ySaxkqfo}h^x9`{Vgc8?l)moTl?xI{*8*0KBZ2KNtT9jlPD-LzVp)vRp6(mbQn zvQp-GgKRZ!Ht$$gzvG&`nPbDAan|F$Ij-U3u9Nq={l?O&T5ydc2DN2Q7(LXYJ8V*y zJWz#vby36eRckhEZr{GMYoxU*x*UVVP;H0U0W5+Z%YuLJJj~*w!ZO?qn zH1cvSnxz3-%Na9^)!Ld^V>CKk$e3pergu(lk|fdA%4kAX-bjvz zlGK#!F8b1FN;dn*nglQ=Hziwwvcy)fR@TG%*a*wBDRzlnW>?uYcAec|AF(gk47<{)Q`x_BdV<8ry1~D{Z8J1%`TG57fB+-il=))l#!3mtiDWstz2OHx!gGm(e zIG(_hcoxs&1-yt?@dn<(dw3ro;A4D=ukba#!H>9wU+}9KU8JP(zS77A;xEE-DF+KV z^4#5}9N)Wdf4y?x!Ikn4i@1K5kbWByYu0aU?by+I`{|cG^jU(uQ-!|pgtC0al@ukE z9&22>Z21Z$K1fa}r&)`RTdY*-tQ zs}WKk_iWlso_QpF;cIJG;_7@-x$th=t|)2+Ed$}*xr@A&BzWQNT0yalHo^a{*w5Iv z>}OKzKVYaNr7j_ruEIKOLHTM@gY9P48AMV>%lU;{#35liB#UU9D9`P zC5_Jx3GeQofq5b{#?SwI?*0A${yPXGLk2&(Ua=wqG8@^i{)qS1YIL^@x<#D w1^OYB`NwfW|2R%~`wv4ZC#WiqNd{OHNES-}`-cGjD>Qunhwp!1eGhN;FFx-j9{>OV literal 0 HcmV?d00001 diff --git a/assets/3rd/datepicker.css b/assets/3rd/datepicker.css new file mode 100755 index 00000000..3b16a2f1 --- /dev/null +++ b/assets/3rd/datepicker.css @@ -0,0 +1,356 @@ +/* Date Picker Default Styles */ +.ui-datepicker { + padding: 0; + margin: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + background-color: #fff; + border: 1px solid #dfdfdf; + border-top: none; + -webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + min-width: 17em; + width: 350px; + z-index: 10000 !important; +} + +body.wp-admin:not(.rtl) .ui-datepicker { + margin-left: -1px; +} + +body.wp-admin.rtl .ui-datepicker { + margin-right: -1px; +} + +.ui-datepicker * { + padding: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.ui-datepicker table { + font-size: 13px; + margin: 0; + border: none; + border-collapse: collapse; +} + +.ui-datepicker .ui-widget-header, +.ui-datepicker .ui-datepicker-header { + background-image: none; + border: none; + color: #fff; + font-weight: normal; +} + +.ui-datepicker .ui-datepicker-header .ui-state-hover { + background: transparent; + border-color: transparent; + cursor: pointer; +} + +.ui-datepicker .ui-datepicker-title { + margin: 0; + padding: 10px 0; + color: #fff; + font-size: 14px; + line-height: 14px; + text-align: center; +} + +.ui-datepicker .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-next { + position: relative; + top: 0; + height: 34px; + width: 34px; +} + +.ui-datepicker .ui-state-hover.ui-datepicker-prev, +.ui-datepicker .ui-state-hover.ui-datepicker-next { + border: none; +} + +.ui-datepicker .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-prev-hover { + left: 0; +} + +.ui-datepicker .ui-datepicker-next, +.ui-datepicker .ui-datepicker-next-hover { + right: 0; +} + +.ui-datepicker .ui-datepicker-next span, +.ui-datepicker .ui-datepicker-prev span { + display: none; +} + +.ui-datepicker .ui-datepicker-prev { + float: left; +} + +.ui-datepicker .ui-datepicker-next { + float: right; +} + +.ui-datepicker .ui-datepicker-prev:before, +.ui-datepicker .ui-datepicker-next:before { + font: normal 20px/34px 'dashicons'; + padding-left: 7px; + color: #fff; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: 34px; + height: 34px; +} + +.ui-datepicker .ui-datepicker-prev:before { + content: '\f341'; +} + +.ui-datepicker .ui-datepicker-next:before { + content: '\f345'; +} + +.ui-datepicker .ui-datepicker-prev-hover:before, +.ui-datepicker .ui-datepicker-next-hover:before { + opacity: 0.7; +} + +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { + width: 33%; +} + +.ui-datepicker thead { + color: #fff; + font-weight: 600; +} + +.ui-datepicker th { + padding: 10px; +} + +.ui-datepicker td { + padding: 0; + border: 1px solid #f4f4f4; +} + +.ui-datepicker td.ui-datepicker-other-month { + border: transparent; +} + +.ui-datepicker tr:first-of-type td { + border-top: 1px solid #f0f0f0; +} + +.ui-datepicker td.ui-datepicker-week-end { + background-color: #f4f4f4; + border: 1px solid #f0f0f0; +} + +.ui-datepicker td.ui-datepicker-today { + background-color: #f0f0c0; +} + +.ui-datepicker td.ui-datepicker-current-day { + background: #bbdd88; +} + +.ui-datepicker td .ui-state-default { + background: transparent; + border: none; + text-align: center; + text-decoration: none; + width: auto; + display: block; + padding: 5px 10px; + font-weight: normal; + color: #444; +} + +.ui-datepicker td.ui-state-disabled .ui-state-default { + opacity: 0.5; +} + +/* Default Color Scheme */ +.ui-datepicker .ui-widget-header, +.ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} + +.ui-datepicker thead { + background: #32373c; +} + +.ui-datepicker td .ui-state-hover { + background: #0073aa; + color: #fff; +} + +/* WordPress Color Schemes */ + +/* Fresh */ +.admin-color-fresh .ui-datepicker .ui-widget-header, +.admin-color-fresh .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} + +.admin-color-fresh .ui-datepicker thead { + background: #32373c; +} + +.admin-color-fresh .ui-datepicker td .ui-state-hover { + background: #0073aa; + color: #fff; +} + +/* Blue */ +.admin-color-blue .ui-datepicker .ui-widget-header, +.admin-color-blue .ui-datepicker .ui-datepicker-header { + background: #52accc; +} + +.admin-color-blue .ui-datepicker thead { + background: #4796b3; +} + +.admin-color-blue .ui-datepicker td .ui-state-hover { + background: #096484; + color: #fff; +} + +/* Coffee */ +.admin-color-coffee .ui-datepicker .ui-widget-header, +.admin-color-coffee .ui-datepicker .ui-datepicker-header { + background: #59524c; +} + +.admin-color-coffee .ui-datepicker thead { + background: #46403c; +} + +.admin-color-coffee .ui-datepicker td .ui-state-hover { + background: #c7a589; + color: #fff; +} + +/* Ectoplasm */ +.admin-color-ectoplasm .ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .ui-datepicker .ui-datepicker-header { + background: #523f6d; +} + +.admin-color-ectoplasm .ui-datepicker thead { + background: #413256; +} + +.admin-color-ectoplasm .ui-datepicker td .ui-state-hover { + background: #a3b745; + color: #fff; +} + +/* Midnight */ +.admin-color-midnight .ui-datepicker .ui-widget-header, +.admin-color-midnight .ui-datepicker .ui-datepicker-header { + background: #363b3f; +} + +.admin-color-midnight .ui-datepicker thead { + background: #26292c; +} + +.admin-color-midnight .ui-datepicker td .ui-state-hover { + background: #e14d43; + color: #fff; +} + +/* Ocean */ +.admin-color-ocean .ui-datepicker .ui-widget-header, +.admin-color-ocean .ui-datepicker .ui-datepicker-header { + background: #738e96; +} + +.admin-color-ocean .ui-datepicker thead { + background: #627c83; +} + +.admin-color-ocean .ui-datepicker td .ui-state-hover { + background: #9ebaa0; + color: #fff; +} + +/* Sunrise */ +.admin-color-sunrise .ui-datepicker .ui-widget-header, +.admin-color-sunrise .ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: #cf4944; +} + +.admin-color-sunrise .ui-datepicker th { + border-color: #be3631; + background: #be3631; +} + +.admin-color-sunrise .ui-datepicker td .ui-state-hover { + background: #dd823b; + color: #fff; +} + +/* Light */ +.admin-color-light .ui-datepicker .ui-widget-header, +.admin-color-light .ui-datepicker .ui-datepicker-header { + background: #e5e5e5; +} + +.admin-color-light .ui-datepicker thead { + background: #888; +} + +.admin-color-light .ui-datepicker .ui-datepicker-title, +.admin-color-light .ui-datepicker td .ui-state-default, +.admin-color-light .ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .ui-datepicker .ui-datepicker-next:before { + color: #555; +} + +.admin-color-light .ui-datepicker td .ui-state-hover { + background: #e5e5e5; +} + +/* bbPress Color Schemes */ + +/* Evergreen */ +.admin-color-bbp-evergreen .ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .ui-datepicker .ui-datepicker-header { + background: #56b274; +} + +.admin-color-bbp-evergreen .ui-datepicker thead { + background: #36533f; +} + +.admin-color-bbp-evergreen .ui-datepicker td .ui-state-hover { + background: #446950; + color: #fff; +} + +/* Mint */ +.admin-color-bbp-mint .ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .ui-datepicker .ui-datepicker-header { + background: #4ca26a; +} + +.admin-color-bbp-mint .ui-datepicker thead { + background: #4f6d59; +} + +.admin-color-bbp-mint .ui-datepicker td .ui-state-hover { + background: #5fb37c; + color: #fff; +} \ No newline at end of file diff --git a/assets/3rd/fontawesome/css/all.min.css b/assets/3rd/fontawesome/css/all.min.css new file mode 100755 index 00000000..1460fac6 --- /dev/null +++ b/assets/3rd/fontawesome/css/all.min.css @@ -0,0 +1,5 @@ +/*! + * FontAwesome Free 5.9.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"FontAwesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"FontAwesome 5 Brands"}@font-face{font-family:"FontAwesome";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"FontAwesome";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"FontAwesome"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/assets/3rd/fontawesome/webfonts/fa-brands-400.eot b/assets/3rd/fontawesome/webfonts/fa-brands-400.eot new file mode 100755 index 0000000000000000000000000000000000000000..e79f40f98a8be036d04d8b0def788bd02609b877 GIT binary patch literal 129352 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�W~j5AmI?=WrGa?KDn7M<7h_2n!0fpM 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%0DJ{JhTA8n9G7)DI5$ZQt7 zMp|NBEorX?kve(^B*V6!iYL>yvwmwibkzE8J)S+?lr&rY7k=C1nS!D3*!PFvD)}>LvgrC=rVA%^ zSH(61?cq1Xe83Zo>#cKB@rxw~oY9i$@z^0{{u`bIkzHn(@(y(w6ZGs2;EJkVN0Ld? zcVSQ=9bp`iFcf)6=W`~DuxFRZj=pZ_rC8d+@q}s<{lSsP_pUSk@u&SPOM`@>0ZT)? zBvw@s?THqkbNUm1CHZUqKgR0_77i$8@G|nuCfr_?0a#H@nEf*GHJG!HVbw97>nM|B zco|>P^?H5qe@fTiJ=5CyE2v2=1Z<|)uKl^wM|PrV#FKWWc4S)LJD{tHF~f-d==uTq zUFB$$eAM+Fs~mjr!|@O3S3Y~7nO|Bua%5@tAoNQQ^cN_qGLh>=WATv1SoUIK-DA{G zk{nAPV;Xu=hishy8=ebAx<^>;5?AUmp3$UX%(gosDk5!9A}#$H(#A#5iDh$(N6N{G zLQ#D?ov2J#N~K<}7}QqBI?J(AVe6ZR$J*VILV$LTg^Z6In><`lFZ|>29FvLPYdPt| z>~lEdl8ArU?opZdW8Z{KUbzmuNT|IPe_}oyx zuZH-Oi~R1Vh`Bu#F=RJ~?gkgdG+=BO1~#*#P^<~x2)){d)86AY(C^1&fQH&GO~<#l z|B^`~1H6RjqUIsK2i=#u#ZMHxlR;t-|FNxmXyaHp0{!y>jKkb%Qe72Y6_P?EE+S|k zP&J zPE#gkeic?2yp1Gek*NmdzTqxn6JtaxBTFHM1R;staStXSu;G^*jg3a*5wZ}S2{$ua z9`WZdxM1ENDbHro6GZi#o|7$x zp)_heJVW!++bE20f9hRePrl&=*S@wVjLGhkJ>$0Yy(%{UW@?D3xwyR)`}@C-bqss! zySCAZ#kz+5t*!4U|5M5MS}e8}7ixF(+`a_&^^<&e6)hAvggJ3)2NSW7H9VqG-2TX4 z>_OTWZx2K}@`wB3b}tvnH3kcs{@|6zd44?b@4EfcO6{gcAHAtox%4wD6eDn_$`3p? zor+C8^hE!@Zp$5WljX*Bv)c1VVljSaqSxq+Du3c3*Z%pNZu)uK-TKt%Yj`HB##K=k6zm8G+I~xW2)Bcs^fxkQGgL6mA~3xBZQ8{N4Fq z_4qfw@r@k+qxp)e?L3Q$*n{+28Q?I3c^4r${E8*X7OEVXzVfbjQLW(Ix!{S#bOz`VXhK8x6PL!$dliOd$SB15;P5v&wHBC0MX z!Pn?rASGs9U8dfJekkC{{EQ#5K6`VN+0;q*qmfw)bbgFLi7fZ?YAj!=25%m_dA!~o zUfI8YWw`ebjx%w?gyYOS__|_o?UQST(!_+lcE$CVuUiun--x$YV9rKxEN09X4ZD=D zkRvfnf5Y0AnBE7m^A_-7t!~#i7(hDuQms~Uo|xR<$!3QSOg`Z>Oe+j6Ycf>!zJ0dZ zSGlR8RxazR?&Ujq`{YPQ;iy?QUY|wnRx=qu=HfjIP)T?N>18Q2t09U+&*6)-soxsf zIrRLYp}f#o8RwQ57>Tvey!cFY0i2{*naPh%byv*}95QCail#kZGrp$t%CG)4Ls8<*{iQVH?$4a zz~hl>0%DE8Enb}O1kh#|$qtF+VgibH2XJc#uktRKR}Jb)HMX8U`}pH$8F_ixc={>c z@OES4sYc_e#@W-S&pzHb%b(MyhoXKs)CYGx!2GwD$|hGb;=-uyp<6W{ie?19pM?5I4}n2teksMkcjweP(iI$9#QqcDAqnhG2n9 zVYZ7qX=J~NM&@6ixEIR<*vdR!Ao6Zge)et7Ys5Su6lxr=Qc*O%tJA&3NX+`Vc<6UZ zg@mI+V8)qv{Q1v+{H_;yC9um%w})UG5pF3QFhW2{M_qV00m9L+q1+R|8cwQO+qUix zi&o%`8G7kvRP-|%B_fC5?8%t)W^x&%!tW7yC8tn$x_#)Lp;r&RmTDjW1@+bU4}F+B zgtaWGtOgtr*X$9w>9@Mf=ZLM=C__cK7K4XgD|k8$F>lD=CCPk0^_LpN|GzAUMG^5X zmgbIYRxTTQJ}II^9kYHdOC%1F^)$5jM9L#}=;cbVBGO(v&=Vy;iy^CaG&cWWvoW%H z>eS}Q*576*KmHTH$A9u8YyUG#n0eOTyJp8PemCV<5KG})$eT=~0|X{Vh9{DM@GO!f zN`Uj|u`pw#nk8yr8kzh^QIGB1`q9OUGc$`9Z*I=cZhj&5TF}WO19Re}1uN2NdjC>_=4&&^l*+>EmnX!A^c46GpwZ^)G+;wzr*r;pqMy0bt`R z!uy)bqxpySQ7|gy?xpl(u@jHxuis$@*_a>eX2Gf-^np~lz#Wxe({nb=gq ziKQ0$v+A%ry>h|9nP#ol{JTW4R7~GgOV+Yh$+`lXNm!vAS*@=NIpE`B%vgUyVOzd#7PQkLW zn66L8n2;bQXY$3+v#bh1mMdZqGb+~w^(<*29@i4)6UnWoQ@OYaAoK6xY_Za6|>;e=%gf_7Rr9t9^y(O}> z?^-=(2fY!uu)lHXE3UZoQg_$d^a~Chy?uIp?yVU*z)LdHoM;7&DLL@c=gGX zuRihVz^B++p%7~VF#9A}`0;8i2;$Ya@&hB8QyzziyHlB&%(ZHn3IfZ#TW|92cTXtx z7k#KWefzJ;{rP1^@xySSUo-T}sPz3YF|~7eWB5;EY5`odB2|}=A)6*XLvaF}G3BxM#eB<$ z0xIM8&Jcd0>xn-%!+k^x0)G$y9gQ_{{tdd@Ob_5r=L=TE{+*9%FZa6U_WAUn6NWW9 zfj&cAjpMU`;1vAMueB~o5ms@g;y6D9at^iH%cH%88XA9^R*Y9ey-Y&a1xMnNpv||~tcKM5KBC5 zrUNwL1n*C}!<~w{+Q^f?i;6)`g@uUjLIfjjTK`Q|b6!<3v6FZX9%SB3;WU52-75hi z<>z$0H9g(oKxi{Cn}_UFouFEuqw)v=c4q*bbIG)mactopsL+8KXsE3xRJ#nVJ|Iqm z&rA@4P#UBN@xFoUjm98+1my~uLSQb@NO&E`^HG+TKnT^fh!Hc>FwJUIKGcZ~ZUq%w3iq{~D(m;iP|}zNFsA{NKTEyMntc zWL1)10i>iy;&4O~L?BdinwV>n6v{o1^2(wiox8nLVU|Otjvfh~iPi40)qp13w6^m*d!-copidKZ@&M%Ymp1+H=1Wt(d zS@sXsrz$0PvE4)cjFxA%wvbLHK{ED%Ts=EmEiUzo)zqltVp4&!8})$A9&-?%8QoA*9DI^g9 zpF`5km~#eb*wXorq+ZhlXg<#@kTIGTFMA0WV(@nW7^wFc@mJ!RQh6@Enj!QROQCJ0 z^I%Z&Pz6LjdLYVGWK{H6ypp098mJ0uvASmy_$=DGIdzq#)e-;OjU@Iq+5m?wR%bx6 z_cL}dEG@>3O<_~zg7qq~!QB3Fh`V|jw$(nMwQi(0c0MN29NM6@MYXa_8qszmi>NkY zX>qyj$c6+C0BvS|k(NgFZm|z!xF6UKTr0Pri_$mSiJitQ%)^p4I(VlxodI zNE8F_HY&p!xh(OQ!qrOVGU`&`a@aMF<22g!R))HOBLo_i>t2nLRf<&R1Pom8t_cEaXpXNG!a8<*a? zMfu6d$3FKIn$1sP^{>E>I=USJ#)xH#m3Uci%>YV}28QIY23C{T2M(ODO-ZG+S+y>f zJDP8k6rolE3e$OI6Bd16i+3n*K?=m=5yJALp7tnDHMNl!7~eG zY{i2j%#HaOb`Q?(^VFr|=G zAKR0c^M7sm+z+H^0W}g>Dt~za0VIo8WNAZN7N}E82alW^nrih=HnP+Tsk+OBc)4nX z)^ecdtA4OrQN{7PS#FNT+T+2L`^p1_{^WRNKEG@6Xm-!$2}qf}3A56wRr8f_XFJ#4 z%oTF8m2{<%YSAIO$mUHa(y3ARm#huvf*tPC*NxM$U&~MC=e#Qu@2hSCaYh*DSJYRS zzfJT)Ho#YgJbO`G$pINHAHp2M9~iQ*_NGjU16Z8>Ajxh~BI<+?#XLn=Y@y}<>E5NK zj7rzL)59x=FIM-}+|?Kp2=+sEG~S)iGQ*RL99En=a}0Y<#6Nwq`77<*^-&nK5T1D>U7dv+898 zJf&^$RK5!i90TJVl3;Zc(GM)tHjvxW@yS=e#NB%7++iy6YUucd9-~Nw0rDRlnw=tWQsK5Hp>c zZcI6zi<)3+Ca2I$NGGY3dXfUx390{;o{ko9r0KfsAVhw9I&G$^Wix#e)=+9k<0MgJ z?x%6?Tk3PzFj6ybs1F?=5?!J32&1h_afAVJg)}7y$Gw)2Ir4;+C=!GlDpSnHs`HwU zz9hcKX%Zrvc=^L0>Q$#lkrJq-rpqdwvFq89)|{1T6g*W;O&4>nRa)Ns*h}IMesnbs z1g0y`q^{T~X%6GvVUHvN7b{*B#+tCd)2*;eeN03l5EvGH_a~`W|3!MeFg2;z3Oiw1 zlVl(!0$v$t@IVKj`>d4@ys}a@zLDJEB1%+*e{J))_VnC{2~sTWxdt14qDbRD{1XU zuE?~0+yrO$jmn)`-^{u|E#&{C+cFwL=d(U^!Bi%4<6f6~P6 zLQh6OU|z+(LY+lIjRq@9(GA3{dXsHqT5;u=E<$s86t2pEZ9(E2bTB|lyCPN0fu@lr9~$mniT#SyJ3 zXt6PeFmIfUD52fSe;tAtEHJKP7^)i;W`r%BfVGdYXRx2pIETk$`AO7K z`Es=IBm=;j$W{SjnYAg*!d$MNHj2IFqqyoh&EIp) zGKn^}e`1IGs`RfPd;g1W{Bix2Z_3S1ePR5zWMFiwTJr5l8 zZtARj08IaL^aENo7$@F?7}+(|@xy3(2H)(qY5RS8sj&DX1P^mB0)54~iwsu+eZp!G zQ$AucQ1BKVB{*4llDrZ5iJ!TM<*deKj6%iiN@NAjU9^mEi2P6p6wh7DN;nk~ppmfc zBA!Cf*3Ry}V^4cHnLP8z{M6!)Kg`P`XF9EvbLNrNcsv0hmq7r_O^~vf%A{gx{hoBL z=4FOkv0gGm8lj}+?chDB_|yh>lRI=X9YHPOnp^*a>m3Iy^T^Fd%v1JWo8MCu z96rBJz0&o!-jcj>d13$l1)wB0@Ry_cTXg$AOWzTjSU4y>)Y3u$VSCuP>a&0O&Ev0m z=**R^<5!#z`pMa|U!Q#Op+j$9Sqv7Zneb5_+ScWjc%k4eKWS5ovfOTboC{$!TuOxR znxX55ZXJ4|L|%LIJt^Wtn`Iy+Q>j0ArB(H}|D)H#$qYWrUqmbjhxBNIHvi?XXdCL? zUemJm?WJb)srSs5+g}m<`#m#X|Kd$I`L6dm%eYRrZr8LMZ+h-Om9q3(lz!d$WxtP- zXUEMI`MmWjMp9iGbME$1ciY+(ENL{Jpy;2O+MkIhQ|)9Tk=&Qf{<>+lHEmxkc5^zt z&vDwxxm;jiJ5@cjCitFm5 zwn5)yqJ!R@q3&xy`Yr=F+dM#Vv|7gx*jFYM0&a*Oz(yBUFLJ-A01oTzktw*w6u9nj^ z_RM8m)EJYQmd{tl`6j*>dJ#QzfWbdS{6u(FuL6O8Y-Z%6Sz*2Z5IFWK2mS!n5 zZ->4A@V{+y+o*2*v;Lz21Zco?@-zQ4-OPo3JO8u(GvSDt6Jm!AqORNanq-8A5w5a` zEZnp2pSwI{SVud6VOlDPMKnse26+QZsEx@qcstt`i@GmdKE8@5c@zW&EI|DTp=3-a z@knSILfoQ%pbj!PEOSd=jHO>Tg~g7QGNIe!6jy9@k{N0(_!$p;IFaW$q)*d9A;!St~oOczCu~Se)QrK_ntU$?<;wdFXQt zZ5^xGxhjC6K>d5}@oO$ch`BZk%j-$?Z;Yk$SX^hw za63En>x`&EE3rwyrQc9Nh=En7Teqj|$nf7OX|%$u(|Ti3Ia(O;ERkLX;)X*ow`P(; zwn%aqS4-y|yy2L>)y4hd7U60!G|L^>j`s0~!I$w_M&^OnSyf;wQXN1RsLwVl3D_cm zm#4a--8$IemXM%AzBNFwJgZiP>P35z>+4~kOYvrPZQ*pEF`GSYbESWe# z7T4LbMb81_UQZz`h2D^psW6^DQhn9cVYi%5krzQofa+VYfaCNe%f=#Gu!2&((Q4F^ zFPJHpRN#I8$O{TK6@zr!OOITY8=W3)$1b+PvM&a$#tCw=Vf#kgYA`Qp%S{FxXz^Wo zK1bAzoqJM;-kl9hvz7GGuK504=mN9Qz1*LWcWoV9ho zGPOxu?3t}^^h$5rK;DpQ7TLy_o4$D&$1j^IS$=wYt>`XXaZLIdHF1VcYxmPECx|!P z%RGdph&H83_y%e&=mMtyIt69<2+)AOaGSIN;D(>M+BJyr-TBoTs9XTQ!#6m>7^eJd&BJpvE@;dq*jU4F@*Uh<ADjMz{Y$QW8-*!DDs|-SKjy2XK7J(IW*po$~`x!oZ)g^%P50?I$vU9=K-r#_ZHJ zyT?1n@^Hzcc*mbd`umZH4WFyF?pu~(u< zV`Qzsv-!{L3=Wz-$PgG(t zDZ}j{nH{0t4sj*akxRZAKe%D-DvU&leo6c~U97~2s zr|V|6V5#A0D#ff&c^CX5YoaQtQGAzgi^nR-K(AKyAX$#tX!4NM&9}wkWeTDoyB9wOTI2Ymrb|3d3QAJ_lDifg5R?irbw{%NW3OXkqLIC zJH9sEwvqqQNx|efJXbVKYn-SSY?=7HorpkD!_A|D^O9}LT$o9{=X zR@k4WXEWanK6_CVSj@b4Muq5#`*z&w{dsp-sl9vZ>qo<^m(P>FzHw#uzz#oVt-?1- zy2oZ(1(H*&P7rQ=rg|+R|o##;8L#EXlFA8wX--` z$6x}y`Nv1ECAdqQiA4GIcs}nMmG;)-ac}))bI5g9sVPyc zkKTV}BQXpThG*C(cYK(t31q|D%)PnGC~WI^3E$aP9M5_ z<5<7iojYEA@QYvV-gNk~t)VX}cX=nwxNR(JierFmg^T)p=*{cF{dX)MJGJn#jrXgu zZ<7)C-uL1q{%B|wOldC|@HDpD9$4QuQE3LHVexMIlKno@#xbPmHaCzM2Pe>$A&`|A zZp=1#08!vmw6^;J3ou-`-HULXBdHuJ1PJCSU=useL57y$5+s#ER?Jq68|c;|f$ORl zyE)BGdK%()iXt1JfJ`vl`&`;av?;9>kRqY6oHs^wm_gP&n*| zi2CIIlF_~)vxs_{yw8m!X*H?1v*xL+gR~ZUCs{LKQl)wXsH+Q)$$CT4pAV|3AbAr0 z5oJ+5N{*Deai}11|Hgbl74yTI;o|Mt8FFV-zkiaxPXz?)Po9%~_&P;F3i9Z$j0f2S z8O#Q%Eje!_4M#E;-}DO)O(!S@bNwZkTyMDIatQS zb;r4us>nbWmGSwyu3bLX8|jR{s@#HR{D-OewG!=c_w{}a#c($pq&;f1s~ZA83;I*1Qn`b@124NlIG5*sMBjQ1{pxgtR^2!BbJWBB z;?UQJenbSNrG{0Hp?y1d0FOsvN6;t+(IOmmmOPs~@H0{etUhVY5t1iQdNAm7(NWgG zB0ZJKlfkkdHMuA_DKXeSSdL(_g3mJYvw1gyXvq;2Y-jNO#K|Rjfmd0;X<pIPkN(XP+EmY?32jco)hgp@o(%6VI=%FO_92u$_d z?*N_)dx1izoBTadGob~oM87)_4a0A+wXB6>YOM@@wef0QL*xuUuvjYN_}H43Nu$1$ z>{C(2pd6*Gc`$mTAx1nD=A^BEHdKeoW>~d^NNLi>F4=&>fa+p>7oVcvG-zE%pF&+c z`ptip4MCXY7reJ)47TL;k|d?N_)V%GD?aLL+ebL0F5(*)J@`@>dQGJ^qu0S35n9W6CK^5z87p!*h;!+0zLr5P z&j=C=k$qpG_BPBeMvLhLoZ}Z)7zE8ID~`!`x9pC@)$ygc)TzN zv*z-3Rn1)4Y3Q}(#tek;X{`FmqGs$|F}2dvg~zXYY07!kAV1@qV2bZY`TZci#>t^O znQdiUc-zo>hdws+nW5hw`sUDIGJ!{PDi_LS%BaT8=|us@Xy)bSNDPPTXE}e^D3mZG zcSm+%%fS+cJ?^RODFRcnjgaJJ9peS>qx}bo7f9XM^3jSGvH?4ZZjKNz!)Qy2#_7=( z+;3!L{M#zO(SgkR>`kYq|E*0?4zS0?iLF&8b9_}F?fk*{-gW)+Uvo=Ld9$4skO z0ra+dOEKI3hh(}CkSG37KA&Vl)(_@ApFD!V^ZmR>Wkk*Qg8iU&CgIB6`MjxvYdtT@ zG&o|<4^x{Bmb6_8w!Yh{*PBFH8?KkgrL-Fi>Q88Rfy1+87$s+NIVi|et%gMaq*99M z8R|7A?~S4GpK1bhHfxP~mMbfFF=Zlu`76w89|jqd%z_-P)x+kHe5+m?DoiM(IJNfP z!^M{tkG$+MK&9P}`5)L?^&fN8hqoG+T=Kg6KN4TgWR~MX{SZze`CDhzh15ehijVoB zp(lsFAhFC4m45-Di9b>fVc^z`SC11q*jkMRN+a%1syn5vXT(2j&|+lX)dBCfvUj>Dmm zooJ`BQ*@+5-yM$=WNf1PxxH^DpQ@IE9DzXO@y+-<8*S}ctDVheN;MMe)Z~tG@vrlW zG<>I-Ec)m*#^doO*^ippaG>eO3w|-#9CKT4=;rHLH_iZ`snIZOzXE0lyn@-i+A@~@ z3mTiPIQv<3r$yYl;Fl83c*ud{Ee`zA)K0gR$hooq?LqdAH|=EGDd)Uyu`{(fc;4`; ze-8}nQ#|+oG4wr{(pgpHd808N8E}z8HqVg9x;+&zunfiz8B(HUGC@QG&a-QHWG{&I4u~8eK8MZv>Hr7+xTjKDS~g4S9Ea9t2stW8E?_e@6A};d5(=a%IavY zMMd`56+}C|Zn=Q6{@uOSy^6VXPY!pKLb_J#6kc zwfT~Svvaz0frCf_|4e`Kf-5tLn-8^Sr8=Ujqkl+B1&^O^XGh`+;7OQCm}ByZgE3^$ zZ1j-y0T$}9VG>O>^c2{H7+-nou6m@;6w}HLl#g0(3CN@pl~8t)QP#BYpa1}a+f^kk zWySYhIZ=kTf^o@wbZWz0&f9JjNBwNSwn)~;*yt5fSi;PT4w)4g z@sq6*!PIuCLi_HGi>MQ~n&FuIU+w^-w~O>LwP!FXSr8C$Dv;6c2KCpDxUFz)CS#|cr39@EY<9B|C-B3RQ)BG^;7%VS| z$P-oUg}U7n$PaHj{B*b5{YvA*A8x2)_uoHLzPh@41VpWhCa`r9gX>6&&E6#B8OB7l$g7aJK)r!S*t}h3Vbp# z767>bPU!@iH2ORxW<^j>BA7C$Ga~z~=&uk$Bqwoxk^TV+`0Qu!t>=8|ZSTR~XO7Yn z4|=f|F3d~%h)hYLc*ByT)JL)xf5YxU0G{vN>MeNLwY4>`cgTk|lqY@!pC@-HIyxFVJt+P?o0*BDZPBZm_YfDi=)a)p5 zKr^$EH=~%O?G~VZ$rh9w-QEX##Q=P#rK7g3l|~ zF7|AKfHIQvBTl6_r!Wv0l0zZAA|B7AEzAVT{@E!(EtbMP)WSK8VBWGy63!67#FAt~ z24_=V*%D(_RET)&Y5@*|Q14`K3{Vmkw+~rY^J~z#q%a#UCgU*s0=-BwlB+tF4PCyA z2QpA$ouU9|g}O^M2=uZI9x0a;YGU8l!w_> zT$VIwq8vtJR+pF_J}q^xaP=4vB@LfPo&|`WaUsRiDsYDFnh}T$VhVY+6k4QYPcaPR z33Fz6(F~f5tXL>$0a|I|#y|c%m4L}QPbF0r(APpAi%JJdvPamF5NwQ)9Ui80Lx#LL zJVp@~{jX$=u`MP$A#uZ4(Pi}Gf`|}7gaN7JDqv)!(Q8bW3Jy|Iv2rq1Cn7J_G0z04Yb(=^ zL?3O=!;aM_ce%0T2qJl?ty-!R>SogSumUB#WLX4PlCvmD=pD4cMZXYx2NVH0CFmap zJz=&Hg=38WSmad7GK4Es=ANF}2S+Z3Y$=b4MPsvwssNyNSF zZLsPBxdT$Be2{+5$Pl@f9C^x!MuM=<0{Sx$_7XxQ+|Im6S49VXGtN-AJG$hl_fc)N zm|0nQaODJ6H#}Jg>C{DTw zc_zN_vA3UCTRWkq_Pp@Uy_2XMe(UbLzxA!-+w=S&4v>wQcWYo1C(wU+5!IK_c;iXq zD}f~k(vXpwTMC1&Eps%9EQ@ADAdNgQLG&Sa;PCTY*{0osnHc#)7|cR9QsGgD)^6# z<>RAv=B9V<9Cn6JfeePZbe?BKabPDFWW#c7jH(WHDc($GhfD3LDUXuc^W&Y7k>s57 z<%IhRX7w<(8E?Mxo!myofCM=8J>2^i_swSrj=DZFVbOh|7R~wl@{7%x9W#yFu5Mjb zzwCm3Lq6Pc{G!dh2WO!R=G{VV=g6Upz0`eEZNxwd)#c8iD@v~&mhX_~`?UHLwp}1K z3i%dhO@y`v_g9$aRv%eQ7YmkRlC=wnG+cfCtAW>?tQTH!HREXi2h@Z9P+8Zyqyr zRTSN5!C=({?QKHt98dN$0|;(|AHoUZ^`XBk2PHvZa5anF*=X?~tN=VV6V702kT9@Q zgD$y!VJ)DCRTZw_)I|WBT#p=Pu`8*ZkP7m6j}?8_W}`8JxJ#khzP2e*E+)V69i48u zB$K^D+Ne0%Yh7M89vdD1pq0u;$|1dqH{S5| zDQ$FYjO$8iwIn6r3o;yza1u^{h5dXHhXU`GY76;nDu;0-*W;PclCU&PZVpEWhBnk$ z-GOERCDlN}O-vSyBz12trnP9JjKx?YHS(P?Y`A1jk45}YXoj1hy;#fNz$aKO`pFYc z9Qin8t?{|B4h&pK>%t4LYwlIEofw@%^`~-K39*8 zXz;XkHkhRmN@I+Ao~(m`MsJnyE@4C|uNIvH8wcou&jhX6s2gyGqAnlp3E5hTQ_6OW z(!5)}aWxakJ8+B{0ny}$W>=2Le)1i1jA&-(xb%$~di<=MZS)hxJO|xX_^o^g_eDfs zW%pT9i_UMk@G1p?1ukZ+lFq1Kq_OD<^qi@ILxxvOwVoT@{0h&0Sg;C=IXrRfWE`bD zMz`N%O$I_^73wd_0$AacJ9#x-qC=q)QANOFcWoRi>N~gzEooY=nR8(rDe4#{v$pj{ zDe$1>tA%7-#S)x@cA8Bt@H)jm6yXgqmd&IPV*xfCJnyx{b713;EkWirkxUzqm-T@W0{6ahz5B? z?CjS+C(t@Uy`K{WfR3ag9hRg8PKh!;b7#cr;p#3!P(r0wsTycJpOhU71DzGx3Dbi1 z$@!xs$_OcKc=0j|6=EKjc$G|7@=rsHX)?OGz#TPx$X~O5~{$jgb z*!mQ&#qwt_dEwgTJ;$FqtsZL^w>~Xv)PZ9A$_F33`|hppKJdU@93Lw9Hb3myY~TOz z9irPTa!R5#E&tVrkm8AN-6pS(jC|>(@=rZ}ehGz`Q(K??(w9a?jz+)R*YH$?*W}2> zgI{j{hn_DJQpB63TSOIs=}M7g8NCPq@-x?7OBmaKwl$2!tWxqot$J6bWKlr*xgWm2 zwDj#~H>`YdXLWm%)I=t|I@sPWCMUM@X1A|jax)@DZOTn&AtE4{xV52f-1^>$lcIvH zQYYjsw=BZ+W7>n{NhjcyTtx=L%Y{AWJx74n9#GN6oFrkgt+Sp00qF zI;s$+d^AopS*C^MVfC-*bd!IEcvBk1gk~LAeh~+&5_BtN&1jA@qgpG)A5N`rOg4+` z7PcF1X*g5OmWGF4iw9E3s@Cu7`tRx~zx@!hDX+*`%m%=P57A+1;Fl!MdVV{BkVU3N zWB1%ttl(DbVcO9q3EkMbqZbpmtY5Y6oj};HI-ZaJD)pHv+0K0Dha5axz#fCngP(Q_ z??i!n9d)-?keM(vG{^^7pn|7VijGX}HN##a7t%m{!d^l1%7&@~D1uB6p?VlMl-#LN zQ3F8 z{(=eGE92M!4r$qmGatxgmU58?S&(z>vvQmAJbt}i@d7t}x z?1x9uxtc`TO{(BrGjt1M+%vR#rpOj9H(f`l8e&T4Ll{@OkUYdoW&z88=6mx$v5l4y zy3olB*FQuWuwe@`}I)H{g`)b?+g;LdS)JMv|;y?>bZR_YlICj9$ZR`hGFsYsOwnPOT-Rzp-8gonXih=Yt!Qoa?p zRy!NEh<@p=Z5D@9Rli&5c@xP+YusHa&i7W^p-y0IsoRiUoZw4+rYAzb=Y?a4vW1u>knSr`@#72<^4X@cN7fl-|zI? zdplI0I(6!t^Q7PNdj=)-3zQnnWR!U@5hDp_%s!K{3Uc1dGSM6t=_!;;O@DHA3jIC&b*}EZawj~ z=RWVT$M3%D9SbkH^6bNdTQ;ty(85IDne@RUVosDM_l%PX5)e7LZI1g4F&-MC;x(AY zn7%kxFh}vM;6U%mYN;zEWWV>Fy-r-?J$$yf)T-yGO>?u=FH~n*ts-d6in@3It#&70 zZB-iWO4?msc!jmGp+5ej_dM^hx1YP~9lufUoPEg46mo#4XNncA*Q>PxRV1b6Yd6o~ z-R$?3-zugYi102cm9JUf81e?VAS<~Ur=YmSh+b4Q5u+7bGD`q}=V|-sZAFFg1jymNqG!A$VA5y2@ zU_E&C`RyxhySLt|c!i(|>Y;K(E^O}9=6opEw!7sQ+wiOH8+eOpYFPu{s8#Fjvk!kV zw^^)Q{ou_V&z+4g#{$z$)Sh)+9y@jy%>1+NPHr$J(V4p<(Ji^6$+h%t|Kim!`w6B2 zpdZ@9i#O)p^Ov64zqNnAwO)CJ`|yXx`u@9|2d{3d&(^#v%Lk{!xq~}B^>LXjlP*7} z(}CYA8}IL{G|oQ!rh=6nE>!AQKbWc4bDiNevD;qsjPdu-BPz_~XZ7=0Q}$x|>{H#j zI9c6a|Mg#=ocGz2^lfuc3W6IF0%1(bE!7f7fHE?oxn{s?vo!yeecOl zC>g;Y%ZoZu+?;%k#9BpDAz7``(9CaYRj^wo^kPaHY2Hfp)VEpoRE zh#lq1tsPv($;#8Cx4RXsZ&~On^Ts!x@24n?b;bEbE1vb{-+0K+&-}Z7&hIe|J*%J3 zx^LuA2o3@V0J+ZN)wOYmueQC`_X(qs!9m3Jsg7Q}qbE(hQPcGGOWplD8;9QQtNZSA zrn~*?7oP6u(|gf>(vM&e7b-@%vcI5?RJXU!&1;JbOY7-$W^FDvCu1wN*~Pu80Osw7 z_twV4PX^$g-x5$byO=2OI;$Gr_4jr4cMWJ0lI^u}yu3LZ%=OJ}eKmk5Iq#SQE4#At zgL?dn)!D3Fo|_Ar8`G)9&f@eO`k$lbS605iuMhm6`pSkIj%A|{W$WQNdp|7nllW)k zl*Bb7zDb)DKi0UspyqU6-X%~f$fdEchKt62o65>m#Qxo0 zaw{=|AAXnFoi7d(1A*qsnB*tVqL* z{l1Y4HilUpoyC&!u%-%3Gr%vw3x4?oSnc6lQqSPJd4u$77|o}nFa96#;L zuOBpYUkK+RxeU*G-u`vZJ9ee#9Y5lEr{=uaaRPO=<^q_HU2+;!-&LM>%R)?fhlgJ5 zX0lHwZA!xv-@?=DW0e)M|Nk_4&n#rg%7&qMHA=rA0{}(`D2?H9_Mes;*X(H(Y0Gh} z*PG4=n1U96BSELv&&0>)KXU&354y6~IMzqy3nMHj?PDHJGGp|>U2$#t&`(9akf-}Q zJ+*>O^26`8#e&|$fozlS5iJ+IoP^jV8uEQN?EZCvF>WwB`Ezt$8&OKTyXB@6^FOGc zo29v>(b8OL@~3irK6xje^2K`+$?JiWMPoa)gU)#%V#Gd4Uf(%%Pq^O4eQ`a61Rq$A z0zQdCSH!6R+Yh6FBo0|D0fv;#r_B--e2cNi>NQ?N&4|pr!Kf?jK9d>@C@oPW6AulF z@hz?AbShh>pm=Ah4P{N2`+3#S8u?yrQHveQ7G|1S%Q&>0_PXQUk1kXy3*~<;q?c>} zP37G?)yy2(mc?pjc4l^_GuKiJ3%DshJ$g|rc`)U<9@(X)QK(VdD)2sVx-i{wohJT? zV6K$Ekg6@$YRg&NY6Zv=OMbZ!&!huqrrDY8^&Gzx`0(Q4m(JkR`4#+4HdfX3WHmoD z^{%PknfmP1)M&yfu&zZ8716|nE*y*mhEK$(gu;$1nb?lKscl=BOuaE55b;Gv7Y9Q) z0uULwZy82Rqb~Xxv7i>LI5=uT$rp%dNZQNniWalMm-i(TC=4dil8B{Ailt!Cg_vc1 z)B*HqT*=Y?DYq>85fxXgIItglvy0C3yRj5#gWHnOI8qbh{Xv-;R`Hc$YiD*T$XZ%% znvhG%F5qOf+;}Edh08FX0O1b2M=Rsv&B6MU$^OZQOd0^%oxWsfd%sZ3}6;F|>3|B_^dXS1)S|XRT?8VP6=}wSIUWSQ^gYHt|@0m-9 zSee>V0Y0V0QV4xk;@F@tZ^lUi&5&V^H7nlbE?&K)nX6S6>f>rPZj~3yIf_BU-<&Tk zzB{{6s3x->mbfYtbEbMHfY?U3n!lehE_#Wboemq96Bn0oB=f$Z9cKOH@YWulx-3F` zfHkwk=Gu#MQ-2KCz}k>f3&eq?tRkyn&uU?T1lTwzIJoDmw(XO>+13tUcj$%F&F*u~ zz43z&U-7zAy9Wh3blZ)u`g5n4$hk4{u}#lS#eGuO!i4wL zGnd?dnQLrs$Il{0V}qW|`N`pvE`JE)Z>f!rsQG+b*fngoR;Jd3f( zb#1B@1W{ff*U`Qxk~{Ln^0mNj_1D-eF_0twv6V=MxlB+mYMbQbPr`iU`S7%6WU^$Y z2)CJ)3UgkkL?Lcdt7QQ~P!tTXkDm5GJ>LmUQ@R^fV!Yo@6`MvS9S|8Lc!yunHZI^; z5eJ|m!;h&TiPejgN=;aA0d0i}5G#k}sKPuI*kU=ak<2cr!>XMo`BKK@x5(G{266B< ze(byP%*zaCQ$io%Zps6HYxEY$sjw$w(+FiDF<&YAi-Vd^0j;3=NkSCcW%S_t{0+rR zHKF|F35x@%Bg?}2Cq3s4tI5DNO6f|c{Ri+zr_$5sR@Gqsa5saWf~5tz#ntbezUkCP z6q{9E2>CB?D7OZ*&z@g@+l7dsI}sAmDZOtsnaVbmaiyl3cV&p6X+di`n{blNX4ffD zyEYEP1CcMiHeX8`KeA|L1JVWDRyF>>IOrZ-Ow{N46oL+YP+YpXGH0?Eu4L!$0cT9n ztZ`syiJx|iG`z!&*;4lzdV)<l|6ucv@nt;yleha5Yw^dPeC)9&AN#S7zVekHedTLD^2j3}c|^U{N}kwC`{Pbn ztPrVA80Avf83pO>6G`jj8BIHT>gfZ@1_zjxV%Qn`>8%q9`_x&IdM_H5AE4>So>V)u z{mPH-{%0D0$KZf&CKM7!#mrZ&Q<`y$?nQvLe<_u^&rDrMZJ0ZydXcf0lB4a#5c&+N06Kl{1x(t05E6|F zM0K|$@ju$)dVL!-mbfrRlJpN$OE`qIewQ2A9@%UJcCR~>2Jn>o+(+JrLh9Bi&-~q= zdj0D^_4+^Dw~$S(%5>UF=>ir)y=ioImnqN}lguvM0O`zV!iFTn`X|dG*wrr+$U| zHI!^M@x#jw5kX76qB(8@ zTc_+X;^!yEz_M5qRSR`B*t=yH16-rM*Q9lF!@yWe=p3bt???+iO$Z{OMH8d%qMWE4 z!jW=%{8D)#gDvT*=Oikm8d34yCVeX7WQh?ct`MYpJPRWUsueYhAakrFoSvGAZ#AcT zJE>$Ywm#ilapQ%!RqO@R>#)M6c6!sztxzhb7RHrau9BOFk1P_w43*?J;Lx|4ceIrZ@AQjj5kK?8mYm?aaG)^6O2{YbN)o55PkBc1JRA`S-x z<#=>l>$VpM@sX8e8~l*uo504j9}aMhX24v-q~T@b1)9;4NwvS8xtv}VT4{Qft0d@E zIvB>P#HEaCj0(nvf?64fT^&x?SWXj}FFx$Asox=Y4;7%xJ(UV)?L~75Ex%5Mb%7a6 zg%O@dFyzT|e(N||$MA^2_?6v)O3}~f#w;W>+fX7B@>4^N!+`-Av8CRM(>kWbGwt~! zv&QV~hhikvUOHXQCjD59TFibq#N)17g`J&z-Er#qot;8W zU^nwctzaa|u}oQy*9w814h*kI3cZ`r!xNf2&Gyr4&(*-%_|1O58H<(smQ`GvpKTN^ zyRbIXcHQM0x0gLHKU$tk#G9K7{SuDS%%vS_Qj8bXB3TtE6T5%3IOfQPakcKvuAE*l z(<=*Oikg<|E5l3MdV)DygmrlJ1hSzFM(*d)G+wISNshv2)t?a5L>>a$-UKWrLQ~X7 zfcz6+8Ircwp5U|a8G=F~rAH7~9LAx@(P*`?zI-MoJeB~r(@imdIHz=uT~qKY zekghS(#sIZE)DQD|DiJxg9l1oX<8DUNOqGQq9wndddRAex-sdBAYt&G(n|E0WLHF2 z=;Q4pVQ%t87>1?eE7Ens!P2Urm_GT!nt9?@&L0O=2V5Du)p z&sK+6ZIX^hBLMYvVf1EGvC#G`*{w!lFk(E|)%XCu=D(2$lKc=fgvvDnkg&9Xo5)Th z@5?V7G3aChYlnR;3foS;#!H0*Ci=d#BN;b*TXc95~wHM#SkUNdba6oBY672%H8*Rybs6iJvG{h(F-}iGfFN z+ICHv12RYGP7YDWqYt8Ca--<9Qr8MZ&CqkkrA|_tX~vGHNTm3exf4J>Ta3MF8G_FZv@b3y|@}J+N2tz5|9&b8WOhI5Yr0OPT_3W?n&! zC8G)Nv;~a{7fa$nJi7mIztAzlpYa3`0D^FIp7DbcPvZ1=DpB3J8~i5=LZ=!GEkgMw zqZR#=(UPu1;LBgeR;Eq@qlYA8Ck;0RDmG_89{&0|%^-{H6V#rP~e+e9$y6s3e9a%C$*_4El=eChp`L zuF(arzy<4RLZ3!~PFfae#|hF4@HsNjT%mVKvOJFf(2M^1scL3Gbd0|cAATDSeD{4>z0QsZFW72m|e8q zpV~)Qs$ziPaB0Cu*V}{UK4SyxOXh1&cD7Y^#t|S^wo4FtlGymvenYy#Xs|MgkVh@j zs%&>Wp1Dm%T?qie0^bEQ{sSJIO;Ck zx44YG@3yfjCwuYUX=D`GU>OE}_WBkzivymGT`p|z|LQX?Om_82i_6lJ@4KQ17ReCS8-1C_t5PiqmW)Wui9(mcV20tYhIc7Xdrzs`U4%Mu=2Q zx+Z+4=$-y@8<~YHZbgM@+O78L%C=gOdpTUi9e@@JP=9rWJ3I=;%lL8;N&``S^F;AS z61o`z9JO2gaCJVjmHtVypo*vmLakV&Qfmd5!KytHaKOdjRuVwl z1Zk0<%Ot5^WZOg>qD`NSCO@7n0PXfn00|b;nkw!tKhw=ZmR*!BMI@rg1J6z5OZ_EE zfSQK);#?7LB3iiYitK4gAfZSGc0-jWCB@|-{Xsz}E!E#c0QvNHoL1WvK}+R>P4GA*AjXBq_gC%@rT<=k11iM z2^to4A^Jz5Zz;V-zxYFIe94r-oP7ETxlbB7Jf2HQabPcalb{9WUC%Y0WZFgm0@*{H zUK|>}huC?M2yx^f>ITJ1DcVL=B7`Gd6b?f0urV)|qOODml8wH}mp>|JME<+kdc9AE zrklehi_l05E}y}O8fdC9{`UZ7m+ZVVC*SA{kv7NHHBZ$iova6cJ!puOBmIzq-bw~HG=7ApgS5Qknj6VriS zdVa>OaF7wJc z7Sg^c4u^^*XS6!+?8;5&`XjweN*ln6gTU9oPDg)rUZY;1j-q@pRD2&6A0l2!$wy>> zV=yC1)3n1vjAb~QbZxjoyov6|bON?0UquN)hnA6N8OhP4JJJch%bBc%ZzUKbxfi6N z%c#;N$zcb#9^FZu?0p-S9#a)%77Ggx0R+v#tmPBYn>9<8MvOU2o-zB0Ojv10em&zK zeqi1woj3Y)@1V(%ELgf=^eC1SOT-e5QViN!={(&Oh$KNi(WJTUmP28@JPDM-jchq? zoPvK$FdOndBW6@b1>MBs7-yM6FT(xz?1Y^lRxtIw&vM)+ z@G-p*tz{I#Cxb+b1dx;kmpiRuJ1b zD$m4T62X92Sld>xyYuDSj^8vpKixdIXvC|Pu-mamO_E{#c#7a|n3vU($+gQqq-Svw z2xga7nhRPcR1oqJ=Ajr^X}MWPqm`v(K_&<2t!A0U>606;8yDA-_(q3VE)-zRs#jjZ z-DOq|DV)ey+j?f9*=od@vOqi}?h-Sp^9+pM0k_|P+JkJgDm19=RI^@;d6u^@I|3_g zbc$IDI$NowTq-%;S=!9yR~L@AD^4r5UYcL2uimoEq;Vjr6->p%Pu~Rp1#}@3_N5Fv zE(RU}_#t^%{pjVG0;hcX@7zQW#c#yJd1L&cBO6CdlV7}1DotMN`jL$<+(g&~)2H90UibE^u3CPu`;(tOe)jPXzb*er z`RvaGsZ$hI}+TVJuI(XIFpL}Ba#j97{ zdgO)v6QA4pwU4}Pg*Nv;Fz-GdW>S8_D6kcOEIR4#FLTN_efpE_rO$kJ@yt#83a1NC zK6x`F)^5IFQY;0!sT6`bZapDY5TUD2#?NFjF3un`%>M#sd+l#E>%%jH&wl3fXAYb> zuzU5(t~yA(w*z*e(P$zGyf`9qH<6r)9@_K)oI^Z9k`qinAQ8(n% zQ=gmqA^~%|&%>t#I8mwosLwJBEryy$^a;xkKUQyS^Cybn!l@^|NxYYJtxp2=7{1r2 zFiM0lBKSAHcz`Tp6m!k*6Xw7rVfk{Ze$@D=j~A(Lg_0X=*lTh>Sir1*(en5ojD@^v z#9Akxi8q5VdWxfl52B|W?sEj@rANhO;X^>G>t3pcP%75#TGp(nh1opJhxpu_>&m>t|BcOb|CH zeWjJ~3YYUh+skIQX4OmaRK5xm6Pqrw9O#X8I1RfZ<)p~9nJyr=^pa78lcAaDoBvbN z=jW5;0jQ$scvx#*$*5>%KUwhoRNSs<>5y`odW~{b^~ChF?$;dL$t}BS`xUcI1T|Z7 z&3reO?`o=%OI1lI$Qe#^t1`HwfAglzZol$yntuQ8o8B{v?r1~D*jcstA_f5Tn7@8QV z5_Q0kT~ySPU?GaTR1Bf6SnU3v&k=9a0qO}%I8BN#6;__(pR#v`$& zZ6+T91WoKjZdnbhmB@sJeTZWb-)hLslp{yfwrcf={^TL%l+swVz#)R_mD`NPhWJLF zcLlMG;>0~`aTq=a7`08QueHJh+ zwXUwv{T0mSRYG4a+#yids>^WQG1+B{(ae1mPerX15;_ZeM@!>XLTl1(@pw5~Frkvk z2TUHlPyY&9C0l~1*f^jf3r18p^f04FJYNhd>5yB^$;~eE!D#>Cw ziGx*ajmYDQxe#{>xE~YoT-aFfmA}+z7Y#$073PQI`6g0(kU2WIo!Bn$=J^D4m&$)~WGry2+pl1X3kn?iY0zyReaA_2qQ`~AnQX0vrTiioN=ZfurHn;WH4vsEg!nx(&Q zwGK9$Dn3yW{_)z4>ozaTP>e;20HVfx;5n6l%Jx6?VeRK4dN&t33OH#%GGlg~eO z>c{v9DiRL!fM0yNvUIS0;_kaos4M=m+1~wpd#f`#dGZ1Per+m;Ui!;mVq#HcTwoFG z*U|$Jd_P87|S+bMXseq6V7GX)dKa-$~8@O_v4S>J$+kEO0=mvUlLTu z-PVCX-2q7*woG+@KG#TRZPm*bj~yqVTHywDNz6BlD^E05o6U5hm{Iyyz4+1`W&un- zFs)@{t%SWr_>g;rU-zGA=PhtIOmdlE=90Tb>I;B}5p{j!86DqyOU4gRF9#9+jYyL~ zJ#g3L9lmB;d+*8pCgRMOKk-EM%zE{q)J*a{sp?GX37l>Jl(OGjIa9^K<3Kw9g#EYQ zcZB^vCx?*gKRM){C#vgbXeITY)O0oZ1YdnPmABtptvdM>g)pCRZhhA0^1T;6`v7L+ z)c0V+QJ>~o8)Siw$lW>u@&HS)PGS~*MtVyKPBLqI~Fj0abJptlmE#6ij~9oi}uw+@x?7AEj>7;4z9EkN5@CV{CG zTF&A=hv0A3o>vR8_1J=%x2u3X4|;WA289tt~@ zh{i&@TB_s7s^qKf2MUIlcB*fAW25oLw^TFnMDQ!!){9@<>dOAYmIjXYAiK*tRY&gQ zTJg6cg+=ocTRq0me3SPF7?OCB9V0?zYxf(C+(DmuXqKMB%|<3&9L9xs9L6j2V6I`b zD^@TQSd|~QJTpP)PaHkm5d^OKxwDdK?Adn4o3pKXFb@djO%!r)Rmg@A z(Wj|)E~|Zq;9{l_-&&CXfx>zWC<2Avv0Mx2{;c;x<%+nAkah*n3G9!B>?(k=TXQ(YxmZMP_bG#^ey$Z znE%^B^6uLy=Ji|rz2m)BS7^nkV+Rw+X?cbR&P3P~?E-viLZ)bGr&Y9r?$7<#-i5WD z_~g&-A9qlX3gv4Knr3&2vU!@;!PUm()btnKZdv686pH1(CQA+cMG`w=!1XX{=zgTM zk~0t`d{2_b{fy*c2wA6E#-Vk{GM`^}h7SK$5j) zZ*8g9mUFvbj^1C)m3P1V<&!7B{P4+>59{ae0Z?f^WrHUoBvxDW1+(4v?RG{86vxAi z%8a2Z7`Ih!yvF-ECFET|NHVs1->v7bxnugmORv3s_t3FFxq9`~?q^m{Uva#lMrTid z{Vm6i?f=P}cGO?gK62mA?m&HLcewU1yPxl?Pw$2scisQhHT8G9N7N@^s^9vJb1GPi za`fl8?kjngATRT(soTUh1H&YjD|zP%B&OKemrhgZqVUlw^B|8eUg78a=H*;g!%oiQ7Vy<(Su*#!ypV z%GDs&66hy>?+>9c66MX!XlDAaRqQ3PdQ2l8BMorCp!*WBxJyNQ#Kgz9 zCUu#a)Kvr}auG5`agB*{EOKNKB@_XIHG@p#CdmLdMae_%=u$^b($v*UsxyTnxPTx<#b^j?4h3}YpuWGC3v-5mQ z?c&8RYJF`*yIOmm_7-ePw)W7*+KSj35RbhzJW8vhl_j#XqX-?iLfk$>;U4E>E{O~a zdlV*hJM#7*OLa`ria~(Y$9R*_BBp3tKJD>~)erIwucv$w7~H6BgVt#yutJ*_$%q3L zXTz`u`6x&5==TUgh0*aLC$g#I#H0d`qp?_>__=(PGqzZolGk`U1P};HY!$uOqFRTn2&`FfmwMY` ziODuCUN5-}U}6?$9M-InFc*ut{#x(2vHPhII=D2-!OZ>c_89h%{!r zX#$bb$3IM$M}3KlOPUHQ$skx}AVc|zSj05J5Tb(gYmVRN1gKvjf8~-Gv5C9QlKp^b z)n=9V=%9dwdLzCrraG})#?WG`luk!85K+do#H^;bd~1zUFiS^6G=orLv=Tj*nHu;u zP1)h1PB$Zkh$`8@5M;=C-{S57nQHSqgo=>HnI4gskPXHXb6))o{EifrckNf*eAB@L z#F(cc`O)z3TV7gFDe&($jj$BqH5{|5#TV9arNr%uRS5KU)5t)RnR1Ey5yz0!I>H2Y z=)NHDz`#Rzg9XhV7&fvc1RVhvRyd0m7^OkLBP5G_T1pg4WXCjizX?|lg(FENw~1yF z#3K5KAsIJkf~8VY;V;8(2DRg8AsoOWE(sWzC_xvau_ydHe0RqdtoZ{Qd-8#=4-imZ2EZcN;eUUCz54VNN2Li8Spw(n@Hm5 z6FtLomonML$cOYpi_aGz9HmYpYy*=H=NfK;?hq`N@Ryfz11)xZzC^pR8jOZbi_lk; zkz$iLLktX!$C>NRRjBfj`d30o5cI_fLJ2ijHA_An+)Y%y#3_NJ%*x?UAtuJoIY#3W z`fE;V7=44R4PuT*l#yZ_kOrhkK%<(RfSoAYLk!SMm~kmnNDK^JjUc9I9LBVcP8_Go zi?ZEDra+%vBB?22^IWN`f6=mu)2EW&O%HEw-N1>1g*JDEX#x<}eb99ANlL^1Ue0brn<6fzOK6Azy$dIsuip^88?Ojx?=HF^WeAPs~n)XL_9$Gs&?dUf`93FkLXpLcod*X~Qbr-I=AnzBVipluLZd>}2rz=!xm*zc9J^cz z(sN4|oe&d%^i2?6f;M2aSIYQs)4Cn6G?v|C3=efbP3YpJidVvV&~&?AJe6J^lIWBu zrVYc7gH2!|!I_SyS*YQd5(5&2EPVz46ja`fJ%I(BMN%!5v%|y#dI4}+NL4u4MO~)9 z7bB+Z+K1TGm1D6PP{1Vvq|D+zJ4aq?E1}?Y=JVuu+@pD;PBqsmlg!FIkE9i-eiI-ZDtU=xo9W}nygaA|a)0P!JXXrUc?kLiLybK= z=3iQ0*bIQUm5m~J1H745aerS?!&yPUB%yz$W?~MGHmCAjIy*(xD5+2W$;fv2>8Wq2 zqPju-toloQem(7|_FZmKNpI>4I?>b|Lj%Z6+|!`DjWtPOLeOvl zb0qd0@$2+a2N?CphC(*yZ9sNVn5+wmPHt+8=tV?m2eD;Mir9og$`eW2flrMal9`wfN#np1aNiTN{apCmb@Zi7`jd5YHn% z97q?W=o2q^w~91olAxYzL(DrKTwye00IfwSoRI!OYGXw%eB?TpCeA`GqlJ<~-x&u^ zIR^G6?@0!--4*~K%~CxDonD4wmZ>LHexcPxMq{fn0;pR3$kJ>JSztb(L-sNsO;CcX z(zXoAq+PfmV2Wi#WfC*UJ&0VPN#8W+!C z+2o+LsiVt%=nJ9Y3MuE@4^fz9*%2&48A5Ggq&S;=nXhuMM?R4Zy4H)nDVNF3>~lSn z_UI3TDwp3D6^DVON*?rn*vfo)?lJBSMKT1fD2huTv?KK$R>x$m*ECv@&M`)?Gz#sh z1<-xXVn_wNhd$ThG^3s+hpn!mr!lmB%l?b6AZpyZ@6q&NYaf$H_x{jwZ@<0n=<$SV zG)QA#goqNf7tsJ1mz|uq0IXT581fii?&trK;y5l$f-^mM(A`M4!0mHONzWg`nZwL>G8d59k#q6eNdsxBP8NZ#bSI z!H$*d0>8x?Vi|3#Vj*NgQ0zA=Cy)BNVXF{ikK z;i0x5sWYlfScXw&u4suv1Y8J@+hyM8mKK>OQVflIr__<7jOL-OZ<=kn)&1JpcPahA zQOi1U@C0>(8PQ1TRq7=?L*FJihEU3L_5`=og{MuQ^| zGuEG0*R(o02C<$-j2(C*Fs-7jh*GM6{4_ec*#ie*m8~bKnS2*Z*yd)^5U9Wy9{j1P z8}I@5@Q?Mu@!UW4a&q3@L#48BQp*rbliE}#)OG4sbzZ$ey<2@qeFpXG$i zOC#-3Hch4=(;6L}WsTC#OPBfM^u2@!fdXwXxv{p0)g)Z=AIi;*0>zrk&eGEEcR`W5 z8RF(*A2T6k6)^kQo(Qu7cZ!6GB zwVV7TwAYpuFQ$X4WmkQ&8{4VW347L_UqC=xv&S7}H;Vw8#YCnFFV$vmAqgiEO}wd_ z|GjSq+Pr4>DK-In=>4e-1vcQS&M{`dq`6p3Rh*do19ALC?f~Nv!-I}#!!>ZJw2t*h zKA@?xAVy8Guh}gqB7*G)N45+y+X}xpUcM7uxm+I0T?QwK+Y!z_wkS3b4tEO1upF#t z&M8N`+-f$=J4q9ABRr!KV{@e6B;nA5=rVw=CPdqo+akP~M8!E1FX$Y51^wlIAX(+c zFc(CX=bm!}2jJ|8EVwi~-Fc~Mjj)g&x{XxT^^$37O)~0Oh8(-e`&@-=q_}i__oU;e z{7o=KE8MH?d6Xab za@XiPv-hYp<#F(@I2quY(tAu6zRsxAQk1(s@x8iJMKDW|2X+(@9td%hU{{_Q9mt`G z;@KAW>lzyj`e-l~53T$VEfAMnP2Eqx3je`$wp7aQzFU4jKP)US6~nuBTo9<+YmLSe zy=Jx6=sDGYa-Act^V|<#JW@S3TiX4%qnX;zRqw6E-It-mReQDG1CQT-|KmBp2f|PM zDe{peZ@h^g|1uadr=&_drhy>v_$9j=`-r?AM42}zr921ahmphX5OH_YP4w|31}54j z+9;@0ZOC4uroR65uaAS=x?vTqln)EF7H=e+nIfyYRVf~*o%qV7O;k6u1-sz8HbT83 zKx|k&^+Ypi_1yAW-rt&4Q{Ur}{`R-Ot=>nAumRGboyx~bxajnl)hoGr&(Axx%O0UU znxnmt_Mn*FYY$%=1&q3Gc?8%>y+WE(Q?wV2!IZ1L3cg{3D9(T}xP>tY@EEd8 z-tecBU+{@USaz&nhU(fo)C+#?1)lp5u~gh#j&|iWkDW1-S6mXyn*S?Nv;1j?xMH7WM=X#J>6Qg>MQ&D`@A5Q*6T@c zp6s}ko?RGphB-T7_$gc^UxF?o(P@T-L~P!Cz?`owP;<A6#nPkmtO&sdGKgyOGOx2adC_o&}cPpZGsuGMbR?$CZj zdyV!M?VaHEqQUH$*gi}taV7IkWDvGimiv@+lA*-B3z?z=Q!-ka1$-Z2xeNcqGT@8;u?1+9CKeVj?o`LCc?5UPI3%5h!nXo zLkVgIw!h3|=Y7C}aH`a~k;pW%b6bdQNghVHa{z94fM#PB1PTeEEM|px;zuEY2pYp! zhWCK8@|2JY>w=TQ*tW*1AXvo$!ITq=6636GhcYNc2gDVFeGIH{t;aY7V`>9hvhKz> zwxa+A7Z6 zJ{XPr7HQV_ws~e-wy=-($1KL0-VJg6(+(xN`p~;FAtDus1sC0DQ`DYlw_*y>1|!DZ zC-U6;e>@L@qCnkbTrzk2wW0uD|D45jq>=g$5>C@xXZV5-;2aj|!CFhlsc{yNk`b>2 z$1gej$h@lDKT=Nd(D4_{0&t+#gK4En_(>My9;iH24@ne7Oo>0$62+P&k->&W_0i#? z#}2{^sX`HLFbpX%bC4a9wSmOLn!sU6XZSd>1YwBcEi4BP!T%`YR{F(r{wngDP;huR zjjJ2%o=71%9{~m*KUgw>g-W4nF;GY&o+Esr<>_!1)eDF-T23yDeMMn7@fhorWJ`G1 zI~J7+ko1c*g-%bvGcpCl$`CsQ&%Nk#90xd>jfI?5j0}e|&ysY4@QuuDdc}wG0`r*! z4+OfTh@fYfdX=F8Yax0G&7)somlyz3@Za@R>e%JoLkIkpWOb3+i_f2cs~2vVz5|&;aY1t7(81bsf(+cZ>0syC9k{Ll~KeASY1@(Uj1PbLnx5OOGGEJV7U?hto^^CsV?(HTsKC%W)pD1g$}?z zrf$NAjAkgyh)KfnD2OryY0)T&YH^VuKOAkAF~B|`+D6z72RlX&gOWlrGK(-b?4^Tc z)!jPaGf%5qDDAAh_#AUMo#?o;W|eC$B7v?ZopE`@Yr9JB`Pk#pDWv@Kk#isw=nZ--axyO4Q98ONPD&LE` z1T`!ohil)#(}T1^VziN?Xbs{r5YY>8K*SZ1bJ6yYCKGXmDKKOkK!NZ8cAx}DT0{n_CQoTO3G9aG~`=K z4zixikOOP7SF$M)ycR2oy@3rj?wVKgZGx!4wC(SZOB4OiA*j+P;I>btJl|hr-$0z; z;zR7D(#Y@IcwgSr3NiluzI4jc>E1UN7VNEk#bT<_x?`{~o%9GthQ-+s%4ATAzFSD7 zl9iSEfpMXbZnSP6&duUmB)(XjArET$_|QvccYl>0Vg_p3>|9ue?KNM9$ZzqwYC-k< zpt~Ga$e7BNcyHl4@-40k*ly#UT88ovc#5IfZA@ojM&rU$v0|}N&t`C3nyKt`LpE~K zX3f=gr^FPVOD!&!$^K(& zm8YI@9~d!0wK%JzNNt)>+TLN`vZ>)IL%a8PWKf!ZI+-K~#p)mo#7@qNB-j+MxGn{o z^SJ_boH4mJ$PdH)No;Hba|s^G4Slvc(Dji>ea%>t{d>QhRk5LK6Mw~<)!qEbCqL940mTg;zGG)=ykKDByNo4 zscqd0I{Dfl#UV$J8tyijMct7j`nAfH8^)uU!nur;>-3BkWjW!DSKIq{NByf}=F_j= zTj(2Bm@5R?3F!Gm0h^eCHMx()m0o0KQ|Cs))&2 znZv5wqH2+&e0EVQd#hSaCRa&c_Pl|*dhd!TQXP%9ve@YPwGu74+;xjz8U5sjlXU*oQC|ZKS>tK;#O$%*(aqzWM~Q5Uu%jSJyGek!Y^wMW zG2JMIK9(qzl;U9z!>x;};OVE>fW9?(H!=t7XpWCEWn;I-a#qdC-Gi4~S@#e^_m}ZR zrB>03v~rC^*g0@m-gKGOGKT8FSR zYhk>c!q8j85)$N7+qe5`ptO1JBVC9kL!REpv(qI#m4t?V*Y9JvjQcw80`-C(31VUD zSW*!a>jspQyub;wM#4v*$b3kV?r)xM z+(-nj(zqdYL;cQ$#>qD~FaOf1Io0DO@M38Utk$wG!)yL*%DVrC*69ka4> z30mP$jwuXh*8P^BA>wv#vST;#R_j9a~nd#*Z*9omyL~)oMvw z?xmV4kl*(=aP?A;7$71J2Er5gImop`o)*hgJP8>g+Y@`kNoxR4+%ZQGiHDW&Sbh5}zuB>fAEXxt*6q zH5H*A(z2yM@m{dkE4{NJHQoE5<}9mhrZP9#*s4!Nd=KNST*Kw zQ3ZrRa2bVrepN{hXTZm#b5qm1Kk>5KL+!+9e;9m4#e+giyQb~UCibssD=QZ^$MNC7 zwQ4@qY~Ho+p&;1ajV~F!*EGpwO(#FQZ{K*|tt-S z0l7Y3SHHvfd+hoJQ0twk*{NmnU^c1Ra-11=_0$`u-a7STQ8xB3O#KqIA%8Q<2aw9? zQC&0>*A@PeKB*Jp=E1Gf=U0ziN1p$X-ymus)Miu#Q_4mi9SFn%FSTg>qYzh8?T%z}diYB~&&>yZs?&%cF_XHw3~OJ$lV2Uaekz^9Mt+Hr}Lz z%hQ3(wEh}DuHc$cEnrY++xD7ev`lNo)H}MdsOv;X7d36wTG7Y)KC1-@&&GbkI;Q;_ z0PR%EnG0=n5$HbD-1clbkw`ans~Hk3LL;&kuQ=#BE(H-ST31z+Bhww3X4^EEO{1fm zi-ta}4@S14!kb2`>iw_z%~v;q58YJqynPflZ5q}n*L_?_JkY7i5YeE~b^w1Hv|&)r zrW2K3n1*`Ma_~8WMA}EZh#JFi#@)2v)Q`LKg`&Gut)tw<0fH%QYkps$Xz5E~6U;#@ zmW*u=@f=B+alP_X`&H9un>vc?#r7R@EuNfp0B#(xB;5uLBai%j9=2tLSu>^DL>we5 zY&iLauX0l9O9FYVi;0H*)q|shLA%Wl2H~Lnp*FqiEIBLn4sZ;JQ%_{bof4&{&n zhsbB_hZp6e$i_PH-KD7m%+DyJ>6wuZs7%Ea!Lj;-|DtqYQ{jp13+b__1>-&QPQ4*) zHpAVI$nU?Z)h>(vpQzQ;A-olK%vk>D06rX^uYX~aci(^USamvVp7~rd`MH$yr>WGR zrh@4C!s}A0*QNfEZ$R`38K^X%9*f?Tv6FnviM&r?U!VE`*Rk3oWQX;I&>Aqs#oarm zd>dZMHf9#PzHCW0wi*znFVCP3vX_L;YIyZY^kS;dv?htPUZdXbcDRnxTBZ6uBHghB+@%gT#PV8uys({}m z?t|%PtG}fhExPQ7D}QWRCx5Q@!7p8Y`Q=}<($)#|+YeX&3(w@;M|f9s%c&SKln2m> z&PaQLE);1o76-kMvVn=}0?JTuR2aNuZby-^DC<%U zwfjg+PPXf?DA?i3+`>v)<){1oX+OI%H@}io>6uQYqI<|Ek*RmQ<;msO4Xp-JqCvtdh^9mxEk7OH4%74`8P>)Iu(k^_M8_yP1tJOg%aEW$=Lwq9G&H zn#N)BH;~`uYG9)rVM9CJ#C;BzQ6@vOLs!$IPL-ZKoQ-B$WaJzTudHv3c?gr6O7#YmMkgOk}m5>;`23~^F$|$;0V0n-RKAJhCFGt zLFx7E9>=m@NQE_dCOs_n5*s&_e z6)iopb!kb@1jrSvckGos-_IK^bZZplWfhYT&n(vLlm&^d4W^B>0rxr&8_czDoez*E`jU;}5#jJZNNGxIyDFSMWl>_5kBs z5T4=g!FLNGR=rL#L*(~m<1h)7JCMtR$K?zZCgQ80!L+bNY@yq~C0v?I6qaUHJyxvQ z&3v0en;3oQ1N;~FFKRH-7ypR3BtSeUpzh+H7Ayl#Y=8^^8aRvavz}LB%*zr@NCaTG zafyR$PgPp^rd=xn#!E>EgM+!xxTHnSf;d1N19QMn4v1VAD5Qh$*#LoW=|!v8Nlte^ zYUI0(r1EAu=bhPfCS{xbT$p%sn3!8EBS_}AilP+%Nm#d)OpuS_h;pY~d^lW;O zoPzZAvCd3fOVs;$WcAedc8R~gitNEP_6Z+Yjby=!`%n~J@d--eIblFadJ@?^P7?MK zU!rW0>Y6h?e))88Fz)yNA%V!A6_$Vs7U8jg9FN{h-E+iyZt8eg_@TLyQUr8FCIwR5+W0 zf4bcbiR9^+wsj1zT-aVxCV5GwzN9LrtQ*y%QDMsYG-x zci+}k4?T2MsqHxJQlr}?kN)4LYTC=x9aGPva?Km2$Sf0IFTq-1+v1K5P+r-iCJ-vw zvtg$e;enzmdI1ZVfjAn`0!gX}MuUchL+Gph-=(^gaTR$_`R55q$tWcDn^_ za^z*dct6?Yt-)$b{fWA(Ve-=f>? zWk(}FHrsPkxk8KtX3RjsCNR-Bsgep3ojlYrR;d#V%W()PN+&v(4u_eYo zAQK={Q=T2SajM!-i(Ri0L2MHotqp%l0fOfgXhTWJzzORX8b%2^_ew3+SPFFaaL>Y>D9LbSBqnZ!ZV1W#F@2ElII1c;vEal97clB9^X- z<3M!Ci#g50`6aw$+i>GQmEGJS$}OV6mMI^t3>kNBSVT~UFv;&p3dD%So%_fWAyh{w ziGV;v?qxy`Nv-1?XnmVixqcOi`UkB}QwMQm}(zCv2mPjCpBvn|iau(i43Gut>kBJ}>TTBmlqp zWiQo?WDaAn9N4c)l)9Dm{`K|M$}0J@pQ&}vweVcWGGTM~AJmhV?q09n4pfj_Aj`;A z)s?S1_CVMDoHLu z1?HEDtudMRS5id_gbZOM(GLZ<5KZ4Dsm2|_7%VPA0#J()Z!J5_Fcei#(xc^Kb-TrS zK*xl!ik%6+@MvQ44RTz(G&w@Mi?k&cL<Nn%R!*w)mW($!9= zgNeyRkh zcujf~xWEWU5RZ}62w2;;(-m*6sksHnh{!Ttr`p#+O_&UfIZc z_hviwRI-@uO<%UyT}UVMxlZR{Z%{n(b2(~TNbXb|9wqf>h3*FF?fd3uHqx!dL*3)= z%jLAe>Fw>)gT{a9cC=je@YT#qm;Lxt=p>(pdGRQorfcyr{ruD~!}j-a<|y@>n3AHw zixoqFk}DoFVy1z|lgB*@h6h3a?w8Z|{; zTJQD?D364I8moq#rl2dTf!hm=Yl}v*yHArMXsY0)b3vuKIy1-IjFp;jIGt~H(bku= z-%JP44#!fzU()nC{7-LM>6EogpQGjT8~bb@tVN>WCcM=H%gvUVWNSskkL7cEC1_oG zfJBxgbS@rg1x$RxhV`7&G1661{h+<-9J3u?r;b=vsG!kH6c}DU6_OH5@vAbyzbkIltP@vM>sqqG99dtV%l1ziPCB&+ z_$Z2q;^Ks zV+fbI%n=}uki3wPmj^MtBpe|L;0Fl_BqVuxxpZ|Yj>c$(36$EJHlV3V8dGYbd0|zGAzR3gjJmz%8@yf4OW=FSY;hK|Jd}W~` zv0GEc^tETQF#Hwd#LF+=f8Ynl5HY(KG0QpZ0|c)KFJFATT;I?3ojO&nU;GRVCvRcDbW%NeFMB{c>!QzMkbn0f_up7-9sVYWdYs-T z0lHuXV+8xUvGHUD0)Uh26~vB@F2_aYf}26@)8 zUR=#8lS@@>atB|z^k^Ollquu@$#vxVNHckw6=Wo~LnfCrJnncV4`+r#2AO;Jo{1+? z2z24`y$ms;j5$y<@Jq)Q4B6_%$HwOobOh%mC7at`QLtzZr3h!Qyqv9L#W-H67WU5; zb8uFN!emlq?5HBR@elT__`UeX4e#mMUL=K$#dForsTR**oEAcQlQyJR8+&qfyOKr8z298JpyVjKw@17Pv!@(n)1omw~)WG#tyRQ zz=G~Tw@)u2YBUNA!eZ0X0=!Tuh8A6qc`3*lKbWpdvmEN`Bv!+qpCIb6^3mW)#KSBu zQ4B2tduZbUOc!DJq!^>!1y)6hqy>1kVyB&XIPD%nR4}nA-9&ruMA0~KJ%Xzeg{cDL z!ZJ6o1`K?E77+~#B7k6BJV+5wsD|o;Qm)rd*!W}S!Ur$&&G2{BOnX?FvB z@5ln777CM7R_TZ4XkO3mDtJFBPz(4Ev!tmEOHH znVz0e_f9F($0t+cP>_wIQ}yG8sX3*XhtFy{m6*Qn=+w`CTtY?+nbsIn%`#lAlNGt@b3lC$|FhzI2qA&dKmc%W7?x^dDd~J;AzNf42NJG z;DLd!fxBV7gnx9ooXz5Q0xz6Ir&mSVo7Cr%hBV zIuk~_JYfmg#4zWJVb0e?&Ny%&ty|F~FERoVD-245t4q59x(Jv&OHL={N*k%qEBC~k2AZqPFAKZ4v9!(4IT040ay zAjl+NtWJPIvLNu>zB;PJh6PxZ#EuuR0%nVdDo3E~*tXg@*2v+Jo+%}E%pX1sgbQ~- z7?z-M8DeRU?Ab|f;Fw0{qL+`~>a*9;BHWxrjp4lXVim)K`1p z;YF_ttUwp!DX1^ZPmi-*q~8t!^RE8Nm+h11Y#loDq=RZAI|DnOoNfU+ZvT&h~1WK+n#l)Gnq z?C_2X67G)7Pab^b?8nRV%Ios-!nVipt)C{X+F!bgXZZq;X6Hi_H_U-X=PsrQzeByLPZJNc@ zdKO~of3IC#oIN&6H$6?4{QuwX5W+jDCCA{pcQ_h^r>|=j{pO(u&8RiUarfo-n2E&> zEgYLYcJy#_?~^)oRd~MX*vFgEtKhbc=RbLH7oRjn>d*H&J#skKi-Q4DHwWT&(2qc4 zh*nxyKcFG*p^1J(LoQ10=3qC`cs*)<6Q7IdjsambQFid(!peh*GQ9k5?~3M{XzlTv zJ;x84uHzC#G)>*Ho4yE|pp$0cIM#|8;BF$~09E;5xHA|7mtLyM|rMu4B()*RwP124wKK5p(97*v*(zoJG9RZS1-1c0>f<0Uww~2H}Ypey&7y}-lZPsC3X0m0>w=LLpY#3c!b`Ck|eQbypvQ@Um)?xlR zj~#zs%wEFoK^)V)>^}BV_A>Tzc0YRsyMU}A53mQ>tJtgAYuIbq>)7kr8`vA!o3KOh zLoi)EjGQ8GLsatH**n-f*}K@g*(2;d?7i%L?EUNm>{0eX_96CR_7UVA`6&Asa?t+< z_7(mF`%U&q*ad$ZJFNW<`xN_K_IvEp?Dt{y{{zYd2E_4)>@oH^_IX4){}KCR_9yHM z?2GJ6?91#=*;m+~u|H>j!M@7A#=g!T$HMM6*f-fAVt>v4hJBlThy5*LvA)ax zp8W&+M??ku6TIdB8P>diW&g(hoqZ2}S>ID~N=T;naSbAt=s<{jSUCSOLDSBv+!%^mLYbKK)T4|vE|`5IqG9Qk?v zBK~6j5`GW=RemqOkH3_^jK7@U&tJhW@K^E&_=Egah%|o-^Jg}AK~xe@8$2~@8=)jkMa-l5AhH4kK}_jGYEvI`sYH; z6NR>>iy0vON5jvT?gK_&DX7HXbJYptxBYex=-ToQ@?_ z*9!gNrQFs_oy96!%k#0MoH|RSl@PuVK3Tg>VSL^fDmE@W* zTaM%j8$T&m>j*qU_`}ADb-k9TL+`rzEoao{ zh8Mb;B`rHn&(h?UKr?lbA09Uw8VIeI_37_MkNK_>nC*Vr5UZvJt>*=4-wAC)x17*O ztm55e-7y5-NLlvVreUBPJ<$@DBzmst2^#m|v*IXby66ft&=zZcE)Zyg9jH;4@^j}T z6fp2<-!cv1cR{=oQKjBZ^o8Y07y!J&28pd{mL&pN*VR?i*K#=aG_>5)HP6W4%rJeO zXoc?3dSX3=kOaD>SV@0j+5P zD$ZPHD_2?TYJso0u8hvs9n+S2;MA~}?W=$pEz{Nl$ICfxVA^WW0sRY4A!5Qi2U)T1 z;^sgYzHdo*#bv#f#{rxUG^grT*edFt03ojmdK!J7cRHy~XM?n;OEd$$Np%>uvx3(7 zwz*}@OJ&9I&S}77GHok|p zT8<|?3EdfJPIB?!L3dr!dfIsha={7DpGOZ62d$=B#5`(XiWH$P!f}3f$R(O(3OgZ; zj!-~@rU1z&dXBN4#b5;L5TM0Fzm;`8#|ZU6?S^)s^vv~$dL>^6;~S_U6o7<5H?vt% zTO|H0t(9JLTcTrP%sqL{#dCYUB1|6A;@nO z)DBTrVe@n#X402=HG>ZG0~Mk|c*(v4@=OI?(G#W*-rpiz@rq!a;VViILEypUxzO>n zeA^Q=zy|(kJy!{YB}hstEeJijlEB$&LIi$4VfKucj5A?*eT4{CM}-+b#9+D38psB( zzd2MrA%f5?Zmn2_WGQI64xwg3eyTJ&3eH2{X$J~u36IdMyw+};mZ=3IdKFo-Iu1@T z+;lYuHuL%$l$iqYgE>JPxy_PlI(`yo!b@v@zt9^4XRVtNG^%>xVGj)`uCjH zGT2jw9w7cn;Mh+`B-9d~*OyzC)9DBgV;&vVRhE!VtDdr%q z%|NqMM~ASGBT41qK9X2aJwh@Z9h#XAkd-;Z)7rtp@H>SKWi_NR$>?i%m$cA4NEXvG zK%bt4K22{ZaFG%%F-E)Yx?H|q9A;>krY}#B;5?nY8J!Z9qA-fvTg#!#B zJQ{dcWZbUS@=TqCe97%P014}A8>}k;9ab`~rS42fkxLM|aX*B&bOi$y6jU=IdR{T+jHR9K8#oFzu`_yj2t2Oh8Naq4_*> z9om=#a2JYB_FbW^Xl@!e^wDX6ksDy4-)lJ*PSDrT?!C|wI01(`sGZaSWQuEv{Dv?B zW(3vc03O9qL7Sp4HH%~p!C0-Ig}&T8iMOqOf<`m$ z_$DxorUzLq3>&v%C@C-NT;A)C^*PJ z39qWHYIK0^R0aptPX>M0Ig}o#LTVEso6Bbk$xu&(J!!@9PRfu;|K!7L%#_B-rr3g?*yi?es-Ure(v~&Q+Qbz-q zfqPVNZrB2>FKk|cz{WGu%fMFyT#)I3mLc>#D88&?f%k{sDQ*Z2f)$wH*a;u{st7uR zNP@@#1S5*CtT|R2qy?^SX#w;Qt|?u|vs0JO-2)~ZzLLEr9NmHq~Csq}| z>$qzG=9vL<@$nQPM`~Sn0N+K+>c`j2^#rhllOBk7m}Xa`6|IA*B09=j!34}s*aABJ zeAn!T66z<`!$a^QhT0c_S=V&XDjJWL`CwMv0Ukl)g^>efLpMQpdJg2tP{pb((RXYk z4pd%k(=5gBtDt{aoz)J+r=JBzw)-js9eSd=W}XLI_^Q)ZsZyO#Rwn2|o~b0?{7l5_ z0=U2xNzDK@NJD!JMQl)CQ`=^d@d}Ed_T$ ze*rVnAgoLH8=aV)o~A^i2zVR?KySQoVj1WXoez0siGJ3@S0n6#sU7&%0FO#OK)2qd ziI}GY4GEF(L%@cx1<4u4L)TA)KK}GI&z3aPYuT+djWikw@STD&0B_@IuG9+KZD4@` zRwwMIU|QovdX=VK0A6X}H{nCy>k#PFJCN>%AnnlaLB919Yub4M;R;md$q;Wu)Tu~+ zK)rPbra!E1!6L|TlEp7MMAKQEeGJD$bcR3pM|Z@&@xmF4j^7-AX|yDWi literal 0 HcmV?d00001 diff --git a/assets/3rd/fontawesome/webfonts/fa-brands-400.svg b/assets/3rd/fontawesome/webfonts/fa-brands-400.svg new file mode 100755 index 00000000..ba0d850b --- /dev/null +++ b/assets/3rd/fontawesome/webfonts/fa-brands-400.svg @@ -0,0 +1,3442 @@ + + + + + +Created by FontForge 20190112 at Tue Jun 4 15:16:44 2019 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/3rd/fontawesome/webfonts/fa-brands-400.ttf b/assets/3rd/fontawesome/webfonts/fa-brands-400.ttf new file mode 100755 index 0000000000000000000000000000000000000000..217ffe9e4b273741dcd6434767c115ab3b6297f2 GIT binary patch literal 129048 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

<_iiqkI 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 Pbo|zim&HqhI9~NXnst?y literal 0 HcmV?d00001 diff --git a/assets/3rd/fontawesome/webfonts/fa-brands-400.woff b/assets/3rd/fontawesome/webfonts/fa-brands-400.woff new file mode 100755 index 0000000000000000000000000000000000000000..a2d80254c3324ed27090e4f5d23847f7c85694c6 GIT binary patch literal 87352 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

Xfe3df@HCHPEqQF4M3U za2HT@8JO(XlQLfK!ZqY`Fx?I8!2){OO4yN8K>^i-9(f0jm_Ow;-G$L_R(KwB{=V~oY z-$D=v%SIk}KM6bw6L>OmdLZEh%&Bi+%6TC&uPKNNfdl^q*s55HVB%RYN8gJ;`h-wim zL_BRlD8UBVaCav)N8gE16iOTDAcv|FV9Od=}Kl7JN#o-$zk=Ycm5+K!>7b9hO7 z-t^ME7~(1GH!$#runutTIw~v0P;J~si3Y4UBJ>a7E|Gi?RUzA{!KQwMP~pTi4m zyt?;(LwwelPFMYB7mU{!{!LoweF8%F*#T}->D8ev!EbGUB@QLX6|T&LS?9^!sM8O~ KTmHXqf8puCx%H#~ literal 0 HcmV?d00001 diff --git a/assets/3rd/fontawesome/webfonts/fa-brands-400.woff2 b/assets/3rd/fontawesome/webfonts/fa-brands-400.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..e27b0bfaf805d30fa467a0332b7c61ac95ba616e GIT binary patch literal 74508 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 z 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

-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 literal 0 HcmV?d00001 diff --git a/assets/3rd/fontawesome/webfonts/fa-regular-400.eot b/assets/3rd/fontawesome/webfonts/fa-regular-400.eot new file mode 100755 index 0000000000000000000000000000000000000000..d62be2fad885f750abe96337567aeec99e5adec7 GIT binary patch literal 34388 zcmdtLd3+pKoiAFa_NuO~-WN$NsnxCS*1op7Wy_Z3C61Fgwn&^{5=bOl@{-7w&=Myh zfF_tsfWSDxlL@)Z#ca8}z|7eTO?^EFOpNj|xk| zj4+8jL9o~5TrUg?1HvYu2j5{Kk7wGhQu{rqZys+u&fmY8zmJ~m5&DF7)c?CfhKCux zUbI^h#&_>NaO2zG)BSltcq{cu;@Vx;>=rtNbAoVs1=mgcZ|)t~{_Y<%;Gu)Ko;ZAB za_-CLp8L5V$d({T-#t3HFn9SfY7$QW829y~Gxr^tX;2yk!AJ_i$-h1}JvkK#kNpMi zeGlKlF=WU?;@44M7}u@GPAuLVd*oaF)DHzgxn*v4Ve!}dw|_No zyd-!WT=?&a2QzqHz`5)4PcQ$a`1|Z{ajCngf`{-qfB8IMSibyI9Dkqp5JHvCH z6h4N*r9Y~e@w_p*#GlOmg`E);Wbb81aDAmE!Sm)XkYe-X#6>uyP5c(F2=fwxEMiUq+m;1Y=vYx!w3XOOYNd6h zXJvF{*UD>FPOi+YEUYZ8Jg~C7^3clLR?e>c@yfZC|FZHoE6=T5SoxnTFRr}2Qo0zp zSbs5baq!}G{K>_CyZDPs=B4W{ z-FWHtORu}Mc2sI9c5-S-`_hMB`s7QWe(8%ZJqKzetjKF%eRT!aH`KuTA;9|O8d&31 zu-4gfc2iL%Q-%D?P>G797 z^wKBFu=+0hO1^*f{gdy9zW>|zyzk4tKli=gch2{peShqG!uN;1Gro8EPWvA4-S0c) zyUq6+-wxlfuiw}0Yx6~YexJ|&h5gU=kL`c5e_(&#{;vH^`;+$5_8I$)_WkypeZ-!y zZ?SK-ciNgQdrRKmcz@#kk@wr)zxV#B_ha6VdY|_G7w?naN4>x2J>lKst+QURK5QNJ z{GI20o>ouTBbk@Ye>4Bp{J!~*=C{qSJGcRC`2WNoQ-Sd=q?~Nh^s4?V->lC2|8IIs zctH4T;bnG`eV%<^><~|jUz23%kn}ORUjBf5L9vuQ%BR#0b)WjYR<9k>zONtBzi-@O zeA=|l&E~`Ak3E|`U$f#?!Fteo!5jAe$ZoRt*$>-a^6dh4e$g-ZNBt-L&jyAAp9;1G zj|4vy{90&l=xgC!;g3Xw$ll23qlxHD^oOyY*i7uX_^$X<@t@ZnsavUkqW&ul;fC89 zewsLz_(|ig#(!vfyt%&lSo7zTa`IU6*%q_q`j#^-UrZfI{VcsNeZJM-dRObWTT7W} zW<0wi`&7=%jprW9eKvQgt*vdQ?fLfB_6OVlp<`dimpTibZ|W>{UElRocd+}(9=+#C zuipD`UsvCI`;+~j8n6cD237{o41OoSIe#|))1lkeNS9TlAWeeNH!a%cF>}AN;iZRh2w(Ps=q-5YN zZwVx&y1Q&E{MdG*&DgF@y<>Fr9aFIf9$;ZHYae|q6f<`1GUK7gj@nr z(Cd^OK{dh#8qq%(qW665(MP}b=!c(LT6$`UskbOr(%NZgL5+PH*^hp$^mXJfJ>?yh z)el+LyZSV<-lSQtqum!oft|x!8iX7K^=-nn!hYe^==*_aB;d4vD1i2}0i4hq$Q;Z> z!ksMT05Eigw94V7?jg8W&+G+iduf7>>`7HE&8RB7%X-dQ^Z9k8DN_4k=bX;Pb9lNm zr?LZh{A22C;})jqfvTgyA6=?Ca@@igqpe?r`T>cW4FI7r!kROjS|qHZP1&J9b|_zn zHL+MY64q$gLqp{fbTv4@#=Ex1JEL27W{yU;Z!va|tt1zfy0vB^z(n3`1j&+lfemv3Nj|bj_E%EUYAx$sfm)To3{dE&~TmV4>6h zIgNL{+wny<9!{J;kM<|k(ofYh49Qa8+#Gdj=>WS2z47(~gv(SJWG))hG!&<+j%9gd zVnfA3Gox>0qaoUqip5efy-nBK?$z~!Y#Fb{qaXW`_>pOJ=V^-b%VPR~89thha5lEUepai30aa7{u(RTWz zNVBC(1Zuiu5KK{1dK66$nwG8`Qk~Beunf&e7;0uLyKQ@2s;(|o+c|HKC2ha1Dw?Jk zR@kqp3LaN1zh-$1Euxu){AcK)I^It>h-1M20I0U?VJM#~D8MV5rBgj% zDf!|kNS!uNDE6?Fsx^r$*}HxF>$b~YJJzE4Shpl~JaPM$*;^Bo_|y|GUjODy=FMl{ zoQYq5JL^Ni?LB^<))KS5$|PvP_+JPc=2P?7Xpb0XdW7XrY_Id5FV1JwlB4_y~B&QJ8OpV%lXAK$PMt z%ZS9P(%Kc$)n$rRjA(=nIec%hd>)8OffjJ3mVvWvmepoW;CrRhdG}tKi1gul8Q;Ee zqOWw0ILbMvghf@jpNGqdO3wF)$vb=~Z&`WzCQ6U7j?%YP$WXs>d1^?=y7LBOOruuB zEWuDK4ik?+e8RXEwqbxD|JLJ=-__f*{d&J;ioTdO#DrV#zyD+Rw}nmJYHA3_vg{l# z?Vd)D7{~;Nci;MNcbvZCjva#?(L^|6hP@h$Qk;jlv_AyePjtU5!w{K;xX{c(Lutr! z=|DA+f4A2tp8qlqkFc>sxI)&AVrk_94i`XssPa9SQxV8VXceR*LR|<)PQ@{xZ6nJ> zFzZ3WJ6SHBV#O9s^d}O&al4^3N8NR9482ww-)1+kxcaAK52@_TcyUH^P6)}fA-E-Wt#iqk00%bGElcL@jZZbu?RYk2Ei0z|EIT02;KKOI}w3y^Gz zYYMSG17J>iSCRPl$P!`n(~|@3&U+Cv@dUbiof_q7*+oL@6Blc=3>zjq~Tv z_vy-Rx`l%vaXh&OvR4{L%^T6KCK0l(iz>OSgE0j{7)}(LSR|Z@MM1(y0xTm>Q2|BE z=0Hk7cX5-DDVFVJVpt1#m}&X8Z)s{8I~w=dBRhPS83}aVf9u$>_zlyg8^ZCr?RVb! z;GIozpDafs?B1rae%5=_K>tm3@o*p#m1W+pDGQJ2l!=&s@6wu~Mv ztjifPy8?m1!j|2;l9I|ixbk(h4GxSnrs(>dXd3Mk3iAdaek>Ms_Lm)nsGeyX9^N&Y z^~ky?dp+xNjt4tU4^yS&uH9P-g8^I_vZ}QtQv5RDWy(amVTxY8xTulFj(Gr@G6r1n zLo-SWU5*3`l&GSNgRxX2!|Y232DY-6NO-VVC7Q>o(xTrR^@0Lo!X+TKu?rC0lIq*7 zJr+LaEs(p1Ep`rNR;gT{+R>qcKtBDnI#r>9ZJg#fbCmdP1lHb0AtQ7Hmn(z^vcWbs z%0Qi?;4&?_&`?XH)zt~g;(=H+9B_=|YRqJ|8BTl%7Z&|*# z5zue*S$||$meDXbM|9#wD&c;JR=M|qN%ebUO@UTXmBVbPCz86^lnn2f zHx$Cbkc>#ckb_pezhgkW)s95$_ce6MreE=dlMR86j!#0GCt}+Xtt*@kH0!}=tNe@@4sO+wK5y21J5|8V z^VRLYRk%YCKtD!E!XQ}!6eiXm9brT*o67PVh&AtyT(+1+I$I2*gc^;}2jvRIA;=rK z9xHzdOz#c#@84e!&uhRUAg4fsK--($7*21Bi?9g6FU=258+&>M{@)9O#z z5i{%cCAF2Q~(nBK>D7h8;_Z#ipZ(HJRq#1WCk$-xC6 zXc0nTKUygBPKp(|mfr|Gp%#<;h5x}(hLTzjqfgXr|6Tp5Xf9eFFWsxV1E$pnLgvOJ zmaQ2ub|Te}8rC9^VH;H#8Ph1&%oMy!s+kD>gi1gWvV zu$7U>PB=i_0M(bzR!z+T&%4RcG37P=52#PXL7)0S9w{~PxpK}Jw3_-x_u7h>JL`p2=-E4bU?;2|FZb}*Kvi45qC$bB1a9y%(h3$RI%lE6|KHGf8v^!Mwp*{Kh zp8U03m1m<4xQ-NSr^ZVwDw9QV-;`i-Ht=XclJ+Y6)h>yhBzQn&j zn<%oV>C-g78DYi5>Rg(D?BWAw14f0&o&|CVjH3BekcKcJxak5ybryHQKfp24q@58L z;YEplMAAKCj-GgiB*FSDX83U1IVr9f`wS&6jbC@P%Wl^C#87AQhN1l4WM@e1Q$k_A zYnsiWY_^^rYa1@TwX;)^Gn$r>*$YRn+cDrDifP)`{?@*s8?G<(wf1iX_?bp?V8^w` zi58IF$-V&iGr+A)#Fqg%P^$-86hK6W=0V=cJlDvYFvE%1DJ_7rp9`6NnC)oiV3_@d z5wuIoh7Xnl(H98s83x16Y;Fk$d}8TcY`6=e;M?=rWR># z2G`n=?b;dlN!rL1>w(zFrv5I|06Y@33cW7tk2fHc;Em88T?LO6#KBcXGF`1P#;WpT z5ePpcj4L{5l0)5yr3VHFG8Jtxkanp7rcg0Wx(cMGG``^xOfEdMl?~#XC#?{lN4V~{ z=v?gO7mt+2FtyBswmE0opa5a3bY>0(=Eiu=*t7MJYwA^e==6M*xO9L&pLZ&IptaRv zZ!oMjns05EQF<%eX<0kjopH*D_f=}(6*+X>nSTwS6l6sskvyUb|k+v7AN>~Tau8M-B=sJd1q6yV@qIFiX8naK0B^u*S zGVOD0#kFzAU=@L_X04sOY+?r%avQQX3ZI0grgB+G^|9yxw{E+3@3(Rh@SXgaP{Te^ z?LFJ8ioUSga-`OpbhsidhU#Cdi{7xdX_FTAih6ECxcaUPSDF5*15n+d+T^k+N4r=L z*a8P^_D$`osOi9rn}8pHaU;mOIeaJjwXmv*dUG=e5uk0*XB*fi%Y9ac4f?Oc{~!ll z2`r9;U=p@@Wq97m`8Jm^`9UO^f7Ner1H1-@VfA@~@cY8Mh4%>`T~Em|H(d`x%Rq*v zHRc&+T#Y@b+U`@GR;tQZr~jk%RM%NeN#IH%p2c+{_G7)2)OB`2FFj@@EPN(5I+dPr za@n$TF1hCo3%i+ztnXO()H0&dGYqdQUC`f7@7myVvMTf8s`UE8&svt>D%*lwIk*{~ zowZzbof(bf3$mhB^X{^BjH`YevlsYynHE?=7`A@!8sdySBsLdf zva9mRuI$JbE$bP>?}=M1U+tp$hL+H#Wyx#2VB1=>%B#iYT8I95xUWhmR?+^e(YqPT z`mtrrY)Iuk1VV_<^Ba@5s(1R}lS!}Z#X)#10vXo_P`3Y9_aK`nonu>SEbmccttdo= zF0C5iA2E!m;mYywoBS>MazJQpavsk4cT6hgA}L#rgkwEyR4K;D zT}zryS&YOqBT*kT3e%1R-WFnV;(%?RiH-Dk>YhTPt-G~psPDRwSnAA~mcA_=+0dva z>;C%Y_V)TZkEvSa9z1R7;h-el%J~FK*=?w!E?JO6$#}9oPTI9SbVO`)Fb zokhqIcsFFcLZ;f}vWB(3@k_d@9@h24=$aeK-9_HY3R_+ADRf`)EnflUs&LMIcLr(- z_bx@%tD!mDx%%>@4c~pH{O$|C^}9(ngd2{!on58f&y;Is{te&!x>e9v!xdic=Cu?XaN@xiXYXM>Lut4pSPe9%TOJXbviv`|1EoS|73K!w)Q61;_z= zd9O@>JjZGC0f(4>whE*J_LeeCr3v7=({4~Ucxn#_uO+%kb}BL5!97&zij@KqEqU3X z2a%RRjv<_2jjA$N^++hL*%IW!0oZWJUL}`pRo~G3N|eP0vyxxxzNR-I1w7nPby$x# zn3C1l&^>6h#@nJd_?SoYMg7MbnPP-&-S%sVXoKmgJCV(dnU-1l43`7m-_q3Doam?v zhfO==UGavrWZIB7_vVLUvASHeexI-1jN5iRxG7|Mf~Kxt>(?@k@n^F;wA3wSV^wwA z3uLR{`bj57p0q5u=kQ5$-JO^S8U#}vY>As8qC@)AqH;ML0=cAZ6|y<{U=UTP%;Y-5 zht$S=c8Gn$9%yYf2D=*?Ey>eoYG%+e)LDkd*K=(*x@CBnMHPSPbsRi)$P7Xo^e~@} zR*z+}C+a*_s!jLXdLW{UjsF<0Pvv7V7z#Gao^6JocY+=c4|X-THXY-A)a(fwcHC_D z`BU1C?6c{D?!Q(y!?riHDF`1c`NbLVo#GM3ggq|DM7uy|Amdh|USL2)=nFaLF$F-^ zePS_J)N)!brcn?~F_v|yV8sgXvtV$GE&F_tYumh?R@=3aCfVM?^O}%lb-7tXH{KY$ zJ)gfl=$@awb?eq!x4x>UrKP9k`&Osber?3(t2`Oq-R|U3Wq|-*fXd!HRC)ZhRL#Gm zf~~h6Mg=VhJP?H#WRRZ&x1&Tw6_VoNWrNXyEy5XJArFw0$oVQXci zoVXZvGxyGyzRp?H|FxsHcSkRKm^~gq%*G3n=>^UF^FFqDUfvBNIPcZRf=)x0_#G#@@JxwLSns6 zjNm)lEbVc$;s4A77Aa1NXm^=66oswu1zt~HpsRCAZ$JIhFiIO{{nY&hkss4AeFI3b_VLRC@ejuPU`lifPpi{-x&A>-ULFlA5~B zpyj<+fvGaVAp-phEpc>a6t6N(mr^Y z;FhQH=k%hg4{my;wu4rJMK}^)4lY60P6b0gs0qVW?S4Vly(SRJTAv=9@;i|g~okL)8w?L z2NG$cCW#GJKte*3dz>8E2pM5XyJDlBvDB@BeX6BO#fD~__E9?67Hw5AW@O{2#@m80 z`bwkb%w-IXtwI2BY*mmxA@6pwD>Pt_bxk5Is~*E=`gNbEDRHYW?(up(@hd`IdhbW9 zOrt00^{9%-dKK-kF9xN4Exc`5bn{9xY&CAI%!aN2W|D%!4(fXRuiFxdw#1cTJ2O@; zxx9jci8e&UmHSZ=G{FO!+JgAhesImb!Z_&PU?g3Pq=z(|@fj+vl^kQ*s`Q5Y=|C|S zr2rsc2n@J`11iZ-i2os`L=`P3lVga>!{Hm%Qf3nu?fR1Aj|C-fy}zzm2_>UucLOY* zLE9KhvSboZ(qB`J6q+pye13mv;!CggHwJU@$z<{&zen?G_;@~*Oji2-yet3qg2ug4 z-xEXQ;xGwEAZ-yIo;wO7E>yjqE8z?DfYtc^3unk*R*QN zu&lSLs{R@+teFj}8QC21=-q@`!DildA_6xW;sR&Sw*iy{wVAyhW&2jYfQ6b*iC!4oP9m&+ekHR#m^RV`>*kg00p zKWvOfrHNl^qVZWnqNBbaPib1!Qv%w%Du39Jy&BPKSPEs=imF5hia9ms>d*s(G*CIn zb_owD!n$MNlk6xLNlNeUo$DPM7HbS2 zWPJs%7F4W!dk(Q9pGN#dosa|u^pN()$YzWA1Aa*1im)t`jF6*P(`-(Q02Eb>Vx z0bvw+Fa+_m#(tQ*V=|lDf4YvJ^LOsqY$*|zySA{eK!kt0(uhBsx3UwjHEF6G07?w)~fAe&|ZhMDk-tr zx8fLK9qBPrRYv4S;gUbrVw;^xoo~$VXBXg9+e+~v*39_5bb1&8Bgd>YAGQnu4%XzB z81qAz3zj~u>n~pxShDnES-uy>RD8zU+8*H{+lbx9=e_*6g&%>amw&-mDt;NXzKLr` zh?d06L!>0lywG5*h1_o#tWkL=1}ToBBdgq4F>EKEW0XxSsuj-LALG6FG7uLVEWH~Fb_wl9Rh3?>?8eSJqf zz3ZPsjdl8}Z>yN?jYZ+uDotb>0!;yo-Kss5bb$PNAA&-t2cJBYSrWyld0C1#fnJ1w zlmg*fBwXV{8EoISb${zv+elUxgPJGN5^oK5w6-=O{u5$Xjf2JC{;Dmxu}oT4B&pG3 zL?fAKYM?=8a)XSO7Lcz6Pbzt$ia%ar)4!Z3KpL7bl}cJ zDnoOp1>e9>8Xm@UB*zQ!hj=9@IGC$cwpsx_7ejd{TM_niG8XNzO6Muc%1N^^q{ot_ zv1F2+PwE!k#2>OT3!Wpz=sD}tXC{WNy=?5VQ1x6@8qX$^rDZyfF@YXON&KBB>r|c} z;&XG)%;Tw0_e#(VJE1_4d{=X(I0oiWAhH-4`6>FqebAEf*AteB^^?6EHJ#vfem zg4K)*XnE;8HU9#Y<%i`Y8|Jzx9ymyOdECEnZuN2WFD}++B(WX?MKK;iGWi_~CGdC7 zI*Zzobly+TV$^t%DjS1qv&_&mE-NWqiI$4#P)h);@}b+|cG zvJaJ?C*vp*-&HS!69@`nXAz+BJkIBxo7M3vCB*$z!dF)!+dCiw>z}YJ*-bOBlG5`x+;sy!?98@> zrly5$4u7al@12?1TbiIF!6Lfz{Qa=$&H)lGSz;6%)hRo)Makx&{ql&X7)0X&sq5@(fH;) z_4S6PX~y~!Rxv2`^|8tD_w-JMz24u|HXn~n87&kiA?peVHmri|mQ;RIx=U|w3&*gw z;J?lLyNHrn!>jP>P;;ioN|1Dh@JhfupNB? zk|24K+&aJD`H}kV~qW4Z?n~)YzjmNdfC00_G{d z9&KzHOa{lp&H08PLZ?;D2nEqAsu>KLDmo_=jA{+CWoq)mSHPV1EA36EW6`&GZ14XO zE&3zYn_AlRRxzWuw|xCHShsgCwf0HNV_N@-QlF*N=P30aN`1}JjI1ijhNXVs6tUn6 zZaf82rVPQwO%TNy11QI?-ZR8XK9fCl!5D$C9 z1V(FlLw$?_XDQwZ&2C2QMI#ftLl>rG`E;x$-#Q=s>y}Nl{qKfE8d;TrXCpI%tRy#5mGA zRWb;X%t(uSoGU_C6$8o}=3azpbTQVEuowysMVhr-k~Kyfdevw^?Q00v%gJ^<$&{oN zFn{JXZuh7Ud=JZknk9ckY>>QgC5Ty3H9e--A$h%CsapyMqz)#+-lcn`CMn_<(;yi&Qq;zV)5jYcHKi#un0%|MW&-}ZO|S7e%cm|)7-q)uJmj$z>-A80 zpU^Dm>rY$O-&l(6`EyxQCF>zdJ}!#acyw(5h8qQQ+_4WgA?kNdSQZ|+;!GzDE`SUw zSsOEeM%qDpqKOrMQ-ug{7e2pQb1z3!!<`SjJF~^r4Bqp&#(nfIhJhVv*(5e7nb^lu z;S-!Tjoc7{E zF$@LC8*J6ahk32G^Z{Kv6>Cg9$qC5&6S-XCdL?dpPMLDhd{XzF62${F%}_H|j!`NC z!l}z?N~U@4pHcE6h{;V8G#4k}t(I`&X@2ngC;WV^wA0^din3+}9$M^TB51N@Ht-9wNYGHZ|AZa*PzLnF%Sa|%xG?aOmC28YE+$q zD5+AXCiNvXB`52;y#Gj>xH+i={SCE>P8z^S>TL(ep7pY#-7*-J+FMMoK1TH4@h@VO zpyiA}=KZZ>=GKMBz~NY4WyZ!Wh|~DGr#Z+?@HIoIf;)qpB#@xo#bnTGE5)q6A6fMl zL9ne|HC7F)2Qn4*WUAKRs~uKXgY5ynjQW8qLv*hrPJQR9plr}@j!zP3O}@ank&-!uF#3sZB*WUy7b$&gJPh_D!JBX;?gIsq<~J9 zqoA%9(^DR1Cn~D>U50)GUsl^St0Qpd>S0oUi>0?W@O8G`C!H`K(#74iJuQfHp%v0D zlr}aw;35dOQ9*1TW$5@p?gLf=u>dO$1~et0r2}H0YAUAk1Z*7U$DWp?nyb<$mP;?Z z8N&L7H#2q)tJt1WvBq#nlD2MRSdf0(>ec4b_j_1V=|{b+sjI|VdQ0D@IYjdHd9Hs% z0bRKVJK>?`Ivu14ca3@$a)Szs6xc~*8;lwScD_EFtv~ZdNwy{^#m?aE%S2kv?DU?~ z40b+SU%F7Ay+gDP;BK-$i(siF-N!0ZW6OZ)#sXE-mkpyt5edt=4cI6R+F_v<%59E&}t9V7qvDWticx6gtcLrRShKUs((A2sAk-8M#YSSc z7>Gk3yQj||`#~&FdX-I=>~Te%F@oKVMp%sIHZh5fb|faP7So?GjHbA%obKK#Ne6t^ zc3o2=TG8@&JeK#UET429hg~D&^_oeap~d|HF|?QJ6#C#MS%D;EctP7=tpy~X5gm!7 z#nI)1rtA$RHM2FOsMjrzik>ZMSl5_3=z&shS~tsbAAimnt1{j;!qz*1KCCvElIc(x zXp&>t-ysi=VX8;Ox+Yrb0$~NBaE|@u)#o#fT-W-hgK3~0@$axKx z90Q}IuVZegkp9vOw2b2gJdw>m<AWr6*@_=m<`;Avxn9Luc7HYCiAM$ zRx{RI#hMjPSEp;jfiIMj8@2*lJIvL7HVW;0W_@GEbia;I?a7_{)iLp@YP)fHa+ck! z!2t?dAX1=ZXsropX)ziS8kZONRx^9Kr?tpQ&7Ynfj`uV*H8ywGu}lUbCYkmzDbt#f z#@Io=>&!v!YyFl>u==v1X|h~ve(dI@rJKj{c@s`pqD|+y-G|12cy@>U|H3ll_m`60R?-jI!94g(~R;%%Web?UIcY-Q_~CkzEq7WCF0E6S-J#iM&uck8wPIA)MIQ2KmAZ z6Ko6?%L@X-{#57Lmmtr70J3}&2}r%*Xk1dt_KFeLJzHVIJTe=mfFWX=q*!f(*aF5$ zQY>AN{im37vcLyj$(A!tSQ$i^NjP(?D7CK43-N}Yr1x`c1c||PLGRFFP8K*d`?QK( zesntrPm?P9R7;HP836pQgU5 zNXxdo2$l4VAtE+ZQ(3g5BZ?qCghz_lQO4%gA$_IVJf7dSvNDY!oy~*U zI?U%Q_I!XW=U5WbA&2Q;x1ch!axGY}WsNcv;ySlB$Yq=mSXcEdW)Ku$!heJs>URha zM#9i;N~v*c3c;On>f^yjf}(VX^u^KzC~qj7bk}T*^W7Xu&v5eNTx>FI)uV1|Y;2T3 zh{j9L^f_fQKZsU3bSDnFlSezQ<@#rp%^qv19cg1L3vrtp<}2DcRI8*6I-!Dv0gcd) zzL6Go0kAIK(ek7$#CZg5X$EV}S}m)U76+`Azf;1x^No%wT^>!t<@{I?;d1`tK2HgC)i)5MzyGU zS&eeB_HDH~4Bl0a3K88A)LgyJ(F>r?M8a+`h_k=kCu_lX0zlk0f3v#HSlfB|H?ZUG z1n!W$5QEg#Bv9lQa0o4d;7)rVky5LqV}lt?*|auT)MB~8SWzpc*$b+SVJiJpvLx&+ zrc5CW@5W8}U8R4|e=+}+ZM*VQ_wE{;oDAHXXXll(npXO#EVElQ?X1!_!T-*jJNM#? z=gx827YvhhDh)dJkZ=up*p0-639}QY$bvSAQ8gdnEo>PbACfS(<}BhWGFD8A;ZpPSRZYh^4cSQ z{UG)ok+9_2mRJ!LFz7-hUY>#9mR8Qu1N^|};05U5#OoV2uwy{xEj#+4x?E*%vRY}t z*?jM;Iw&X-6ui&DtjO~@z0$U_gG$!xc1EDS$Er; zEANo>7QTG4`uOZC?wPdW2rE^`zk20Ol!$Jx%HSm9V%_vwi)L%hD%4^j>&m!AT9-f+ zfv}18d*TG4yfI^;W=(2~`p3LY%i)Z~d~hFREdx@67^<%&ORZJwQ*-)u-kSD!5ZeeD z_``NWRv4l==QpcxCt*Q^hPM`OI6rIFscr-9B|lKnb%s&13Q<6T&=a}=m&&M!30mEZ zci)wAmav9KLwpHq4j?HB!&C$2xM51l$5qovD98*dB77jq_?ktf4eidt)@YP3Y<)dV z5!we1duB*+xL5*Xp@5_ta1DjL0mXoVPx1V<wFsS+w&Kp##(`VP^ICmd(MEaUIoV%}3c5iis)#=l& zc+cZkR>zapN9SN0EMkXFMC+^_*VT0ejsd4U$Fekv=mrG1a;{a*ztWmurtuKIEnIKR zayEUCNB#{}IQx$A+Lo(w9_0BH*ibv3)IRJRw6e3@^b8zb@5az;NP|u#XVn z@z%_HXFYlWF}T~oEv`ef=mA=vv<^OZ-dEPAmt|8|*X8j)(ZM3ZAYfRcDIr9~x+!`0@zHU%bE?4;FL)o>L_v>>v;_cS{)nE%)L6~cs(r-4 zc?V`51Wtcj|R&td9+l| z(~?r%;;u~FQQB2Gl?WzDpuf4LS#tWLs)wrSm=`pR^t@fr^LW$CI7gNTv>m*Nhb^Fy zMdGp4F+gEbS8){A;w?MGn_9-ex!rzSQR;1&2I96qfQZjOS8V@oT@1?szY(+~X!5pY zUaG?3Kj72K!N<{{-01UCDcdhf^>}cXuTc()`fh){#8lhR5Ot)Q&s5`cWvt8lPtHSif}bMP(nqkQBz~N?9!hs-__h={fA% z`)S}%jBAcNAqP-IQWXv%x`Fc_qIpE;8q zWHWVD8mR$`C=#PehE-r@C29zBOu-*{c>!Tf5@@VaZ%(G{OF?0uo^J2A>QZ36;`}Sbx!OA@OUD_9P=p`5gsHf&^{J|$p z>_6I4Fbtxh1`*V=L{wcW`@6N81=kZ?HwV*&`{*2XvKL*sjFKq|67`X*2KR?D4lp6lR%WY*NluZPn0&@%%a^ z=kt6>{)6aKOBqWVPx5VL6N1z5+c;uBStCDu zq)ISg7VHOxO7;U)H-fDkmk(4)3$DiR%C$9e0FCJ;iX<)bff$0gAko2W$k`#q&JxR~ zGyLRD(pqTCy6S)8Kz<~hZpVHAB2xpANI;h9sKQ_3ZwPvv!E%4q!sAR$<2x+A}O4%kV*Q;r}3i2EDsFPsxLvhU|)Y3L9UHTX9{Rjat0QOS-@L{T{J5 z58?di(MJOafAyJMKJR`c>a(N12Dr$uva5_0IFk+lq}XekWG=(5Qz|!~Sq-63L+}H^ z79}bgH(N2kD2DuosQCKZG_H*w?dg)dp5`RiCy2hS;*Vq3tg%@Lj=C8w#~xJXF4m?y zfwSQL?hb7122xR$p5ZwC34Z*5rZe@L9=qonh&gM1xMk_byek}?_+~@x-m;}zMNCI6 zJQN#+RfFYuS%wGKHRwsU6RwCkNRR!FuL$3nT5Nnb(3xwJ7S}Ale>I3%A5hPc41l>! zkl!3Nl4sqx+JrT2NPuS`PH$}+LJn0Vx>d))V2Lid~O4ngKK#nL>wm);wnAug(<9xfBPG6OE39XZ3Hy?0lkX{~_mP}YjAMqBe9;uSkLveTA%0N6jmuUunu zz6fcrY_Zf_qrmFDE7~l@EgcXEt^3w`DhC#tV3GE z>T68U?BQV$h+(|6`$#vApYW-MZVk^L<=ghS!*g--I0>%fo9C%ne^giZ zM|2)=S-wFogLtr`+KCX{+MS3?73%ZQ-rUJ`5Jx9@*Q!b~F7DZ>FjGs686>{9xoHua%AdPwNoc{U z2&arJG_c#jh>Hzw+7!CPce!a;1;qd9ru{-l>U7fqL6i2o>7dXc{ehc~ zpv*VjbQER&9iCk#gOLMkDdK?A3=qG{O^f)&-4DBI3Hwif&P~fgfu-HFB3#c-xoK7C zWB=@?P2r%JcherBNBoSN_6u1_a?=69mbSU+piq!r?WQ9r^HDb)MVbErDmRNYMfc&S znU7<|@G<_w&}~>v-7X}r_+!q(&e^&9=8qpewwP=?+@9P$dvYr<_U{lYg;e4{KrYZMK&o3OGJ-Io_8_~YnirQcO9>RDzzxds~wwI|ocT|UHIJzs{ zegJqvKM_tpAAShl%LSxQ0FM?p_RMjND*teJ5_mt6gH;jdXl_0_*?-osyi0>u{>=N2~i_8vjICLL_;IXsISza18Bgem{4F>|AL ztj>b}9dLp=iJYDam%jkZ&PIPvA`?GA53VOM8N?gLX{IwWV|$pzyazF7?Q93z$#$`8*lu<$+rzG7*9-4pH{kckZ)E$}em2ft z#cpCZvjglFb}M_e@OE~Py@uV!ZfCD$uVZ(xJJ|%AWQW*cHpQmd5q6XvW5?ND>~1#0 zPOy_~md&x(vw60_7TFTJhn-^gvisQm><#Pz_D1$5Mhk6zk3GoV!cMcdvWM93vxnK+ z*xT7V*dy$n>|N{+*ctXHdyKuCon?QBW5}$?>;d(f46e{#N^Rwd3x&jqP2MZ#PmY<;p6j%XQr*g$EFY8?Oym^ zzcjtDh$-z}OVjsF8~AoF%uFsEvkp(rOrM;ZoTu6~p!JFAlZ)z+*_o;7d5?4Io}HUM zX&gQVxVjHb&g*WW1%rU>J~laXM46dBF?-T;c%C5XK0G-;B^{fZ@*l&r>zf3so7H}<-=eW^1|dj)9S+OmnP?@_34xMOwRxqV}@ABp{1Ea z@}cRO8U5Jo!rbx2$r;bw%+f-)Q&@F+LRmO*d}dlXGLH(S6Vu1^yQl9vGz$Rra=Y=+ z3a`P&-i$9ZuZplJRb|^7RMaR0b~B~vE%nlJNc7KQ^#kW!L0yrcVT)82r)3R3z>B+;>-tzdP8A}Ux<%(m# z>Ls65tCxIUNhc=fJnkf*F|_6;F;m?^K`UnG+%$(8h;#R}w~V@cE?JXPQ}fdc3*9u2 zD;G3vJT&FY!+U%R({1YLw1x!T^qo3>64=pwV)EYOCyw7gUAaDfl3&~IeN??TJ3nnK zoSZ!ca&h;xu{e*JPN1rM*cXh$GsoxnG>A;jV`|VX_pKa_*XI)IMc0+(2pw9Ny)-8s zojzfMBuwAeedsvQfqKb>j^l(??ml4ig30G-H}2o9Oad3~Q>KpJfB${j5e&?+X`nJq zUfyxq(RnoB@U)EcNu3TVlKT1O_<@@O&rTy$FK4 zU^+P + + + + +Created by FontForge 20190112 at Tue Jun 4 15:16:44 2019 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/3rd/fontawesome/webfonts/fa-regular-400.ttf b/assets/3rd/fontawesome/webfonts/fa-regular-400.ttf new file mode 100755 index 0000000000000000000000000000000000000000..eb3cb5ef66108375fa9405584df000de398d3244 GIT binary patch literal 34092 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 literal 0 HcmV?d00001 diff --git a/assets/3rd/fontawesome/webfonts/fa-regular-400.woff2 b/assets/3rd/fontawesome/webfonts/fa-regular-400.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..b9344a742ff2089c6bf862dcb92700cbed31cf0b GIT binary patch literal 13580 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 S)`hUC=>}_BlnnbyiU9!eaGWRr literal 0 HcmV?d00001 diff --git a/assets/3rd/fontawesome/webfonts/fa-solid-900.eot b/assets/3rd/fontawesome/webfonts/fa-solid-900.eot new file mode 100755 index 0000000000000000000000000000000000000000..c77baa8d46ab45aff98845588c807e81b73c9d91 GIT binary patch literal 192116 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

EFA9fIE%m5HyEmWrq*L@`PS)m?s1zo^|eW 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 fd>p@0o#BB0sD + + + + +Created by FontForge 20190112 at Tue Jun 4 15:16:44 2019 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/3rd/fontawesome/webfonts/fa-solid-900.ttf b/assets/3rd/fontawesome/webfonts/fa-solid-900.ttf new file mode 100755 index 0000000000000000000000000000000000000000..c6c3dd4d40e6935dbda5f4fc671956c41b768a09 GIT binary patch literal 191832 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 JlKu;TE2wOj%Q1qdB^k`WJpqvW9V}9KNYfOicm{ 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 R-Q)Ro=L@j@Nd4~k{{Y?~eeVDO literal 0 HcmV?d00001 diff --git a/assets/3rd/fontawesome/webfonts/fa-solid-900.woff b/assets/3rd/fontawesome/webfonts/fa-solid-900.woff new file mode 100755 index 0000000000000000000000000000000000000000..77c1786227f5377318cf4f52fff9f454874651b5 GIT binary patch literal 98020 zcmZUYQ;;T2w}s!fZA{zKwr$(CZQHhc+Mc#;+qP|YpZWgVQxQ*Pu2p;IMMg$uWo$P& zQBeR80002;Jp{o0Yk{xSfh0ao{`LOfBPyya^DmJ8-v^w3;6`T9^oR+Ii2n1W|7pDc zK?O1-r$op2&$Irg<^G{B6m;}#WMg3e&+7yLz}*1=7)L5YCNDDsr+*$K^S>C#|M>X< zfS6f(nEvZ>1AwF|0l=|{fHc!ra}xt&0Fct@zZjN(u%Z$1x0?Sm0YJ(G|MY*5fC_;F z%x#?A|9SiX07wS_0RL$q3EXaNXY?;l?Gpfi8UX+h0H8+Y<~9cI_5dJ*!GC%9{~!P* z1X8j!urc}P9sZjD1ONbxRJ@sU*51y^831JT2moN;0syp)9gE&X?%78A`ufIzKpdz{ z4uba*=_KsrWgr0i6WG7B|K<_)AL#!8{-;1dy8pGH|5N{7|K%Edj&1h$j`#MS4x|tF z_U^(L_b`exHqz76Gt@FN^#Te3Ai$tSZ6)-~-ukZ$Id{E3Ah4d%W|)H5{+7Ma)tG6( zlwjbZfWUJ2w14AWEnCT}j$lFDg3QUUnZ0-{A+sq#57S0uxhTwY#W4@gAEp9^~OQ z?QVuQ+;Ml!osDo(=uQ&1r}S#Yoj|uQ^#_M620I zGnF7PBDSCd5~E94Z%&V!HZ*e2Fxg!+8Y5xfgF&Q|0zK-8NT&)3YhR~M7B$kwu#^Hx zr9d-du+Fb@gc6h+IolunbDmOl6vuMN3X2G^=zW^xTlS2EAMUOhgu zf9or+jGiqz)_CponzXL6T(jEM-WK^;#NkxrDoRy?vCBm(87w;^l@+KoWfbcyD>6&= zm#kUDrc|KL;Zmwn%Tvy2nlw$yo+|jSl)Y3ksMOHT{VNp6mAfnzPqN`KeyV-ecBtYOYrA;T=;m@`O1kODR@NV z7WkG>o}4@ra|=q(+`l4otNp4^&UY?AbINvRDLq4UD|c4bJR7E0z&u-M=S@X+%4ag>)8TLxjJQlf4a~X*z#hHes>F16y$cCj^ z8YX`qx0vQjFjAVfy%lQMEN4n5nK({D91AI#M^5T0S&qwuaF~BvT23lBZ7yb@I}K?w z&9e`uU)Y9UIB~VTwCQZ&x5u>&Y&l#v*e2s#$-0?!KwS&6t?3+>v|-uUqz=(+$A;PG zk=IA*8O!1Ijoeen8RPnGp|r6RFm9n_j5WN9cE_YW6n++w-&6PWa=3+%mfc4D%^k(t zH<*)yMGP8JG7Khn%uXjL5RMK<88eI!hY6oV#rGs~3pZ4tt@t9s5pHNbjBqX{-58T! z6WONo8V9hr*%Mbsdpiie5pIvLB&cthlu9KWeCgji_-I!Cj8M zq_K1!%yBjiPQJ3Xf9V{V-8IcyI$!P@3ogv+D{~lA6LEPFf$N$!YA$D7MeZ1y>mqiD z{|GE+oTz&o;VotcCX5ay?CY2|y6|45cZfFiL#fz;wIA_m%WrJAumam5b!f~qMCTYQ z!5lSd*szF_agEW|hmv7+FB9-KdU+>&{UD4-uX3!^GphM8q(ijPaT)>pAk6!2CroRf zw3)m?Wwotj|i@hblb?#*U9-kJlaDU{5yP z%N{+HXTs5Y`4&ID)~;PBbzoy z%A7$qC*n*fQv`GB&6zg5fMHG@lb>|<;EWtoFf;GqOzji;To^YScJ^XUw;seRJa87& z$mQd|E!Qzezn!k8+8G{Kk|OENTG;Lu?{>~r_o?%Sq&ij7?0Mbk|k+{3CE?Xw2t=K$gh{~p0` zCXV9YQ3mwytOj<^?(Blf#uf9S*j!S3V&UOg;8}3Gy2Rxg*)Gh<$yjQ_uKt^HWCWK; zgCnN9QBN9ebO=H}+>4Ei7z|M_6AiV34C(NSRe%UT0Ap~)jzA7HLZVHFNR$|Va(LAB z>UE18w!3ztr?SPw)9`!k`|gX^qO`rDz5V*Y41>z#jznbFQU-z<63)AC0A*4bknUmJnDNk=8v1V+f)pNz zLq^1KcE^0~jjEYeILhTGF;lH#)9jPu)Z^odz0vlYh{EO+!OEN^=ki7B2tD4%naLny z4E!YP*s#tXaE}@X3ECNl;#L$H=;K2d$Oltd47))4lUYI_;-Y8rq#ZYyUl$x zx1F!kEtJ$yKi`LZAvXL(0?wel7*mhM0S2&B;+J^tZ*klk89?S-Ryd- za@_hI=i6PH{l2@w8pj7kc@lb6gs(FOv{MemRd4XQ5eS50w8t>Bl*X_7Of;y4G_)#YsMMHes40jb$?iQJ`EGefHT{^7_ zD10ScBvbgk3;Rhp;XZ!)owH8T7g_EyZCPT33ICRXt$7~8x$`H&7OGW_7H7Er&f~n> zY(Og(#UOiH!0)f4fi32{GsdG~4jeLb5WHd?pE`!P-19zmB46tEYQZ_S1%<=&2OiBH zPoKb&Ewv^~lgj>?6X%SZP=qe^uMb-tC+!%mUEMyNnXT!r7%%^WOZA$_BC5Ye1^VpE z*k!JB3~$|_?tgOJcZ25nx$gK|nd86Nq_0F3-R!%=UEav{A;?#vrX$o7K3_|_#MjOF zz&yR!nopd&CHVfpb9M=P5594r_Ip>&l*uWY%su2j=k9VZ`{0LbUwO#6?j#+N*`*Vw z^;H~bg7EOJ>OJ%Ot#32k%q02aKL>?!-SW=*0o`PEY~6x!2F?4%xp(K8n-;w6ui4&s zw{MUXjhCM! zW4ha)^c=LlQ{s*gLq{ly_HMjcg&a0?PlwF8oU;Cf^l1A=3OIx3m3rO`*!1(%Ryoj= z)(dVfghpxG!4~1+i-6nj#4g` zo~e3;t-x{;h4sDost5C8Uj?Ouz89yA|e&%_)`WFXsQ{@^?_i)5X}u z%fiKT(7y*}1?=1*pYs-1_lMIH@0@wPVy>AmlAu~&-m%LS{kK9FN*%*mb3d7%6bANYwZbB1q(M6;pb*wBo7<+mJZfHAA zPa-}rYc`=S&BwT4$J2wZ@3LSK~O;;D=Lqb&A&+8pR7hEw}ST4ljrAlJ&iVj zyVV5PkMZHGX{g(EiNAiRt2o54OX=WOxOADZ-Bnk($8h&)sNON&1vZrIPjkGx#16Zu zn(K#vIWhxo&gyKd`C@a0^bTC@y`VmWO<-%oqYYY*pqUG`31^`F$&NJC!)W~7Llqj9 z(rs9D%xyMF<=F5y{Vs^jsLjvR&MM?ejtyA?)8vr^Z+h$r|o z({pvxyX6+K3)Q9DhtXr$V0AYPTP2X+bDq$i18(l znpi*r^@Bq6Q%W#ysEDXX50hV6$4qX(-1mUshg_N2343E;Y%DXBw+TEJY#`wtc#?-$ zWN^R4)b2Yc0A+Nxf>l;r#Rq1!&)|Omc#j2!73(#ogm=lj?w7lU$m{<3F1-=cVg_g~ zH7hWYJg$C`TxY3Qo4cQH)v}u;T#8)$KxJHmyjJte*<+fRdzm!DVr5W-8U(aho0Gfl z&#syl0`D?9gTnFa@l&~(;`#f&2jC9KqA$JWuw#2Ds@>@#Nxdf}Q253f>d}b{qWi9F zjGGCs>Qyp|-d63SGwZ1yQN9M)&11LghC<%G6T&pvU~tMiU#&q&C=@|?t11>{R#7;@ zaigkg7J4a1yQ#P8?h`?o9&rX(p)L$AbD8BliNTNY+)!aECy$hg=-D)Tx9AV1 ziNhbnw``A2IPV;S)f_26XWEpq4MZ^W88+uK76C%4zYQV2OAt>g^^iVT=Z5Yn?NHdYSMHF_AW&l4E-d8_ zYAtwd7ML10?d`4?wV2X)9l&2ei;Iwrr}Z3Ynh}3HK{V&yx@^mM?;`_(>A~3nS#9>% z%KEz3`|y2)2`{Yo+#9PLcGqJdGpc~Nh@6qQ+%xJVN`C;?gfp*_{nmHSNsv0s$Ap08 zJ6zxCtVHIue(x71PYeRYCc(70W`7E}!w@*fJ5ZKYJQ(Q4E*9TUbW-a%jT%kN6((1j z!?HML_K=R6PLq`b0~c$m4vCXW{==@rDPel0eWuWMdN0ZlaO~R&9<1L&NS&MhWInZX zRWn^SOUn&5M@D8I3k!_?gdp%PfWdE<=x{h{a$rEVWfv>z&}lf;nXOOK8VeTuIvZg(SobW#Mgu*Hg?6BFPok>QP_J`n!FeO*oY^xx$RW2J_!I}+P!Gj8quvSsVF@EY2 zWP^2D`J%jizuls2Jmy&RIvqu|A$LqVl9;RRYoeHnx|AA|5K$h1B-Bitm~Cx4Zy&kS z|EULNjtPQ`du*)^C2|_%5W5j^UME?#ZN6kQq*{n61cy#5fEg$PnfNmV{kg2V{@ZHT zIXuX*?MU0JEoY){hXZ-Rwx$n3SMf*E)`O-capH)*Qc4RdH7~Sj^qd~fOA1D|O9!`w zRPm?yTTF$eBDUoAb8A;@KPKw?!#^wvLcH$$RjxDIkt(>LZ&jkC9 z{iI#iG20{+_jRQyqjJf9yzwlaop#B;ru!r%l_(OCW*sH?Q$Vej)g> znTtr+7s7l~rBjJ(CGkXTXI}e-HmzBywWyXzksm-J!eu5G8W#+pRn;`ddZ@00ypXP>LdC(SK6WoWh4D0z{xghdbmEms;DuU7NfxM}`hoK^uP zo>R{j%O|fqjWY=F{Eb7Sp~%ET0HCVacY8n?tk627D~gdj6DpHhu{)zfg_ADnYxZ9X zsRBw`%1GTxFc9-4p+ct|Ghmg!N8F3;PRo5#iH*TIPC9Wbu|0Rk)1j_|tc`_pJMf}O z1rlQcQfCUFBZTf#8a2>vr0oxs4ryvkj}?6t>_y+np87fGDnH3bNNAitZ61|`yK}`B zIPK17%LHHc1eebPQ7+7g@JQM4V}nQ4^l856f@tP?0vJb{$wD` z4?^@`^Q(I%@Zx*RscC(9!xuQW!f&A{csczj-hkAzy?-y|zFZD(C9ziqETdo-^XYQ( z#~%P#@XqI_Em9z?cw zk-^q68}ErLS!G`KnE!!Z&Qij_)JiN*vw85|qSo)$QTa94_Ot=eV_5Mu<#GRSGW zk5Z#*3I?a2X%Key7pPO`4*XFLf#jy3m1F-faLu%2G68=jg8~UhbKKc!PDOl1K*%1F zf&s=XVSSt^!Cf#S*wZZ!M$!>|?4X#6N((b#(CiFbzc?vmNr( zQ~G&%z)a9I{zA|50k1w)9-_eYv8{Xpv_z*V=ItUw=iahOlub0=D84|4>8VwQrm=C7 zp5OHb(!C?2`qG6l-O7(8NBiUh#fq;Ix9q1#1MD9m@{4Cx>~pgxelz+9?@sAb zHw24+MCszXqdzyJEAGr&A1TIe6kdrh9i8Xt@xCFAJ@6ekt>SOOc4V^=Fr)tpJS>k@ zS=7Zu7;8ek!wsktYczMA+?Z?FEX`Q6VBQ|@8J#*jq8>`v3sH|X{^&f46U}M3v@9C^ z7_&~9O*(^DnVU|p227&lKHUz-G-{|K3as3lyuCLDxlvhxsEd4A$SzpK< zYcL#j*cL+^d40)^i>sJv=O+GfqD|n(XC*kM4JFI@_&u#)x14`nMa-S$7smUcv~Ff$ z?&Y5;m#SC}v4Js%t)KH7G)H*XRThri$ZU$?!J3+5(>BR`f3c{0u^#u*Y8&44IT5?XFDo{+NY{s2CZ(*2a827U?Y~;nmi(tI9gwL-dttX3I z80u7KH1o)fTv6Z1V|(VrCpy4;`&~sdm}YPq$pcdqC$kHt9mTV^a_0&LCQ?ylajQec zox+E(CSHuy>m-ErzLyi$ zTXQmH;mmQpvi~3r|{bxJ?U^s4tdyNK)iP&xX)#VRS>4aQEF2GcumOn zVDzw#9F#tUDmS~I+tQ-|TI0|V(&H|^U&@L|+iXV&I+K<4;_3HVb$zSv8R{kJhuvZW z;=JAF46t7IYHv*%$NiUO&#jh8iL$L1JF)`{}(fe|q+0y)7Xv9)P zQ5l9PP4VaVn}vx|GbAdv>o7C3uFEGKYYjTLWizH*e)CkLdXn1j75y)Sw~L)LJi-kL zwdUa|qQMU1tA(LhomJ>-!2xCM;}JIll3E#n*GK;^W!gRX_Musx4|4mGIYw(aiXn36 zOTjIhI>wN1^V;y~I7%&J%t(H_Zhb7|%a$Ls>E8T5-f&!|B?@X(0kwP6NmF7VCL<}| z^%mcLFmE;UzUSkcwMM>}E^%5!oNoyasJCtyr+htmzN5sC8^Ifq-pG-Z?6nPQWuOtW zM3bbCodww}j9Smrt%M9E7*=Z;QE8@3;QRTVVNLR{6!S?&R}KTpiDG1A=%Ptfn$Tg) zdCwEmjxhRDShffwBG|lK3n-_QQ=W$)a;>F%@13%8lcll05FqYAeGN-o;|y@gMy#e= z#hCh>R^5B{hQ6iPpmk17*v`419>v>q6XXjOYh{gNMBfJ!^x3sbM=Xo41oB>_F0wC{ zGeRX;!u?63M6_RQ`agOJPCgCzz$VBbanL|emuVTQq+-vYbgL4HzoLJQhg>r8+&Bdx zO-daNPxt}`(k`J3A#j%h40n=lp>`J+XErkl_KW~cSXSTlcxEC9+ z2WA+zTTN30&OR5bAX!T+{A~A^?yAZXe{~rOz?AU0@$#yvjs4i!qFu8TNI4wnDb6bS z)(SI$3T$>hE8cQ{C3!U*@L*Wv8gakrENeYq1l?-@ow|egSk3BqH@gvt=n4T>qx{`SG8|Bwv{ zWt&JGD;uSa1rv0zdM?+jU)(-k6V3w7V@kf^B>F>%`((uhS7p+|7-(4Bb1xTPQ3E$gsbNm!fq-`)s#a#btc z$Me7m>sS`8qJ?^V_pQy!c{nXeGG~dYCOW?dAjRpM?pVI2MrI!k!TLE23|gO$G!>5u zW(Jc}&G~SdnH6Y%20YfIVx@&b$ux`yk|D_)TFr6H9ch0XNfM%i9Xi`J#m=k3mZnE* z$`sm-azd@x;znRk5+)`Fr!i&&O1<_adLps;BSp?cDHCWTE-8blktZlPLSXxQk^ztK zvO!cNqu?!Pve@!JxEbIyuG<1|>U$|W6w7? zO|(P?92qO_Fjo7eR%CRS|IA!`Ki$G-o^puSH6b%DMjK%nrm?xv4GmmuiWqk_Y4>lF zvsg55Qq#TFtDwmhMcN-z1Ru>?9zd52|g3L4^+cX+7i4CMX&Pn(7@)H~%FYm6F zjT(>n-&cP?zsEg5f)$r7%(6B8F|7$JA8-klc1kJJ0pB?%cf|KJ`Zv;}iEYlhKmPq_ ztol*%*^`0l-1MW0% zz2aZ;$+|FMB;3trPo$Z*Q~=jh=YfjIux6WT%}`(9S?K*A3?%L!qQo*%I=GQz_>IzE z2;Ct=!^^weJAooEvn}|Zr^jvY*HIowyE)>b+mWg_zK^yYw71ByHW7ARr_lKLufIo6 z6#Vf+p^A5|PomSy7RkfVh^uDPrAfZatu@?0$NC8(c;D!a@p-Xgp%~ktr4VqK`3;fU zAE(*2Jg^2O+)YPdMN!l>p+^k&NCnVgp>UY(5mLz(hqzkodLH~6Lu%zs$<6lSZWRE{ zhs_|?ZE=ljCAFj+Rclx>Kx;o{#O*Pzwt=Y#heNyij_nOhIl$F^bqqB;S*Bp@m9^h6 z-&3c&>Ox-NbwQ$Y2TIfOn%E&tqzK)s5${M)2;}rbwaw~o^To-D@#6Xa=RRNdjFs?Zk=kdRhW`LV4w;4!IQ0i z$!HzCg!BTTQ2Rk1QjJ`E@e1N>9vo?T<6_^8z_zA*DiR#|!R}~X6Z9bvSK7*Qp;5NH zH)Pbm1#;UU+Y_O^{#^u=&F+7qOMaaloHJBpUqrCTM{ZbVRqfN-bY9J^y(oIR$3}x> z$9dF;0qYA|NRauvQR9!NAGzTTzS*B7TNv&Om`OJ{Vg7-4!5_nQEkxKssYd~KIM&DR z!2_oddWMVblh9e`I^g&fiVV>j{S;vTEwbGabVZtu+&*YTMKRy}x8@;5hUh2M@wX*t zr(t%4Tl}iqV*~TETh7lhM|6#G7-C2*=gi~TALCtR0#Deq-pGlUBxW5dnJL!S0%2`O z+)%8m3cM#!(M-JSU*!Jc3qgH{=}LvTkaiSxR6CRtWi*wqU;#7TTB-Q?z}R8s{-WE# z>j~|}<6p@O*^w+ns14M5!72udcnMrHN_}x||Ik1a(o47G2NE0>M}M_r2vL|ie>e5x!m`u(QpKp`%nZm%lj=!7QPhWepES? zI=tV5g~8&&WoO=JR(`_$aNdpBm7eW;hPP&Xl0M+){yu_T{+3T;+IKgU8>>Qh-3k!@EXh-o?g2|?0PxJ(xx1#bg2HVV$@SnUmbC=32RU(F-0s(#fqsq{p)CD2GEwrKz zL-%~zk(aB|Rpo_lbraF*{&1z*rZC0pw<6V`9ViC3=V6zLk1E#@y8Ra14*rbn&FYRs z4l;11|`j`GjQ&x!`tUybOhM88jAUNM*@%qskOU5=JNW^XeE^n zo_<{=MU;6A_z7rX%=P<>BuW5ig-hu*_1Kr&YIegl8P~FR?K-5@3e)V$nY_6=ztNI| zoI>d-iFCHqx+5HUTvoQIG%u*HRdi0iQA{<$w=k~m@NPov$RYnudr7tYMig1rVAG@s3B8M!twT%Ji#?YB61+Qj})81=x1i&OY zIcO_dJXO#EPE?BBJYOgdXK0Gg$vRW|a}FL7 zS?c2xx!~b8HkEh1QfmHEsYKDu8Y1WqFyYTL{KB~KgKW5x_$%I8gPRfb! zk$Q5({z$OZ0m*u1?BQ0zD`XzILswSOZ=_pEeYw-@k4Dp-i46Q;NY1vw2@~4Q6oDJ${YdWu-J`D|}^;I#Fs!XaE^K_^a0H z5x+PmMQ+EWSF~Qwe;5v*D%Cg{jRo)O+1w3O&O7^eo}SVlufW6uA9;h_DK(|_Yj;<3 zSVSIdsA-w2%9?c%j6W&AaAtB(=b1c+{6_5+sbX?oj!l01Ywi2v58ZDw9&AXrnNG3W z^zKB~nfKz)bODBl0BF?>X8E^;K9;+n2$Qd^vpWSNb0g(=U+A$9#nL))|0-Hk+slHF z=&XZKzl%lNHecb8N? zG5Jjg_6Kb6^}iSVW=jm|&RZYFuRern9b%3SRY+4gs!{1-Q{S-4$wuq`Tj}hq(<+Na z<|f}Va=A^oBc~E~ot8$)6#Dh{>C_A%Yu|v&wy$5&AfYm(zs*ooB3Ktft1o52N6$lV z{WP>1J<;NnT3jiH9&0>^nr#$@OFD)zU##c}x39cazy3B*<1w}Ol_Fu3-GO~!eGjdt0q%XVD zQV@;erd-^aF72U>oUzTwiS$n(cqUPng0fu6D2kEgh)24TGDG9gmw=>k^TcJS2H>A7^&d%*L=` z6j2JaD{Smn=#Ao_Ct4>N+g$TgBp*b7cmt1F8laCRI~l_J5m|E!e(L4C`lOzGN$kZL z`DeHw6dw8DOts(j7Ul}5oOm*&b7G&^S(KVE%*c$$2SU%r6wIF#{__2!;tG@^0|)ua zB$c(7rC3AD=W#FThSelbg6_R1g6KZRKbms;=B$R+FrHu+t^%JZki6p z!T{$(L7&j&_5&id3Tt%|8P7Tg180ezZC$+%IKeI3S}XyPIUv=-rJD5c&$%XzW-m}| zO&33>)?<^Wtgm}9Q~xx*z^lm?DaCRnMWjn?Wvd{|oqi-yWwxw_Q_v&n&)t2xgwJkg zhC-Fiu)Vlhs$&X15E{kIJ|bejPwdV&7Rm2b`I4D8o3=+~B1E|Bl%uq-J{a_~yI?)X zjBaYJ;-!#3o8R~1Z{uK0UFU%;>#Hri7^6dQqRDuHZ5t~!Mb>dR&fS7MC9@t#LG0@|wEAMTg7eEJY`22T zPg%8Ysh19}Q3a*Up4OY!&4Ozn`_*RqY4!{cQgZz880;c?kh?@x>@b2cf;Yw*Bp15! zy3f3$ON83G!Vvf*T>h%oWYocTSsrJ;=f@rI>iP2SOr!Ts^`Iqc3-9j;D%wk{eOh$} ze+N(46N5Sud!g-4feA(vbJ`rrLpCS{KDg-l=5wB1D!y^K78?7JqyCcAV-5s6Bl5W+ zq+DF@k#ahO96#x_PnA9|&|LqWO~OpPz3>c|4bMwW6r*w+EdrW((f*4_VPnmjrlZ)W=sdSR{1RNb)*bO6ne=NY;?;Lu3H~wNm7tH z!GM)eqkz5eOpCU<@&-xe_E@O%1X$@^z!I29>x=Aw%~b1g7;S|;n265DxlkQl<>uUe z!se7Q2!2<36!~B^RsG{v3!!0qfNrpJ|7=#b9T2+J9HvZ_Q7nsB*J~NV4 z)q+)LwY@_raj%};MX*x{f`Z~jzU{aqjI{w-4h%mePu)!1OpcyJ;-7zD`FRY}wK#eL zDc22#r`83AOr^szGsNVZ-d7WcbBS%M|GBOPD`r`EKB=~sJP|BW^M&;_uAJb zgjuCfPJH*L;>hOq3QB960=@uNWeS?W-b?4=UH2IZ?Mh^N-h+Nq2n%m8;k>`m`+15> zgWrQW64Elm1{`^54leM(>>lKu@=MbYp080|&y*?>WH;iX1MYaJELwI1=w&*oo;MUWFP1s&f>G8#5xX~%(Ewxw0nK_lL)L4Iz1{1h(mdp!wulT+~p5UdDI53+ge0W@q~iV2So;- z$d1dvOH+D6FCN@DwzHC{k3@U^%S&&IX|wQXN<#xwJd3P%jzB)7(kyI{WR8CzDu*F* z>0W|MPpo(FJ+Fsc5@xY7pS%4(6sIjczA&~mxWG$CMK+fd6pQ$s@C?v!KfYwx!tJ{NlzxTHqD=1P62tv}32OBW#iAUv>4PJ&#C0hnGM;8@D z6iP%k!ux&yT2@d~1Ou1rYlPZ48xo!nXStfmYdqtU*!<>3Na2RwR?&$jffG^|78zEr ztFy60$}zT~Opzpz#3Bv)PM{dNtTF4g`OHsjeqyR94XG;NSKEs`Bc4N1BF6}=x!Xn+ z*CW8mQL3k~G>gwd&iGGPeMV->d-vhZovV*aOCJIhv~<{AtqqzQBH*(|gq~=)tc&)6 z&BZUJ#J8D7w|G0++ap!OnfOa}bakJ8Ivp`>c6Ouy+fAi&wEQ~#;XHMR9~odgz){Vk z9)VhD-qYhp)UVYgI5Ethv%E7-Jh*>u{{46&sfe`nI(?)({hno%vC^1emf-vXyLr3O zj4V=(>qSwll+#w|nLps7*M#A?a04abE2kGoXychGCp7IhfP5?M`mtuA8p4!=C;}gO zhW?~pC$%AG+Djjqng-oCqgYSW;NY#377N7GBH&A9JXjpRrU zZ&VFiPo_!A-J~~sT63%ef+;vfsV)MiCcxw-pH@pMq3U+}xIIxPnx|)?>NP^Jw?SatXYd=jKip3{ zu^y7a^WFn=<^e*$V>b(j3LZU%P-D6WRJW#v(!gx@hp{I7Xbj0`p&K`-&6%(0tj)4ssEqCgIBgGA$vK|(6Y4vHdJX-977*pVhw==vrO6GunIdktMzkFt z7{^NVzRMJf+3XkjU!FhZU?Mph1j9qabdtJs2Hx;ea#+K~DGts*Y&Uk5x4IeZcfApk zcv3868$%xM+P}>&Le$R&zcfLEKNZ#p*hK0;iJaUJvSVn69iJRERBq%K&QZNa)6_^S zxLgL!vRGCJ#1ygE^Dp-kPsvDc++_#S2O(fut&(ECs@Rm-1(TV92!a1Up6|tSI|u? zYrD@5Vyx%2ErueZ^{ei^OFqz|bqr-|x%iMu0`BcvG|QW}c`6Zc!zw@2m&?nRQClzO zoeX^%Jz;{GL6D=DP3xJrk6`YxHRl+J`^~1-Otu-0sFMU=3$Zk^~ zoI6lr)K;8%xJo3%XOac6OFKaHG$>TDM*jJ*TeGO;ioNdMgOmC)ZF{yfl9s=guDd6g zcT)54B!iJF3{I)wSAioPgeKABe_c?;_iq|)>BakKiP?5polP2*B-Is;Y(TTTd3ih* zoE~L*tWU)$jPIRG%$%NDJh%oD)9M#-Pgu*IID#g46O-b7KPaIpRVfVgned}w)XsE# zVlTzOD|k(1OPT8`qhwT}8l)vNS4MK)-KuZpRmMn#y?)JP)HFybo|&fnh&VdSJ! zgs2S^M>I&&WSWal9MzW;Ni!Ay*$hz2V{fHr(iJLW<$VAsROT9DFKZ*ZkHuWz?MHr)mwQ|g(Z8*-&tqy$#opfWMULwPTQ@Q zyVC3*m)_r%<(oAF5d<(2AJ+oQ4gFoRJ|7DaWt=>GgK0eB8`fJ-Z&af6a-1MMa(0Xd3*=C}VE1G1o8-#IcHD^uYw!a&I;(hVw@8vwT?yifA zyHyh-Th*ET?^Qup%J)9>ylMm)nnNUP2Wd2LP#TfYg5pz~58GDP8sDX5gmS`de>$2` z0beB-TdgD8j4=PI2#Ue5MFblj%c4?6t`WPaRHb6ll*2wSo777B25lmw8&?sO5cRG- z#S{j^x>B=upOE^O71ibRco(ybbBPs4JX>Gr>O;qWRkb96iHvFd{x&e(II^Blyf6>q z1QZJRwWS=@Y$V~&^_8)%-J)O962V~oMjr@q-J<5$DZIaFU`=V(MNFN? zrj>v=+=WQ|m%~$No!cEw<%!wULWYaSkKDs1aAr?{doa<9ljn0Qc`GyMFDjfUS`>3> z+*BQ*qBjXs>J=Q^ri#jSBuwpongF{fYoS-t)=lK>a-KcB#He0G&-UnUA=f&{dZpg4 z+aJ07zJ-c6ROkzKfs!NU)eB_J*Kvw>*@c6HR2>7h2JZCWHpH&|WKF$u<_;&1|U-pkjM)1`z=1L=aWU6%~ zlaws49&rdg&bS9*0W-;MC!UyM2z;;#F}cWfct@h1*ho(ge`zD^U)!y_Y4w;0{;fpn zlT+l$9Ac~4`tW*Cn+%aD-#JUBVu+nAp>3k8D%)nx8Q79iU0U&^TvK}-x#(gJ`99CW z@F+C*MVu6H0`c1(6*t0Wft?PQv>6(@nnmQA%3(t{^(G!Lo${s)77@D3at*gZ!=)8c z%M-)9bd#UOVjgrW7L#Fb z(~>_RzRpy9IgvWoN|q6yIyjnZiao+D3%}P&+PQOj*c9eO(;s)Ss2pCZz3Sf86*o%_ z#}QySeH^u)d?#FsbkpJW>bNqu7%pRvt=Cp!3`S?mWv&SFmAX(fx~OzD&s7U9t|}+U zTCYMb5grv(Hb7J%-{YI~9&w0w+d$c(eKB+(>=)AQLIQvi#Zr2zY~l?Ye* zRD?_pFPr=cI2D8y6;z+w{1I78AOO`qu9IA`4j?~cmo;}L0jCmVWyn6VCS|Q$o3HPv zWWh?{J1dN;1`0@`h+kzBr(|rj@zAYVw}p2fx`JMMRe03!&xn{f*LkP795b+EHjG%T zIG%JhW@qenyyG}wPD%NNZeqA0zU9x(G2o)+N%{P3a2{UGAOtn66IKg&+eJ)iY^F;| zJvb%HSYKM8kk@_73@mA9d65)}aktJZdJU%@mkveLmQ7eZ3l|uCfqhW% z|0?3^k^0TK_sLA`;wsPTXROJC&rAWyP!N_JOM8kYXg`%G>lUJOD8FJA$kzc+Wvjri z6eb2LaU%V-PC3P{HJp6LsJR3&Y@Jw3WfMTKmlAn@xOvxe|9Vu)P9GfAeXfJNx!CEQ z9*ccMo}+Bp=U)OhKEt+k7zTCC+NN7yVR(+6>i(8JUIp%`p-|bzY!Ds5I%x|rQtqzE zwzP}JszOoyQfpf$6g4r0(m?$$h+BC(t2st?#`8; zMtF0T?<7CrQHTLnP=OBmf^p%pVx}6V=!K!a-cdhIqHdH{`h@vN9^}R(04fACb-@HP zu4vz6pOJ-30y264p7$!fsMFoMniB#)R~n|b`oZ@54x`+!nVWvO$w zQdm^h$o7s?i^oCi`tmO`ibxwC?(J(|-INcT2Rr9qa)ef&PP{Try5ET@Ok{q`mB13S zzgw1({AnlBlx&C~2F5#JZT4gDZF!u?CZrEmvh#e>FZKN0EA)P&8RhfqXsdUE=i{$!&R2JE_lBNk+Hdj$Av~T|cZO0^KfuA$A5+0~G2y3^^Q>Yo5pf5zSY^iVB4E8Mqri(t5o=anX ze=irXp>%Stb!7BP2O}lkL&%m`{>Yc1&yl7W)>%)cMY&p0DNS8;j1MVNvZac0<0C!y z-&k$Kfrq&7z=4-og*q3$zC;PS`<-q<5ZxD4T_5FiwL1fbp2Y^gfKB^E80vNs5W>HC z*nTgfuZhd=umg_7zdV5%2AQllU)lVU0;lmuc9lWE6*!+ z!OEmcE`F8PtSj{K@34TnI}b;5sT}20yvvH@D5eyXisW3smz?4tgnkiLjqDsN2H#sO zNbpzNBPKdFXx|;))Y1h)+&WuFp_I0OsL1BAFg{70JTw*Hp)hG7m_;{?>nz&O)=;(o z{iLeH5RL}xQjCtd&ig+AH$ce0o;Z?JOylZTXotfg?O_}r@=OU?$8bW|6Zn|L3S(u7_z=}i+bF`F&))y%Z@F?J_nl^)6u-tnxjA?AhuYCE->ww=kFGm)h9 zgAhVWFQ)U82bZ@~BWv4#+SMhaa_B?~eLr_8)uqM6Y#P;t%Oc+#5S3)5!GN)E$wIGNa*NMx~&BB?NhJKv)i zxl7%DXV`fyHKvTEEL-L!MN-t!Bw^J@hvU*ycq~o)=`nmpmw7=~LkTIKi$dHqC3SY* zMIWf;5k3VfSBPMbaXkyj@vdMY6R~3AR<36XG+-8VmP%vUGBJKa*P~1M?lo1NB+`VF z)ZpD@Y-~qtQc8KYp`>GEmQ;;)0hH@u6he3QfZoT+=wgRF z9E$tGnB7h9TH8W39*9g#00f*TN_7p-P!Ca@nF46RKi2uj>5z=+@EE ztz8(OBQQRZKjm8Weva0FvV~t4$8i+HP);cZeLf6MbH~`&jDWaQZu!C z6lrNmQub^T7c@`4tYT5f5t)`{s#kXE6w@}l;|@F+4)QQoSljY1(l+7$_qJ`;G9sDt zB28oGC6l#Jk@J#CgXOz|Fyz22K`UD5|Gf8%VRSz1n9HV#IJ0W5nw>wsXX*C6pM5W} zXtoS75Dl@_EpJ}hkQN*H^rE^OI)7-qs;b(PT0SF0ysycTXy3-l#*3hJx(QlZJQ`lX_L$y|*HR`Kiq zvHoTLop3Ie;Pl}nvJ+Q4;KRG=i~xXcGf<)M##KrxOaa1{3k~A$HdIG5Uibt0_=CA> zY9b}2bXp7N;$YQh<>BcxHfN%iriGG*ioQ-C@1CsA!8fa>2C@iO-&5J ziBggILXgH0q7qyAnE;KW6woF2?D%!>42{QNV>3K!No&N|UdE|;?3fxvaYpAC6s{MI z3Bwq1G6aDkKWd_w@#1N@b6mSCi$Vncim`0)OaK6Qj5j4_JgwO(Q?0}LY^!_OaN5@ColK*{VpdMbQ5;ew!Hz0oc88wNW(vwS?Ot{~e+ntmov=k^cq=VN6T=pj zdj9u(LrL?3tc7etRj{pI98PbUOj~@^JB!&}--z1Dn(-~W#R!#OF7_GG@%ASo=15F< zxbbdf{{!#cVd>XPa5%-alvY<&_oQYDTcnh6vV7xWJ*S-L!%_CFXydirJ%YF&@`+943H`{>PnsUBet~y`A z8~P_;%h&6cfQp)@nzl&+zNx~EJ=dMj`~tvfl<(ducsPg5Ow#%{?ovq9rMq)r|B6wY zw!JS1nZ4p0%?~NEv{zB~O0rTkUs0n=Xk=@(+8W8sQoB^OSD3|Knw<6CPruhf93^cm zhgo#EvPJ$QSeTMFGhE$@&|GDBMw95ZAb%upsrac5UU}s~l4 z{CTzSPq9k`FQA0~aE%yWB+i9sJ)2nf3D9~TefXAJ9=_%6R6OG*rVYeqVduxUkXPTJ z!WXZjiawOitZ;Y1JW;%IxDhr}w(A_u`cvE^-Fo}A z-odl#^4>&W82lC~8w=q2??WLJzwPIzNxL&mY7u~p12qyrrKkI1`ZN?6fB9(dm@2~swo^|nl z+ZMwcZ_lg@+WI~d;BEeRz~Xn`-Iv!tMq?k^Pt%;#eO*AWtPJ5m4wfc_5xLiv3KvrUy8(T65?)nbO|sKeu#$^92i z59w!=HQ16Q!;m$<^WUgSN;W1+b<{@T)4E|TYHnqF)d=ClWus&B<+!?N89HpP--44F ziGapmq+kaut@F<Qa~|%M*y$m(HaEfU@iRvI3b?sHO6HcKDK0c2>eh4DoSz$mBes47I%%pgf1vo?8j2ZaN=0X8to+siCCD> zd9hkl>RXL;Dxp+wC19!?bJ$v&EyrmeWXO^1Cdd9t)o1&-D<7vm%5gfjq?*lZO zF^tS*J6qE#9>Quitwu~8i-!&4@SCu-Otixo9K6svP{i7ZBHN;(g-nIW9=)|LVc%X4 z8Ut8zH`P)i=7YLcGzwH84^|%2c_DO=N;xQZHA9ucp^~23jQg#LNz2$a!lYu#GA|c2 zEo?7@BC!*NDN)?Lh2QwfP`?*CJejX}H@s&hQv$39+yZ96h3z)h`UuR3yHeTqTk3brqLlOn;< z|Mi-W8^*^mbQ8mx0Ln8y(Z2lh4_`7;trk~^C>y|jlrNMsCMEnA#$_v)|KOp~Vxh|U zdev>ZPA}zN!ClQA=T4H*@-IoiY@mw%)9aP~-a++N@agxi)GCr2Fy~={7G09KQk1dV zD#C)_Li)4l^0T`zoP0;dcx|i7kGI%!6qd(+W!^AqQ7C^*<0HT7@alxdJGYv=HU%r& zt{I)XjIu5xgoLbex%{>iFYpF0+-p<}K|qMl;>$7ONbA3(s$U{M+5uJLa!FOMxPtwp z%OT>SW^>v|+?&g(x?$*VZ8r6U5r1DU=fSk>K3B3oZq%LirK8Ug323czmVl&Bt**!# zz8<4F&FnlzDb&ws=H2oN#CdXpUYJ22+{#j)RT~AyQq)p;%v@Zrq`h@1F}_PHbC1d zj+)wjkKoqz9^nPZEELjJEbyzkej~Mox=9=DpoxR7u!Z!?w9(qw#^smOMwIg#*?ESl z^wm~gMk6KCMo*Wivr_9yf$6}>o92=TJ)ge6H4cb22W*HBwc%HXI6+Ddd+Xj@AcY)j=udZOa? z4ZNoThc4RCto$%-R%WwK_)f2p-j%dpy+Es;->e(92Zo%qx+}AWJXx>38#So9iWLq8 zkcnv`&(az;d1}9o?MBqD7S$lcB8FtmkPU4tKP1!^ixI%X zorY!VrlZG_;d7os4>(Lo1-&u33&V+RN2VgqsF{kICZDsg^j%4aT@nsYY?Hzx8``j+ z<0Abwyc$hU#)s6lLX3^lmd#Ljfl4_5Tnm47ww+R*1Mjr}oGPme??64x%&-MOV5GQM z6Jp7cghE;)heQS0#pI1B7f!~Axm2$qGqm}gXSYp+L)Gz!02Rkp4oM+BnleWnXqBCH zi+EQuITDr#JSMHLasNsAZX-QfgdHEa`Grwz<3#h)y^)%O_>y26bChT`XP82b4=H-7 zq$?pFtxhpFxrR12m*O7DC9zK3p3xQc+MTMzt-qDYDPi`x5MxBupcMBb88 z$C}6980EuqcFgUwvqWrlmN>57y)`0esdLbvL(ad*Z6C5o}C}ECU#LQn2je<4JAD-7d>FE&^6)Zn*%1>6`?v)c$%{53H_IYm0z6YIVaRI zcdB+uYgX$;nyrvyhvuf~n}4Kn({mxa^HzF_g2SA=BPIMc>f4sqHqh7pA5*(j7KXp{QmX6Zb!}3FRVpK5E1uA0ix(1@xo< zJ!;<~Wp8_wzSESm-K9zKFqfHbCc7N5JWWkbQZWu<%#oZFJti;l(V1LvO|O?*ao4}^ zr-hy~1ySB@q~!Vc7*ReK9gZf8$V^(&+sJ6XQMylwh+9jt@x@f^%ErMHJ7+{GIlM46 zwo9JR$RQywtHwJl{l{W78$oC!X$?jBJl*hfI)0PQi<#E+wi5?iR}tIU_2H?7)~HV- zxtHOjFyms>grj%mCCrCL*AuwfluU-MhuNn`cfub2rW==xEwZY%r~`=Uz3_Y|b@pG6 zr8O)aKV>|wL*}CzZ)APXKEtRFF@HAedp>r_qKJK&VS=01sU3tk5mL*;5oC%)XO~hR z2&&#-F4QDeZ_H!`7f}8D44!G0shA^w`SkSczRura_37%u_*ko8IT>QC(zd9AXt&J5{YJZKa=1TB7#+ z2B^Kna{SCZpzbY#DCY@1J1)uC6bn;Ag@{WY#kxPYrWqLwE?#sq34tY!GaTt^eht5vr_jSM7D9R4g)gqR52R00Rhh|09R4mNi{QJah#I){h6STjiu3W7Iqr8{9l)I5= zpA>hYc*!5_$R=7qGKQ@n%*$@vmDy#PWW5t2EDU@Tj_nfJ$RcE>wB#(JR)6b^h{h~G z;fM9Iu1M&ws6^Sbh%?#%)U^%cb~UCdSS5xgHJ#YcS7bdJu^i&jLZO_l8!w!NDU#?s ztC`yoFN>}!s5{^XHQ~1kYEBitT`uQiD{OwD_FWb;B5oP6xTdSJC}PM+Rb|c8v2KP8 za3FWBSiA-B_B9w^0DsisVO5iVS5boU>OK7DM($Q7H5JqvkowmLrP#z{!Uj#Q{;>NZ z?^{d^su*i~chtd=NKJ+?!y!KnsZ(kIi`x{>={Xkso*{Rq^~{dsAaKsl7BUNUKGOZ< zon7A>H;H=#(RMsT=27q7D4*`KlRF6gbRA4Fe?fK6Hgul*pxj;@lja6r>pYa2pdWqS zU<#^4F}`yyC>T6TpLY)46~+E?WNjjwcEUJ30dpaW(JnFD zK~Os$PXUlkpgrNQFTQ5JTu5GQM=wbh%JWIfiJMthQk;p8PESUiM0hwUtN%OhSYs28 zBDvZ3CY$u}y=N=D*j=O~; zZ@B5Eo1#aKfQzo6kN>77Z;fj+iZVN^C^K68)}%UeOHwUMQdv#jf)0-CdmkDdMdi+y z4plDuP^B`q-+K~S(_gHAmG(`Bo1<1g7zz>hZ{sZVu9}X!Ey|+w#7;egg2`+WfemW9 zn#ntR=0@ozOt>0f=A&x0u0?G^+a77E(fX(==(oa|dXGAyMrFOA;b`XO%ve>83Q1m< zZ`B30`k8QIGQI5JCBs<4&axfV(pZC(U(rHx@^ULr#Ey0sE>B4@_y*&H;qZ_q$7OA3 za&jRlhqPNU=95B9N`2UEjAtmOuj>@`&s!53j>#G)u6JOO@n{9cX*ah-_7UVUtf(}9 z7jMgVeH26YZ`Nwf3(T%r3FkeNW_TMvFL<{h=KVV;V@_7shS1LlH%m~RxJ7r^b&fu) zxT6X(^!kp7982dSD}}8_r1L|f{VXNT6*IY&56QZWg+d07;Y-bE)Kpyy;C5XO0YoDw zRC}nFh&JiIO*iglG*KI})r72$h0{^3oEwYI%!DG5-$T3rizOe0j51NnRYh6gQJ<{^ za>odjXDKmpw)6BrlVQ$5vjA>a|K00~uHj7dbUc#_wm6rG$MJYtr?y}8^f>N(i1KV3 zC>}wY_+3LlAsX?tSafS6_GqtZqtQ~$Es96d1$LKeA^pdc-}@_jB*pxkFUUe<;J=1` z4dyk~4JQ~|7y4;<7IUb>%&=0+bcF6p6QR2`BmAzcsH)4VDrVmmHngSTu%TWy6qaS} zR^k7p?oHt1ILA9x|gTY`9%nXPd7|aYvg1`_w#S@e$lAFp~Jd- zLGlqPmL1BLZOKV&*l`@m(Z;l%W6O#U_>7#56UOp7j<03%oUD?~^Gc34t9Y&9tM9As znH~V7rR2Te`#loVRb5@(U0vr_-|_!cRh3?6sA{n1pl$_wcbeVFaV;3s#*^LV@sxSF z9WdV@iK6rdGhknCraT$8XII#T7L+)Na^*!=a}ZJD5?Lqi#mLIruGn&7njfBd+b%M( ziwESck<4H$7sKNlPhWP>dyym_0^NR|v7%!i@(E z`^iY(XxKJ2gHe82yA(2JVp24(2Y*Nnb%{1VLPMlozg!+O4ZHMpWHEWF#!DzarASu7 zU}en?#z~BlOd!?BCaV!rSYITw(I5#iE$Tf6JCdkqbTLA(C>ljwN)jT+CB0;bCBg>S z!Sy6H=LF-rbntdvzg_FT%Fxxvb^RL4Ii~B6%T#`+E3@%`$0Y29){$1B{y~sTdSAe2 zYfcz*!gu}hPs@}Rs8lRUETHnVd!CoVQJJT#EAsleYN2P;=%O|iW+}9x#doDL5N{aX_Z00tKsu}L;D5oZ*SUHDb6uK2f*9-*D zp@~y1y9z;Zvc&7>0bf7Av7AnqdzSk({Y1Z}^^=`gEn^*hIE1QG-(6%GPC}+Jzx+^R zBXof6)egdL&8;nQqGiictFNg!*gjHr5Zyga6@e}IFJ6dO+#glRJy?$)2?zCPcT~U2 zSDz=djiqeYM6VnXjYPKnFRGBEd}Mu&2B;YdnKba1{;I`X&81S;QNwpz_O;1QnP`s9 zyIX*NyteKM+4DG@ZiR1h&m6r)#&7TWTQa^)iL^%V9wB!jJh^cY$tcn z=vMXaZqrDb8yf4%N^gEZQ`J6e%IZ_qDKn+&@y#)l?Y?RBbp{L42hwIr(Ffk}kyhW9 zI{M6{zsIcCql0A4CX0Px)$2IR{;ycbm~{lY!9(55xP2$tQDi`zub13Rwo$5cAFN78 zxhldgVc~+knbuLMgde%LCeVFleQm75CcQ~W9)sjqJmzpE*_MANibq%o)*Aq~$B5Y9 zFOnExl*Cq1+{#FdDv`;IoW|o9coOkvTX&Sa7-vf+>FZ+|#5f^aL|NQI#^vV-;AZjQ z1g4SBjBJ%_^B@C4TF@`TEuKxq z8sYRUnDR4>yS&RTJozZ{!N2Fb%(HSl%yWOr%JLap<6XU9F4r8rih(=0|Vdw<$s%vur8;jw9P{+ji>2k$1)=+X_dN(ABg1ZoYZn z?A0M9;^I4;`x90h-w+ZlTfb4xd5qRdRAEbbo%|@!CGHmE#+w^P_C-mPn}2(wEe6OJ zX*k%NH!Wpyf4~eMB1MHtFAu31&&S7~l7C}$T68Vu3whTMeG7w;wp_`A;vl19@ZBwn z5Iq~c^zeye+clz@YLreipy(H|$xAaIrh1G{?7rqipBmG)qG9U>O;kzw+wZN@ILl6y zepU|?6&lm&!=^?jb~K;SB(?GYpS{>!tgbyC9H8%q*UAbDYt2Q%9j0C!yl^$3VS%h< zTZR`|e|-I9vfu|#Uh<258|$Y-Kgqg0&m5-({W8t4Pgul@MOHlgBQAT+f;IUI>;9;C^Jjo#zZj&$Oew^0*y~FS`7yl0AD?q`f(gi0e$)1^NfffAm4gt^8>M zEO^KQBK3>cr}AJTluunRB4R&8SmF|%m_{ScBJqY{Vr~{mu%r%oOLZOGr93UO<*v?$ z5$N(c6qqR>!KgbN6LB^2(y2sfyC`lCC7fJtBX*hE4llR_xWOzfE#%OACzhxyYYb==@(IR?S3u~9cA*_ctyJ7Pqr4%$<{}kBl zoSXz$pYVp^Bloh$M8cGIPg=?3G(03Zs7Kfx>=(voMY`DS5U!+3?A|G`-s1ZGK3_!x zg3nt~xz6@F5U8}y0=De2r7lq~&oT-dE>hPnNSAh!0KNi z-}d>uze2b{c!O}C@NVHT;rE44GnxqzN72Lx;n2tHCF+d1!0DLca3x2OC&gcFT=@^= zKi|E|_RoE8yP*v#rX(FT)rAGsJSs`1GALaL*5N;Z?m&)hA0OXt1a@eoAP2~Fp)gGX za)D?&6h-^f3xPd=cg9zkF8Hz3bs@v(tS#t&)kVUcNGM2N6^odw04|*> zaGQA|L{m`|e}^urH|iJROuE|k76EE@^HoNJVdCfKEu}yqY3gI>6gSr?cF-Dt$ z9np-iM>w)ZuE%w+#R*_w*L^JcoG)HJPkOy=|4{*NwrsNOcX9|Y&>sr@!m=KXS ztX)vuNqA-nMfXzPy;PeJ->4{g(|ld?d#^LiyrLZa=}*t05(qKz!tCR-JpFl6lx;}4 z_F71=W-xs^XnQ#XN8Die9(p}t4 zTpev95lToVLp%Us3-CK4b6s7{tgR9xdTs1fdNo^FxEF3FOJ60j3yq1>PEOUb5`U>g(3 zG$XN8VCLe!Z5y&vVRs+(XR<6yd6{kL6kSutvbn*eEXoB*Qe+}&R9EGTw``azB}1J$ zCYykxK+tHNwTxKyR6tniTzz#l;ka-ToSx#a$CQ(LQLbr^6bcb;e9xYJ!H{E1fq~f2 zHnwwRO@E0w+R0Blxj!&-#xcx8Rdo)Zs0d?;Rwgq^+^dHPM)&K@Re&}j{a`zKW zbbiFJ8amOmSgc%}%|za{hl*2;W7|X>gxuT7rgS3O{gKy7)o4t&LzWXM^iFk$TwVqA z=YlZFW~V)<*PCaguO~#zt1h&>Up)eSQ<^%(l~sVky2l z6g<5P!NuijSsJlv7s#V<5&B`SioSmdTb-IoBx0(vDIRYw9hCy|r3g|Ct5oyP&&rbW zg_92}M7a&u@^imB_a!mM`i;g~uz-6QFvS}sb!4)lPiVz~Zcfof7wh$LF+>ewZ86P{ z{6wc`4SLy9^B;akA?ozrg;SDr*KuktoAi=RhWX*G)HusV+|q}BM+wSd;TV)GeZ7Ug1xJLZ0)?r&Vi2f4!MsN(2>|p=LHmDghyI`b@i$>5~ayvvX%9>WF z;m%HckJvl|SR!|ZES6i>_l%%XhG<4?dd(gmIS z0uRn_v!p;_e&e$mZRyXcPKJo2x|fi>)ycgZf=6gz(%dmr-Mf!%95UmEO-*`~>bC_e zs0AOO2NKQal7sS|WWRpMwzXkR&y9|Lea}*|PklK*F`6@sVM$U0YCsx}5i&%C{nhFo z_VmfAQu1BqKy7bra<4XK8>&ee&6q^o3G>a`o>Jn@RHDneNF1FTUAVhHJGLN><#VIr zZuTUdJ#kmEw|B_(JpuF6B&(-=;6sXZa2evO6&<#$VLU*7p(TFgq>D$Iw4{&-Nu}AA ziZaL*JO-j1UGn}f+~0f~iX6v?0L%0_IFb;D3v8hF@+Zt-wk?QcwEHq9kL5>3@?*^x zxERuPXTc7OZGV2PxuFa?6l?U`RPO5;w3oFDXSSt>XIf$Mr%r1mb+Eu zJn25324Z}o@W!W-)S)82N?pm557+QpU&=Wg9>+EwpPI+m(^Q|Idfc!%c#f0PDM>oH zCg-g^YS`?eXIjzx{?t6^WTD{(Bi_-c9hB`$=;Naz90e~#4*D)ic>X);1&D%6Z9oQ- z+M_DNW@GN=s9d-(s5vUf{#)~hDhZgjsAhA?M3#`qcfy5ayqBl}edkW-MJE)4GCJ@< z%a%svJH~Jvc!1?@bSWD#yMhHLmrZnqLrH+)>y4YSph}J+7gW)e;fQ%A`Y89=hxhrS zo~@zxy*vN?-|MQ`xfbWI`t$A?w360f3xwj8e%I2pWlekF6P^w*>{F+~VxpMwOg;+v zG7`7!D^zcPIsrP1wOP{XIk)05n~QN|Syjo4_Ld>HN+>L9rhSL^*t2H1LqE6at?* zRuaY1v6f76g?yE*kTpi19`W=h+8##Gwz5>^I+s8IBs>SPjOvPUOX>P3aq29XtXJX7 z<71UX95krd7uP^jo&{v7r@-Be6f<42p>2vZcG}%EVWe$4Z6s*7y|WS7tQpet+2q7; z4ooEXs6&$zBS2uwb}Xifwn%#ts`gN1OM!bF>6?j6Yj$rg5RC=K^SYwgl-i1-=f^<< zJ=be%|HS6(m6dG&Q<7w=s>$XAO;W>QRgDJ~mCMIkYus)&_HN;GTS6^!4y!FX32%u* zqZX%L;%;D;(Gj%&Y<1GKad)X>L}$Kt zkO+GxYx~$zx49e-ZWvA)!GYTTT4lFL)L55o7yh1k;SbC zKk(fT9NemDxk~!pC-2=-(e@)>fvrO6m=!LCtyr2Zbph7n@3cnJ=rUr&(q%^pMonNP zhq|dFKZgv4zmEpk%A#rM*g_z>z*#zob#qn}$w!3%=ph!J3KD#kI(W>9vcXpKx{_{RLcUPK4#y2T(x$pX%+$WV@2Qu{6mHvF_8C88| z_gi(H1d2EG*LD5s`*q_;{|!a4zdzkmF1KtMvM4v%!0{i?WBBa?Kzg(w$zOk?ozxRUV}@($#Ut8 zJFK7*K9pc@I6OU2m=7ze_E`?+w`3h;GiG?cFu>k$_u<5$uo7&pU@^RXf0p%&&1esC z;cu&>4{01n=(ea(wcvT!eYR>V0Kp6FF_pfn>Sy2Inp~F1o2xTV3++u2b@Cr6&=J=~`OXqfu5UD7G4o zMRl!*ZJ|Sj!>{bCX#eK?Kp_;<*lqYARXYf8i}I9MDAD=JKG`3Pk)y9>lql!P2DP@o5WVWmK@O0&X;GaLi zSLOk)Ro6K3_O*|@clELWTaSHF%$;XPNMS5L4s$QxwH~&pA%(}i0Xzm({sG=fpHZlL zZMryHmU9`F7%wKIpp@&ue9(>xmBM4*5FdxO;k9yzD(!3e&3#gkh)^wwVmyqeYsfGSRUUpPHc?ra?QbDOWf`|zs9eSNE+w!Wda zD~oN@o9e~yY(NXGY1fC^W08Fe&sKv`F-^YNo? z_Y5OE7}6GGn-9z_;h9zb>i{d!K&C$inrE>jdp$T`QdKRaIReXJh2=$-K}H_|k|3%s0ZkaaHPyGZRjwjn`Onyz-DA>H3rs zOu|H>_jqrGc_kTC{sqhOtXDwGiuGr_^0N~t{i)IR9M9L?FnXRu6hth7H-mUB#O4I{ zbes!5&D#OSI*4BQ825UE_ib7BZQORy^B>^yp!wYoL6HxW5Z?8A7?F3wy}Hl8tAkPx zF2_D9T*XS~Lm!6*@;nl>JQMr}uamRQM$0^=f`-Wl@ObQ1rjsm^WOz8n9iebXi?1rV zJ!dQ-k980+qhEoZhKCwSS4$WeIl*0%ajsmW9c}(Svbsw3gIqn~U_D&eS9oD{HXa>A zKG;nM>jS`d7^oi%h1zBP4fHoxK>G-90_ebQ$F-JTu#5+WEz2>@krC5$ENi&qtofn! zN_u9!tnS&&I>qIDK%o67NKtDZ&Zb|l$Wy8DF*|^``75{gkIeC!^FctI)hVBJ4$X}q z&IAg0DM1O&nNw8v>5Dt4rNOmG*!~A9VAl6Cx=IG;sjZTg1Cz6|q&Cl}k~}+k;NbYm z#DOtC>i%ORpb6Ow646C2Bf#W#M+(@C^zphPkvwDb+V^1xWzb>T8~T9$R5 zdu8mqP+4EH4Q^&{*w4139E7m>Q`cw410r2BhjyE#XkYh>yD-pth6{6?)%gx?zz&vUIKaL(Snh-2`l`cH_#49x^=| zt?seA7)5G}ElyXPZkwdsN@PX^T@nWZ(9odDVW6=N16AQWdJmdQ#xPEJoFyUL6=_(9ZDTjaxUr?1t!Y@WrG z2N2nV^}CaJy2Nw%GGnx{+)mkz{gmCb8&CcC4TxV>go(5R!vW3Jpq!}g{*vb&l3op( z{7a~F&fP^eU#edXCIM}{eb5=nt(8cGEAdqdKrTVKI6FONw6=FL!o@yBJP{Q=CgibYI@M-^+LmRlB6xWa15NiI7 z$G_+Nk^!LUJ^hXtdN5f9STc!jOFYynR2L<<7H+Rrw_}r@=4XX^FLxcf<;WJYg3Rk} zH$@^hZNsQ{ZcQB=#(1-_`O-@_`}M@2EVWlvnh`K|jMl1!m~-JWDS?UUiNG`F8S|Bt zY^iT(sE-Jld_J?bu6}*7IL&SYie@23PM)t!fJpS?BU{dpr3)1X52r5OyxCh9yt2IV zlBgFh!z*~d_wN6Sek5kOhi`6Cj9=<%x4V|i71!e|k5tx1CTrxc0`Y)0rl}@j!%y_|0NLk{wC10aTY=T6CoVJ0&M9l>lZuKE23M%zW=Avc4 z&#;T#Z_*-CLNbhh0DVVtz(}gU7tC(4=`PAvneL*cRrFBKVf`kcH(z$rcc6{PiYSq< zq9q5S$hKPrw7lSJtK||nNn*`YK@Ad+6;|qCw;u#J0rFSbh}u#tta$H_u>9fcKgtZFf5DOI{Yk$L+D+nfaEvw4wmT!)wZMtRjl576${+NJr91= z+OW7FOCSp9;8EpLs?-z;xV+*WBv3PnPE4AS^a)+;jSx{}r!|!l)}UK;X)r`|ZBWv; znuIJcGICI%F9I?8B2@;h=C=dpJ8JpZrIcP;%Ou|cXe|Av_SR}P{#MOgrK2B&xwVKs zyeAT#x1?yPTtj)a-%B;ObtOINj1#wih+2j6ASvCrOAiKh$FNgF)K1#=i#=18>&0RD zpqQMv%r;OBWcMY3q~Mo7clx!Bclfn!d3#5{w&;fRzoRO46Lme7|0kq~p{C$@wdD>K zqS+3ww(UKA52H?ZA)m?z2HfFkg?*^f;g>}@zthPo`OIopEX{pwM=iUpX_g3LcMM3j z(=$t-m2JCid8nO_{RzUVGS^>anSBb|7cL`v-P6{Ei?-saVE+f}u@m8+a`gwUV{_p$ z2F7$ft?6T9$W0#WIJ;oUm)E<)JrmY^&*oS8J!PM}0`?IX{)WrgD{mY@-uK12_FES& z_d;6NZXDHEX|=$+BF2&$)j?e}*e;_tb|HO0=!Xt>K4OCL9U2Q8+WU_ZwWN5qE;* ze_Pg|Za3cwU+_3m^^e*53!LeR^GfrrwmyiN9&3=BOmj#_9WmD~t+{a#_^QOgM12UZ zXR~e{{Djd29~BJ2hFxBG65zJOz;mdFop6*b$gHkywi?5t@X&8+_R7j9Rh_~K*`r#9 zIMrO5l?-i+EH#=-U;!dzrIc!( zO_i>cDLu?iv#HXmx!Unt*{-$?Sk3d}isH|sju%(-YDZnA@Xsx`Oe$N4PW^A{^QbbZ ztosIXtbO;I=eG5AR#1+?bqLzV(tMEy`+3A~@p%3%*~Y@cXs&rSH@d*Kmn%!9$dXMn(hzLg0 z_+0GNeetp{E;hhTwit+8%|{~LQVJOf+iucQ30a%}=Xp&|q_ms10gHf_X^{tKdGI_V z89!%6O(*g>+;+UrltU@=mRrnJNH*VRKeG;JwSDmP%+Hdqu(@Fy&dTs*p7#gpVy_fh zkvtz%^;X0~oNq(VgJM*HlFy6AL1(X`5seu0L9VZ0UmYUG1{MkKWe56eb3Ef*;}FAG z(v^PWh@mSN;{ndrBs~ROO$F(@ulsz554XAho*c;Y6YlksDEKLJ=_*qD@N4GgUNiR^ zWIW&Ri=WKew$^-@T6xF3NLK z`Qm8OOyJabFF(*4=Dm2nrfH*6N@mS9TKUwlLy; zAu76;5TF2X3F7D`4p26^{^J(jlN|CUQB=e?Ysy>5i?fQE>{9yVzEr9&^?Fs*XpCM@ zM49x?$;mEDsf9q3YYSzoADt!gUr6)}yZLJ$vbqe@I!2~baO2msn96RwPn1PczWI+W zOHT&g|4g zl#%LRWiqN^q`H#hS6|g;*QI~)xTZZWsj{SJGP*(!X9gXrJg(45wg>wK>;LzWZ?ZYE z!p8F@g5V&u8z2pGL)1c9b?Os{H{qs46ESq*T0%Gv&~mH;l7}yWt~!5hV|ZlNuo@c4 z$`&D0+3XY{mYgM8Ls96%x-OZlzsT$#>o4Y2!^4`P=vuL;>55V6?$!*IHD!!yskN- zal%vMU{hj=`}^f16E%3NlQUwKo4sQu@2kC9h9qjbr5w7RG#|^)=f42= zz)B4v8@-=6aZ&eRDi+m;XW0#zL{~9d>YCWOa{{hk^bY*)Tk!aokRlSY{q+esZYsJ= z#O{ZVNPo;8ihPS-p8KZwPV$T}A#4@y5bkGdV2Oe&$O0OD6v}+wniY}10*ZQIssqy- zL^&WfEw!xc>a|L#mX{U> zxh+W=vKa+x4yLZ$Mr~vrsKo;LeltRdVo@hPJZMlwi5HDTFlL1Ggh9h$ zvbZX@9_!4l`(KcL4ZPs+l@y z5m{z?xkq$Y2m8ye4*D!$eK>88$*UuEh?F_YFVW_2g7>)^a{p9-*N%Luc7l+w6X~|loRkYEIZq#idS@3x|1 zR1W=Ygx$_=37Z8&6G_+@3n#4OL3vp)9*q(ZMSyE{f2oN^%9I&Tw%?{wB(G{&{Z&h==p<1gZ02G+g@uPzZ@I+(k zuVRreMZ$^1hPy(6H{UuP47M*-`v)$2{{#8?sZ=sLP>OV!F)Pw#E0OP;Df95)CN0J` zb&^J|(*w;HMQPI?hNDmQU!P32FYPvt{z}wYnmyEnVK+{4(mRbO~9Z zAJ;6<0A;Imyaf19sG%K)d1SI)WiyOZ0Z5$cCc;Trg-iZC3Ri($2qFr>0e*!lkXL{V zm|;X0`9A`BU6$XQvJ54l%m?y@5x80pd~KlsL_oX05r}R;$Gb1DEJOo3_rd#dgY^Ne z+fcH4uN4VbW0yzjdf@QI2{9Ji%$~QT*T1SrcP33skuM^KXj(aw9M>8E8i|kCK!me_ zXanPHr(;^|fpW=`jZj<-UwpQ%?~P4^Q}ynaeDf=8FAct$TT~Zo%rO+Di{oH{K})RN z$3XCoP~s(oyaJ)4JTW7Ibh0{G76ndlMK-)CZ9AIg*y%TIh|I~funW#)50y9!j+ zMX7J6n6RCAEbiC|ac7?-qGAD|NjrNyuA8PFKc2OdbE@23VW+C8+oaMhtF|c0QffjB z8v#`f7-4ZDCCQ@b=M4e)9>rK?-e(q+S4GTQ?H3aLj;lFxwn9Dkf& z$@!Eq>wD-ib*!9Lq61MS(i;irpV0#(3nKRhXD4y8lXIA|=tlKVqshFc1-nC0%`^qS zFEXH>V+iHV%rj{3u;(4&Q{c*34asbO3g2uW%6&m+t zR-b#W4M5FhzJSw#Z`~%VpE*|UDCoskw~1)?yZvQ9`Kj4 zkQ)_6aNnvC&{)&JL#rspi}9_D#0D`zmMr||;#hU>zUo-tf9{`}YMva;sTP|XbXg}q zhIaWeVbdI&Doh$LCguTDzZm&PkURWi#8>8^kcTp_E=qmPC&Z;S9{{z#;*}@cE_`VH zqLbWcgBRloD8>_!G5-hjH_u+6{G-DE*JZu|%6!BBzskIUBOm{J%S_oSxVgP!eN|;G z)^@y-f?kfB%=oJ*V5q}R1#E}53Kua-{W9UT!VSW$!ac%$!h^!Y!ei*K7;!PcR~T-P z!i6x0{YW_IW+SG0954?d-`kyc`tzRXOkSIP{o7j%Hg#1<-uYn~qZXxIVltY@jx;XW zT;Gt|l)yxnXu;!AJbn<56FA2%_)`3N?()U?@gh7rz9X6XFl8@@(agbKYb4wJ3o^0! zlA>ltFm*RR-|-zeErx%-bAOKd`nlaWKX%A}c6R8Pp9dz~uX7Hq<#78cWC6KN*+X2r z{48>v&j}c0xw7VHZXnsmc2Ab3U8Tb@BnR|JAj;KJ%juar*fltBLz3< zSK+PU(P%IlK>rbK{=doAFX(H6qUI5fVFHY%(SELsX7_*t1aa5^u#o|Kb2Y+EY}68( z^0Jjc;%G7snCrTpv^|anG1WaPwU_KSD5_0mW#s6VjTaMfOp&RrDm|Mw6sw}BJoC1l zQ<6$#QXGop25aeyP7L%(>{OLD?)V0dsSS?Pb*VEnEEzX6syHSBE9X3xtqI1S?-P{4~+Cwhq93qyN3@XMJd`P%VPJkaqPX zJ^P6@bcRyp;97p90dfkUvpOj#bX?(+3knNh$+6n&mj5XW=@?RMS*~l_w&e=D(wH#E zG%0al6TnMcji1QLhzgM9W23n z^y6l|RroEh9Bsj-6L(Fjs+9?!`tB<}FIM6OpEcHG{Z*bry`S|Iq1A{wFu)Gy3!9k> zUREQlZdxQ?`hcaX>X@otf1c1{KNaE&=Z|0?IQL67w!X>g^AFIb8OOP&JuSvt@J6i( zf_h*_)wUZ6&jy5J%>uiDGtFu(yAa?zut%JCwpR+HCD* z9TyfVNXXNwB!#G*Q$hyvs90nfo+n}#$ypQ5TL z6O-<2G-+?OIVVjB)jXy}12Ob>n3&j6g*DAWBtrU;-jm6qJvCC|~J^((-qBzaAJT{<3 zZf(MeCnoAMVzuU)JhMo2gm8^`cevKigo@b!2^tL}NCNTRa7Y{yS*sISf(T_%ap<0* zd~{$Vdia_$*|kq!#cs5IW(0%A&$OO_RQ{@9=slun?%GU3A?=-__?}Snxx$fsb0x0R z5Hi?&2lBXoBcBHyKH~Yr!5)gN*Ltl))l~q=MA&xQwuet#wad`^HEnEm=W7YMZpYl% zfN6!^Y1kRFZx?xb?)Ggb9&TtX2OYS2$F6G#85%G%w(-u8W%ljx+2MfS!yM;cIjvn6 zN0#1#io*0f@l~^P3r{ZVLBx=d?jumVfHc;E%!SB&^E8`5NbD>kvYhAeL?`@Qr%XSM zp4@TY%v+FKf7V(CR&@m>!3ltyb8Xx~OWZZgu94fv=Qdq#i^fKklJJAaui4$_)mQVc z;W#ipSK2-;oJNmr(zb9i34Cgi$JCdQSAy(&~Wp$oM8%z(X!Dmqb zbA7_K4j29QPhjbA`raq+y>4&XvhKF5^wdx{>i_hR{Asklu==f2NAA7%$o@B2d9LD= z*ZaCrIf$(rS3fFin*6BcjgeomI(s{7`EgbbPkW<9VZqFY2(6wjDK}^ExB_wV;^St9 z`xDKWkJIL})?pyiVGW1<#bN7HkF#%Hu#E-7USKu%IE{VMn(ANapJJto237*mRylrw za?WljN6xDT4=>U+mxuN%$m=0NPzY>dZlu}>GS}*J8FaH*!b2|&han_;#d>*{5 zl8*ku=AUv2Ah1A!f^J=qw@-v?ceQ%Pz}Vc5>j-)6&e<_d>(`B4SDkqHz2xb3R~Q%~ z_jOQ%8dqfwSP)gQ>BER8EF1rDA`&fihNpDh&DYnUBr}w za(_2l^fTT4a-xtKi1wsPqq(lQIMp8vmr^~^flT3Y6k**hQ!2-^*#$1nlUqC;PJc~u zosIxJ!w4WI>(^oESo!)fTReG=E!O9gs@|C1=Sh0lZ9iN_5hptvYaO> zAaOSD#nZ9vs2;H}w&>>La-8P5FQM<%0P5@X<6f|ZGM9*zv5C3A+ZqBH1;uKCE%8 zft^C4?R(Z&*j%1-k!0~1v==3TD$Iq5K;eEb`MLMRKe_ahZ{%+qWv@}{`A41W5lrtc zGe_?9p5K3%<)|y{rK7jyA5C0unvQARX>nRTaPGef|H9gwO~v&}r}J=_CmtVRL*xh> zbw}867_p|T>oe?>on^>~Wx?7n>}P9G1@Gq$zb3iIuN>kYzSE!m(bW%wy#l-cE9`!@ z^cQj7$`F;$6R7!EA)D9}6iHIpGn(JAtmp9=ie)LShq&KymVL)Zp&Zddr(<|Fx~j)k zznY}HlEG73`xdmV+U#j#_yuhC0n3&}Sfg*c2_}(6T+bn% zIbZt8SCGe_?z7d2qwhnZ)BOnYaae2mIR7nvYa9J-zBE~4WA3x4^0iz2jLQDlD&E@B zf$Cp+5;elEjj3u(6?l8Iep&%!OTw3#77T%}@hjwBuX=ycijaiA4LTacYr`+IHv9@a zyYBCb)s6;@fA74H*}3+mojQY{wBWL9XuJ)0=IT?sDDUsvrK#%ens&RYYP+n4t;Yqc&Sd#-1lj`(q02Nwb3SYIJ0);wTp-8Zd%W=o?I3=dgBS#_wc()VL) z9_dOGe%&)`E(@z(*VcW&W$S#s*uo`=10E=M_17Z$-60{>I#5C@9B;0W z3+EUKFE&`m{ukD84yC_m!Yls@nml&~09$$j4{|m}8$LPPnU}&DR z0-@7hPtCBb&6QII^=J~$=R#o}p9_V&U)h`E`E__$I0geP`!!wf)%34rfk5;-Rp`sW zHLX{NYdAvPcm4~b2j0!;OepM9besxZi1lRWM%VY=Q5&?DYt*M@`NZ6&auP2*MYBBAk zVTBrp6$zkMzHZo!kTtcaX^UnL3CUARkadQqds_B%JJ|f#h5PIl>L%*UhTS>RA)DZF zw()fUoRO5n>~RLXh3qzaz{yfjnUYDU$6N%ein#Ui71+B99UgKxL$6@cG%hQ#^slB%>o@d!5L9q4IEnmNPi;MlfPZu28xQOBB>IcG z)HE;keneosbnY5GkGb%W*KgR4T$X{#0a@KY#X9lwRR1#Uy|j>)b$=c<1^b=`@+6%O zizIh4^U#OuVYI3bv2pZxW5`}G9&z@z&STc3U(Pz$5DL(a&q_+o~P$Ypm)(oS3H z$@zT~nX!TymvuIJG9$Ho+B&Tf@lhiXoF{tMhPk1kOS?4N>YXU{L<0&r77Q4V(gYua zp>tm#FQ9!58{_Ci!Ir369+9e(GZIcv(hMV_$#?8fW@O98bR;sczfqPHs;et(mWu4X zMm$Y!R+7Ql+b`L+!PK`-G?7Fz&^+tY?T*T=rFg{y*PuX_4M`En-&QFVzlnk(c~ zI>uEupoUo;v#uQ5=NZ9+?K{b?+`;zyTq@*65U~|8ihLLq6m|!F7eIm{(`XA8s_x}Y zy0=;{>?x@d+gP+etutOfUZ`(Fq@7MLYISe|^I>lto zpRAY1J@e@oWmzv90&PTxqx_XsTAHk*uR=D4&~qXC{!+PEE7Jt6tL#FZEJky?uf2A6 zHr5kP*J|ldPc*yx+1=S_PbgihcZZwjy1IH3@qg{=%ES|g%e^~y_Ll8jdix)3@6H8F z8FpH-bKP*7kL=%XY}PivJ+77SKb;8_t$$m%Sr(sIoK970C{XTl2W(NI3{ zt6OBrYS95?LImB$v!KKX#zL-yqW?AD)!2{=mqTc*!ie5|Wx<$E0T< zEBWmH`hlT88`*iaJefZ*Any3!$cJYy5r6YHR(&~?!g-e9ng*OWCV|&(eOS#sS)VZdbo{k}4D z&{7D=lFzxkc?ZdwJGx9YrFN+`_DiW|m-LoVn1t?PnO1nFC91!0T#~4sb)N}Ti%uo! zIFdM9XJ@x!(X-##IdWe+66!j z@55l}N;ni9m$Jzg=HPgt+TLNgwW{qJFl_|Mv&~ZOW>K_6Dqh}iIj-Yqw?OqM8KH$Av5JTw%(!so0p+iG{dj|d7;*2}ulV!X^o!ze3ho%M-X zw0i?j+m{GOh0BGjglmKo!cD^KSzoz}^_I5^=sAp5;^<&H%EB`Hq1RUSgHUlD`GOg0 zl!XMZaE~Y;K?aXvl*REGEG)ZmxCZ&b!C0AvAU%fkGCULRWuXK23k^WMV*eo|OYGQO zVYLk|QkLM*gd|LCkcOLz7aEOoLWAG8(oSX1YvRqVN3dK=knG;D;)VntjsI2}zEbdl z;N=w_#pgHND?VRHK|rU;t=23+$y<=*E<6eeqWQQU1r|Y=wWs;LJtP`f26xQbmaqI~ariV}#9xtCcm)~4x}Q6F~}eX8T&g92>!6d`9&cnt#XATl=DWIpL(-L3ip zMygTW7Oh7P-r8KTV%A18lmM;fprtZGEo51YAnk9L{`NT`NI<`M6(`CGoOpedRxKlhw0=}JfoXeP&bnA`P)3LK-AmXi-rigKG)-z1rKMQj32RyI$iF`7B?3W>88$2t zwjnk!7;_UJb;G505{r@rMinA5z)3d9*aMb$0BBa2y27rbrSapBxA6lY?qB;=^!>M_H81DkH(&p7@Nd|U98SC0ogPK;LQ7H8 zozG7Aa<#5{IGxMLqb;yq{S;W!)+^XlYHL@I_(H{)Ez*KJ5m1y@CRA2)EU-x#2NX|X zu?4mR51~XBL(;HQeTg3pSMPoD-p|<41nr4wyAz7(1T@EvHt?K9&`k~)8L;rj-PNIz zoxY-e!FEJM+-QHoQUn`=P{qpDJnz+VVZEhbs4Odxkc6ozWV|8SO3MVE(83%TMCe!~qV5eXo|04SNgB@ZOuw`K{3Ti(HtP~`mo5Fgy>jij5jDkQ1bb-no z`iV^S#vU}%`AaP6kJ#yKc))9L!uZd+1cD_uFcB?f$Z@PQ2^VenO1#4e``q zWZ>wc|4;hq&0QI#R%%O|%g9JgZk* z4qU>3l;nM`y6W>==c$E-R7q@r%yFT4mIyoBXc_kFd~pCDX|9w~L@1?JQYBE)?+{#ehpj{5sYQC*_V7-v?(8+qk&TUw&$A&u0U*BTeyj;Zw+>btO&IpDPPeYAO900`2G== z?d-_h%up^CAOEdI_`Jp8O;;pzYeTq$*BeJ}`r5iia=Rs)@8B>c>V9r7Na$XX>te}EoE+E7g{@1|XzA}di<*edJ?efRZCwtD(%g>H$XufQU2^;dk- zH-!1${dhdNj$z)KPisEv8`1pu6ds!&M)|-=-_iAfj5uz<1FE10oxN-i-r^d1ev}k6 zU#=%=Rp=XP0#+`r7|duzwo8U}t8dM8?cTeZPXAvx<^B%Z`87Wtp^9ZjlJz5drgtdW zQ9JDfWE!CHmq#0Xf?}urZ8Tf`mxTXWcA++m~KS|3UMYy7eRLWuj<-A6g^v(d`%Y^jx%k zG)_%hGYri(X{3L4W1}n4V~OEt-|?vwyP{g`BTdp3OD0c-LZRlF5O8y0+;l)`G z-@@hst{(2x8KIOBxt4bc={xkgSuXh<;yKX-VkWdaM6#uTsPas1OKytaD>m!W{!q1O(lzo%Ma^K+=S_Q_>gqa=1s?3y?sq9Xkt(r+jmr zCZrHEIMIWy?i~uUtB$!PdLh`tdjN}?))AnZiv^x-tXfo#0)#ca&#*y?&9;7LSnT`$ z6-D#=%N|A4SzjR#Cvt*yhYEKE>pCfG$u^;gj#qk;ZIxtaK{UjTiR19aJRTF3ceB^A zB0h$tMyPEp)8jj3`L-c81|jU1*>v>0Vc&q|7JT}ZI(km4_^Bn(+eSOtR-NE%+N!Uj zx8Dx4wUn)>OQdm5SXDtd<&Kd>@NW!}m1d)J$#u0{u(dq8rHicy<7~8CBwQ!lD!lnZ zlmR))Yh)oB zXrAI+zCe`oK$=hDrHAl%hcEtF-&537^GCi*LWk_B(1AI}zpUd+D)@zbV@eiTy)Uqz z8;})D|GO77?btC*Put?Wc$ zaZjf~v@9Ch?=B%zymO^pSXf5M@iPI+&7cD`K$aK4?VrycJ&yF_j$cRBL@&_x7orn5 zwX?gkXKSb7?|dXr^Cumh{8`UdU-r$V;B~oy^XXbb+$qG@YPoovPnXNAR15JO`(cM# zY&1}_Xo+*#_>#@zBG^PUpI9bK%PUB%^XU{KjrOAKkHSA*)*p%6+1$W=SaUQ*cr%v6 zap~4Nm?0uCb%wa$S*ZCix6CHCQwQVWGZ?{y~@M;3xTRO}pFuooNG|gKz** zavQ8|yx&Tj^|x9_q6_#nYxv_W+m`wTW=f7f&tI!~rCPm~_+H)2k_9Z=H#)Z`Ek8>+`JM`KV{eCp_iMVRk*WoZVx58w4=D5A0XCU9?-ORD`IRyj>+lkA^F|}#`obc zK07z!>uB6R&)aUI$L*!AUr4FI2Jm_0Jo;T()SfeG8A|Z^9Cg^{Hk~% z*X9Sis3M3MBk3BlZ5=4V^F z8k1J_HW>26m)Doo@jXtw8>V-ycf$w^`g(iV5o^FTdRRD3v{VKzO|!!>%MmU9P)MwYYOF3H6;suJ`2pS>u7vc9$A+$e`Xv^Zm(+_;&U!CZh6=;N0i>lB(9&PAd+4!x6E}T19A0eAJx_YuDa=xlUB6c}7xn zGRh8@PiN`_X+@F5-orQ%vUzdmb2vG&QzGo�Yw6(>3h3Ki)UqBdO#joC{%U+==re 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 DKZR3$ literal 0 HcmV?d00001 diff --git a/assets/3rd/index.html b/assets/3rd/index.html new file mode 100755 index 00000000..e69de29b diff --git a/assets/3rd/magnific-popup/jquery.magnific-popup.min.js b/assets/3rd/magnific-popup/jquery.magnific-popup.min.js new file mode 100755 index 00000000..6ee3a3bd --- /dev/null +++ b/assets/3rd/magnific-popup/jquery.magnific-popup.min.js @@ -0,0 +1,4 @@ +/*! Magnific Popup - v1.1.0 - 2016-02-20 +* http://dimsemenov.com/plugins/magnific-popup/ +* Copyright (c) 2016 Dmitry Semenov; */ +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):window.jQuery||window.Zepto)}(function(a){var b,c,d,e,f,g,h="Close",i="BeforeClose",j="AfterClose",k="BeforeAppend",l="MarkupParse",m="Open",n="Change",o="mfp",p="."+o,q="mfp-ready",r="mfp-removing",s="mfp-prevent-close",t=function(){},u=!!window.jQuery,v=a(window),w=function(a,c){b.ev.on(o+a+p,c)},x=function(b,c,d,e){var f=document.createElement("div");return f.className="mfp-"+b,d&&(f.innerHTML=d),e?c&&c.appendChild(f):(f=a(f),c&&f.appendTo(c)),f},y=function(c,d){b.ev.triggerHandler(o+c,d),b.st.callbacks&&(c=c.charAt(0).toLowerCase()+c.slice(1),b.st.callbacks[c]&&b.st.callbacks[c].apply(b,a.isArray(d)?d:[d]))},z=function(c){return c===g&&b.currTemplate.closeBtn||(b.currTemplate.closeBtn=a(b.st.closeMarkup.replace("%title%",b.st.tClose)),g=c),b.currTemplate.closeBtn},A=function(){a.magnificPopup.instance||(b=new t,b.init(),a.magnificPopup.instance=b)},B=function(){var a=document.createElement("p").style,b=["ms","O","Moz","Webkit"];if(void 0!==a.transition)return!0;for(;b.length;)if(b.pop()+"Transition"in a)return!0;return!1};t.prototype={constructor:t,init:function(){var c=navigator.appVersion;b.isLowIE=b.isIE8=document.all&&!document.addEventListener,b.isAndroid=/android/gi.test(c),b.isIOS=/iphone|ipad|ipod/gi.test(c),b.supportsTransition=B(),b.probablyMobile=b.isAndroid||b.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),d=a(document),b.popupsCache={}},open:function(c){var e;if(c.isObj===!1){b.items=c.items.toArray(),b.index=0;var g,h=c.items;for(e=0;e(a||v.height())},_setFocus:function(){(b.st.focus?b.content.find(b.st.focus).eq(0):b.wrap).focus()},_onFocusIn:function(c){return c.target===b.wrap[0]||a.contains(b.wrap[0],c.target)?void 0:(b._setFocus(),!1)},_parseMarkup:function(b,c,d){var e;d.data&&(c=a.extend(d.data,c)),y(l,[b,c,d]),a.each(c,function(c,d){if(void 0===d||d===!1)return!0;if(e=c.split("_"),e.length>1){var f=b.find(p+"-"+e[0]);if(f.length>0){var g=e[1];"replaceWith"===g?f[0]!==d[0]&&f.replaceWith(d):"img"===g?f.is("img")?f.attr("src",d):f.replaceWith(a("").attr("src",d).attr("class",f.attr("class"))):f.attr(e[1],d)}}else b.find(p+"-"+c).html(d)})},_getScrollbarSize:function(){if(void 0===b.scrollbarSize){var a=document.createElement("div");a.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(a),b.scrollbarSize=a.offsetWidth-a.clientWidth,document.body.removeChild(a)}return b.scrollbarSize}},a.magnificPopup={instance:null,proto:t.prototype,modules:[],open:function(b,c){return A(),b=b?a.extend(!0,{},b):{},b.isObj=!0,b.index=c||0,this.instance.open(b)},close:function(){return a.magnificPopup.instance&&a.magnificPopup.instance.close()},registerModule:function(b,c){c.options&&(a.magnificPopup.defaults[b]=c.options),a.extend(this.proto,c.proto),this.modules.push(b)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading...",autoFocusLast:!0}},a.fn.magnificPopup=function(c){A();var d=a(this);if("string"==typeof c)if("open"===c){var e,f=u?d.data("magnificPopup"):d[0].magnificPopup,g=parseInt(arguments[1],10)||0;f.items?e=f.items[g]:(e=d,f.delegate&&(e=e.find(f.delegate)),e=e.eq(g)),b._openClick({mfpEl:e},d,f)}else b.isOpen&&b[c].apply(b,Array.prototype.slice.call(arguments,1));else c=a.extend(!0,{},c),u?d.data("magnificPopup",c):d[0].magnificPopup=c,b.addGroup(d,c);return d};var C,D,E,F="inline",G=function(){E&&(D.after(E.addClass(C)).detach(),E=null)};a.magnificPopup.registerModule(F,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){b.types.push(F),w(h+"."+F,function(){G()})},getInline:function(c,d){if(G(),c.src){var e=b.st.inline,f=a(c.src);if(f.length){var g=f[0].parentNode;g&&g.tagName&&(D||(C=e.hiddenClass,D=x(C),C="mfp-"+C),E=f.after(D).detach().removeClass(C)),b.updateStatus("ready")}else b.updateStatus("error",e.tNotFound),f=a("

");return c.inlineElement=f,f}return b.updateStatus("ready"),b._parseMarkup(d,{},c),d}}});var H,I="ajax",J=function(){H&&a(document.body).removeClass(H)},K=function(){J(),b.req&&b.req.abort()};a.magnificPopup.registerModule(I,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){b.types.push(I),H=b.st.ajax.cursor,w(h+"."+I,K),w("BeforeChange."+I,K)},getAjax:function(c){H&&a(document.body).addClass(H),b.updateStatus("loading");var d=a.extend({url:c.src,success:function(d,e,f){var g={data:d,xhr:f};y("ParseAjax",g),b.appendContent(a(g.data),I),c.finished=!0,J(),b._setFocus(),setTimeout(function(){b.wrap.addClass(q)},16),b.updateStatus("ready"),y("AjaxContentAdded")},error:function(){J(),c.finished=c.loadError=!0,b.updateStatus("error",b.st.ajax.tError.replace("%url%",c.src))}},b.st.ajax.settings);return b.req=a.ajax(d),""}}});var L,M=function(c){if(c.data&&void 0!==c.data.title)return c.data.title;var d=b.st.image.titleSrc;if(d){if(a.isFunction(d))return d.call(b,c);if(c.el)return c.el.attr(d)||""}return""};a.magnificPopup.registerModule("image",{options:{markup:'
',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var c=b.st.image,d=".image";b.types.push("image"),w(m+d,function(){"image"===b.currItem.type&&c.cursor&&a(document.body).addClass(c.cursor)}),w(h+d,function(){c.cursor&&a(document.body).removeClass(c.cursor),v.off("resize"+p)}),w("Resize"+d,b.resizeImage),b.isLowIE&&w("AfterChange",b.resizeImage)},resizeImage:function(){var a=b.currItem;if(a&&a.img&&b.st.image.verticalFit){var c=0;b.isLowIE&&(c=parseInt(a.img.css("padding-top"),10)+parseInt(a.img.css("padding-bottom"),10)),a.img.css("max-height",b.wH-c)}},_onImageHasSize:function(a){a.img&&(a.hasSize=!0,L&&clearInterval(L),a.isCheckingImgSize=!1,y("ImageHasSize",a),a.imgHidden&&(b.content&&b.content.removeClass("mfp-loading"),a.imgHidden=!1))},findImageSize:function(a){var c=0,d=a.img[0],e=function(f){L&&clearInterval(L),L=setInterval(function(){return d.naturalWidth>0?void b._onImageHasSize(a):(c>200&&clearInterval(L),c++,void(3===c?e(10):40===c?e(50):100===c&&e(500)))},f)};e(1)},getImage:function(c,d){var e=0,f=function(){c&&(c.img[0].complete?(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("ready")),c.hasSize=!0,c.loaded=!0,y("ImageLoadComplete")):(e++,200>e?setTimeout(f,100):g()))},g=function(){c&&(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("error",h.tError.replace("%url%",c.src))),c.hasSize=!0,c.loaded=!0,c.loadError=!0)},h=b.st.image,i=d.find(".mfp-img");if(i.length){var j=document.createElement("img");j.className="mfp-img",c.el&&c.el.find("img").length&&(j.alt=c.el.find("img").attr("alt")),c.img=a(j).on("load.mfploader",f).on("error.mfploader",g),j.src=c.src,i.is("img")&&(c.img=c.img.clone()),j=c.img[0],j.naturalWidth>0?c.hasSize=!0:j.width||(c.hasSize=!1)}return b._parseMarkup(d,{title:M(c),img_replaceWith:c.img},c),b.resizeImage(),c.hasSize?(L&&clearInterval(L),c.loadError?(d.addClass("mfp-loading"),b.updateStatus("error",h.tError.replace("%url%",c.src))):(d.removeClass("mfp-loading"),b.updateStatus("ready")),d):(b.updateStatus("loading"),c.loading=!0,c.hasSize||(c.imgHidden=!0,d.addClass("mfp-loading"),b.findImageSize(c)),d)}}});var N,O=function(){return void 0===N&&(N=void 0!==document.createElement("p").style.MozTransform),N};a.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(a){return a.is("img")?a:a.find("img")}},proto:{initZoom:function(){var a,c=b.st.zoom,d=".zoom";if(c.enabled&&b.supportsTransition){var e,f,g=c.duration,j=function(a){var b=a.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),d="all "+c.duration/1e3+"s "+c.easing,e={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},f="transition";return e["-webkit-"+f]=e["-moz-"+f]=e["-o-"+f]=e[f]=d,b.css(e),b},k=function(){b.content.css("visibility","visible")};w("BuildControls"+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.content.css("visibility","hidden"),a=b._getItemToZoom(),!a)return void k();f=j(a),f.css(b._getOffset()),b.wrap.append(f),e=setTimeout(function(){f.css(b._getOffset(!0)),e=setTimeout(function(){k(),setTimeout(function(){f.remove(),a=f=null,y("ZoomAnimationEnded")},16)},g)},16)}}),w(i+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.st.removalDelay=g,!a){if(a=b._getItemToZoom(),!a)return;f=j(a)}f.css(b._getOffset(!0)),b.wrap.append(f),b.content.css("visibility","hidden"),setTimeout(function(){f.css(b._getOffset())},16)}}),w(h+d,function(){b._allowZoom()&&(k(),f&&f.remove(),a=null)})}},_allowZoom:function(){return"image"===b.currItem.type},_getItemToZoom:function(){return b.currItem.hasSize?b.currItem.img:!1},_getOffset:function(c){var d;d=c?b.currItem.img:b.st.zoom.opener(b.currItem.el||b.currItem);var e=d.offset(),f=parseInt(d.css("padding-top"),10),g=parseInt(d.css("padding-bottom"),10);e.top-=a(window).scrollTop()-f;var h={width:d.width(),height:(u?d.innerHeight():d[0].offsetHeight)-g-f};return O()?h["-moz-transform"]=h.transform="translate("+e.left+"px,"+e.top+"px)":(h.left=e.left,h.top=e.top),h}}});var P="iframe",Q="//about:blank",R=function(a){if(b.currTemplate[P]){var c=b.currTemplate[P].find("iframe");c.length&&(a||(c[0].src=Q),b.isIE8&&c.css("display",a?"block":"none"))}};a.magnificPopup.registerModule(P,{options:{markup:'
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){b.types.push(P),w("BeforeChange",function(a,b,c){b!==c&&(b===P?R():c===P&&R(!0))}),w(h+"."+P,function(){R()})},getIframe:function(c,d){var e=c.src,f=b.st.iframe;a.each(f.patterns,function(){return e.indexOf(this.index)>-1?(this.id&&(e="string"==typeof this.id?e.substr(e.lastIndexOf(this.id)+this.id.length,e.length):this.id.call(this,e)),e=this.src.replace("%id%",e),!1):void 0});var g={};return f.srcAction&&(g[f.srcAction]=e),b._parseMarkup(d,g,c),b.updateStatus("ready"),d}}});var S=function(a){var c=b.items.length;return a>c-1?a-c:0>a?c+a:a},T=function(a,b,c){return a.replace(/%curr%/gi,b+1).replace(/%total%/gi,c)};a.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var c=b.st.gallery,e=".mfp-gallery";return b.direction=!0,c&&c.enabled?(f+=" mfp-gallery",w(m+e,function(){c.navigateByImgClick&&b.wrap.on("click"+e,".mfp-img",function(){return b.items.length>1?(b.next(),!1):void 0}),d.on("keydown"+e,function(a){37===a.keyCode?b.prev():39===a.keyCode&&b.next()})}),w("UpdateStatus"+e,function(a,c){c.text&&(c.text=T(c.text,b.currItem.index,b.items.length))}),w(l+e,function(a,d,e,f){var g=b.items.length;e.counter=g>1?T(c.tCounter,f.index,g):""}),w("BuildControls"+e,function(){if(b.items.length>1&&c.arrows&&!b.arrowLeft){var d=c.arrowMarkup,e=b.arrowLeft=a(d.replace(/%title%/gi,c.tPrev).replace(/%dir%/gi,"left")).addClass(s),f=b.arrowRight=a(d.replace(/%title%/gi,c.tNext).replace(/%dir%/gi,"right")).addClass(s);e.click(function(){b.prev()}),f.click(function(){b.next()}),b.container.append(e.add(f))}}),w(n+e,function(){b._preloadTimeout&&clearTimeout(b._preloadTimeout),b._preloadTimeout=setTimeout(function(){b.preloadNearbyImages(),b._preloadTimeout=null},16)}),void w(h+e,function(){d.off(e),b.wrap.off("click"+e),b.arrowRight=b.arrowLeft=null})):!1},next:function(){b.direction=!0,b.index=S(b.index+1),b.updateItemHTML()},prev:function(){b.direction=!1,b.index=S(b.index-1),b.updateItemHTML()},goTo:function(a){b.direction=a>=b.index,b.index=a,b.updateItemHTML()},preloadNearbyImages:function(){var a,c=b.st.gallery.preload,d=Math.min(c[0],b.items.length),e=Math.min(c[1],b.items.length);for(a=1;a<=(b.direction?e:d);a++)b._preloadItem(b.index+a);for(a=1;a<=(b.direction?d:e);a++)b._preloadItem(b.index-a)},_preloadItem:function(c){if(c=S(c),!b.items[c].preloaded){var d=b.items[c];d.parsed||(d=b.parseEl(c)),y("LazyLoad",d),"image"===d.type&&(d.img=a('').on("load.mfploader",function(){d.hasSize=!0}).on("error.mfploader",function(){d.hasSize=!0,d.loadError=!0,y("LazyLoadError",d)}).attr("src",d.src)),d.preloaded=!0}}}});var U="retina";a.magnificPopup.registerModule(U,{options:{replaceSrc:function(a){return a.src.replace(/\.\w+$/,function(a){return"@2x"+a})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var a=b.st.retina,c=a.ratio;c=isNaN(c)?c():c,c>1&&(w("ImageHasSize."+U,function(a,b){b.img.css({"max-width":b.img[0].naturalWidth/c,width:"100%"})}),w("ElementParse."+U,function(b,d){d.src=a.replaceSrc(d,c)}))}}}}),A()}); \ No newline at end of file diff --git a/assets/3rd/select2/css/select2.css b/assets/3rd/select2/css/select2.css new file mode 100755 index 00000000..ce3afd1d --- /dev/null +++ b/assets/3rd/select2/css/select2.css @@ -0,0 +1,484 @@ +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle; } + .select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-selection--single .select2-selection__clear { + position: relative; } + .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px; } + .select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 32px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline-block; + overflow: hidden; + padding-left: 8px; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-search--inline { + float: left; } + .select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; + padding: 0; } + .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + +.select2-dropdown { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051; } + +.select2-results { + display: block; } + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0; } + +.select2-results__option { + padding: 6px; + user-select: none; + -webkit-user-select: none; } + .select2-results__option[aria-selected] { + cursor: pointer; } + +.select2-container--open .select2-dropdown { + left: 0; } + +.select2-container--open .select2-dropdown--above { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--open .select2-dropdown--below { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-search--dropdown { + display: block; + padding: 4px; } + .select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; } + .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + .select2-search--dropdown.select2-search--hide { + display: none; } + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff; + filter: alpha(opacity=0); } + +.select2-hidden-accessible { + border: 0 !important; + clip: rect(0 0 0 0) !important; + -webkit-clip-path: inset(50%) !important; + clip-path: inset(50%) !important; + height: 1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; + white-space: nowrap !important; } + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; } + .select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; } + .select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; } + .select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; } + +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; } + .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; } + +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered li { + list-style: none; } + .select2-container--default .select2-selection--multiple .select2-selection__placeholder { + color: #999; + margin-top: 5px; + float: left; } + .select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-top: 5px; + margin-right: 10px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: solid black 1px; + outline: 0; } + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; } + +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; } + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; } + +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; } + +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--default .select2-results__option[role=group] { + padding: 0; } + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; } + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; } + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; } + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #5897fb; + color: white; } + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic .select2-selection--single { + background-color: #f7f7f7; + border: 1px solid #aaa; + border-radius: 4px; + outline: 0; + background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + .select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-right: 10px; } + .select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #aaa; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } + .select2-container--classic .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #aaa; + border-radius: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + left: 1px; + right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { + background: transparent; + border: none; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } + +.select2-container--classic .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; + outline: 0; } + .select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--multiple .select2-selection__rendered { + list-style: none; + margin: 0; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + color: #888; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + float: right; + margin-left: 5px; + margin-right: auto; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; + outline: 0; } + +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; + box-shadow: none; } + +.select2-container--classic .select2-dropdown { + background-color: white; + border: 1px solid transparent; } + +.select2-container--classic .select2-dropdown--above { + border-bottom: none; } + +.select2-container--classic .select2-dropdown--below { + border-top: none; } + +.select2-container--classic .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--classic .select2-results__option[role=group] { + padding: 0; } + +.select2-container--classic .select2-results__option[aria-disabled=true] { + color: grey; } + +.select2-container--classic .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + color: white; } + +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb; } diff --git a/assets/3rd/select2/css/select2.min.css b/assets/3rd/select2/css/select2.min.css new file mode 100755 index 00000000..60d59904 --- /dev/null +++ b/assets/3rd/select2/css/select2.min.css @@ -0,0 +1 @@ +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/assets/3rd/select2/js/i18n/af.js b/assets/3rd/select2/js/i18n/af.js new file mode 100755 index 00000000..d835a91e --- /dev/null +++ b/assets/3rd/select2/js/i18n/af.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Verwyders asseblief "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Voer asseblief "+(e.minimum-e.input.length)+" of meer karakters"},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var n="Kies asseblief net "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"},removeAllItems:function(){return"Verwyder alle items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/ar.js b/assets/3rd/select2/js/i18n/ar.js new file mode 100755 index 00000000..d31b67bc --- /dev/null +++ b/assets/3rd/select2/js/i18n/ar.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(n){return"الرجاء حذف "+(n.input.length-n.maximum)+" عناصر"},inputTooShort:function(n){return"الرجاء إضافة "+(n.minimum-n.input.length)+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(n){return"تستطيع إختيار "+n.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"},removeAllItems:function(){return"قم بإزالة كل العناصر"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/az.js b/assets/3rd/select2/js/i18n/az.js new file mode 100755 index 00000000..58471745 --- /dev/null +++ b/assets/3rd/select2/js/i18n/az.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/az",[],function(){return{inputTooLong:function(n){return n.input.length-n.maximum+" simvol silin"},inputTooShort:function(n){return n.minimum-n.input.length+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(n){return"Sadəcə "+n.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"},removeAllItems:function(){return"Bütün elementləri sil"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/bg.js b/assets/3rd/select2/js/i18n/bg.js new file mode 100755 index 00000000..09d0ac61 --- /dev/null +++ b/assets/3rd/select2/js/i18n/bg.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bg",[],function(){return{inputTooLong:function(n){var e=n.input.length-n.maximum,u="Моля въведете с "+e+" по-малко символ";return e>1&&(u+="a"),u},inputTooShort:function(n){var e=n.minimum-n.input.length,u="Моля въведете още "+e+" символ";return e>1&&(u+="a"),u},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(n){var e="Можете да направите до "+n.maximum+" ";return n.maximum>1?e+="избора":e+="избор",e},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"},removeAllItems:function(){return"Премахнете всички елементи"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/bn.js b/assets/3rd/select2/js/i18n/bn.js new file mode 100755 index 00000000..a224e805 --- /dev/null +++ b/assets/3rd/select2/js/i18n/bn.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bn",[],function(){return{errorLoading:function(){return"ফলাফলগুলি লোড করা যায়নি।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।";return 1!=e&&(u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।"),u},inputTooShort:function(n){return n.minimum-n.input.length+" টি অক্ষর অথবা অধিক অক্ষর লিখুন।"},loadingMore:function(){return"আরো ফলাফল লোড হচ্ছে ..."},maximumSelected:function(n){var e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।";return 1!=n.maximum&&(e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।"),e},noResults:function(){return"কোন ফলাফল পাওয়া যায়নি।"},searching:function(){return"অনুসন্ধান করা হচ্ছে ..."}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/bs.js b/assets/3rd/select2/js/i18n/bs.js new file mode 100755 index 00000000..9d91773b --- /dev/null +++ b/assets/3rd/select2/js/i18n/bs.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/bs",[],function(){function e(e,n,r,t){return e%10==1&&e%100!=11?n:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(n){var r=n.input.length-n.maximum,t="Obrišite "+r+" simbol";return t+=e(r,"","a","a")},inputTooShort:function(n){var r=n.minimum-n.input.length,t="Ukucajte bar još "+r+" simbol";return t+=e(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(n){var r="Možete izabrati samo "+n.maximum+" stavk";return r+=e(n.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Uklonite sve stavke"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/ca.js b/assets/3rd/select2/js/i18n/ca.js new file mode 100755 index 00000000..66afe55f --- /dev/null +++ b/assets/3rd/select2/js/i18n/ca.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Si us plau, elimina "+n+" car";return r+=1==n?"àcter":"àcters"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Si us plau, introdueix "+n+" car";return r+=1==n?"àcter":"àcters"},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var n="Només es pot seleccionar "+e.maximum+" element";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"},removeAllItems:function(){return"Treu tots els elements"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/cs.js b/assets/3rd/select2/js/i18n/cs.js new file mode 100755 index 00000000..52d7fb05 --- /dev/null +++ b/assets/3rd/select2/js/i18n/cs.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/cs",[],function(){function e(e,n){switch(e){case 2:return n?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadejte o jeden znak méně.":t<=4?"Prosím, zadejte o "+e(t,!0)+" znaky méně.":"Prosím, zadejte o "+t+" znaků méně."},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadejte ještě jeden znak.":t<=4?"Prosím, zadejte ještě další "+e(t,!0)+" znaky.":"Prosím, zadejte ještě dalších "+t+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(n){var t=n.maximum;return 1==t?"Můžete zvolit jen jednu položku.":t<=4?"Můžete zvolit maximálně "+e(t,!1)+" položky.":"Můžete zvolit maximálně "+t+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"},removeAllItems:function(){return"Odstraňte všechny položky"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/da.js b/assets/3rd/select2/js/i18n/da.js new file mode 100755 index 00000000..d0234204 --- /dev/null +++ b/assets/3rd/select2/js/i18n/da.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){return"Angiv venligst "+(e.input.length-e.maximum)+" tegn mindre"},inputTooShort:function(e){return"Angiv venligst "+(e.minimum-e.input.length)+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var n="Du kan kun vælge "+e.maximum+" emne";return 1!=e.maximum&&(n+="r"),n},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/de.js b/assets/3rd/select2/js/i18n/de.js new file mode 100755 index 00000000..eff40fdc --- /dev/null +++ b/assets/3rd/select2/js/i18n/de.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){return"Bitte "+(e.input.length-e.maximum)+" Zeichen weniger eingeben"},inputTooShort:function(e){return"Bitte "+(e.minimum-e.input.length)+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var n="Sie können nur "+e.maximum+" Eintr";return 1===e.maximum?n+="ag":n+="äge",n+=" auswählen"},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"},removeAllItems:function(){return"Entferne alle Gegenstände"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/dsb.js b/assets/3rd/select2/js/i18n/dsb.js new file mode 100755 index 00000000..8d6b555d --- /dev/null +++ b/assets/3rd/select2/js/i18n/dsb.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/dsb",[],function(){var n=["znamuško","znamušce","znamuška","znamuškow"],e=["zapisk","zapiska","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Pšosym lašuj "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Pšosym zapódaj nanejmjenjej "+a+" "+u(a,n)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(n){return"Móžoš jano "+n.maximum+" "+u(n.maximum,e)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/el.js b/assets/3rd/select2/js/i18n/el.js new file mode 100755 index 00000000..46954e95 --- /dev/null +++ b/assets/3rd/select2/js/i18n/el.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(n){var e=n.input.length-n.maximum,u="Παρακαλώ διαγράψτε "+e+" χαρακτήρ";return 1==e&&(u+="α"),1!=e&&(u+="ες"),u},inputTooShort:function(n){return"Παρακαλώ συμπληρώστε "+(n.minimum-n.input.length)+" ή περισσότερους χαρακτήρες"},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(n){var e="Μπορείτε να επιλέξετε μόνο "+n.maximum+" επιλογ";return 1==n.maximum&&(e+="ή"),1!=n.maximum&&(e+="ές"),e},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/en.js b/assets/3rd/select2/js/i18n/en.js new file mode 100755 index 00000000..8af09628 --- /dev/null +++ b/assets/3rd/select2/js/i18n/en.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/es.js b/assets/3rd/select2/js/i18n/es.js new file mode 100755 index 00000000..a84b1f39 --- /dev/null +++ b/assets/3rd/select2/js/i18n/es.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/et.js b/assets/3rd/select2/js/i18n/et.js new file mode 100755 index 00000000..382ad98c --- /dev/null +++ b/assets/3rd/select2/js/i18n/et.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var n=e.input.length-e.maximum,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" vähem"},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" rohkem"},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var n="Saad vaid "+e.maximum+" tulemus";return 1==e.maximum?n+="e":n+="t",n+=" valida"},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"},removeAllItems:function(){return"Eemalda kõik esemed"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/eu.js b/assets/3rd/select2/js/i18n/eu.js new file mode 100755 index 00000000..3333f1ab --- /dev/null +++ b/assets/3rd/select2/js/i18n/eu.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gutxiago"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gehiago"},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return 1===e.maximum?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"},removeAllItems:function(){return"Kendu elementu guztiak"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/fa.js b/assets/3rd/select2/js/i18n/fa.js new file mode 100755 index 00000000..fcda49e0 --- /dev/null +++ b/assets/3rd/select2/js/i18n/fa.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(n){return"لطفاً "+(n.input.length-n.maximum)+" کاراکتر را حذف نمایید"},inputTooShort:function(n){return"لطفاً تعداد "+(n.minimum-n.input.length)+" کاراکتر یا بیشتر وارد نمایید"},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(n){return"شما تنها می‌توانید "+n.maximum+" آیتم را انتخاب نمایید"},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."},removeAllItems:function(){return"همه موارد را حذف کنید"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/fi.js b/assets/3rd/select2/js/i18n/fi.js new file mode 100755 index 00000000..e84f0add --- /dev/null +++ b/assets/3rd/select2/js/i18n/fi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(n){return"Ole hyvä ja anna "+(n.input.length-n.maximum)+" merkkiä vähemmän"},inputTooShort:function(n){return"Ole hyvä ja anna "+(n.minimum-n.input.length)+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(n){return"Voit valita ainoastaan "+n.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"},removeAllItems:function(){return"Poista kaikki kohteet"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/fr.js b/assets/3rd/select2/js/i18n/fr.js new file mode 100755 index 00000000..3d51cdf4 --- /dev/null +++ b/assets/3rd/select2/js/i18n/fr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les articles"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/gl.js b/assets/3rd/select2/js/i18n/gl.js new file mode 100755 index 00000000..bb88dc4a --- /dev/null +++ b/assets/3rd/select2/js/i18n/gl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var n=e.input.length-e.maximum;return 1===n?"Elimine un carácter":"Elimine "+n+" caracteres"},inputTooShort:function(e){var n=e.minimum-e.input.length;return 1===n?"Engada un carácter":"Engada "+n+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return 1===e.maximum?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Elimina todos os elementos"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/he.js b/assets/3rd/select2/js/i18n/he.js new file mode 100755 index 00000000..bf52345f --- /dev/null +++ b/assets/3rd/select2/js/i18n/he.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="נא למחוק ";return r+=1===e?"תו אחד":e+" תווים"},inputTooShort:function(n){var e=n.minimum-n.input.length,r="נא להכניס ";return r+=1===e?"תו אחד":e+" תווים",r+=" או יותר"},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(n){var e="באפשרותך לבחור עד ";return 1===n.maximum?e+="פריט אחד":e+=n.maximum+" פריטים",e},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"},removeAllItems:function(){return"הסר את כל הפריטים"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/hi.js b/assets/3rd/select2/js/i18n/hi.js new file mode 100755 index 00000000..689dc375 --- /dev/null +++ b/assets/3rd/select2/js/i18n/hi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(n){var e=n.input.length-n.maximum,r=e+" अक्षर को हटा दें";return e>1&&(r=e+" अक्षरों को हटा दें "),r},inputTooShort:function(n){return"कृपया "+(n.minimum-n.input.length)+" या अधिक अक्षर दर्ज करें"},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(n){return"आप केवल "+n.maximum+" आइटम का चयन कर सकते हैं"},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."},removeAllItems:function(){return"सभी वस्तुओं को हटा दें"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/hr.js b/assets/3rd/select2/js/i18n/hr.js new file mode 100755 index 00000000..2377ddcd --- /dev/null +++ b/assets/3rd/select2/js/i18n/hr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hr",[],function(){function n(n){var e=" "+n+" znak";return n%10<5&&n%10>0&&(n%100<5||n%100>19)?n%10>1&&(e+="a"):e+="ova",e}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(e){return"Unesite "+n(e.input.length-e.maximum)},inputTooShort:function(e){return"Unesite još "+n(e.minimum-e.input.length)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(n){return"Maksimalan broj odabranih stavki je "+n.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Ukloni sve stavke"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/hsb.js b/assets/3rd/select2/js/i18n/hsb.js new file mode 100755 index 00000000..3fd5cb79 --- /dev/null +++ b/assets/3rd/select2/js/i18n/hsb.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hsb",[],function(){var n=["znamješko","znamješce","znamješka","znamješkow"],e=["zapisk","zapiskaj","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Prošu zhašej "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Prošu zapodaj znajmjeńša "+a+" "+u(a,n)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(n){return"Móžeš jenož "+n.maximum+" "+u(n.maximum,e)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/hu.js b/assets/3rd/select2/js/i18n/hu.js new file mode 100755 index 00000000..ff0ad75b --- /dev/null +++ b/assets/3rd/select2/js/i18n/hu.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){return"Túl hosszú. "+(e.input.length-e.maximum)+" karakterrel több, mint kellene."},inputTooShort:function(e){return"Túl rövid. Még "+(e.minimum-e.input.length)+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"},removeAllItems:function(){return"Távolítson el minden elemet"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/hy.js b/assets/3rd/select2/js/i18n/hy.js new file mode 100755 index 00000000..b26221d6 --- /dev/null +++ b/assets/3rd/select2/js/i18n/hy.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(n){return"Խնդրում ենք հեռացնել "+(n.input.length-n.maximum)+" նշան"},inputTooShort:function(n){return"Խնդրում ենք մուտքագրել "+(n.minimum-n.input.length)+" կամ ավել նշաններ"},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(n){return"Դուք կարող եք ընտրել առավելագույնը "+n.maximum+" կետ"},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"},removeAllItems:function(){return"Հեռացնել բոլոր տարրերը"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/id.js b/assets/3rd/select2/js/i18n/id.js new file mode 100755 index 00000000..87f25034 --- /dev/null +++ b/assets/3rd/select2/js/i18n/id.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(n){return"Hapuskan "+(n.input.length-n.maximum)+" huruf"},inputTooShort:function(n){return"Masukkan "+(n.minimum-n.input.length)+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(n){return"Anda hanya dapat memilih "+n.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Hapus semua item"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/is.js b/assets/3rd/select2/js/i18n/is.js new file mode 100755 index 00000000..6df6bb5f --- /dev/null +++ b/assets/3rd/select2/js/i18n/is.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/is",[],function(){return{inputTooLong:function(n){var t=n.input.length-n.maximum,e="Vinsamlegast styttið texta um "+t+" staf";return t<=1?e:e+"i"},inputTooShort:function(n){var t=n.minimum-n.input.length,e="Vinsamlegast skrifið "+t+" staf";return t>1&&(e+="i"),e+=" í viðbót"},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(n){return"Þú getur aðeins valið "+n.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"},removeAllItems:function(){return"Fjarlægðu öll atriði"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/it.js b/assets/3rd/select2/js/i18n/it.js new file mode 100755 index 00000000..98cf93a0 --- /dev/null +++ b/assets/3rd/select2/js/i18n/it.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Per favore cancella "+n+" caratter";return t+=1!==n?"i":"e"},inputTooShort:function(e){return"Per favore inserisci "+(e.minimum-e.input.length)+" o più caratteri"},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var n="Puoi selezionare solo "+e.maximum+" element";return 1!==e.maximum?n+="i":n+="o",n},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"},removeAllItems:function(){return"Rimuovi tutti gli oggetti"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/ja.js b/assets/3rd/select2/js/i18n/ja.js new file mode 100755 index 00000000..a0062c76 --- /dev/null +++ b/assets/3rd/select2/js/i18n/ja.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(n){return n.input.length-n.maximum+" 文字を削除してください"},inputTooShort:function(n){return"少なくとも "+(n.minimum-n.input.length)+" 文字を入力してください"},loadingMore:function(){return"読み込み中…"},maximumSelected:function(n){return n.maximum+" 件しか選択できません"},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"},removeAllItems:function(){return"すべてのアイテムを削除"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/ka.js b/assets/3rd/select2/js/i18n/ka.js new file mode 100755 index 00000000..5ef45dd4 --- /dev/null +++ b/assets/3rd/select2/js/i18n/ka.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ka",[],function(){return{errorLoading:function(){return"მონაცემების ჩატვირთვა შეუძლებელია."},inputTooLong:function(n){return"გთხოვთ აკრიფეთ "+(n.input.length-n.maximum)+" სიმბოლოთი ნაკლები"},inputTooShort:function(n){return"გთხოვთ აკრიფეთ "+(n.minimum-n.input.length)+" სიმბოლო ან მეტი"},loadingMore:function(){return"მონაცემების ჩატვირთვა…"},maximumSelected:function(n){return"თქვენ შეგიძლიათ აირჩიოთ არაუმეტეს "+n.maximum+" ელემენტი"},noResults:function(){return"რეზულტატი არ მოიძებნა"},searching:function(){return"ძიება…"},removeAllItems:function(){return"ამოიღე ყველა ელემენტი"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/km.js b/assets/3rd/select2/js/i18n/km.js new file mode 100755 index 00000000..97999667 --- /dev/null +++ b/assets/3rd/select2/js/i18n/km.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(n){return"សូមលុបចេញ "+(n.input.length-n.maximum)+" អក្សរ"},inputTooShort:function(n){return"សូមបញ្ចូល"+(n.minimum-n.input.length)+" អក្សរ រឺ ច្រើនជាងនេះ"},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(n){return"អ្នកអាចជ្រើសរើសបានតែ "+n.maximum+" ជម្រើសប៉ុណ្ណោះ"},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."},removeAllItems:function(){return"លុបធាតុទាំងអស់"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/ko.js b/assets/3rd/select2/js/i18n/ko.js new file mode 100755 index 00000000..9f38391f --- /dev/null +++ b/assets/3rd/select2/js/i18n/ko.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 깁니다. "+(n.input.length-n.maximum)+" 글자 지워주세요."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" 글자 더 입력해주세요."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 선택 가능합니다."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 삭제"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/lt.js b/assets/3rd/select2/js/i18n/lt.js new file mode 100755 index 00000000..38491f25 --- /dev/null +++ b/assets/3rd/select2/js/i18n/lt.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/lt",[],function(){function n(n,e,i,t){return n%10==1&&(n%100<11||n%100>19)?e:n%10>=2&&n%10<=9&&(n%100<11||n%100>19)?i:t}return{inputTooLong:function(e){var i=e.input.length-e.maximum,t="Pašalinkite "+i+" simbol";return t+=n(i,"į","ius","ių")},inputTooShort:function(e){var i=e.minimum-e.input.length,t="Įrašykite dar "+i+" simbol";return t+=n(i,"į","ius","ių")},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(e){var i="Jūs galite pasirinkti tik "+e.maximum+" element";return i+=n(e.maximum,"ą","us","ų")},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"},removeAllItems:function(){return"Pašalinti visus elementus"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/lv.js b/assets/3rd/select2/js/i18n/lv.js new file mode 100755 index 00000000..95fbb4c9 --- /dev/null +++ b/assets/3rd/select2/js/i18n/lv.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/lv",[],function(){function e(e,n,u,i){return 11===e?n:e%10==1?u:i}return{inputTooLong:function(n){var u=n.input.length-n.maximum,i="Lūdzu ievadiet par "+u;return(i+=" simbol"+e(u,"iem","u","iem"))+" mazāk"},inputTooShort:function(n){var u=n.minimum-n.input.length,i="Lūdzu ievadiet vēl "+u;return i+=" simbol"+e(u,"us","u","us")},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(n){var u="Jūs varat izvēlēties ne vairāk kā "+n.maximum;return u+=" element"+e(n.maximum,"us","u","us")},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"},removeAllItems:function(){return"Noņemt visus vienumus"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/mk.js b/assets/3rd/select2/js/i18n/mk.js new file mode 100755 index 00000000..143f7908 --- /dev/null +++ b/assets/3rd/select2/js/i18n/mk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/mk",[],function(){return{inputTooLong:function(n){var e=(n.input.length,n.maximum,"Ве молиме внесете "+n.maximum+" помалку карактер");return 1!==n.maximum&&(e+="и"),e},inputTooShort:function(n){var e=(n.minimum,n.input.length,"Ве молиме внесете уште "+n.maximum+" карактер");return 1!==n.maximum&&(e+="и"),e},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(n){var e="Можете да изберете само "+n.maximum+" ставк";return 1===n.maximum?e+="а":e+="и",e},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"},removeAllItems:function(){return"Отстрани ги сите предмети"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/ms.js b/assets/3rd/select2/js/i18n/ms.js new file mode 100755 index 00000000..ce346d80 --- /dev/null +++ b/assets/3rd/select2/js/i18n/ms.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(n){return"Sila hapuskan "+(n.input.length-n.maximum)+" aksara"},inputTooShort:function(n){return"Sila masukkan "+(n.minimum-n.input.length)+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(n){return"Anda hanya boleh memilih "+n.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Keluarkan semua item"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/nb.js b/assets/3rd/select2/js/i18n/nb.js new file mode 100755 index 00000000..eb89efdb --- /dev/null +++ b/assets/3rd/select2/js/i18n/nb.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){return"Vennligst fjern "+(e.input.length-e.maximum)+" tegn"},inputTooShort:function(e){return"Vennligst skriv inn "+(e.minimum-e.input.length)+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/ne.js b/assets/3rd/select2/js/i18n/ne.js new file mode 100755 index 00000000..4867b586 --- /dev/null +++ b/assets/3rd/select2/js/i18n/ne.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ne",[],function(){return{errorLoading:function(){return"नतिजाहरु देखाउन सकिएन।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="कृपया "+e+" अक्षर मेटाउनुहोस्।";return 1!=e&&(u+="कृपया "+e+" अक्षरहरु मेटाउनुहोस्।"),u},inputTooShort:function(n){return"कृपया बाँकी रहेका "+(n.minimum-n.input.length)+" वा अरु धेरै अक्षरहरु भर्नुहोस्।"},loadingMore:function(){return"अरु नतिजाहरु भरिँदैछन् …"},maximumSelected:function(n){var e="तँपाई "+n.maximum+" वस्तु मात्र छान्न पाउँनुहुन्छ।";return 1!=n.maximum&&(e="तँपाई "+n.maximum+" वस्तुहरु मात्र छान्न पाउँनुहुन्छ।"),e},noResults:function(){return"कुनै पनि नतिजा भेटिएन।"},searching:function(){return"खोजि हुँदैछ…"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/nl.js b/assets/3rd/select2/js/i18n/nl.js new file mode 100755 index 00000000..b3ff265a --- /dev/null +++ b/assets/3rd/select2/js/i18n/nl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){return"Gelieve "+(e.input.length-e.maximum)+" karakters te verwijderen"},inputTooShort:function(e){return"Gelieve "+(e.minimum-e.input.length)+" of meer karakters in te voeren"},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var n=1==e.maximum?"kan":"kunnen",r="Er "+n+" maar "+e.maximum+" item";return 1!=e.maximum&&(r+="s"),r+=" worden geselecteerd"},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"},removeAllItems:function(){return"Verwijder alle items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/pl.js b/assets/3rd/select2/js/i18n/pl.js new file mode 100755 index 00000000..2008e2e1 --- /dev/null +++ b/assets/3rd/select2/js/i18n/pl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/pl",[],function(){var n=["znak","znaki","znaków"],e=["element","elementy","elementów"],r=function(n,e){return 1===n?e[0]:n>1&&n<=4?e[1]:n>=5?e[2]:void 0};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Usuń "+t+" "+r(t,n)},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Podaj przynajmniej "+t+" "+r(t,n)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(n){return"Możesz zaznaczyć tylko "+n.maximum+" "+r(n.maximum,e)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"},removeAllItems:function(){return"Usuń wszystkie przedmioty"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/ps.js b/assets/3rd/select2/js/i18n/ps.js new file mode 100755 index 00000000..9bc16ec6 --- /dev/null +++ b/assets/3rd/select2/js/i18n/ps.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="د مهربانۍ لمخي "+e+" توری ړنګ کړئ";return 1!=e&&(r=r.replace("توری","توري")),r},inputTooShort:function(n){return"لږ تر لږه "+(n.minimum-n.input.length)+" يا ډېر توري وليکئ"},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(n){var e="تاسو يوازي "+n.maximum+" قلم په نښه کولای سی";return 1!=n.maximum&&(e=e.replace("قلم","قلمونه")),e},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."},removeAllItems:function(){return"ټول توکي لرې کړئ"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/pt-BR.js b/assets/3rd/select2/js/i18n/pt-BR.js new file mode 100755 index 00000000..c64c7aa4 --- /dev/null +++ b/assets/3rd/select2/js/i18n/pt-BR.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Apague "+n+" caracter";return 1!=n&&(r+="es"),r},inputTooShort:function(e){return"Digite "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var n="Você só pode selecionar "+e.maximum+" ite";return 1==e.maximum?n+="m":n+="ns",n},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/pt.js b/assets/3rd/select2/js/i18n/pt.js new file mode 100755 index 00000000..6ca5e6b1 --- /dev/null +++ b/assets/3rd/select2/js/i18n/pt.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var r=e.input.length-e.maximum,n="Por favor apague "+r+" ";return n+=1!=r?"caracteres":"caractere"},inputTooShort:function(e){return"Introduza "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var r="Apenas pode seleccionar "+e.maximum+" ";return r+=1!=e.maximum?"itens":"item"},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/ro.js b/assets/3rd/select2/js/i18n/ro.js new file mode 100755 index 00000000..3befe800 --- /dev/null +++ b/assets/3rd/select2/js/i18n/ro.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return 1!==t&&(n+="e"),n},inputTooShort:function(e){return"Vă rugăm să introduceți "+(e.minimum-e.input.length)+" sau mai multe caractere"},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",1!==e.maximum&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"},removeAllItems:function(){return"Eliminați toate elementele"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/ru.js b/assets/3rd/select2/js/i18n/ru.js new file mode 100755 index 00000000..8102a321 --- /dev/null +++ b/assets/3rd/select2/js/i18n/ru.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ru",[],function(){function n(n,e,r,u){return n%10<5&&n%10>0&&n%100<5||n%100>20?n%10>1?r:e:u}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Пожалуйста, введите на "+r+" символ";return u+=n(r,"","a","ов"),u+=" меньше"},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Пожалуйста, введите ещё хотя бы "+r+" символ";return u+=n(r,"","a","ов")},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(e){var r="Вы можете выбрать не более "+e.maximum+" элемент";return r+=n(e.maximum,"","a","ов")},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"},removeAllItems:function(){return"Удалить все элементы"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/sk.js b/assets/3rd/select2/js/i18n/sk.js new file mode 100755 index 00000000..19465bc7 --- /dev/null +++ b/assets/3rd/select2/js/i18n/sk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadajte o jeden znak menej":t>=2&&t<=4?"Prosím, zadajte o "+e[t](!0)+" znaky menej":"Prosím, zadajte o "+t+" znakov menej"},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadajte ešte jeden znak":t<=4?"Prosím, zadajte ešte ďalšie "+e[t](!0)+" znaky":"Prosím, zadajte ešte ďalších "+t+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(n){return 1==n.maximum?"Môžete zvoliť len jednu položku":n.maximum>=2&&n.maximum<=4?"Môžete zvoliť najviac "+e[n.maximum](!1)+" položky":"Môžete zvoliť najviac "+n.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"},removeAllItems:function(){return"Odstráňte všetky položky"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/sl.js b/assets/3rd/select2/js/i18n/sl.js new file mode 100755 index 00000000..06c291e5 --- /dev/null +++ b/assets/3rd/select2/js/i18n/sl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Prosim zbrišite "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Prosim vpišite še "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var n="Označite lahko največ "+e.maximum+" predmet";return 2==e.maximum?n+="a":1!=e.maximum&&(n+="e"),n},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"},removeAllItems:function(){return"Odstranite vse elemente"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/sq.js b/assets/3rd/select2/js/i18n/sq.js new file mode 100755 index 00000000..f4cc7932 --- /dev/null +++ b/assets/3rd/select2/js/i18n/sq.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sq",[],function(){return{errorLoading:function(){return"Rezultatet nuk mund të ngarkoheshin."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Të lutem fshi "+n+" karakter";return 1!=n&&(t+="e"),t},inputTooShort:function(e){return"Të lutem shkruaj "+(e.minimum-e.input.length)+" ose më shumë karaktere"},loadingMore:function(){return"Duke ngarkuar më shumë rezultate…"},maximumSelected:function(e){var n="Mund të zgjedhësh vetëm "+e.maximum+" element";return 1!=e.maximum&&(n+="e"),n},noResults:function(){return"Nuk u gjet asnjë rezultat"},searching:function(){return"Duke kërkuar…"},removeAllItems:function(){return"Hiq të gjitha sendet"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/sr-Cyrl.js b/assets/3rd/select2/js/i18n/sr-Cyrl.js new file mode 100755 index 00000000..124a5b20 --- /dev/null +++ b/assets/3rd/select2/js/i18n/sr-Cyrl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr-Cyrl",[],function(){function n(n,e,r,u){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:u}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Обришите "+r+" симбол";return u+=n(r,"","а","а")},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Укуцајте бар још "+r+" симбол";return u+=n(r,"","а","а")},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(e){var r="Можете изабрати само "+e.maximum+" ставк";return r+=n(e.maximum,"у","е","и")},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/sr.js b/assets/3rd/select2/js/i18n/sr.js new file mode 100755 index 00000000..b078face --- /dev/null +++ b/assets/3rd/select2/js/i18n/sr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr",[],function(){function n(n,e,r,t){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(e){var r=e.input.length-e.maximum,t="Obrišite "+r+" simbol";return t+=n(r,"","a","a")},inputTooShort:function(e){var r=e.minimum-e.input.length,t="Ukucajte bar još "+r+" simbol";return t+=n(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(e){var r="Možete izabrati samo "+e.maximum+" stavk";return r+=n(e.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/sv.js b/assets/3rd/select2/js/i18n/sv.js new file mode 100755 index 00000000..3995f65b --- /dev/null +++ b/assets/3rd/select2/js/i18n/sv.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(n){return"Vänligen sudda ut "+(n.input.length-n.maximum)+" tecken"},inputTooShort:function(n){return"Vänligen skriv in "+(n.minimum-n.input.length)+" eller fler tecken"},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(n){return"Du kan max välja "+n.maximum+" element"},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"},removeAllItems:function(){return"Ta bort alla objekt"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/th.js b/assets/3rd/select2/js/i18n/th.js new file mode 100755 index 00000000..2367bfe7 --- /dev/null +++ b/assets/3rd/select2/js/i18n/th.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(n){return"โปรดลบออก "+(n.input.length-n.maximum)+" ตัวอักษร"},inputTooShort:function(n){return"โปรดพิมพ์เพิ่มอีก "+(n.minimum-n.input.length)+" ตัวอักษร"},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(n){return"คุณสามารถเลือกได้ไม่เกิน "+n.maximum+" รายการ"},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"},removeAllItems:function(){return"ลบรายการทั้งหมด"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/tk.js b/assets/3rd/select2/js/i18n/tk.js new file mode 100755 index 00000000..b5a90334 --- /dev/null +++ b/assets/3rd/select2/js/i18n/tk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){return e.input.length-e.maximum+" harp bozuň."},inputTooShort:function(e){return"Ýene-de iň az "+(e.minimum-e.input.length)+" harp ýazyň."},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){return"Diňe "+e.maximum+" sanysyny saýlaň."},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/tr.js b/assets/3rd/select2/js/i18n/tr.js new file mode 100755 index 00000000..b02b3728 --- /dev/null +++ b/assets/3rd/select2/js/i18n/tr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(n){return n.input.length-n.maximum+" karakter daha girmelisiniz"},inputTooShort:function(n){return"En az "+(n.minimum-n.input.length)+" karakter daha girmelisiniz"},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(n){return"Sadece "+n.maximum+" seçim yapabilirsiniz"},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"},removeAllItems:function(){return"Tüm öğeleri kaldır"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/uk.js b/assets/3rd/select2/js/i18n/uk.js new file mode 100755 index 00000000..40b46b47 --- /dev/null +++ b/assets/3rd/select2/js/i18n/uk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/uk",[],function(){function n(n,e,u,r){return n%100>10&&n%100<15?r:n%10==1?e:n%10>1&&n%10<5?u:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(e){return"Будь ласка, видаліть "+(e.input.length-e.maximum)+" "+n(e.maximum,"літеру","літери","літер")},inputTooShort:function(n){return"Будь ласка, введіть "+(n.minimum-n.input.length)+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(e){return"Ви можете вибрати лише "+e.maximum+" "+n(e.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"},removeAllItems:function(){return"Видалити всі елементи"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/vi.js b/assets/3rd/select2/js/i18n/vi.js new file mode 100755 index 00000000..cc58c15e --- /dev/null +++ b/assets/3rd/select2/js/i18n/vi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/vi",[],function(){return{inputTooLong:function(n){return"Vui lòng xóa bớt "+(n.input.length-n.maximum)+" ký tự"},inputTooShort:function(n){return"Vui lòng nhập thêm từ "+(n.minimum-n.input.length)+" ký tự trở lên"},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(n){return"Chỉ có thể chọn được "+n.maximum+" lựa chọn"},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"},removeAllItems:function(){return"Xóa tất cả các mục"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/zh-CN.js b/assets/3rd/select2/js/i18n/zh-CN.js new file mode 100755 index 00000000..3acd4cdb --- /dev/null +++ b/assets/3rd/select2/js/i18n/zh-CN.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(n){return"请删除"+(n.input.length-n.maximum)+"个字符"},inputTooShort:function(n){return"请再输入至少"+(n.minimum-n.input.length)+"个字符"},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(n){return"最多只能选择"+n.maximum+"个项目"},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"},removeAllItems:function(){return"删除所有项目"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/i18n/zh-TW.js b/assets/3rd/select2/js/i18n/zh-TW.js new file mode 100755 index 00000000..cb43386b --- /dev/null +++ b/assets/3rd/select2/js/i18n/zh-TW.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(n){return"請刪掉"+(n.input.length-n.maximum)+"個字元"},inputTooShort:function(n){return"請再輸入"+(n.minimum-n.input.length)+"個字元"},loadingMore:function(){return"載入中…"},maximumSelected:function(n){return"你只能選擇最多"+n.maximum+"項"},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"},removeAllItems:function(){return"刪除所有項目"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/assets/3rd/select2/js/select2.full.js b/assets/3rd/select2/js/select2.full.js new file mode 100755 index 00000000..f3a20b9f --- /dev/null +++ b/assets/3rd/select2/js/select2.full.js @@ -0,0 +1,6597 @@ +/*! + * Select2 4.0.7 + * https://select2.github.io + * + * Released under the MIT license + * https://github.com/select2/select2/blob/master/LICENSE.md + */ +;(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = function (root, jQuery) { + if (jQuery === undefined) { + // require('jQuery') returns a factory that requires window to + // build a jQuery instance, we normalize how we use modules + // that require this pattern but the window provided is a noop + // if it's defined (how jquery works) + if (typeof window !== 'undefined') { + jQuery = require('jquery'); + } + else { + jQuery = require('jquery')(root); + } + } + factory(jQuery); + return jQuery; + }; + } else { + // Browser globals + factory(jQuery); + } +} (function (jQuery) { + // This is needed so we can catch the AMD loader configuration and use it + // The inner file should be wrapped (by `banner.start.js`) in a function that + // returns the AMD loader references. + var S2 =(function () { + // Restore the Select2 AMD loader so it can be used + // Needed mostly in the language files, where the loader is not inserted + if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { + var S2 = jQuery.fn.select2.amd; + } +var S2;(function () { if (!S2 || !S2.requirejs) { +if (!S2) { S2 = {}; } else { require = S2; } +/** + * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. + * Released under MIT license, http://github.com/requirejs/almond/LICENSE + */ +//Going sloppy to avoid 'use strict' string cost, but strict practices should +//be followed. +/*global setTimeout: false */ + +var requirejs, require, define; +(function (undef) { + var main, req, makeMap, handlers, + defined = {}, + waiting = {}, + config = {}, + defining = {}, + hasOwn = Object.prototype.hasOwnProperty, + aps = [].slice, + jsSuffixRegExp = /\.js$/; + + function hasProp(obj, prop) { + return hasOwn.call(obj, prop); + } + + /** + * Given a relative module name, like ./something, normalize it to + * a real name that can be mapped to a path. + * @param {String} name the relative name + * @param {String} baseName a real name that the name arg is relative + * to. + * @returns {String} normalized name + */ + function normalize(name, baseName) { + var nameParts, nameSegment, mapValue, foundMap, lastIndex, + foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, + baseParts = baseName && baseName.split("/"), + map = config.map, + starMap = (map && map['*']) || {}; + + //Adjust any relative paths. + if (name) { + name = name.split('/'); + lastIndex = name.length - 1; + + // If wanting node ID compatibility, strip .js from end + // of IDs. Have to do this here, and not in nameToUrl + // because node allows either .js or non .js to map + // to same file. + if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { + name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); + } + + // Starts with a '.' so need the baseName + if (name[0].charAt(0) === '.' && baseParts) { + //Convert baseName to array, and lop off the last part, + //so that . matches that 'directory' and not name of the baseName's + //module. For instance, baseName of 'one/two/three', maps to + //'one/two/three.js', but we want the directory, 'one/two' for + //this normalization. + normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); + name = normalizedBaseParts.concat(name); + } + + //start trimDots + for (i = 0; i < name.length; i++) { + part = name[i]; + if (part === '.') { + name.splice(i, 1); + i -= 1; + } else if (part === '..') { + // If at the start, or previous value is still .., + // keep them so that when converted to a path it may + // still work when converted to a path, even though + // as an ID it is less than ideal. In larger point + // releases, may be better to just kick out an error. + if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { + continue; + } else if (i > 0) { + name.splice(i - 1, 2); + i -= 2; + } + } + } + //end trimDots + + name = name.join('/'); + } + + //Apply map config if available. + if ((baseParts || starMap) && map) { + nameParts = name.split('/'); + + for (i = nameParts.length; i > 0; i -= 1) { + nameSegment = nameParts.slice(0, i).join("/"); + + if (baseParts) { + //Find the longest baseName segment match in the config. + //So, do joins on the biggest to smallest lengths of baseParts. + for (j = baseParts.length; j > 0; j -= 1) { + mapValue = map[baseParts.slice(0, j).join('/')]; + + //baseName segment has config, find if it has one for + //this name. + if (mapValue) { + mapValue = mapValue[nameSegment]; + if (mapValue) { + //Match, update name to the new value. + foundMap = mapValue; + foundI = i; + break; + } + } + } + } + + if (foundMap) { + break; + } + + //Check for a star map match, but just hold on to it, + //if there is a shorter segment match later in a matching + //config, then favor over this star map. + if (!foundStarMap && starMap && starMap[nameSegment]) { + foundStarMap = starMap[nameSegment]; + starI = i; + } + } + + if (!foundMap && foundStarMap) { + foundMap = foundStarMap; + foundI = starI; + } + + if (foundMap) { + nameParts.splice(0, foundI, foundMap); + name = nameParts.join('/'); + } + } + + return name; + } + + function makeRequire(relName, forceSync) { + return function () { + //A version of a require function that passes a moduleName + //value for items that may need to + //look up paths relative to the moduleName + var args = aps.call(arguments, 0); + + //If first arg is not require('string'), and there is only + //one arg, it is the array form without a callback. Insert + //a null so that the following concat is correct. + if (typeof args[0] !== 'string' && args.length === 1) { + args.push(null); + } + return req.apply(undef, args.concat([relName, forceSync])); + }; + } + + function makeNormalize(relName) { + return function (name) { + return normalize(name, relName); + }; + } + + function makeLoad(depName) { + return function (value) { + defined[depName] = value; + }; + } + + function callDep(name) { + if (hasProp(waiting, name)) { + var args = waiting[name]; + delete waiting[name]; + defining[name] = true; + main.apply(undef, args); + } + + if (!hasProp(defined, name) && !hasProp(defining, name)) { + throw new Error('No ' + name); + } + return defined[name]; + } + + //Turns a plugin!resource to [plugin, resource] + //with the plugin being undefined if the name + //did not have a plugin prefix. + function splitPrefix(name) { + var prefix, + index = name ? name.indexOf('!') : -1; + if (index > -1) { + prefix = name.substring(0, index); + name = name.substring(index + 1, name.length); + } + return [prefix, name]; + } + + //Creates a parts array for a relName where first part is plugin ID, + //second part is resource ID. Assumes relName has already been normalized. + function makeRelParts(relName) { + return relName ? splitPrefix(relName) : []; + } + + /** + * Makes a name map, normalizing the name, and using a plugin + * for normalization if necessary. Grabs a ref to plugin + * too, as an optimization. + */ + makeMap = function (name, relParts) { + var plugin, + parts = splitPrefix(name), + prefix = parts[0], + relResourceName = relParts[1]; + + name = parts[1]; + + if (prefix) { + prefix = normalize(prefix, relResourceName); + plugin = callDep(prefix); + } + + //Normalize according + if (prefix) { + if (plugin && plugin.normalize) { + name = plugin.normalize(name, makeNormalize(relResourceName)); + } else { + name = normalize(name, relResourceName); + } + } else { + name = normalize(name, relResourceName); + parts = splitPrefix(name); + prefix = parts[0]; + name = parts[1]; + if (prefix) { + plugin = callDep(prefix); + } + } + + //Using ridiculous property names for space reasons + return { + f: prefix ? prefix + '!' + name : name, //fullName + n: name, + pr: prefix, + p: plugin + }; + }; + + function makeConfig(name) { + return function () { + return (config && config.config && config.config[name]) || {}; + }; + } + + handlers = { + require: function (name) { + return makeRequire(name); + }, + exports: function (name) { + var e = defined[name]; + if (typeof e !== 'undefined') { + return e; + } else { + return (defined[name] = {}); + } + }, + module: function (name) { + return { + id: name, + uri: '', + exports: defined[name], + config: makeConfig(name) + }; + } + }; + + main = function (name, deps, callback, relName) { + var cjsModule, depName, ret, map, i, relParts, + args = [], + callbackType = typeof callback, + usingExports; + + //Use name if no relName + relName = relName || name; + relParts = makeRelParts(relName); + + //Call the callback to define the module, if necessary. + if (callbackType === 'undefined' || callbackType === 'function') { + //Pull out the defined dependencies and pass the ordered + //values to the callback. + //Default to [require, exports, module] if no deps + deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; + for (i = 0; i < deps.length; i += 1) { + map = makeMap(deps[i], relParts); + depName = map.f; + + //Fast path CommonJS standard dependencies. + if (depName === "require") { + args[i] = handlers.require(name); + } else if (depName === "exports") { + //CommonJS module spec 1.1 + args[i] = handlers.exports(name); + usingExports = true; + } else if (depName === "module") { + //CommonJS module spec 1.1 + cjsModule = args[i] = handlers.module(name); + } else if (hasProp(defined, depName) || + hasProp(waiting, depName) || + hasProp(defining, depName)) { + args[i] = callDep(depName); + } else if (map.p) { + map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); + args[i] = defined[depName]; + } else { + throw new Error(name + ' missing ' + depName); + } + } + + ret = callback ? callback.apply(defined[name], args) : undefined; + + if (name) { + //If setting exports via "module" is in play, + //favor that over return value and exports. After that, + //favor a non-undefined return value over exports use. + if (cjsModule && cjsModule.exports !== undef && + cjsModule.exports !== defined[name]) { + defined[name] = cjsModule.exports; + } else if (ret !== undef || !usingExports) { + //Use the return value from the function. + defined[name] = ret; + } + } + } else if (name) { + //May just be an object definition for the module. Only + //worry about defining if have a module name. + defined[name] = callback; + } + }; + + requirejs = require = req = function (deps, callback, relName, forceSync, alt) { + if (typeof deps === "string") { + if (handlers[deps]) { + //callback in this case is really relName + return handlers[deps](callback); + } + //Just return the module wanted. In this scenario, the + //deps arg is the module name, and second arg (if passed) + //is just the relName. + //Normalize module name, if it contains . or .. + return callDep(makeMap(deps, makeRelParts(callback)).f); + } else if (!deps.splice) { + //deps is a config object, not an array. + config = deps; + if (config.deps) { + req(config.deps, config.callback); + } + if (!callback) { + return; + } + + if (callback.splice) { + //callback is an array, which means it is a dependency list. + //Adjust args if there are dependencies + deps = callback; + callback = relName; + relName = null; + } else { + deps = undef; + } + } + + //Support require(['a']) + callback = callback || function () {}; + + //If relName is a function, it is an errback handler, + //so remove it. + if (typeof relName === 'function') { + relName = forceSync; + forceSync = alt; + } + + //Simulate async callback; + if (forceSync) { + main(undef, deps, callback, relName); + } else { + //Using a non-zero value because of concern for what old browsers + //do, and latest browsers "upgrade" to 4 if lower value is used: + //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: + //If want a value immediately, use require('id') instead -- something + //that works in almond on the global level, but not guaranteed and + //unlikely to work in other AMD implementations. + setTimeout(function () { + main(undef, deps, callback, relName); + }, 4); + } + + return req; + }; + + /** + * Just drops the config on the floor, but returns req in case + * the config return value is used. + */ + req.config = function (cfg) { + return req(cfg); + }; + + /** + * Expose module registry for debugging and tooling + */ + requirejs._defined = defined; + + define = function (name, deps, callback) { + if (typeof name !== 'string') { + throw new Error('See almond README: incorrect module build, no module name'); + } + + //This module may not have dependencies + if (!deps.splice) { + //deps is not an array, so probably means + //an object literal or factory function for + //the value. Adjust args. + callback = deps; + deps = []; + } + + if (!hasProp(defined, name) && !hasProp(waiting, name)) { + waiting[name] = [name, deps, callback]; + } + }; + + define.amd = { + jQuery: true + }; +}()); + +S2.requirejs = requirejs;S2.require = require;S2.define = define; +} +}()); +S2.define("almond", function(){}); + +/* global jQuery:false, $:false */ +S2.define('jquery',[],function () { + var _$ = jQuery || $; + + if (_$ == null && console && console.error) { + console.error( + 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + + 'found. Make sure that you are including jQuery before Select2 on your ' + + 'web page.' + ); + } + + return _$; +}); + +S2.define('select2/utils',[ + 'jquery' +], function ($) { + var Utils = {}; + + Utils.Extend = function (ChildClass, SuperClass) { + var __hasProp = {}.hasOwnProperty; + + function BaseConstructor () { + this.constructor = ChildClass; + } + + for (var key in SuperClass) { + if (__hasProp.call(SuperClass, key)) { + ChildClass[key] = SuperClass[key]; + } + } + + BaseConstructor.prototype = SuperClass.prototype; + ChildClass.prototype = new BaseConstructor(); + ChildClass.__super__ = SuperClass.prototype; + + return ChildClass; + }; + + function getMethods (theClass) { + var proto = theClass.prototype; + + var methods = []; + + for (var methodName in proto) { + var m = proto[methodName]; + + if (typeof m !== 'function') { + continue; + } + + if (methodName === 'constructor') { + continue; + } + + methods.push(methodName); + } + + return methods; + } + + Utils.Decorate = function (SuperClass, DecoratorClass) { + var decoratedMethods = getMethods(DecoratorClass); + var superMethods = getMethods(SuperClass); + + function DecoratedClass () { + var unshift = Array.prototype.unshift; + + var argCount = DecoratorClass.prototype.constructor.length; + + var calledConstructor = SuperClass.prototype.constructor; + + if (argCount > 0) { + unshift.call(arguments, SuperClass.prototype.constructor); + + calledConstructor = DecoratorClass.prototype.constructor; + } + + calledConstructor.apply(this, arguments); + } + + DecoratorClass.displayName = SuperClass.displayName; + + function ctr () { + this.constructor = DecoratedClass; + } + + DecoratedClass.prototype = new ctr(); + + for (var m = 0; m < superMethods.length; m++) { + var superMethod = superMethods[m]; + + DecoratedClass.prototype[superMethod] = + SuperClass.prototype[superMethod]; + } + + var calledMethod = function (methodName) { + // Stub out the original method if it's not decorating an actual method + var originalMethod = function () {}; + + if (methodName in DecoratedClass.prototype) { + originalMethod = DecoratedClass.prototype[methodName]; + } + + var decoratedMethod = DecoratorClass.prototype[methodName]; + + return function () { + var unshift = Array.prototype.unshift; + + unshift.call(arguments, originalMethod); + + return decoratedMethod.apply(this, arguments); + }; + }; + + for (var d = 0; d < decoratedMethods.length; d++) { + var decoratedMethod = decoratedMethods[d]; + + DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); + } + + return DecoratedClass; + }; + + var Observable = function () { + this.listeners = {}; + }; + + Observable.prototype.on = function (event, callback) { + this.listeners = this.listeners || {}; + + if (event in this.listeners) { + this.listeners[event].push(callback); + } else { + this.listeners[event] = [callback]; + } + }; + + Observable.prototype.trigger = function (event) { + var slice = Array.prototype.slice; + var params = slice.call(arguments, 1); + + this.listeners = this.listeners || {}; + + // Params should always come in as an array + if (params == null) { + params = []; + } + + // If there are no arguments to the event, use a temporary object + if (params.length === 0) { + params.push({}); + } + + // Set the `_type` of the first object to the event + params[0]._type = event; + + if (event in this.listeners) { + this.invoke(this.listeners[event], slice.call(arguments, 1)); + } + + if ('*' in this.listeners) { + this.invoke(this.listeners['*'], arguments); + } + }; + + Observable.prototype.invoke = function (listeners, params) { + for (var i = 0, len = listeners.length; i < len; i++) { + listeners[i].apply(this, params); + } + }; + + Utils.Observable = Observable; + + Utils.generateChars = function (length) { + var chars = ''; + + for (var i = 0; i < length; i++) { + var randomChar = Math.floor(Math.random() * 36); + chars += randomChar.toString(36); + } + + return chars; + }; + + Utils.bind = function (func, context) { + return function () { + func.apply(context, arguments); + }; + }; + + Utils._convertData = function (data) { + for (var originalKey in data) { + var keys = originalKey.split('-'); + + var dataLevel = data; + + if (keys.length === 1) { + continue; + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k]; + + // Lowercase the first letter + // By default, dash-separated becomes camelCase + key = key.substring(0, 1).toLowerCase() + key.substring(1); + + if (!(key in dataLevel)) { + dataLevel[key] = {}; + } + + if (k == keys.length - 1) { + dataLevel[key] = data[originalKey]; + } + + dataLevel = dataLevel[key]; + } + + delete data[originalKey]; + } + + return data; + }; + + Utils.hasScroll = function (index, el) { + // Adapted from the function created by @ShadowScripter + // and adapted by @BillBarry on the Stack Exchange Code Review website. + // The original code can be found at + // http://codereview.stackexchange.com/q/13338 + // and was designed to be used with the Sizzle selector engine. + + var $el = $(el); + var overflowX = el.style.overflowX; + var overflowY = el.style.overflowY; + + //Check both x and y declarations + if (overflowX === overflowY && + (overflowY === 'hidden' || overflowY === 'visible')) { + return false; + } + + if (overflowX === 'scroll' || overflowY === 'scroll') { + return true; + } + + return ($el.innerHeight() < el.scrollHeight || + $el.innerWidth() < el.scrollWidth); + }; + + Utils.escapeMarkup = function (markup) { + var replaceMap = { + '\\': '\', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + '/': '/' + }; + + // Do not try to escape the markup if it's not a string + if (typeof markup !== 'string') { + return markup; + } + + return String(markup).replace(/[&<>"'\/\\]/g, function (match) { + return replaceMap[match]; + }); + }; + + // Append an array of jQuery nodes to a given element. + Utils.appendMany = function ($element, $nodes) { + // jQuery 1.7.x does not support $.fn.append() with an array + // Fall back to a jQuery object collection using $.fn.add() + if ($.fn.jquery.substr(0, 3) === '1.7') { + var $jqNodes = $(); + + $.map($nodes, function (node) { + $jqNodes = $jqNodes.add(node); + }); + + $nodes = $jqNodes; + } + + $element.append($nodes); + }; + + // Cache objects in Utils.__cache instead of $.data (see #4346) + Utils.__cache = {}; + + var id = 0; + Utils.GetUniqueElementId = function (element) { + // Get a unique element Id. If element has no id, + // creates a new unique number, stores it in the id + // attribute and returns the new id. + // If an id already exists, it simply returns it. + + var select2Id = element.getAttribute('data-select2-id'); + if (select2Id == null) { + // If element has id, use it. + if (element.id) { + select2Id = element.id; + element.setAttribute('data-select2-id', select2Id); + } else { + element.setAttribute('data-select2-id', ++id); + select2Id = id.toString(); + } + } + return select2Id; + }; + + Utils.StoreData = function (element, name, value) { + // Stores an item in the cache for a specified element. + // name is the cache key. + var id = Utils.GetUniqueElementId(element); + if (!Utils.__cache[id]) { + Utils.__cache[id] = {}; + } + + Utils.__cache[id][name] = value; + }; + + Utils.GetData = function (element, name) { + // Retrieves a value from the cache by its key (name) + // name is optional. If no name specified, return + // all cache items for the specified element. + // and for a specified element. + var id = Utils.GetUniqueElementId(element); + if (name) { + if (Utils.__cache[id]) { + if (Utils.__cache[id][name] != null) { + return Utils.__cache[id][name]; + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } else { + return Utils.__cache[id]; + } + }; + + Utils.RemoveData = function (element) { + // Removes all cached items for a specified element. + var id = Utils.GetUniqueElementId(element); + if (Utils.__cache[id] != null) { + delete Utils.__cache[id]; + } + }; + + return Utils; +}); + +S2.define('select2/results',[ + 'jquery', + './utils' +], function ($, Utils) { + function Results ($element, options, dataAdapter) { + this.$element = $element; + this.data = dataAdapter; + this.options = options; + + Results.__super__.constructor.call(this); + } + + Utils.Extend(Results, Utils.Observable); + + Results.prototype.render = function () { + var $results = $( + '
    ' + ); + + if (this.options.get('multiple')) { + $results.attr('aria-multiselectable', 'true'); + } + + this.$results = $results; + + return $results; + }; + + Results.prototype.clear = function () { + this.$results.empty(); + }; + + Results.prototype.displayMessage = function (params) { + var escapeMarkup = this.options.get('escapeMarkup'); + + this.clear(); + this.hideLoading(); + + var $message = $( + '
  • ' + ); + + var message = this.options.get('translations').get(params.message); + + $message.append( + escapeMarkup( + message(params.args) + ) + ); + + $message[0].className += ' select2-results__message'; + + this.$results.append($message); + }; + + Results.prototype.hideMessages = function () { + this.$results.find('.select2-results__message').remove(); + }; + + Results.prototype.append = function (data) { + this.hideLoading(); + + var $options = []; + + if (data.results == null || data.results.length === 0) { + if (this.$results.children().length === 0) { + this.trigger('results:message', { + message: 'noResults' + }); + } + + return; + } + + data.results = this.sort(data.results); + + for (var d = 0; d < data.results.length; d++) { + var item = data.results[d]; + + var $option = this.option(item); + + $options.push($option); + } + + this.$results.append($options); + }; + + Results.prototype.position = function ($results, $dropdown) { + var $resultsContainer = $dropdown.find('.select2-results'); + $resultsContainer.append($results); + }; + + Results.prototype.sort = function (data) { + var sorter = this.options.get('sorter'); + + return sorter(data); + }; + + Results.prototype.highlightFirstItem = function () { + var $options = this.$results + .find('.select2-results__option[aria-selected]'); + + var $selected = $options.filter('[aria-selected=true]'); + + // Check if there are any selected options + if ($selected.length > 0) { + // If there are selected options, highlight the first + $selected.first().trigger('mouseenter'); + } else { + // If there are no selected options, highlight the first option + // in the dropdown + $options.first().trigger('mouseenter'); + } + + this.ensureHighlightVisible(); + }; + + Results.prototype.setClasses = function () { + var self = this; + + this.data.current(function (selected) { + var selectedIds = $.map(selected, function (s) { + return s.id.toString(); + }); + + var $options = self.$results + .find('.select2-results__option[aria-selected]'); + + $options.each(function () { + var $option = $(this); + + var item = Utils.GetData(this, 'data'); + + // id needs to be converted to a string when comparing + var id = '' + item.id; + + if ((item.element != null && item.element.selected) || + (item.element == null && $.inArray(id, selectedIds) > -1)) { + $option.attr('aria-selected', 'true'); + } else { + $option.attr('aria-selected', 'false'); + } + }); + + }); + }; + + Results.prototype.showLoading = function (params) { + this.hideLoading(); + + var loadingMore = this.options.get('translations').get('searching'); + + var loading = { + disabled: true, + loading: true, + text: loadingMore(params) + }; + var $loading = this.option(loading); + $loading.className += ' loading-results'; + + this.$results.prepend($loading); + }; + + Results.prototype.hideLoading = function () { + this.$results.find('.loading-results').remove(); + }; + + Results.prototype.option = function (data) { + var option = document.createElement('li'); + option.className = 'select2-results__option'; + + var attrs = { + 'role': 'treeitem', + 'aria-selected': 'false' + }; + + if (data.disabled) { + delete attrs['aria-selected']; + attrs['aria-disabled'] = 'true'; + } + + if (data.id == null) { + delete attrs['aria-selected']; + } + + if (data._resultId != null) { + option.id = data._resultId; + } + + if (data.title) { + option.title = data.title; + } + + if (data.children) { + attrs.role = 'group'; + attrs['aria-label'] = data.text; + delete attrs['aria-selected']; + } + + for (var attr in attrs) { + var val = attrs[attr]; + + option.setAttribute(attr, val); + } + + if (data.children) { + var $option = $(option); + + var label = document.createElement('strong'); + label.className = 'select2-results__group'; + + var $label = $(label); + this.template(data, label); + + var $children = []; + + for (var c = 0; c < data.children.length; c++) { + var child = data.children[c]; + + var $child = this.option(child); + + $children.push($child); + } + + var $childrenContainer = $('
      ', { + 'class': 'select2-results__options select2-results__options--nested' + }); + + $childrenContainer.append($children); + + $option.append(label); + $option.append($childrenContainer); + } else { + this.template(data, option); + } + + Utils.StoreData(option, 'data', data); + + return option; + }; + + Results.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-results'; + + this.$results.attr('id', id); + + container.on('results:all', function (params) { + self.clear(); + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + self.highlightFirstItem(); + } + }); + + container.on('results:append', function (params) { + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + } + }); + + container.on('query', function (params) { + self.hideMessages(); + self.showLoading(params); + }); + + container.on('select', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } + }); + + container.on('unselect', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } + }); + + container.on('open', function () { + // When the dropdown is open, aria-expended="true" + self.$results.attr('aria-expanded', 'true'); + self.$results.attr('aria-hidden', 'false'); + + self.setClasses(); + self.ensureHighlightVisible(); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expended="false" + self.$results.attr('aria-expanded', 'false'); + self.$results.attr('aria-hidden', 'true'); + self.$results.removeAttr('aria-activedescendant'); + }); + + container.on('results:toggle', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + $highlighted.trigger('mouseup'); + }); + + container.on('results:select', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var data = Utils.GetData($highlighted[0], 'data'); + + if ($highlighted.attr('aria-selected') == 'true') { + self.trigger('close', {}); + } else { + self.trigger('select', { + data: data + }); + } + }); + + container.on('results:previous', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + // If we are already at the top, don't move further + // If no options, currentIndex will be -1 + if (currentIndex <= 0) { + return; + } + + var nextIndex = currentIndex - 1; + + // If none are highlighted, highlight the first + if ($highlighted.length === 0) { + nextIndex = 0; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top; + var nextTop = $next.offset().top; + var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextTop - currentOffset < 0) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:next', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var nextIndex = currentIndex + 1; + + // If we are at the last option, stay there + if (nextIndex >= $options.length) { + return; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var nextBottom = $next.offset().top + $next.outerHeight(false); + var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextBottom > currentOffset) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:focus', function (params) { + params.element.addClass('select2-results__option--highlighted'); + }); + + container.on('results:message', function (params) { + self.displayMessage(params); + }); + + if ($.fn.mousewheel) { + this.$results.on('mousewheel', function (e) { + var top = self.$results.scrollTop(); + + var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; + + var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; + var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); + + if (isAtTop) { + self.$results.scrollTop(0); + + e.preventDefault(); + e.stopPropagation(); + } else if (isAtBottom) { + self.$results.scrollTop( + self.$results.get(0).scrollHeight - self.$results.height() + ); + + e.preventDefault(); + e.stopPropagation(); + } + }); + } + + this.$results.on('mouseup', '.select2-results__option[aria-selected]', + function (evt) { + var $this = $(this); + + var data = Utils.GetData(this, 'data'); + + if ($this.attr('aria-selected') === 'true') { + if (self.options.get('multiple')) { + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } else { + self.trigger('close', {}); + } + + return; + } + + self.trigger('select', { + originalEvent: evt, + data: data + }); + }); + + this.$results.on('mouseenter', '.select2-results__option[aria-selected]', + function (evt) { + var data = Utils.GetData(this, 'data'); + + self.getHighlightedResults() + .removeClass('select2-results__option--highlighted'); + + self.trigger('results:focus', { + data: data, + element: $(this) + }); + }); + }; + + Results.prototype.getHighlightedResults = function () { + var $highlighted = this.$results + .find('.select2-results__option--highlighted'); + + return $highlighted; + }; + + Results.prototype.destroy = function () { + this.$results.remove(); + }; + + Results.prototype.ensureHighlightVisible = function () { + var $highlighted = this.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var $options = this.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var currentOffset = this.$results.offset().top; + var nextTop = $highlighted.offset().top; + var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); + + var offsetDelta = nextTop - currentOffset; + nextOffset -= $highlighted.outerHeight(false) * 2; + + if (currentIndex <= 2) { + this.$results.scrollTop(0); + } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { + this.$results.scrollTop(nextOffset); + } + }; + + Results.prototype.template = function (result, container) { + var template = this.options.get('templateResult'); + var escapeMarkup = this.options.get('escapeMarkup'); + + var content = template(result, container); + + if (content == null) { + container.style.display = 'none'; + } else if (typeof content === 'string') { + container.innerHTML = escapeMarkup(content); + } else { + $(container).append(content); + } + }; + + return Results; +}); + +S2.define('select2/keys',[ + +], function () { + var KEYS = { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + ESC: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + DELETE: 46 + }; + + return KEYS; +}); + +S2.define('select2/selection/base',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function BaseSelection ($element, options) { + this.$element = $element; + this.options = options; + + BaseSelection.__super__.constructor.call(this); + } + + Utils.Extend(BaseSelection, Utils.Observable); + + BaseSelection.prototype.render = function () { + var $selection = $( + '' + ); + + this._tabindex = 0; + + if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { + this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); + } else if (this.$element.attr('tabindex') != null) { + this._tabindex = this.$element.attr('tabindex'); + } + + $selection.attr('title', this.$element.attr('title')); + $selection.attr('tabindex', this._tabindex); + + this.$selection = $selection; + + return $selection; + }; + + BaseSelection.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-container'; + var resultsId = container.id + '-results'; + + this.container = container; + + this.$selection.on('focus', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('blur', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', function (evt) { + self.trigger('keypress', evt); + + if (evt.which === KEYS.SPACE) { + evt.preventDefault(); + } + }); + + container.on('results:focus', function (params) { + self.$selection.attr('aria-activedescendant', params.data._resultId); + }); + + container.on('selection:update', function (params) { + self.update(params.data); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expanded="true" + self.$selection.attr('aria-expanded', 'true'); + self.$selection.attr('aria-owns', resultsId); + + self._attachCloseHandler(container); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expanded="false" + self.$selection.attr('aria-expanded', 'false'); + self.$selection.removeAttr('aria-activedescendant'); + self.$selection.removeAttr('aria-owns'); + + window.setTimeout(function () { + self.$selection.focus(); + }, 0); + + self._detachCloseHandler(container); + }); + + container.on('enable', function () { + self.$selection.attr('tabindex', self._tabindex); + }); + + container.on('disable', function () { + self.$selection.attr('tabindex', '-1'); + }); + }; + + BaseSelection.prototype._handleBlur = function (evt) { + var self = this; + + // This needs to be delayed as the active element is the body when the tab + // key is pressed, possibly along with others. + window.setTimeout(function () { + // Don't trigger `blur` if the focus is still in the selection + if ( + (document.activeElement == self.$selection[0]) || + ($.contains(self.$selection[0], document.activeElement)) + ) { + return; + } + + self.trigger('blur', evt); + }, 1); + }; + + BaseSelection.prototype._attachCloseHandler = function (container) { + var self = this; + + $(document.body).on('mousedown.select2.' + container.id, function (e) { + var $target = $(e.target); + + var $select = $target.closest('.select2'); + + var $all = $('.select2.select2-container--open'); + + $all.each(function () { + var $this = $(this); + + if (this == $select[0]) { + return; + } + + var $element = Utils.GetData(this, 'element'); + + $element.select2('close'); + }); + }); + }; + + BaseSelection.prototype._detachCloseHandler = function (container) { + $(document.body).off('mousedown.select2.' + container.id); + }; + + BaseSelection.prototype.position = function ($selection, $container) { + var $selectionContainer = $container.find('.selection'); + $selectionContainer.append($selection); + }; + + BaseSelection.prototype.destroy = function () { + this._detachCloseHandler(this.container); + }; + + BaseSelection.prototype.update = function (data) { + throw new Error('The `update` method must be defined in child classes.'); + }; + + return BaseSelection; +}); + +S2.define('select2/selection/single',[ + 'jquery', + './base', + '../utils', + '../keys' +], function ($, BaseSelection, Utils, KEYS) { + function SingleSelection () { + SingleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(SingleSelection, BaseSelection); + + SingleSelection.prototype.render = function () { + var $selection = SingleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--single'); + + $selection.html( + '' + + '' + + '' + + '' + ); + + return $selection; + }; + + SingleSelection.prototype.bind = function (container, $container) { + var self = this; + + SingleSelection.__super__.bind.apply(this, arguments); + + var id = container.id + '-container'; + + this.$selection.find('.select2-selection__rendered') + .attr('id', id) + .attr('role', 'textbox') + .attr('aria-readonly', 'true'); + this.$selection.attr('aria-labelledby', id); + + this.$selection.on('mousedown', function (evt) { + // Only respond to left clicks + if (evt.which !== 1) { + return; + } + + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on('focus', function (evt) { + // User focuses on the container + }); + + this.$selection.on('blur', function (evt) { + // User exits the container + }); + + container.on('focus', function (evt) { + if (!container.isOpen()) { + self.$selection.focus(); + } + }); + }; + + SingleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); // clear tooltip on empty + }; + + SingleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + SingleSelection.prototype.selectionContainer = function () { + return $(''); + }; + + SingleSelection.prototype.update = function (data) { + if (data.length === 0) { + this.clear(); + return; + } + + var selection = data[0]; + + var $rendered = this.$selection.find('.select2-selection__rendered'); + var formatted = this.display(selection, $rendered); + + $rendered.empty().append(formatted); + $rendered.attr('title', selection.title || selection.text); + }; + + return SingleSelection; +}); + +S2.define('select2/selection/multiple',[ + 'jquery', + './base', + '../utils' +], function ($, BaseSelection, Utils) { + function MultipleSelection ($element, options) { + MultipleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(MultipleSelection, BaseSelection); + + MultipleSelection.prototype.render = function () { + var $selection = MultipleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--multiple'); + + $selection.html( + '
        ' + ); + + return $selection; + }; + + MultipleSelection.prototype.bind = function (container, $container) { + var self = this; + + MultipleSelection.__super__.bind.apply(this, arguments); + + this.$selection.on('click', function (evt) { + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on( + 'click', + '.select2-selection__choice__remove', + function (evt) { + // Ignore the event if it is disabled + if (self.options.get('disabled')) { + return; + } + + var $remove = $(this); + var $selection = $remove.parent(); + + var data = Utils.GetData($selection[0], 'data'); + + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } + ); + }; + + MultipleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); + }; + + MultipleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + MultipleSelection.prototype.selectionContainer = function () { + var $container = $( + '
      • ' + + '' + + '×' + + '' + + '
      • ' + ); + + return $container; + }; + + MultipleSelection.prototype.update = function (data) { + this.clear(); + + if (data.length === 0) { + return; + } + + var $selections = []; + + for (var d = 0; d < data.length; d++) { + var selection = data[d]; + + var $selection = this.selectionContainer(); + var formatted = this.display(selection, $selection); + + $selection.append(formatted); + $selection.attr('title', selection.title || selection.text); + + Utils.StoreData($selection[0], 'data', selection); + + $selections.push($selection); + } + + var $rendered = this.$selection.find('.select2-selection__rendered'); + + Utils.appendMany($rendered, $selections); + }; + + return MultipleSelection; +}); + +S2.define('select2/selection/placeholder',[ + '../utils' +], function (Utils) { + function Placeholder (decorated, $element, options) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options); + } + + Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { + var $placeholder = this.selectionContainer(); + + $placeholder.html(this.display(placeholder)); + $placeholder.addClass('select2-selection__placeholder') + .removeClass('select2-selection__choice'); + + return $placeholder; + }; + + Placeholder.prototype.update = function (decorated, data) { + var singlePlaceholder = ( + data.length == 1 && data[0].id != this.placeholder.id + ); + var multipleSelections = data.length > 1; + + if (multipleSelections || singlePlaceholder) { + return decorated.call(this, data); + } + + this.clear(); + + var $placeholder = this.createPlaceholder(this.placeholder); + + this.$selection.find('.select2-selection__rendered').append($placeholder); + }; + + return Placeholder; +}); + +S2.define('select2/selection/allowClear',[ + 'jquery', + '../keys', + '../utils' +], function ($, KEYS, Utils) { + function AllowClear () { } + + AllowClear.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + if (this.placeholder == null) { + if (this.options.get('debug') && window.console && console.error) { + console.error( + 'Select2: The `allowClear` option should be used in combination ' + + 'with the `placeholder` option.' + ); + } + } + + this.$selection.on('mousedown', '.select2-selection__clear', + function (evt) { + self._handleClear(evt); + }); + + container.on('keypress', function (evt) { + self._handleKeyboardClear(evt, container); + }); + }; + + AllowClear.prototype._handleClear = function (_, evt) { + // Ignore the event if it is disabled + if (this.options.get('disabled')) { + return; + } + + var $clear = this.$selection.find('.select2-selection__clear'); + + // Ignore the event if nothing has been selected + if ($clear.length === 0) { + return; + } + + evt.stopPropagation(); + + var data = Utils.GetData($clear[0], 'data'); + + var previousVal = this.$element.val(); + this.$element.val(this.placeholder.id); + + var unselectData = { + data: data + }; + this.trigger('clear', unselectData); + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + + for (var d = 0; d < data.length; d++) { + unselectData = { + data: data[d] + }; + + // Trigger the `unselect` event, so people can prevent it from being + // cleared. + this.trigger('unselect', unselectData); + + // If the event was prevented, don't clear it out. + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + } + + this.$element.trigger('change'); + + this.trigger('toggle', {}); + }; + + AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { + if (container.isOpen()) { + return; + } + + if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { + this._handleClear(evt); + } + }; + + AllowClear.prototype.update = function (decorated, data) { + decorated.call(this, data); + + if (this.$selection.find('.select2-selection__placeholder').length > 0 || + data.length === 0) { + return; + } + + var removeAll = this.options.get('translations').get('removeAllItems'); + + var $remove = $( + '' + + '×' + + '' + ); + Utils.StoreData($remove[0], 'data', data); + + this.$selection.find('.select2-selection__rendered').prepend($remove); + }; + + return AllowClear; +}); + +S2.define('select2/selection/search',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function Search (decorated, $element, options) { + decorated.call(this, $element, options); + } + + Search.prototype.render = function (decorated) { + var $search = $( + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + var $rendered = decorated.call(this); + + this._transferTabIndex(); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('open', function () { + self.$search.trigger('focus'); + }); + + container.on('close', function () { + self.$search.val(''); + self.$search.removeAttr('aria-activedescendant'); + self.$search.trigger('focus'); + }); + + container.on('enable', function () { + self.$search.prop('disabled', false); + + self._transferTabIndex(); + }); + + container.on('disable', function () { + self.$search.prop('disabled', true); + }); + + container.on('focus', function (evt) { + self.$search.trigger('focus'); + }); + + container.on('results:focus', function (params) { + self.$search.attr('aria-activedescendant', params.id); + }); + + this.$selection.on('focusin', '.select2-search--inline', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('focusout', '.select2-search--inline', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', '.select2-search--inline', function (evt) { + evt.stopPropagation(); + + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + + var key = evt.which; + + if (key === KEYS.BACKSPACE && self.$search.val() === '') { + var $previousChoice = self.$searchContainer + .prev('.select2-selection__choice'); + + if ($previousChoice.length > 0) { + var item = Utils.GetData($previousChoice[0], 'data'); + + self.searchRemoveChoice(item); + + evt.preventDefault(); + } + } + }); + + // Try to detect the IE version should the `documentMode` property that + // is stored on the document. This is only implemented in IE and is + // slightly cleaner than doing a user agent check. + // This property is not available in Edge, but Edge also doesn't have + // this bug. + var msie = document.documentMode; + var disableInputEvents = msie && msie <= 11; + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$selection.on( + 'input.searchcheck', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents) { + self.$selection.off('input.search input.searchcheck'); + return; + } + + // Unbind the duplicated `keyup` event + self.$selection.off('keyup.search'); + } + ); + + this.$selection.on( + 'keyup.search input.search', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents && evt.type === 'input') { + self.$selection.off('input.search input.searchcheck'); + return; + } + + var key = evt.which; + + // We can freely ignore events from modifier keys + if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { + return; + } + + // Tabbing will be handled during the `keydown` phase + if (key == KEYS.TAB) { + return; + } + + self.handleSearch(evt); + } + ); + }; + + /** + * This method will transfer the tabindex attribute from the rendered + * selection to the search box. This allows for the search box to be used as + * the primary focus instead of the selection container. + * + * @private + */ + Search.prototype._transferTabIndex = function (decorated) { + this.$search.attr('tabindex', this.$selection.attr('tabindex')); + this.$selection.attr('tabindex', '-1'); + }; + + Search.prototype.createPlaceholder = function (decorated, placeholder) { + this.$search.attr('placeholder', placeholder.text); + }; + + Search.prototype.update = function (decorated, data) { + var searchHadFocus = this.$search[0] == document.activeElement; + + this.$search.attr('placeholder', ''); + + decorated.call(this, data); + + this.$selection.find('.select2-selection__rendered') + .append(this.$searchContainer); + + this.resizeSearch(); + if (searchHadFocus) { + var isTagInput = this.$element.find('[data-select2-tag]').length; + if (isTagInput) { + // fix IE11 bug where tag input lost focus + this.$element.focus(); + } else { + this.$search.focus(); + } + } + }; + + Search.prototype.handleSearch = function () { + this.resizeSearch(); + + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.searchRemoveChoice = function (decorated, item) { + this.trigger('unselect', { + data: item + }); + + this.$search.val(item.text); + this.handleSearch(); + }; + + Search.prototype.resizeSearch = function () { + this.$search.css('width', '25px'); + + var width = ''; + + if (this.$search.attr('placeholder') !== '') { + width = this.$selection.find('.select2-selection__rendered').innerWidth(); + } else { + var minimumWidth = this.$search.val().length + 1; + + width = (minimumWidth * 0.75) + 'em'; + } + + this.$search.css('width', width); + }; + + return Search; +}); + +S2.define('select2/selection/eventRelay',[ + 'jquery' +], function ($) { + function EventRelay () { } + + EventRelay.prototype.bind = function (decorated, container, $container) { + var self = this; + var relayEvents = [ + 'open', 'opening', + 'close', 'closing', + 'select', 'selecting', + 'unselect', 'unselecting', + 'clear', 'clearing' + ]; + + var preventableEvents = [ + 'opening', 'closing', 'selecting', 'unselecting', 'clearing' + ]; + + decorated.call(this, container, $container); + + container.on('*', function (name, params) { + // Ignore events that should not be relayed + if ($.inArray(name, relayEvents) === -1) { + return; + } + + // The parameters should always be an object + params = params || {}; + + // Generate the jQuery event for the Select2 event + var evt = $.Event('select2:' + name, { + params: params + }); + + self.$element.trigger(evt); + + // Only handle preventable events if it was one + if ($.inArray(name, preventableEvents) === -1) { + return; + } + + params.prevented = evt.isDefaultPrevented(); + }); + }; + + return EventRelay; +}); + +S2.define('select2/translation',[ + 'jquery', + 'require' +], function ($, require) { + function Translation (dict) { + this.dict = dict || {}; + } + + Translation.prototype.all = function () { + return this.dict; + }; + + Translation.prototype.get = function (key) { + return this.dict[key]; + }; + + Translation.prototype.extend = function (translation) { + this.dict = $.extend({}, translation.all(), this.dict); + }; + + // Static functions + + Translation._cache = {}; + + Translation.loadPath = function (path) { + if (!(path in Translation._cache)) { + var translations = require(path); + + Translation._cache[path] = translations; + } + + return new Translation(Translation._cache[path]); + }; + + return Translation; +}); + +S2.define('select2/diacritics',[ + +], function () { + var diacritics = { + '\u24B6': 'A', + '\uFF21': 'A', + '\u00C0': 'A', + '\u00C1': 'A', + '\u00C2': 'A', + '\u1EA6': 'A', + '\u1EA4': 'A', + '\u1EAA': 'A', + '\u1EA8': 'A', + '\u00C3': 'A', + '\u0100': 'A', + '\u0102': 'A', + '\u1EB0': 'A', + '\u1EAE': 'A', + '\u1EB4': 'A', + '\u1EB2': 'A', + '\u0226': 'A', + '\u01E0': 'A', + '\u00C4': 'A', + '\u01DE': 'A', + '\u1EA2': 'A', + '\u00C5': 'A', + '\u01FA': 'A', + '\u01CD': 'A', + '\u0200': 'A', + '\u0202': 'A', + '\u1EA0': 'A', + '\u1EAC': 'A', + '\u1EB6': 'A', + '\u1E00': 'A', + '\u0104': 'A', + '\u023A': 'A', + '\u2C6F': 'A', + '\uA732': 'AA', + '\u00C6': 'AE', + '\u01FC': 'AE', + '\u01E2': 'AE', + '\uA734': 'AO', + '\uA736': 'AU', + '\uA738': 'AV', + '\uA73A': 'AV', + '\uA73C': 'AY', + '\u24B7': 'B', + '\uFF22': 'B', + '\u1E02': 'B', + '\u1E04': 'B', + '\u1E06': 'B', + '\u0243': 'B', + '\u0182': 'B', + '\u0181': 'B', + '\u24B8': 'C', + '\uFF23': 'C', + '\u0106': 'C', + '\u0108': 'C', + '\u010A': 'C', + '\u010C': 'C', + '\u00C7': 'C', + '\u1E08': 'C', + '\u0187': 'C', + '\u023B': 'C', + '\uA73E': 'C', + '\u24B9': 'D', + '\uFF24': 'D', + '\u1E0A': 'D', + '\u010E': 'D', + '\u1E0C': 'D', + '\u1E10': 'D', + '\u1E12': 'D', + '\u1E0E': 'D', + '\u0110': 'D', + '\u018B': 'D', + '\u018A': 'D', + '\u0189': 'D', + '\uA779': 'D', + '\u01F1': 'DZ', + '\u01C4': 'DZ', + '\u01F2': 'Dz', + '\u01C5': 'Dz', + '\u24BA': 'E', + '\uFF25': 'E', + '\u00C8': 'E', + '\u00C9': 'E', + '\u00CA': 'E', + '\u1EC0': 'E', + '\u1EBE': 'E', + '\u1EC4': 'E', + '\u1EC2': 'E', + '\u1EBC': 'E', + '\u0112': 'E', + '\u1E14': 'E', + '\u1E16': 'E', + '\u0114': 'E', + '\u0116': 'E', + '\u00CB': 'E', + '\u1EBA': 'E', + '\u011A': 'E', + '\u0204': 'E', + '\u0206': 'E', + '\u1EB8': 'E', + '\u1EC6': 'E', + '\u0228': 'E', + '\u1E1C': 'E', + '\u0118': 'E', + '\u1E18': 'E', + '\u1E1A': 'E', + '\u0190': 'E', + '\u018E': 'E', + '\u24BB': 'F', + '\uFF26': 'F', + '\u1E1E': 'F', + '\u0191': 'F', + '\uA77B': 'F', + '\u24BC': 'G', + '\uFF27': 'G', + '\u01F4': 'G', + '\u011C': 'G', + '\u1E20': 'G', + '\u011E': 'G', + '\u0120': 'G', + '\u01E6': 'G', + '\u0122': 'G', + '\u01E4': 'G', + '\u0193': 'G', + '\uA7A0': 'G', + '\uA77D': 'G', + '\uA77E': 'G', + '\u24BD': 'H', + '\uFF28': 'H', + '\u0124': 'H', + '\u1E22': 'H', + '\u1E26': 'H', + '\u021E': 'H', + '\u1E24': 'H', + '\u1E28': 'H', + '\u1E2A': 'H', + '\u0126': 'H', + '\u2C67': 'H', + '\u2C75': 'H', + '\uA78D': 'H', + '\u24BE': 'I', + '\uFF29': 'I', + '\u00CC': 'I', + '\u00CD': 'I', + '\u00CE': 'I', + '\u0128': 'I', + '\u012A': 'I', + '\u012C': 'I', + '\u0130': 'I', + '\u00CF': 'I', + '\u1E2E': 'I', + '\u1EC8': 'I', + '\u01CF': 'I', + '\u0208': 'I', + '\u020A': 'I', + '\u1ECA': 'I', + '\u012E': 'I', + '\u1E2C': 'I', + '\u0197': 'I', + '\u24BF': 'J', + '\uFF2A': 'J', + '\u0134': 'J', + '\u0248': 'J', + '\u24C0': 'K', + '\uFF2B': 'K', + '\u1E30': 'K', + '\u01E8': 'K', + '\u1E32': 'K', + '\u0136': 'K', + '\u1E34': 'K', + '\u0198': 'K', + '\u2C69': 'K', + '\uA740': 'K', + '\uA742': 'K', + '\uA744': 'K', + '\uA7A2': 'K', + '\u24C1': 'L', + '\uFF2C': 'L', + '\u013F': 'L', + '\u0139': 'L', + '\u013D': 'L', + '\u1E36': 'L', + '\u1E38': 'L', + '\u013B': 'L', + '\u1E3C': 'L', + '\u1E3A': 'L', + '\u0141': 'L', + '\u023D': 'L', + '\u2C62': 'L', + '\u2C60': 'L', + '\uA748': 'L', + '\uA746': 'L', + '\uA780': 'L', + '\u01C7': 'LJ', + '\u01C8': 'Lj', + '\u24C2': 'M', + '\uFF2D': 'M', + '\u1E3E': 'M', + '\u1E40': 'M', + '\u1E42': 'M', + '\u2C6E': 'M', + '\u019C': 'M', + '\u24C3': 'N', + '\uFF2E': 'N', + '\u01F8': 'N', + '\u0143': 'N', + '\u00D1': 'N', + '\u1E44': 'N', + '\u0147': 'N', + '\u1E46': 'N', + '\u0145': 'N', + '\u1E4A': 'N', + '\u1E48': 'N', + '\u0220': 'N', + '\u019D': 'N', + '\uA790': 'N', + '\uA7A4': 'N', + '\u01CA': 'NJ', + '\u01CB': 'Nj', + '\u24C4': 'O', + '\uFF2F': 'O', + '\u00D2': 'O', + '\u00D3': 'O', + '\u00D4': 'O', + '\u1ED2': 'O', + '\u1ED0': 'O', + '\u1ED6': 'O', + '\u1ED4': 'O', + '\u00D5': 'O', + '\u1E4C': 'O', + '\u022C': 'O', + '\u1E4E': 'O', + '\u014C': 'O', + '\u1E50': 'O', + '\u1E52': 'O', + '\u014E': 'O', + '\u022E': 'O', + '\u0230': 'O', + '\u00D6': 'O', + '\u022A': 'O', + '\u1ECE': 'O', + '\u0150': 'O', + '\u01D1': 'O', + '\u020C': 'O', + '\u020E': 'O', + '\u01A0': 'O', + '\u1EDC': 'O', + '\u1EDA': 'O', + '\u1EE0': 'O', + '\u1EDE': 'O', + '\u1EE2': 'O', + '\u1ECC': 'O', + '\u1ED8': 'O', + '\u01EA': 'O', + '\u01EC': 'O', + '\u00D8': 'O', + '\u01FE': 'O', + '\u0186': 'O', + '\u019F': 'O', + '\uA74A': 'O', + '\uA74C': 'O', + '\u0152': 'OE', + '\u01A2': 'OI', + '\uA74E': 'OO', + '\u0222': 'OU', + '\u24C5': 'P', + '\uFF30': 'P', + '\u1E54': 'P', + '\u1E56': 'P', + '\u01A4': 'P', + '\u2C63': 'P', + '\uA750': 'P', + '\uA752': 'P', + '\uA754': 'P', + '\u24C6': 'Q', + '\uFF31': 'Q', + '\uA756': 'Q', + '\uA758': 'Q', + '\u024A': 'Q', + '\u24C7': 'R', + '\uFF32': 'R', + '\u0154': 'R', + '\u1E58': 'R', + '\u0158': 'R', + '\u0210': 'R', + '\u0212': 'R', + '\u1E5A': 'R', + '\u1E5C': 'R', + '\u0156': 'R', + '\u1E5E': 'R', + '\u024C': 'R', + '\u2C64': 'R', + '\uA75A': 'R', + '\uA7A6': 'R', + '\uA782': 'R', + '\u24C8': 'S', + '\uFF33': 'S', + '\u1E9E': 'S', + '\u015A': 'S', + '\u1E64': 'S', + '\u015C': 'S', + '\u1E60': 'S', + '\u0160': 'S', + '\u1E66': 'S', + '\u1E62': 'S', + '\u1E68': 'S', + '\u0218': 'S', + '\u015E': 'S', + '\u2C7E': 'S', + '\uA7A8': 'S', + '\uA784': 'S', + '\u24C9': 'T', + '\uFF34': 'T', + '\u1E6A': 'T', + '\u0164': 'T', + '\u1E6C': 'T', + '\u021A': 'T', + '\u0162': 'T', + '\u1E70': 'T', + '\u1E6E': 'T', + '\u0166': 'T', + '\u01AC': 'T', + '\u01AE': 'T', + '\u023E': 'T', + '\uA786': 'T', + '\uA728': 'TZ', + '\u24CA': 'U', + '\uFF35': 'U', + '\u00D9': 'U', + '\u00DA': 'U', + '\u00DB': 'U', + '\u0168': 'U', + '\u1E78': 'U', + '\u016A': 'U', + '\u1E7A': 'U', + '\u016C': 'U', + '\u00DC': 'U', + '\u01DB': 'U', + '\u01D7': 'U', + '\u01D5': 'U', + '\u01D9': 'U', + '\u1EE6': 'U', + '\u016E': 'U', + '\u0170': 'U', + '\u01D3': 'U', + '\u0214': 'U', + '\u0216': 'U', + '\u01AF': 'U', + '\u1EEA': 'U', + '\u1EE8': 'U', + '\u1EEE': 'U', + '\u1EEC': 'U', + '\u1EF0': 'U', + '\u1EE4': 'U', + '\u1E72': 'U', + '\u0172': 'U', + '\u1E76': 'U', + '\u1E74': 'U', + '\u0244': 'U', + '\u24CB': 'V', + '\uFF36': 'V', + '\u1E7C': 'V', + '\u1E7E': 'V', + '\u01B2': 'V', + '\uA75E': 'V', + '\u0245': 'V', + '\uA760': 'VY', + '\u24CC': 'W', + '\uFF37': 'W', + '\u1E80': 'W', + '\u1E82': 'W', + '\u0174': 'W', + '\u1E86': 'W', + '\u1E84': 'W', + '\u1E88': 'W', + '\u2C72': 'W', + '\u24CD': 'X', + '\uFF38': 'X', + '\u1E8A': 'X', + '\u1E8C': 'X', + '\u24CE': 'Y', + '\uFF39': 'Y', + '\u1EF2': 'Y', + '\u00DD': 'Y', + '\u0176': 'Y', + '\u1EF8': 'Y', + '\u0232': 'Y', + '\u1E8E': 'Y', + '\u0178': 'Y', + '\u1EF6': 'Y', + '\u1EF4': 'Y', + '\u01B3': 'Y', + '\u024E': 'Y', + '\u1EFE': 'Y', + '\u24CF': 'Z', + '\uFF3A': 'Z', + '\u0179': 'Z', + '\u1E90': 'Z', + '\u017B': 'Z', + '\u017D': 'Z', + '\u1E92': 'Z', + '\u1E94': 'Z', + '\u01B5': 'Z', + '\u0224': 'Z', + '\u2C7F': 'Z', + '\u2C6B': 'Z', + '\uA762': 'Z', + '\u24D0': 'a', + '\uFF41': 'a', + '\u1E9A': 'a', + '\u00E0': 'a', + '\u00E1': 'a', + '\u00E2': 'a', + '\u1EA7': 'a', + '\u1EA5': 'a', + '\u1EAB': 'a', + '\u1EA9': 'a', + '\u00E3': 'a', + '\u0101': 'a', + '\u0103': 'a', + '\u1EB1': 'a', + '\u1EAF': 'a', + '\u1EB5': 'a', + '\u1EB3': 'a', + '\u0227': 'a', + '\u01E1': 'a', + '\u00E4': 'a', + '\u01DF': 'a', + '\u1EA3': 'a', + '\u00E5': 'a', + '\u01FB': 'a', + '\u01CE': 'a', + '\u0201': 'a', + '\u0203': 'a', + '\u1EA1': 'a', + '\u1EAD': 'a', + '\u1EB7': 'a', + '\u1E01': 'a', + '\u0105': 'a', + '\u2C65': 'a', + '\u0250': 'a', + '\uA733': 'aa', + '\u00E6': 'ae', + '\u01FD': 'ae', + '\u01E3': 'ae', + '\uA735': 'ao', + '\uA737': 'au', + '\uA739': 'av', + '\uA73B': 'av', + '\uA73D': 'ay', + '\u24D1': 'b', + '\uFF42': 'b', + '\u1E03': 'b', + '\u1E05': 'b', + '\u1E07': 'b', + '\u0180': 'b', + '\u0183': 'b', + '\u0253': 'b', + '\u24D2': 'c', + '\uFF43': 'c', + '\u0107': 'c', + '\u0109': 'c', + '\u010B': 'c', + '\u010D': 'c', + '\u00E7': 'c', + '\u1E09': 'c', + '\u0188': 'c', + '\u023C': 'c', + '\uA73F': 'c', + '\u2184': 'c', + '\u24D3': 'd', + '\uFF44': 'd', + '\u1E0B': 'd', + '\u010F': 'd', + '\u1E0D': 'd', + '\u1E11': 'd', + '\u1E13': 'd', + '\u1E0F': 'd', + '\u0111': 'd', + '\u018C': 'd', + '\u0256': 'd', + '\u0257': 'd', + '\uA77A': 'd', + '\u01F3': 'dz', + '\u01C6': 'dz', + '\u24D4': 'e', + '\uFF45': 'e', + '\u00E8': 'e', + '\u00E9': 'e', + '\u00EA': 'e', + '\u1EC1': 'e', + '\u1EBF': 'e', + '\u1EC5': 'e', + '\u1EC3': 'e', + '\u1EBD': 'e', + '\u0113': 'e', + '\u1E15': 'e', + '\u1E17': 'e', + '\u0115': 'e', + '\u0117': 'e', + '\u00EB': 'e', + '\u1EBB': 'e', + '\u011B': 'e', + '\u0205': 'e', + '\u0207': 'e', + '\u1EB9': 'e', + '\u1EC7': 'e', + '\u0229': 'e', + '\u1E1D': 'e', + '\u0119': 'e', + '\u1E19': 'e', + '\u1E1B': 'e', + '\u0247': 'e', + '\u025B': 'e', + '\u01DD': 'e', + '\u24D5': 'f', + '\uFF46': 'f', + '\u1E1F': 'f', + '\u0192': 'f', + '\uA77C': 'f', + '\u24D6': 'g', + '\uFF47': 'g', + '\u01F5': 'g', + '\u011D': 'g', + '\u1E21': 'g', + '\u011F': 'g', + '\u0121': 'g', + '\u01E7': 'g', + '\u0123': 'g', + '\u01E5': 'g', + '\u0260': 'g', + '\uA7A1': 'g', + '\u1D79': 'g', + '\uA77F': 'g', + '\u24D7': 'h', + '\uFF48': 'h', + '\u0125': 'h', + '\u1E23': 'h', + '\u1E27': 'h', + '\u021F': 'h', + '\u1E25': 'h', + '\u1E29': 'h', + '\u1E2B': 'h', + '\u1E96': 'h', + '\u0127': 'h', + '\u2C68': 'h', + '\u2C76': 'h', + '\u0265': 'h', + '\u0195': 'hv', + '\u24D8': 'i', + '\uFF49': 'i', + '\u00EC': 'i', + '\u00ED': 'i', + '\u00EE': 'i', + '\u0129': 'i', + '\u012B': 'i', + '\u012D': 'i', + '\u00EF': 'i', + '\u1E2F': 'i', + '\u1EC9': 'i', + '\u01D0': 'i', + '\u0209': 'i', + '\u020B': 'i', + '\u1ECB': 'i', + '\u012F': 'i', + '\u1E2D': 'i', + '\u0268': 'i', + '\u0131': 'i', + '\u24D9': 'j', + '\uFF4A': 'j', + '\u0135': 'j', + '\u01F0': 'j', + '\u0249': 'j', + '\u24DA': 'k', + '\uFF4B': 'k', + '\u1E31': 'k', + '\u01E9': 'k', + '\u1E33': 'k', + '\u0137': 'k', + '\u1E35': 'k', + '\u0199': 'k', + '\u2C6A': 'k', + '\uA741': 'k', + '\uA743': 'k', + '\uA745': 'k', + '\uA7A3': 'k', + '\u24DB': 'l', + '\uFF4C': 'l', + '\u0140': 'l', + '\u013A': 'l', + '\u013E': 'l', + '\u1E37': 'l', + '\u1E39': 'l', + '\u013C': 'l', + '\u1E3D': 'l', + '\u1E3B': 'l', + '\u017F': 'l', + '\u0142': 'l', + '\u019A': 'l', + '\u026B': 'l', + '\u2C61': 'l', + '\uA749': 'l', + '\uA781': 'l', + '\uA747': 'l', + '\u01C9': 'lj', + '\u24DC': 'm', + '\uFF4D': 'm', + '\u1E3F': 'm', + '\u1E41': 'm', + '\u1E43': 'm', + '\u0271': 'm', + '\u026F': 'm', + '\u24DD': 'n', + '\uFF4E': 'n', + '\u01F9': 'n', + '\u0144': 'n', + '\u00F1': 'n', + '\u1E45': 'n', + '\u0148': 'n', + '\u1E47': 'n', + '\u0146': 'n', + '\u1E4B': 'n', + '\u1E49': 'n', + '\u019E': 'n', + '\u0272': 'n', + '\u0149': 'n', + '\uA791': 'n', + '\uA7A5': 'n', + '\u01CC': 'nj', + '\u24DE': 'o', + '\uFF4F': 'o', + '\u00F2': 'o', + '\u00F3': 'o', + '\u00F4': 'o', + '\u1ED3': 'o', + '\u1ED1': 'o', + '\u1ED7': 'o', + '\u1ED5': 'o', + '\u00F5': 'o', + '\u1E4D': 'o', + '\u022D': 'o', + '\u1E4F': 'o', + '\u014D': 'o', + '\u1E51': 'o', + '\u1E53': 'o', + '\u014F': 'o', + '\u022F': 'o', + '\u0231': 'o', + '\u00F6': 'o', + '\u022B': 'o', + '\u1ECF': 'o', + '\u0151': 'o', + '\u01D2': 'o', + '\u020D': 'o', + '\u020F': 'o', + '\u01A1': 'o', + '\u1EDD': 'o', + '\u1EDB': 'o', + '\u1EE1': 'o', + '\u1EDF': 'o', + '\u1EE3': 'o', + '\u1ECD': 'o', + '\u1ED9': 'o', + '\u01EB': 'o', + '\u01ED': 'o', + '\u00F8': 'o', + '\u01FF': 'o', + '\u0254': 'o', + '\uA74B': 'o', + '\uA74D': 'o', + '\u0275': 'o', + '\u0153': 'oe', + '\u01A3': 'oi', + '\u0223': 'ou', + '\uA74F': 'oo', + '\u24DF': 'p', + '\uFF50': 'p', + '\u1E55': 'p', + '\u1E57': 'p', + '\u01A5': 'p', + '\u1D7D': 'p', + '\uA751': 'p', + '\uA753': 'p', + '\uA755': 'p', + '\u24E0': 'q', + '\uFF51': 'q', + '\u024B': 'q', + '\uA757': 'q', + '\uA759': 'q', + '\u24E1': 'r', + '\uFF52': 'r', + '\u0155': 'r', + '\u1E59': 'r', + '\u0159': 'r', + '\u0211': 'r', + '\u0213': 'r', + '\u1E5B': 'r', + '\u1E5D': 'r', + '\u0157': 'r', + '\u1E5F': 'r', + '\u024D': 'r', + '\u027D': 'r', + '\uA75B': 'r', + '\uA7A7': 'r', + '\uA783': 'r', + '\u24E2': 's', + '\uFF53': 's', + '\u00DF': 's', + '\u015B': 's', + '\u1E65': 's', + '\u015D': 's', + '\u1E61': 's', + '\u0161': 's', + '\u1E67': 's', + '\u1E63': 's', + '\u1E69': 's', + '\u0219': 's', + '\u015F': 's', + '\u023F': 's', + '\uA7A9': 's', + '\uA785': 's', + '\u1E9B': 's', + '\u24E3': 't', + '\uFF54': 't', + '\u1E6B': 't', + '\u1E97': 't', + '\u0165': 't', + '\u1E6D': 't', + '\u021B': 't', + '\u0163': 't', + '\u1E71': 't', + '\u1E6F': 't', + '\u0167': 't', + '\u01AD': 't', + '\u0288': 't', + '\u2C66': 't', + '\uA787': 't', + '\uA729': 'tz', + '\u24E4': 'u', + '\uFF55': 'u', + '\u00F9': 'u', + '\u00FA': 'u', + '\u00FB': 'u', + '\u0169': 'u', + '\u1E79': 'u', + '\u016B': 'u', + '\u1E7B': 'u', + '\u016D': 'u', + '\u00FC': 'u', + '\u01DC': 'u', + '\u01D8': 'u', + '\u01D6': 'u', + '\u01DA': 'u', + '\u1EE7': 'u', + '\u016F': 'u', + '\u0171': 'u', + '\u01D4': 'u', + '\u0215': 'u', + '\u0217': 'u', + '\u01B0': 'u', + '\u1EEB': 'u', + '\u1EE9': 'u', + '\u1EEF': 'u', + '\u1EED': 'u', + '\u1EF1': 'u', + '\u1EE5': 'u', + '\u1E73': 'u', + '\u0173': 'u', + '\u1E77': 'u', + '\u1E75': 'u', + '\u0289': 'u', + '\u24E5': 'v', + '\uFF56': 'v', + '\u1E7D': 'v', + '\u1E7F': 'v', + '\u028B': 'v', + '\uA75F': 'v', + '\u028C': 'v', + '\uA761': 'vy', + '\u24E6': 'w', + '\uFF57': 'w', + '\u1E81': 'w', + '\u1E83': 'w', + '\u0175': 'w', + '\u1E87': 'w', + '\u1E85': 'w', + '\u1E98': 'w', + '\u1E89': 'w', + '\u2C73': 'w', + '\u24E7': 'x', + '\uFF58': 'x', + '\u1E8B': 'x', + '\u1E8D': 'x', + '\u24E8': 'y', + '\uFF59': 'y', + '\u1EF3': 'y', + '\u00FD': 'y', + '\u0177': 'y', + '\u1EF9': 'y', + '\u0233': 'y', + '\u1E8F': 'y', + '\u00FF': 'y', + '\u1EF7': 'y', + '\u1E99': 'y', + '\u1EF5': 'y', + '\u01B4': 'y', + '\u024F': 'y', + '\u1EFF': 'y', + '\u24E9': 'z', + '\uFF5A': 'z', + '\u017A': 'z', + '\u1E91': 'z', + '\u017C': 'z', + '\u017E': 'z', + '\u1E93': 'z', + '\u1E95': 'z', + '\u01B6': 'z', + '\u0225': 'z', + '\u0240': 'z', + '\u2C6C': 'z', + '\uA763': 'z', + '\u0386': '\u0391', + '\u0388': '\u0395', + '\u0389': '\u0397', + '\u038A': '\u0399', + '\u03AA': '\u0399', + '\u038C': '\u039F', + '\u038E': '\u03A5', + '\u03AB': '\u03A5', + '\u038F': '\u03A9', + '\u03AC': '\u03B1', + '\u03AD': '\u03B5', + '\u03AE': '\u03B7', + '\u03AF': '\u03B9', + '\u03CA': '\u03B9', + '\u0390': '\u03B9', + '\u03CC': '\u03BF', + '\u03CD': '\u03C5', + '\u03CB': '\u03C5', + '\u03B0': '\u03C5', + '\u03CE': '\u03C9', + '\u03C2': '\u03C3', + '\u2019': '\'' + }; + + return diacritics; +}); + +S2.define('select2/data/base',[ + '../utils' +], function (Utils) { + function BaseAdapter ($element, options) { + BaseAdapter.__super__.constructor.call(this); + } + + Utils.Extend(BaseAdapter, Utils.Observable); + + BaseAdapter.prototype.current = function (callback) { + throw new Error('The `current` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.query = function (params, callback) { + throw new Error('The `query` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.bind = function (container, $container) { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.destroy = function () { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.generateResultId = function (container, data) { + var id = container.id + '-result-'; + + id += Utils.generateChars(4); + + if (data.id != null) { + id += '-' + data.id.toString(); + } else { + id += '-' + Utils.generateChars(4); + } + return id; + }; + + return BaseAdapter; +}); + +S2.define('select2/data/select',[ + './base', + '../utils', + 'jquery' +], function (BaseAdapter, Utils, $) { + function SelectAdapter ($element, options) { + this.$element = $element; + this.options = options; + + SelectAdapter.__super__.constructor.call(this); + } + + Utils.Extend(SelectAdapter, BaseAdapter); + + SelectAdapter.prototype.current = function (callback) { + var data = []; + var self = this; + + this.$element.find(':selected').each(function () { + var $option = $(this); + + var option = self.item($option); + + data.push(option); + }); + + callback(data); + }; + + SelectAdapter.prototype.select = function (data) { + var self = this; + + data.selected = true; + + // If data.element is a DOM node, use it instead + if ($(data.element).is('option')) { + data.element.selected = true; + + this.$element.trigger('change'); + + return; + } + + if (this.$element.prop('multiple')) { + this.current(function (currentData) { + var val = []; + + data = [data]; + data.push.apply(data, currentData); + + for (var d = 0; d < data.length; d++) { + var id = data[d].id; + + if ($.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + self.$element.trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('change'); + } + }; + + SelectAdapter.prototype.unselect = function (data) { + var self = this; + + if (!this.$element.prop('multiple')) { + return; + } + + data.selected = false; + + if ($(data.element).is('option')) { + data.element.selected = false; + + this.$element.trigger('change'); + + return; + } + + this.current(function (currentData) { + var val = []; + + for (var d = 0; d < currentData.length; d++) { + var id = currentData[d].id; + + if (id !== data.id && $.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + + self.$element.trigger('change'); + }); + }; + + SelectAdapter.prototype.bind = function (container, $container) { + var self = this; + + this.container = container; + + container.on('select', function (params) { + self.select(params.data); + }); + + container.on('unselect', function (params) { + self.unselect(params.data); + }); + }; + + SelectAdapter.prototype.destroy = function () { + // Remove anything added to child elements + this.$element.find('*').each(function () { + // Remove any custom data set by Select2 + Utils.RemoveData(this); + }); + }; + + SelectAdapter.prototype.query = function (params, callback) { + var data = []; + var self = this; + + var $options = this.$element.children(); + + $options.each(function () { + var $option = $(this); + + if (!$option.is('option') && !$option.is('optgroup')) { + return; + } + + var option = self.item($option); + + var matches = self.matches(params, option); + + if (matches !== null) { + data.push(matches); + } + }); + + callback({ + results: data + }); + }; + + SelectAdapter.prototype.addOptions = function ($options) { + Utils.appendMany(this.$element, $options); + }; + + SelectAdapter.prototype.option = function (data) { + var option; + + if (data.children) { + option = document.createElement('optgroup'); + option.label = data.text; + } else { + option = document.createElement('option'); + + if (option.textContent !== undefined) { + option.textContent = data.text; + } else { + option.innerText = data.text; + } + } + + if (data.id !== undefined) { + option.value = data.id; + } + + if (data.disabled) { + option.disabled = true; + } + + if (data.selected) { + option.selected = true; + } + + if (data.title) { + option.title = data.title; + } + + var $option = $(option); + + var normalizedData = this._normalizeItem(data); + normalizedData.element = option; + + // Override the option's data with the combined data + Utils.StoreData(option, 'data', normalizedData); + + return $option; + }; + + SelectAdapter.prototype.item = function ($option) { + var data = {}; + + data = Utils.GetData($option[0], 'data'); + + if (data != null) { + return data; + } + + if ($option.is('option')) { + data = { + id: $option.val(), + text: $option.text(), + disabled: $option.prop('disabled'), + selected: $option.prop('selected'), + title: $option.prop('title') + }; + } else if ($option.is('optgroup')) { + data = { + text: $option.prop('label'), + children: [], + title: $option.prop('title') + }; + + var $children = $option.children('option'); + var children = []; + + for (var c = 0; c < $children.length; c++) { + var $child = $($children[c]); + + var child = this.item($child); + + children.push(child); + } + + data.children = children; + } + + data = this._normalizeItem(data); + data.element = $option[0]; + + Utils.StoreData($option[0], 'data', data); + + return data; + }; + + SelectAdapter.prototype._normalizeItem = function (item) { + if (item !== Object(item)) { + item = { + id: item, + text: item + }; + } + + item = $.extend({}, { + text: '' + }, item); + + var defaults = { + selected: false, + disabled: false + }; + + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + + if (item._resultId == null && item.id && this.container != null) { + item._resultId = this.generateResultId(this.container, item); + } + + return $.extend({}, defaults, item); + }; + + SelectAdapter.prototype.matches = function (params, data) { + var matcher = this.options.get('matcher'); + + return matcher(params, data); + }; + + return SelectAdapter; +}); + +S2.define('select2/data/array',[ + './select', + '../utils', + 'jquery' +], function (SelectAdapter, Utils, $) { + function ArrayAdapter ($element, options) { + var data = options.get('data') || []; + + ArrayAdapter.__super__.constructor.call(this, $element, options); + + this.addOptions(this.convertToOptions(data)); + } + + Utils.Extend(ArrayAdapter, SelectAdapter); + + ArrayAdapter.prototype.select = function (data) { + var $option = this.$element.find('option').filter(function (i, elm) { + return elm.value == data.id.toString(); + }); + + if ($option.length === 0) { + $option = this.option(data); + + this.addOptions($option); + } + + ArrayAdapter.__super__.select.call(this, data); + }; + + ArrayAdapter.prototype.convertToOptions = function (data) { + var self = this; + + var $existing = this.$element.find('option'); + var existingIds = $existing.map(function () { + return self.item($(this)).id; + }).get(); + + var $options = []; + + // Filter out all items except for the one passed in the argument + function onlyItem (item) { + return function () { + return $(this).val() == item.id; + }; + } + + for (var d = 0; d < data.length; d++) { + var item = this._normalizeItem(data[d]); + + // Skip items which were pre-loaded, only merge the data + if ($.inArray(item.id, existingIds) >= 0) { + var $existingOption = $existing.filter(onlyItem(item)); + + var existingData = this.item($existingOption); + var newData = $.extend(true, {}, item, existingData); + + var $newOption = this.option(newData); + + $existingOption.replaceWith($newOption); + + continue; + } + + var $option = this.option(item); + + if (item.children) { + var $children = this.convertToOptions(item.children); + + Utils.appendMany($option, $children); + } + + $options.push($option); + } + + return $options; + }; + + return ArrayAdapter; +}); + +S2.define('select2/data/ajax',[ + './array', + '../utils', + 'jquery' +], function (ArrayAdapter, Utils, $) { + function AjaxAdapter ($element, options) { + this.ajaxOptions = this._applyDefaults(options.get('ajax')); + + if (this.ajaxOptions.processResults != null) { + this.processResults = this.ajaxOptions.processResults; + } + + AjaxAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(AjaxAdapter, ArrayAdapter); + + AjaxAdapter.prototype._applyDefaults = function (options) { + var defaults = { + data: function (params) { + return $.extend({}, params, { + q: params.term + }); + }, + transport: function (params, success, failure) { + var $request = $.ajax(params); + + $request.then(success); + $request.fail(failure); + + return $request; + } + }; + + return $.extend({}, defaults, options, true); + }; + + AjaxAdapter.prototype.processResults = function (results) { + return results; + }; + + AjaxAdapter.prototype.query = function (params, callback) { + var matches = []; + var self = this; + + if (this._request != null) { + // JSONP requests cannot always be aborted + if ($.isFunction(this._request.abort)) { + this._request.abort(); + } + + this._request = null; + } + + var options = $.extend({ + type: 'GET' + }, this.ajaxOptions); + + if (typeof options.url === 'function') { + options.url = options.url.call(this.$element, params); + } + + if (typeof options.data === 'function') { + options.data = options.data.call(this.$element, params); + } + + function request () { + var $request = options.transport(options, function (data) { + var results = self.processResults(data, params); + + if (self.options.get('debug') && window.console && console.error) { + // Check to make sure that the response included a `results` key. + if (!results || !results.results || !$.isArray(results.results)) { + console.error( + 'Select2: The AJAX results did not return an array in the ' + + '`results` key of the response.' + ); + } + } + + callback(results); + }, function () { + // Attempt to detect if a request was aborted + // Only works if the transport exposes a status property + if ('status' in $request && + ($request.status === 0 || $request.status === '0')) { + return; + } + + self.trigger('results:message', { + message: 'errorLoading' + }); + }); + + self._request = $request; + } + + if (this.ajaxOptions.delay && params.term != null) { + if (this._queryTimeout) { + window.clearTimeout(this._queryTimeout); + } + + this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); + } else { + request(); + } + }; + + return AjaxAdapter; +}); + +S2.define('select2/data/tags',[ + 'jquery' +], function ($) { + function Tags (decorated, $element, options) { + var tags = options.get('tags'); + + var createTag = options.get('createTag'); + + if (createTag !== undefined) { + this.createTag = createTag; + } + + var insertTag = options.get('insertTag'); + + if (insertTag !== undefined) { + this.insertTag = insertTag; + } + + decorated.call(this, $element, options); + + if ($.isArray(tags)) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + var item = this._normalizeItem(tag); + + var $option = this.option(item); + + this.$element.append($option); + } + } + } + + Tags.prototype.query = function (decorated, params, callback) { + var self = this; + + this._removeOldTags(); + + if (params.term == null || params.page != null) { + decorated.call(this, params, callback); + return; + } + + function wrapper (obj, child) { + var data = obj.results; + + for (var i = 0; i < data.length; i++) { + var option = data[i]; + + var checkChildren = ( + option.children != null && + !wrapper({ + results: option.children + }, true) + ); + + var optionText = (option.text || '').toUpperCase(); + var paramsTerm = (params.term || '').toUpperCase(); + + var checkText = optionText === paramsTerm; + + if (checkText || checkChildren) { + if (child) { + return false; + } + + obj.data = data; + callback(obj); + + return; + } + } + + if (child) { + return true; + } + + var tag = self.createTag(params); + + if (tag != null) { + var $option = self.option(tag); + $option.attr('data-select2-tag', true); + + self.addOptions([$option]); + + self.insertTag(data, tag); + } + + obj.results = data; + + callback(obj); + } + + decorated.call(this, params, wrapper); + }; + + Tags.prototype.createTag = function (decorated, params) { + var term = $.trim(params.term); + + if (term === '') { + return null; + } + + return { + id: term, + text: term + }; + }; + + Tags.prototype.insertTag = function (_, data, tag) { + data.unshift(tag); + }; + + Tags.prototype._removeOldTags = function (_) { + var tag = this._lastTag; + + var $options = this.$element.find('option[data-select2-tag]'); + + $options.each(function () { + if (this.selected) { + return; + } + + $(this).remove(); + }); + }; + + return Tags; +}); + +S2.define('select2/data/tokenizer',[ + 'jquery' +], function ($) { + function Tokenizer (decorated, $element, options) { + var tokenizer = options.get('tokenizer'); + + if (tokenizer !== undefined) { + this.tokenizer = tokenizer; + } + + decorated.call(this, $element, options); + } + + Tokenizer.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + this.$search = container.dropdown.$search || container.selection.$search || + $container.find('.select2-search__field'); + }; + + Tokenizer.prototype.query = function (decorated, params, callback) { + var self = this; + + function createAndSelect (data) { + // Normalize the data object so we can use it for checks + var item = self._normalizeItem(data); + + // Check if the data object already exists as a tag + // Select it if it doesn't + var $existingOptions = self.$element.find('option').filter(function () { + return $(this).val() === item.id; + }); + + // If an existing option wasn't found for it, create the option + if (!$existingOptions.length) { + var $option = self.option(item); + $option.attr('data-select2-tag', true); + + self._removeOldTags(); + self.addOptions([$option]); + } + + // Select the item, now that we know there is an option for it + select(item); + } + + function select (data) { + self.trigger('select', { + data: data + }); + } + + params.term = params.term || ''; + + var tokenData = this.tokenizer(params, this.options, createAndSelect); + + if (tokenData.term !== params.term) { + // Replace the search term if we have the search box + if (this.$search.length) { + this.$search.val(tokenData.term); + this.$search.focus(); + } + + params.term = tokenData.term; + } + + decorated.call(this, params, callback); + }; + + Tokenizer.prototype.tokenizer = function (_, params, options, callback) { + var separators = options.get('tokenSeparators') || []; + var term = params.term; + var i = 0; + + var createTag = this.createTag || function (params) { + return { + id: params.term, + text: params.term + }; + }; + + while (i < term.length) { + var termChar = term[i]; + + if ($.inArray(termChar, separators) === -1) { + i++; + + continue; + } + + var part = term.substr(0, i); + var partParams = $.extend({}, params, { + term: part + }); + + var data = createTag(partParams); + + if (data == null) { + i++; + continue; + } + + callback(data); + + // Reset the term to not include the tokenized portion + term = term.substr(i + 1) || ''; + i = 0; + } + + return { + term: term + }; + }; + + return Tokenizer; +}); + +S2.define('select2/data/minimumInputLength',[ + +], function () { + function MinimumInputLength (decorated, $e, options) { + this.minimumInputLength = options.get('minimumInputLength'); + + decorated.call(this, $e, options); + } + + MinimumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (params.term.length < this.minimumInputLength) { + this.trigger('results:message', { + message: 'inputTooShort', + args: { + minimum: this.minimumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MinimumInputLength; +}); + +S2.define('select2/data/maximumInputLength',[ + +], function () { + function MaximumInputLength (decorated, $e, options) { + this.maximumInputLength = options.get('maximumInputLength'); + + decorated.call(this, $e, options); + } + + MaximumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (this.maximumInputLength > 0 && + params.term.length > this.maximumInputLength) { + this.trigger('results:message', { + message: 'inputTooLong', + args: { + maximum: this.maximumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MaximumInputLength; +}); + +S2.define('select2/data/maximumSelectionLength',[ + +], function (){ + function MaximumSelectionLength (decorated, $e, options) { + this.maximumSelectionLength = options.get('maximumSelectionLength'); + + decorated.call(this, $e, options); + } + + MaximumSelectionLength.prototype.query = + function (decorated, params, callback) { + var self = this; + + this.current(function (currentData) { + var count = currentData != null ? currentData.length : 0; + if (self.maximumSelectionLength > 0 && + count >= self.maximumSelectionLength) { + self.trigger('results:message', { + message: 'maximumSelected', + args: { + maximum: self.maximumSelectionLength + } + }); + return; + } + decorated.call(self, params, callback); + }); + }; + + return MaximumSelectionLength; +}); + +S2.define('select2/dropdown',[ + 'jquery', + './utils' +], function ($, Utils) { + function Dropdown ($element, options) { + this.$element = $element; + this.options = options; + + Dropdown.__super__.constructor.call(this); + } + + Utils.Extend(Dropdown, Utils.Observable); + + Dropdown.prototype.render = function () { + var $dropdown = $( + '' + + '' + + '' + ); + + $dropdown.attr('dir', this.options.get('dir')); + + this.$dropdown = $dropdown; + + return $dropdown; + }; + + Dropdown.prototype.bind = function () { + // Should be implemented in subclasses + }; + + Dropdown.prototype.position = function ($dropdown, $container) { + // Should be implemented in subclasses + }; + + Dropdown.prototype.destroy = function () { + // Remove the dropdown from the DOM + this.$dropdown.remove(); + }; + + return Dropdown; +}); + +S2.define('select2/dropdown/search',[ + 'jquery', + '../utils' +], function ($, Utils) { + function Search () { } + + Search.prototype.render = function (decorated) { + var $rendered = decorated.call(this); + + var $search = $( + '' + + '' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + $rendered.prepend($search); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + this.$search.on('keydown', function (evt) { + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$search.on('input', function (evt) { + // Unbind the duplicated `keyup` event + $(this).off('keyup'); + }); + + this.$search.on('keyup input', function (evt) { + self.handleSearch(evt); + }); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + + self.$search.focus(); + + window.setTimeout(function () { + self.$search.focus(); + }, 0); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + + self.$search.val(''); + self.$search.blur(); + }); + + container.on('focus', function () { + if (!container.isOpen()) { + self.$search.focus(); + } + }); + + container.on('results:all', function (params) { + if (params.query.term == null || params.query.term === '') { + var showSearch = self.showSearch(params); + + if (showSearch) { + self.$searchContainer.removeClass('select2-search--hide'); + } else { + self.$searchContainer.addClass('select2-search--hide'); + } + } + }); + }; + + Search.prototype.handleSearch = function (evt) { + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.showSearch = function (_, params) { + return true; + }; + + return Search; +}); + +S2.define('select2/dropdown/hidePlaceholder',[ + +], function () { + function HidePlaceholder (decorated, $element, options, dataAdapter) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options, dataAdapter); + } + + HidePlaceholder.prototype.append = function (decorated, data) { + data.results = this.removePlaceholder(data.results); + + decorated.call(this, data); + }; + + HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + HidePlaceholder.prototype.removePlaceholder = function (_, data) { + var modifiedData = data.slice(0); + + for (var d = data.length - 1; d >= 0; d--) { + var item = data[d]; + + if (this.placeholder.id === item.id) { + modifiedData.splice(d, 1); + } + } + + return modifiedData; + }; + + return HidePlaceholder; +}); + +S2.define('select2/dropdown/infiniteScroll',[ + 'jquery' +], function ($) { + function InfiniteScroll (decorated, $element, options, dataAdapter) { + this.lastParams = {}; + + decorated.call(this, $element, options, dataAdapter); + + this.$loadingMore = this.createLoadingMore(); + this.loading = false; + } + + InfiniteScroll.prototype.append = function (decorated, data) { + this.$loadingMore.remove(); + this.loading = false; + + decorated.call(this, data); + + if (this.showLoadingMore(data)) { + this.$results.append(this.$loadingMore); + } + }; + + InfiniteScroll.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('query', function (params) { + self.lastParams = params; + self.loading = true; + }); + + container.on('query:append', function (params) { + self.lastParams = params; + self.loading = true; + }); + + this.$results.on('scroll', function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + self.$loadingMore[0] + ); + + if (self.loading || !isLoadMoreVisible) { + return; + } + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var loadingMoreOffset = self.$loadingMore.offset().top + + self.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + self.loadMore(); + } + }); + }; + + InfiniteScroll.prototype.loadMore = function () { + this.loading = true; + + var params = $.extend({}, {page: 1}, this.lastParams); + + params.page++; + + this.trigger('query:append', params); + }; + + InfiniteScroll.prototype.showLoadingMore = function (_, data) { + return data.pagination && data.pagination.more; + }; + + InfiniteScroll.prototype.createLoadingMore = function () { + var $option = $( + '
      • ' + ); + + var message = this.options.get('translations').get('loadingMore'); + + $option.html(message(this.lastParams)); + + return $option; + }; + + return InfiniteScroll; +}); + +S2.define('select2/dropdown/attachBody',[ + 'jquery', + '../utils' +], function ($, Utils) { + function AttachBody (decorated, $element, options) { + this.$dropdownParent = options.get('dropdownParent') || $(document.body); + + decorated.call(this, $element, options); + } + + AttachBody.prototype.bind = function (decorated, container, $container) { + var self = this; + + var setupResultsEvents = false; + + decorated.call(this, container, $container); + + container.on('open', function () { + self._showDropdown(); + self._attachPositioningHandler(container); + + if (!setupResultsEvents) { + setupResultsEvents = true; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + } + }); + + container.on('close', function () { + self._hideDropdown(); + self._detachPositioningHandler(container); + }); + + this.$dropdownContainer.on('mousedown', function (evt) { + evt.stopPropagation(); + }); + }; + + AttachBody.prototype.destroy = function (decorated) { + decorated.call(this); + + this.$dropdownContainer.remove(); + }; + + AttachBody.prototype.position = function (decorated, $dropdown, $container) { + // Clone all of the container classes + $dropdown.attr('class', $container.attr('class')); + + $dropdown.removeClass('select2'); + $dropdown.addClass('select2-container--open'); + + $dropdown.css({ + position: 'absolute', + top: -999999 + }); + + this.$container = $container; + }; + + AttachBody.prototype.render = function (decorated) { + var $container = $(''); + + var $dropdown = decorated.call(this); + $container.append($dropdown); + + this.$dropdownContainer = $container; + + return $container; + }; + + AttachBody.prototype._hideDropdown = function (decorated) { + this.$dropdownContainer.detach(); + }; + + AttachBody.prototype._attachPositioningHandler = + function (decorated, container) { + var self = this; + + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.each(function () { + Utils.StoreData(this, 'select2-scroll-position', { + x: $(this).scrollLeft(), + y: $(this).scrollTop() + }); + }); + + $watchers.on(scrollEvent, function (ev) { + var position = Utils.GetData(this, 'select2-scroll-position'); + $(this).scrollTop(position.y); + }); + + $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, + function (e) { + self._positionDropdown(); + self._resizeDropdown(); + }); + }; + + AttachBody.prototype._detachPositioningHandler = + function (decorated, container) { + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.off(scrollEvent); + + $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); + }; + + AttachBody.prototype._positionDropdown = function () { + var $window = $(window); + + var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); + var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); + + var newDirection = null; + + var offset = this.$container.offset(); + + offset.bottom = offset.top + this.$container.outerHeight(false); + + var container = { + height: this.$container.outerHeight(false) + }; + + container.top = offset.top; + container.bottom = offset.top + container.height; + + var dropdown = { + height: this.$dropdown.outerHeight(false) + }; + + var viewport = { + top: $window.scrollTop(), + bottom: $window.scrollTop() + $window.height() + }; + + var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); + var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); + + var css = { + left: offset.left, + top: container.bottom + }; + + // Determine what the parent element is to use for calculating the offset + var $offsetParent = this.$dropdownParent; + + // For statically positioned elements, we need to get the element + // that is determining the offset + if ($offsetParent.css('position') === 'static') { + $offsetParent = $offsetParent.offsetParent(); + } + + var parentOffset = $offsetParent.offset(); + + css.top -= parentOffset.top; + css.left -= parentOffset.left; + + if (!isCurrentlyAbove && !isCurrentlyBelow) { + newDirection = 'below'; + } + + if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { + newDirection = 'above'; + } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { + newDirection = 'below'; + } + + if (newDirection == 'above' || + (isCurrentlyAbove && newDirection !== 'below')) { + css.top = container.top - parentOffset.top - dropdown.height; + } + + if (newDirection != null) { + this.$dropdown + .removeClass('select2-dropdown--below select2-dropdown--above') + .addClass('select2-dropdown--' + newDirection); + this.$container + .removeClass('select2-container--below select2-container--above') + .addClass('select2-container--' + newDirection); + } + + this.$dropdownContainer.css(css); + }; + + AttachBody.prototype._resizeDropdown = function () { + var css = { + width: this.$container.outerWidth(false) + 'px' + }; + + if (this.options.get('dropdownAutoWidth')) { + css.minWidth = css.width; + css.position = 'relative'; + css.width = 'auto'; + } + + this.$dropdown.css(css); + }; + + AttachBody.prototype._showDropdown = function (decorated) { + this.$dropdownContainer.appendTo(this.$dropdownParent); + + this._positionDropdown(); + this._resizeDropdown(); + }; + + return AttachBody; +}); + +S2.define('select2/dropdown/minimumResultsForSearch',[ + +], function () { + function countResults (data) { + var count = 0; + + for (var d = 0; d < data.length; d++) { + var item = data[d]; + + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + } + + return count; + } + + function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { + this.minimumResultsForSearch = options.get('minimumResultsForSearch'); + + if (this.minimumResultsForSearch < 0) { + this.minimumResultsForSearch = Infinity; + } + + decorated.call(this, $element, options, dataAdapter); + } + + MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { + if (countResults(params.data.results) < this.minimumResultsForSearch) { + return false; + } + + return decorated.call(this, params); + }; + + return MinimumResultsForSearch; +}); + +S2.define('select2/dropdown/selectOnClose',[ + '../utils' +], function (Utils) { + function SelectOnClose () { } + + SelectOnClose.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('close', function (params) { + self._handleSelectOnClose(params); + }); + }; + + SelectOnClose.prototype._handleSelectOnClose = function (_, params) { + if (params && params.originalSelect2Event != null) { + var event = params.originalSelect2Event; + + // Don't select an item if the close event was triggered from a select or + // unselect event + if (event._type === 'select' || event._type === 'unselect') { + return; + } + } + + var $highlightedResults = this.getHighlightedResults(); + + // Only select highlighted results + if ($highlightedResults.length < 1) { + return; + } + + var data = Utils.GetData($highlightedResults[0], 'data'); + + // Don't re-select already selected resulte + if ( + (data.element != null && data.element.selected) || + (data.element == null && data.selected) + ) { + return; + } + + this.trigger('select', { + data: data + }); + }; + + return SelectOnClose; +}); + +S2.define('select2/dropdown/closeOnSelect',[ + +], function () { + function CloseOnSelect () { } + + CloseOnSelect.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function (evt) { + self._selectTriggered(evt); + }); + + container.on('unselect', function (evt) { + self._selectTriggered(evt); + }); + }; + + CloseOnSelect.prototype._selectTriggered = function (_, evt) { + var originalEvent = evt.originalEvent; + + // Don't close if the control key is being held + if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { + return; + } + + this.trigger('close', { + originalEvent: originalEvent, + originalSelect2Event: evt + }); + }; + + return CloseOnSelect; +}); + +S2.define('select2/i18n/en',[],function () { + // English + return { + errorLoading: function () { + return 'The results could not be loaded.'; + }, + inputTooLong: function (args) { + var overChars = args.input.length - args.maximum; + + var message = 'Please delete ' + overChars + ' character'; + + if (overChars != 1) { + message += 's'; + } + + return message; + }, + inputTooShort: function (args) { + var remainingChars = args.minimum - args.input.length; + + var message = 'Please enter ' + remainingChars + ' or more characters'; + + return message; + }, + loadingMore: function () { + return 'Loading more results…'; + }, + maximumSelected: function (args) { + var message = 'You can only select ' + args.maximum + ' item'; + + if (args.maximum != 1) { + message += 's'; + } + + return message; + }, + noResults: function () { + return 'No results found'; + }, + searching: function () { + return 'Searching…'; + }, + removeAllItems: function () { + return 'Remove all items'; + } + }; +}); + +S2.define('select2/defaults',[ + 'jquery', + 'require', + + './results', + + './selection/single', + './selection/multiple', + './selection/placeholder', + './selection/allowClear', + './selection/search', + './selection/eventRelay', + + './utils', + './translation', + './diacritics', + + './data/select', + './data/array', + './data/ajax', + './data/tags', + './data/tokenizer', + './data/minimumInputLength', + './data/maximumInputLength', + './data/maximumSelectionLength', + + './dropdown', + './dropdown/search', + './dropdown/hidePlaceholder', + './dropdown/infiniteScroll', + './dropdown/attachBody', + './dropdown/minimumResultsForSearch', + './dropdown/selectOnClose', + './dropdown/closeOnSelect', + + './i18n/en' +], function ($, require, + + ResultsList, + + SingleSelection, MultipleSelection, Placeholder, AllowClear, + SelectionSearch, EventRelay, + + Utils, Translation, DIACRITICS, + + SelectData, ArrayData, AjaxData, Tags, Tokenizer, + MinimumInputLength, MaximumInputLength, MaximumSelectionLength, + + Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, + AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, + + EnglishTranslation) { + function Defaults () { + this.reset(); + } + + Defaults.prototype.apply = function (options) { + options = $.extend(true, {}, this.defaults, options); + + if (options.dataAdapter == null) { + if (options.ajax != null) { + options.dataAdapter = AjaxData; + } else if (options.data != null) { + options.dataAdapter = ArrayData; + } else { + options.dataAdapter = SelectData; + } + + if (options.minimumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MinimumInputLength + ); + } + + if (options.maximumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumInputLength + ); + } + + if (options.maximumSelectionLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumSelectionLength + ); + } + + if (options.tags) { + options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); + } + + if (options.tokenSeparators != null || options.tokenizer != null) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Tokenizer + ); + } + + if (options.query != null) { + var Query = require(options.amdBase + 'compat/query'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Query + ); + } + + if (options.initSelection != null) { + var InitSelection = require(options.amdBase + 'compat/initSelection'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + InitSelection + ); + } + } + + if (options.resultsAdapter == null) { + options.resultsAdapter = ResultsList; + + if (options.ajax != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + InfiniteScroll + ); + } + + if (options.placeholder != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + HidePlaceholder + ); + } + + if (options.selectOnClose) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + SelectOnClose + ); + } + } + + if (options.dropdownAdapter == null) { + if (options.multiple) { + options.dropdownAdapter = Dropdown; + } else { + var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); + + options.dropdownAdapter = SearchableDropdown; + } + + if (options.minimumResultsForSearch !== 0) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + MinimumResultsForSearch + ); + } + + if (options.closeOnSelect) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + CloseOnSelect + ); + } + + if ( + options.dropdownCssClass != null || + options.dropdownCss != null || + options.adaptDropdownCssClass != null + ) { + var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + DropdownCSS + ); + } + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + AttachBody + ); + } + + if (options.selectionAdapter == null) { + if (options.multiple) { + options.selectionAdapter = MultipleSelection; + } else { + options.selectionAdapter = SingleSelection; + } + + // Add the placeholder mixin if a placeholder was specified + if (options.placeholder != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + Placeholder + ); + } + + if (options.allowClear) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + AllowClear + ); + } + + if (options.multiple) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionSearch + ); + } + + if ( + options.containerCssClass != null || + options.containerCss != null || + options.adaptContainerCssClass != null + ) { + var ContainerCSS = require(options.amdBase + 'compat/containerCss'); + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + ContainerCSS + ); + } + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + EventRelay + ); + } + + if (typeof options.language === 'string') { + // Check if the language is specified with a region + if (options.language.indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = options.language.split('-'); + var baseLanguage = languageParts[0]; + + options.language = [options.language, baseLanguage]; + } else { + options.language = [options.language]; + } + } + + if ($.isArray(options.language)) { + var languages = new Translation(); + options.language.push('en'); + + var languageNames = options.language; + + for (var l = 0; l < languageNames.length; l++) { + var name = languageNames[l]; + var language = {}; + + try { + // Try to load it with the original name + language = Translation.loadPath(name); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + name = this.defaults.amdLanguageBase + name; + language = Translation.loadPath(name); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files. + if (options.debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + name + '" could not be ' + + 'automatically loaded. A fallback will be used instead.' + ); + } + + continue; + } + } + + languages.extend(language); + } + + options.translations = languages; + } else { + var baseTranslation = Translation.loadPath( + this.defaults.amdLanguageBase + 'en' + ); + var customTranslation = new Translation(options.language); + + customTranslation.extend(baseTranslation); + + options.translations = customTranslation; + } + + return options; + }; + + Defaults.prototype.reset = function () { + function stripDiacritics (text) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return text.replace(/[^\u0000-\u007E]/g, match); + } + + function matcher (params, data) { + // Always return the object if there is nothing to compare + if ($.trim(params.term) === '') { + return data; + } + + // Do a recursive check for options with children + if (data.children && data.children.length > 0) { + // Clone the data object if there are children + // This is required as we modify the object to remove any non-matches + var match = $.extend(true, {}, data); + + // Check each child of the option + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + var matches = matcher(params, child); + + // If there wasn't a match, remove the object in the array + if (matches == null) { + match.children.splice(c, 1); + } + } + + // If any children matched, return the new object + if (match.children.length > 0) { + return match; + } + + // If there were no matching children, check just the plain object + return matcher(params, match); + } + + var original = stripDiacritics(data.text).toUpperCase(); + var term = stripDiacritics(params.term).toUpperCase(); + + // Check if the text contains the term + if (original.indexOf(term) > -1) { + return data; + } + + // If it doesn't contain the term, don't return anything + return null; + } + + this.defaults = { + amdBase: './', + amdLanguageBase: './i18n/', + closeOnSelect: true, + debug: false, + dropdownAutoWidth: false, + escapeMarkup: Utils.escapeMarkup, + language: EnglishTranslation, + matcher: matcher, + minimumInputLength: 0, + maximumInputLength: 0, + maximumSelectionLength: 0, + minimumResultsForSearch: 0, + selectOnClose: false, + scrollAfterSelect: false, + sorter: function (data) { + return data; + }, + templateResult: function (result) { + return result.text; + }, + templateSelection: function (selection) { + return selection.text; + }, + theme: 'default', + width: 'resolve' + }; + }; + + Defaults.prototype.set = function (key, value) { + var camelKey = $.camelCase(key); + + var data = {}; + data[camelKey] = value; + + var convertedData = Utils._convertData(data); + + $.extend(true, this.defaults, convertedData); + }; + + var defaults = new Defaults(); + + return defaults; +}); + +S2.define('select2/options',[ + 'require', + 'jquery', + './defaults', + './utils' +], function (require, $, Defaults, Utils) { + function Options (options, $element) { + this.options = options; + + if ($element != null) { + this.fromElement($element); + } + + this.options = Defaults.apply(this.options); + + if ($element && $element.is('input')) { + var InputCompat = require(this.get('amdBase') + 'compat/inputData'); + + this.options.dataAdapter = Utils.Decorate( + this.options.dataAdapter, + InputCompat + ); + } + } + + Options.prototype.fromElement = function ($e) { + var excludedData = ['select2']; + + if (this.options.multiple == null) { + this.options.multiple = $e.prop('multiple'); + } + + if (this.options.disabled == null) { + this.options.disabled = $e.prop('disabled'); + } + + if (this.options.language == null) { + if ($e.prop('lang')) { + this.options.language = $e.prop('lang').toLowerCase(); + } else if ($e.closest('[lang]').prop('lang')) { + this.options.language = $e.closest('[lang]').prop('lang'); + } + } + + if (this.options.dir == null) { + if ($e.prop('dir')) { + this.options.dir = $e.prop('dir'); + } else if ($e.closest('[dir]').prop('dir')) { + this.options.dir = $e.closest('[dir]').prop('dir'); + } else { + this.options.dir = 'ltr'; + } + } + + $e.prop('disabled', this.options.disabled); + $e.prop('multiple', this.options.multiple); + + if (Utils.GetData($e[0], 'select2Tags')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been changed to ' + + 'use the `data-data` and `data-tags="true"` attributes and will be ' + + 'removed in future versions of Select2.' + ); + } + + Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); + Utils.StoreData($e[0], 'tags', true); + } + + if (Utils.GetData($e[0], 'ajaxUrl')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-ajax-url` attribute has been changed to ' + + '`data-ajax--url` and support for the old attribute will be removed' + + ' in future versions of Select2.' + ); + } + + $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); + Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); + } + + var dataset = {}; + + function upperCaseLetter(_, letter) { + return letter.toUpperCase(); + } + + // Pre-load all of the attributes which are prefixed with `data-` + for (var attr = 0; attr < $e[0].attributes.length; attr++) { + var attributeName = $e[0].attributes[attr].name; + var prefix = 'data-'; + + if (attributeName.substr(0, prefix.length) == prefix) { + // Get the contents of the attribute after `data-` + var dataName = attributeName.substring(prefix.length); + + // Get the data contents from the consistent source + // This is more than likely the jQuery data helper + var dataValue = Utils.GetData($e[0], dataName); + + // camelCase the attribute name to match the spec + var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); + + // Store the data attribute contents into the dataset since + dataset[camelDataName] = dataValue; + } + } + + // Prefer the element's `dataset` attribute if it exists + // jQuery 1.x does not correctly handle data attributes with multiple dashes + if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { + dataset = $.extend(true, {}, $e[0].dataset, dataset); + } + + // Prefer our internal data cache if it exists + var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); + + data = Utils._convertData(data); + + for (var key in data) { + if ($.inArray(key, excludedData) > -1) { + continue; + } + + if ($.isPlainObject(this.options[key])) { + $.extend(this.options[key], data[key]); + } else { + this.options[key] = data[key]; + } + } + + return this; + }; + + Options.prototype.get = function (key) { + return this.options[key]; + }; + + Options.prototype.set = function (key, val) { + this.options[key] = val; + }; + + return Options; +}); + +S2.define('select2/core',[ + 'jquery', + './options', + './utils', + './keys' +], function ($, Options, Utils, KEYS) { + var Select2 = function ($element, options) { + if (Utils.GetData($element[0], 'select2') != null) { + Utils.GetData($element[0], 'select2').destroy(); + } + + this.$element = $element; + + this.id = this._generateId($element); + + options = options || {}; + + this.options = new Options(options, $element); + + Select2.__super__.constructor.call(this); + + // Set up the tabindex + + var tabindex = $element.attr('tabindex') || 0; + Utils.StoreData($element[0], 'old-tabindex', tabindex); + $element.attr('tabindex', '-1'); + + // Set up containers and adapters + + var DataAdapter = this.options.get('dataAdapter'); + this.dataAdapter = new DataAdapter($element, this.options); + + var $container = this.render(); + + this._placeContainer($container); + + var SelectionAdapter = this.options.get('selectionAdapter'); + this.selection = new SelectionAdapter($element, this.options); + this.$selection = this.selection.render(); + + this.selection.position(this.$selection, $container); + + var DropdownAdapter = this.options.get('dropdownAdapter'); + this.dropdown = new DropdownAdapter($element, this.options); + this.$dropdown = this.dropdown.render(); + + this.dropdown.position(this.$dropdown, $container); + + var ResultsAdapter = this.options.get('resultsAdapter'); + this.results = new ResultsAdapter($element, this.options, this.dataAdapter); + this.$results = this.results.render(); + + this.results.position(this.$results, this.$dropdown); + + // Bind events + + var self = this; + + // Bind the container to all of the adapters + this._bindAdapters(); + + // Register any DOM event handlers + this._registerDomEvents(); + + // Register any internal event handlers + this._registerDataEvents(); + this._registerSelectionEvents(); + this._registerDropdownEvents(); + this._registerResultsEvents(); + this._registerEvents(); + + // Set the initial state + this.dataAdapter.current(function (initialData) { + self.trigger('selection:update', { + data: initialData + }); + }); + + // Hide the original select + $element.addClass('select2-hidden-accessible'); + $element.attr('aria-hidden', 'true'); + + // Synchronize any monitored attributes + this._syncAttributes(); + + Utils.StoreData($element[0], 'select2', this); + + // Ensure backwards compatibility with $element.data('select2'). + $element.data('select2', this); + }; + + Utils.Extend(Select2, Utils.Observable); + + Select2.prototype._generateId = function ($element) { + var id = ''; + + if ($element.attr('id') != null) { + id = $element.attr('id'); + } else if ($element.attr('name') != null) { + id = $element.attr('name') + '-' + Utils.generateChars(2); + } else { + id = Utils.generateChars(4); + } + + id = id.replace(/(:|\.|\[|\]|,)/g, ''); + id = 'select2-' + id; + + return id; + }; + + Select2.prototype._placeContainer = function ($container) { + $container.insertAfter(this.$element); + + var width = this._resolveWidth(this.$element, this.options.get('width')); + + if (width != null) { + $container.css('width', width); + } + }; + + Select2.prototype._resolveWidth = function ($element, method) { + var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; + + if (method == 'resolve') { + var styleWidth = this._resolveWidth($element, 'style'); + + if (styleWidth != null) { + return styleWidth; + } + + return this._resolveWidth($element, 'element'); + } + + if (method == 'element') { + var elementWidth = $element.outerWidth(false); + + if (elementWidth <= 0) { + return 'auto'; + } + + return elementWidth + 'px'; + } + + if (method == 'style') { + var style = $element.attr('style'); + + if (typeof(style) !== 'string') { + return null; + } + + var attrs = style.split(';'); + + for (var i = 0, l = attrs.length; i < l; i = i + 1) { + var attr = attrs[i].replace(/\s/g, ''); + var matches = attr.match(WIDTH); + + if (matches !== null && matches.length >= 1) { + return matches[1]; + } + } + + return null; + } + + return method; + }; + + Select2.prototype._bindAdapters = function () { + this.dataAdapter.bind(this, this.$container); + this.selection.bind(this, this.$container); + + this.dropdown.bind(this, this.$container); + this.results.bind(this, this.$container); + }; + + Select2.prototype._registerDomEvents = function () { + var self = this; + + this.$element.on('change.select2', function () { + self.dataAdapter.current(function (data) { + self.trigger('selection:update', { + data: data + }); + }); + }); + + this.$element.on('focus.select2', function (evt) { + self.trigger('focus', evt); + }); + + this._syncA = Utils.bind(this._syncAttributes, this); + this._syncS = Utils.bind(this._syncSubtree, this); + + if (this.$element[0].attachEvent) { + this.$element[0].attachEvent('onpropertychange', this._syncA); + } + + var observer = window.MutationObserver || + window.WebKitMutationObserver || + window.MozMutationObserver + ; + + if (observer != null) { + this._observer = new observer(function (mutations) { + $.each(mutations, self._syncA); + $.each(mutations, self._syncS); + }); + this._observer.observe(this.$element[0], { + attributes: true, + childList: true, + subtree: false + }); + } else if (this.$element[0].addEventListener) { + this.$element[0].addEventListener( + 'DOMAttrModified', + self._syncA, + false + ); + this.$element[0].addEventListener( + 'DOMNodeInserted', + self._syncS, + false + ); + this.$element[0].addEventListener( + 'DOMNodeRemoved', + self._syncS, + false + ); + } + }; + + Select2.prototype._registerDataEvents = function () { + var self = this; + + this.dataAdapter.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerSelectionEvents = function () { + var self = this; + var nonRelayEvents = ['toggle', 'focus']; + + this.selection.on('toggle', function () { + self.toggleDropdown(); + }); + + this.selection.on('focus', function (params) { + self.focus(params); + }); + + this.selection.on('*', function (name, params) { + if ($.inArray(name, nonRelayEvents) !== -1) { + return; + } + + self.trigger(name, params); + }); + }; + + Select2.prototype._registerDropdownEvents = function () { + var self = this; + + this.dropdown.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerResultsEvents = function () { + var self = this; + + this.results.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerEvents = function () { + var self = this; + + this.on('open', function () { + self.$container.addClass('select2-container--open'); + }); + + this.on('close', function () { + self.$container.removeClass('select2-container--open'); + }); + + this.on('enable', function () { + self.$container.removeClass('select2-container--disabled'); + }); + + this.on('disable', function () { + self.$container.addClass('select2-container--disabled'); + }); + + this.on('blur', function () { + self.$container.removeClass('select2-container--focus'); + }); + + this.on('query', function (params) { + if (!self.isOpen()) { + self.trigger('open', {}); + } + + this.dataAdapter.query(params, function (data) { + self.trigger('results:all', { + data: data, + query: params + }); + }); + }); + + this.on('query:append', function (params) { + this.dataAdapter.query(params, function (data) { + self.trigger('results:append', { + data: data, + query: params + }); + }); + }); + + this.on('keypress', function (evt) { + var key = evt.which; + + if (self.isOpen()) { + if (key === KEYS.ESC || key === KEYS.TAB || + (key === KEYS.UP && evt.altKey)) { + self.close(); + + evt.preventDefault(); + } else if (key === KEYS.ENTER) { + self.trigger('results:select', {}); + + evt.preventDefault(); + } else if ((key === KEYS.SPACE && evt.ctrlKey)) { + self.trigger('results:toggle', {}); + + evt.preventDefault(); + } else if (key === KEYS.UP) { + self.trigger('results:previous', {}); + + evt.preventDefault(); + } else if (key === KEYS.DOWN) { + self.trigger('results:next', {}); + + evt.preventDefault(); + } + } else { + if (key === KEYS.ENTER || key === KEYS.SPACE || + (key === KEYS.DOWN && evt.altKey)) { + self.open(); + + evt.preventDefault(); + } + } + }); + }; + + Select2.prototype._syncAttributes = function () { + this.options.set('disabled', this.$element.prop('disabled')); + + if (this.options.get('disabled')) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable', {}); + } else { + this.trigger('enable', {}); + } + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = false; + var self = this; + + // Ignore any mutation events raised for elements that aren't options or + // optgroups. This handles the case when the select element is destroyed + if ( + evt && evt.target && ( + evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' + ) + ) { + return; + } + + if (!mutations) { + // If mutation events aren't supported, then we can only assume that the + // change affected the selections + changed = true; + } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { + for (var n = 0; n < mutations.addedNodes.length; n++) { + var node = mutations.addedNodes[n]; + + if (node.selected) { + changed = true; + } + } + } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { + changed = true; + } + + // Only re-pull the data if we think there is a change + if (changed) { + this.dataAdapter.current(function (currentData) { + self.trigger('selection:update', { + data: currentData + }); + }); + } + }; + + /** + * Override the trigger method to automatically trigger pre-events when + * there are events that can be prevented. + */ + Select2.prototype.trigger = function (name, args) { + var actualTrigger = Select2.__super__.trigger; + var preTriggerMap = { + 'open': 'opening', + 'close': 'closing', + 'select': 'selecting', + 'unselect': 'unselecting', + 'clear': 'clearing' + }; + + if (args === undefined) { + args = {}; + } + + if (name in preTriggerMap) { + var preTriggerName = preTriggerMap[name]; + var preTriggerArgs = { + prevented: false, + name: name, + args: args + }; + + actualTrigger.call(this, preTriggerName, preTriggerArgs); + + if (preTriggerArgs.prevented) { + args.prevented = true; + + return; + } + } + + actualTrigger.call(this, name, args); + }; + + Select2.prototype.toggleDropdown = function () { + if (this.options.get('disabled')) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + this.trigger('query', {}); + }; + + Select2.prototype.close = function () { + if (!this.isOpen()) { + return; + } + + this.trigger('close', {}); + }; + + Select2.prototype.isOpen = function () { + return this.$container.hasClass('select2-container--open'); + }; + + Select2.prototype.hasFocus = function () { + return this.$container.hasClass('select2-container--focus'); + }; + + Select2.prototype.focus = function (data) { + // No need to re-trigger focus events if we are already focused + if (this.hasFocus()) { + return; + } + + this.$container.addClass('select2-container--focus'); + this.trigger('focus', {}); + }; + + Select2.prototype.enable = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("enable")` method has been deprecated and will' + + ' be removed in later Select2 versions. Use $element.prop("disabled")' + + ' instead.' + ); + } + + if (args == null || args.length === 0) { + args = [true]; + } + + var disabled = !args[0]; + + this.$element.prop('disabled', disabled); + }; + + Select2.prototype.data = function () { + if (this.options.get('debug') && + arguments.length > 0 && window.console && console.warn) { + console.warn( + 'Select2: Data can no longer be set using `select2("data")`. You ' + + 'should consider setting the value instead using `$element.val()`.' + ); + } + + var data = []; + + this.dataAdapter.current(function (currentData) { + data = currentData; + }); + + return data; + }; + + Select2.prototype.val = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("val")` method has been deprecated and will be' + + ' removed in later Select2 versions. Use $element.val() instead.' + ); + } + + if (args == null || args.length === 0) { + return this.$element.val(); + } + + var newVal = args[0]; + + if ($.isArray(newVal)) { + newVal = $.map(newVal, function (obj) { + return obj.toString(); + }); + } + + this.$element.val(newVal).trigger('change'); + }; + + Select2.prototype.destroy = function () { + this.$container.remove(); + + if (this.$element[0].detachEvent) { + this.$element[0].detachEvent('onpropertychange', this._syncA); + } + + if (this._observer != null) { + this._observer.disconnect(); + this._observer = null; + } else if (this.$element[0].removeEventListener) { + this.$element[0] + .removeEventListener('DOMAttrModified', this._syncA, false); + this.$element[0] + .removeEventListener('DOMNodeInserted', this._syncS, false); + this.$element[0] + .removeEventListener('DOMNodeRemoved', this._syncS, false); + } + + this._syncA = null; + this._syncS = null; + + this.$element.off('.select2'); + this.$element.attr('tabindex', + Utils.GetData(this.$element[0], 'old-tabindex')); + + this.$element.removeClass('select2-hidden-accessible'); + this.$element.attr('aria-hidden', 'false'); + Utils.RemoveData(this.$element[0]); + this.$element.removeData('select2'); + + this.dataAdapter.destroy(); + this.selection.destroy(); + this.dropdown.destroy(); + this.results.destroy(); + + this.dataAdapter = null; + this.selection = null; + this.dropdown = null; + this.results = null; + }; + + Select2.prototype.render = function () { + var $container = $( + '' + + '' + + '' + + '' + ); + + $container.attr('dir', this.options.get('dir')); + + this.$container = $container; + + this.$container.addClass('select2-container--' + this.options.get('theme')); + + Utils.StoreData($container[0], 'element', this.$element); + + return $container; + }; + + return Select2; +}); + +S2.define('select2/compat/utils',[ + 'jquery' +], function ($) { + function syncCssClasses ($dest, $src, adapter) { + var classes, replacements = [], adapted; + + classes = $.trim($dest.attr('class')); + + if (classes) { + classes = '' + classes; // for IE which returns object + + $(classes.split(/\s+/)).each(function () { + // Save all Select2 classes + if (this.indexOf('select2-') === 0) { + replacements.push(this); + } + }); + } + + classes = $.trim($src.attr('class')); + + if (classes) { + classes = '' + classes; // for IE which returns object + + $(classes.split(/\s+/)).each(function () { + // Only adapt non-Select2 classes + if (this.indexOf('select2-') !== 0) { + adapted = adapter(this); + + if (adapted != null) { + replacements.push(adapted); + } + } + }); + } + + $dest.attr('class', replacements.join(' ')); + } + + return { + syncCssClasses: syncCssClasses + }; +}); + +S2.define('select2/compat/containerCss',[ + 'jquery', + './utils' +], function ($, CompatUtils) { + // No-op CSS adapter that discards all classes by default + function _containerAdapter (clazz) { + return null; + } + + function ContainerCSS () { } + + ContainerCSS.prototype.render = function (decorated) { + var $container = decorated.call(this); + + var containerCssClass = this.options.get('containerCssClass') || ''; + + if ($.isFunction(containerCssClass)) { + containerCssClass = containerCssClass(this.$element); + } + + var containerCssAdapter = this.options.get('adaptContainerCssClass'); + containerCssAdapter = containerCssAdapter || _containerAdapter; + + if (containerCssClass.indexOf(':all:') !== -1) { + containerCssClass = containerCssClass.replace(':all:', ''); + + var _cssAdapter = containerCssAdapter; + + containerCssAdapter = function (clazz) { + var adapted = _cssAdapter(clazz); + + if (adapted != null) { + // Append the old one along with the adapted one + return adapted + ' ' + clazz; + } + + return clazz; + }; + } + + var containerCss = this.options.get('containerCss') || {}; + + if ($.isFunction(containerCss)) { + containerCss = containerCss(this.$element); + } + + CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter); + + $container.css(containerCss); + $container.addClass(containerCssClass); + + return $container; + }; + + return ContainerCSS; +}); + +S2.define('select2/compat/dropdownCss',[ + 'jquery', + './utils' +], function ($, CompatUtils) { + // No-op CSS adapter that discards all classes by default + function _dropdownAdapter (clazz) { + return null; + } + + function DropdownCSS () { } + + DropdownCSS.prototype.render = function (decorated) { + var $dropdown = decorated.call(this); + + var dropdownCssClass = this.options.get('dropdownCssClass') || ''; + + if ($.isFunction(dropdownCssClass)) { + dropdownCssClass = dropdownCssClass(this.$element); + } + + var dropdownCssAdapter = this.options.get('adaptDropdownCssClass'); + dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter; + + if (dropdownCssClass.indexOf(':all:') !== -1) { + dropdownCssClass = dropdownCssClass.replace(':all:', ''); + + var _cssAdapter = dropdownCssAdapter; + + dropdownCssAdapter = function (clazz) { + var adapted = _cssAdapter(clazz); + + if (adapted != null) { + // Append the old one along with the adapted one + return adapted + ' ' + clazz; + } + + return clazz; + }; + } + + var dropdownCss = this.options.get('dropdownCss') || {}; + + if ($.isFunction(dropdownCss)) { + dropdownCss = dropdownCss(this.$element); + } + + CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter); + + $dropdown.css(dropdownCss); + $dropdown.addClass(dropdownCssClass); + + return $dropdown; + }; + + return DropdownCSS; +}); + +S2.define('select2/compat/initSelection',[ + 'jquery' +], function ($) { + function InitSelection (decorated, $element, options) { + if (options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `initSelection` option has been deprecated in favor' + + ' of a custom data adapter that overrides the `current` method. ' + + 'This method is now called multiple times instead of a single ' + + 'time when the instance is initialized. Support will be removed ' + + 'for the `initSelection` option in future versions of Select2' + ); + } + + this.initSelection = options.get('initSelection'); + this._isInitialized = false; + + decorated.call(this, $element, options); + } + + InitSelection.prototype.current = function (decorated, callback) { + var self = this; + + if (this._isInitialized) { + decorated.call(this, callback); + + return; + } + + this.initSelection.call(null, this.$element, function (data) { + self._isInitialized = true; + + if (!$.isArray(data)) { + data = [data]; + } + + callback(data); + }); + }; + + return InitSelection; +}); + +S2.define('select2/compat/inputData',[ + 'jquery', + '../utils' +], function ($, Utils) { + function InputData (decorated, $element, options) { + this._currentData = []; + this._valueSeparator = options.get('valueSeparator') || ','; + + if ($element.prop('type') === 'hidden') { + if (options.get('debug') && console && console.warn) { + console.warn( + 'Select2: Using a hidden input with Select2 is no longer ' + + 'supported and may stop working in the future. It is recommended ' + + 'to use a `');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("open",function(){i.$search.trigger("focus")}),t.on("close",function(){i.$search.val(""),i.$search.removeAttr("aria-activedescendant"),i.$search.trigger("focus")}),t.on("enable",function(){i.$search.prop("disabled",!1),i._transferTabIndex()}),t.on("disable",function(){i.$search.prop("disabled",!0)}),t.on("focus",function(e){i.$search.trigger("focus")}),t.on("results:focus",function(e){i.$search.attr("aria-activedescendant",e.id)}),this.$selection.on("focusin",".select2-search--inline",function(e){i.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){i._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented(),e.which===a.BACKSPACE&&""===i.$search.val()){var t=i.$searchContainer.prev(".select2-selection__choice");if(0this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.query=function(n,i,r){var o=this;this.current(function(e){var t=null!=e?e.length:0;0=o.maximumSelectionLength?o.trigger("results:message",{message:"maximumSelected",args:{maximum:o.maximumSelectionLength}}):n.call(o,i,r)})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(r,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=r('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),this.$search.on("keydown",function(e){i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){r(this).off("keyup")}),this.$search.on("keyup input",function(e){i.handleSearch(e)}),t.on("open",function(){i.$search.attr("tabindex",0),i.$search.focus(),window.setTimeout(function(){i.$search.focus()},0)}),t.on("close",function(){i.$search.attr("tabindex",-1),i.$search.val(""),i.$search.blur()}),t.on("focus",function(){t.isOpen()||i.$search.focus()}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(i.showSearch(e)?i.$searchContainer.removeClass("select2-search--hide"):i.$searchContainer.addClass("select2-search--hide"))})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,i){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,i)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),i=t.length-1;0<=i;i--){var r=t[i];this.placeholder.id===r.id&&n.splice(i,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(r){function e(e,t,n,i){this.lastParams={},e.call(this,t,n,i),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&this.$results.append(this.$loadingMore)},e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("query",function(e){i.lastParams=e,i.loading=!0}),t.on("query:append",function(e){i.lastParams=e,i.loading=!0}),this.$results.on("scroll",function(){var e=r.contains(document.documentElement,i.$loadingMore[0]);if(!i.loading&&e){var t=i.$results.offset().top+i.$results.outerHeight(!1);i.$loadingMore.offset().top+i.$loadingMore.outerHeight(!1)<=t+50&&i.loadMore()}})},e.prototype.loadMore=function(){this.loading=!0;var e=r.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=r('
      • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=n.get("dropdownParent")||f(document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this,r=!1;e.call(this,t,n),t.on("open",function(){i._showDropdown(),i._attachPositioningHandler(t),r||(r=!0,t.on("results:all",function(){i._positionDropdown(),i._resizeDropdown()}),t.on("results:append",function(){i._positionDropdown(),i._resizeDropdown()}))}),t.on("close",function(){i._hideDropdown(),i._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._attachPositioningHandler=function(e,t){var n=this,i="scroll.select2."+t.id,r="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(i,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(i+" "+r+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+i+" "+r)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),i=null,r=this.$container.offset();r.bottom=r.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=r.top,o.bottom=r.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ar.bottom+s,d={left:r.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h=p.offset();d.top-=h.top,d.left-=h.left,t||n||(i="below"),u||!c||t?!c&&u&&t&&(i="below"):i="above",("above"==i||t&&"below"!==i)&&(d.top=o.top-h.top-s),null!=i&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+i),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+i)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,i){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,i)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,i=0;i');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("select2/compat/utils",["jquery"],function(s){return{syncCssClasses:function(e,t,n){var i,r,o=[];(i=s.trim(e.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0===this.indexOf("select2-")&&o.push(this)}),(i=s.trim(t.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&null!=(r=n(this))&&o.push(r)}),e.attr("class",o.join(" "))}}}),e.define("select2/compat/containerCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("containerCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptContainerCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("containerCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/dropdownCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("dropdownCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptDropdownCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("dropdownCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/initSelection",["jquery"],function(i){function e(e,t,n){n.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=n.get("initSelection"),this._isInitialized=!1,e.call(this,t,n)}return e.prototype.current=function(e,t){var n=this;this._isInitialized?e.call(this,t):this.initSelection.call(null,this.$element,function(e){n._isInitialized=!0,i.isArray(e)||(e=[e]),t(e)})},e}),e.define("select2/compat/inputData",["jquery","../utils"],function(s,i){function e(e,t,n){this._currentData=[],this._valueSeparator=n.get("valueSeparator")||",","hidden"===t.prop("type")&&n.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + var $rendered = decorated.call(this); + + this._transferTabIndex(); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('open', function () { + self.$search.trigger('focus'); + }); + + container.on('close', function () { + self.$search.val(''); + self.$search.removeAttr('aria-activedescendant'); + self.$search.trigger('focus'); + }); + + container.on('enable', function () { + self.$search.prop('disabled', false); + + self._transferTabIndex(); + }); + + container.on('disable', function () { + self.$search.prop('disabled', true); + }); + + container.on('focus', function (evt) { + self.$search.trigger('focus'); + }); + + container.on('results:focus', function (params) { + self.$search.attr('aria-activedescendant', params.id); + }); + + this.$selection.on('focusin', '.select2-search--inline', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('focusout', '.select2-search--inline', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', '.select2-search--inline', function (evt) { + evt.stopPropagation(); + + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + + var key = evt.which; + + if (key === KEYS.BACKSPACE && self.$search.val() === '') { + var $previousChoice = self.$searchContainer + .prev('.select2-selection__choice'); + + if ($previousChoice.length > 0) { + var item = Utils.GetData($previousChoice[0], 'data'); + + self.searchRemoveChoice(item); + + evt.preventDefault(); + } + } + }); + + // Try to detect the IE version should the `documentMode` property that + // is stored on the document. This is only implemented in IE and is + // slightly cleaner than doing a user agent check. + // This property is not available in Edge, but Edge also doesn't have + // this bug. + var msie = document.documentMode; + var disableInputEvents = msie && msie <= 11; + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$selection.on( + 'input.searchcheck', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents) { + self.$selection.off('input.search input.searchcheck'); + return; + } + + // Unbind the duplicated `keyup` event + self.$selection.off('keyup.search'); + } + ); + + this.$selection.on( + 'keyup.search input.search', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents && evt.type === 'input') { + self.$selection.off('input.search input.searchcheck'); + return; + } + + var key = evt.which; + + // We can freely ignore events from modifier keys + if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { + return; + } + + // Tabbing will be handled during the `keydown` phase + if (key == KEYS.TAB) { + return; + } + + self.handleSearch(evt); + } + ); + }; + + /** + * This method will transfer the tabindex attribute from the rendered + * selection to the search box. This allows for the search box to be used as + * the primary focus instead of the selection container. + * + * @private + */ + Search.prototype._transferTabIndex = function (decorated) { + this.$search.attr('tabindex', this.$selection.attr('tabindex')); + this.$selection.attr('tabindex', '-1'); + }; + + Search.prototype.createPlaceholder = function (decorated, placeholder) { + this.$search.attr('placeholder', placeholder.text); + }; + + Search.prototype.update = function (decorated, data) { + var searchHadFocus = this.$search[0] == document.activeElement; + + this.$search.attr('placeholder', ''); + + decorated.call(this, data); + + this.$selection.find('.select2-selection__rendered') + .append(this.$searchContainer); + + this.resizeSearch(); + if (searchHadFocus) { + var isTagInput = this.$element.find('[data-select2-tag]').length; + if (isTagInput) { + // fix IE11 bug where tag input lost focus + this.$element.focus(); + } else { + this.$search.focus(); + } + } + }; + + Search.prototype.handleSearch = function () { + this.resizeSearch(); + + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.searchRemoveChoice = function (decorated, item) { + this.trigger('unselect', { + data: item + }); + + this.$search.val(item.text); + this.handleSearch(); + }; + + Search.prototype.resizeSearch = function () { + this.$search.css('width', '25px'); + + var width = ''; + + if (this.$search.attr('placeholder') !== '') { + width = this.$selection.find('.select2-selection__rendered').innerWidth(); + } else { + var minimumWidth = this.$search.val().length + 1; + + width = (minimumWidth * 0.75) + 'em'; + } + + this.$search.css('width', width); + }; + + return Search; +}); + +S2.define('select2/selection/eventRelay',[ + 'jquery' +], function ($) { + function EventRelay () { } + + EventRelay.prototype.bind = function (decorated, container, $container) { + var self = this; + var relayEvents = [ + 'open', 'opening', + 'close', 'closing', + 'select', 'selecting', + 'unselect', 'unselecting', + 'clear', 'clearing' + ]; + + var preventableEvents = [ + 'opening', 'closing', 'selecting', 'unselecting', 'clearing' + ]; + + decorated.call(this, container, $container); + + container.on('*', function (name, params) { + // Ignore events that should not be relayed + if ($.inArray(name, relayEvents) === -1) { + return; + } + + // The parameters should always be an object + params = params || {}; + + // Generate the jQuery event for the Select2 event + var evt = $.Event('select2:' + name, { + params: params + }); + + self.$element.trigger(evt); + + // Only handle preventable events if it was one + if ($.inArray(name, preventableEvents) === -1) { + return; + } + + params.prevented = evt.isDefaultPrevented(); + }); + }; + + return EventRelay; +}); + +S2.define('select2/translation',[ + 'jquery', + 'require' +], function ($, require) { + function Translation (dict) { + this.dict = dict || {}; + } + + Translation.prototype.all = function () { + return this.dict; + }; + + Translation.prototype.get = function (key) { + return this.dict[key]; + }; + + Translation.prototype.extend = function (translation) { + this.dict = $.extend({}, translation.all(), this.dict); + }; + + // Static functions + + Translation._cache = {}; + + Translation.loadPath = function (path) { + if (!(path in Translation._cache)) { + var translations = require(path); + + Translation._cache[path] = translations; + } + + return new Translation(Translation._cache[path]); + }; + + return Translation; +}); + +S2.define('select2/diacritics',[ + +], function () { + var diacritics = { + '\u24B6': 'A', + '\uFF21': 'A', + '\u00C0': 'A', + '\u00C1': 'A', + '\u00C2': 'A', + '\u1EA6': 'A', + '\u1EA4': 'A', + '\u1EAA': 'A', + '\u1EA8': 'A', + '\u00C3': 'A', + '\u0100': 'A', + '\u0102': 'A', + '\u1EB0': 'A', + '\u1EAE': 'A', + '\u1EB4': 'A', + '\u1EB2': 'A', + '\u0226': 'A', + '\u01E0': 'A', + '\u00C4': 'A', + '\u01DE': 'A', + '\u1EA2': 'A', + '\u00C5': 'A', + '\u01FA': 'A', + '\u01CD': 'A', + '\u0200': 'A', + '\u0202': 'A', + '\u1EA0': 'A', + '\u1EAC': 'A', + '\u1EB6': 'A', + '\u1E00': 'A', + '\u0104': 'A', + '\u023A': 'A', + '\u2C6F': 'A', + '\uA732': 'AA', + '\u00C6': 'AE', + '\u01FC': 'AE', + '\u01E2': 'AE', + '\uA734': 'AO', + '\uA736': 'AU', + '\uA738': 'AV', + '\uA73A': 'AV', + '\uA73C': 'AY', + '\u24B7': 'B', + '\uFF22': 'B', + '\u1E02': 'B', + '\u1E04': 'B', + '\u1E06': 'B', + '\u0243': 'B', + '\u0182': 'B', + '\u0181': 'B', + '\u24B8': 'C', + '\uFF23': 'C', + '\u0106': 'C', + '\u0108': 'C', + '\u010A': 'C', + '\u010C': 'C', + '\u00C7': 'C', + '\u1E08': 'C', + '\u0187': 'C', + '\u023B': 'C', + '\uA73E': 'C', + '\u24B9': 'D', + '\uFF24': 'D', + '\u1E0A': 'D', + '\u010E': 'D', + '\u1E0C': 'D', + '\u1E10': 'D', + '\u1E12': 'D', + '\u1E0E': 'D', + '\u0110': 'D', + '\u018B': 'D', + '\u018A': 'D', + '\u0189': 'D', + '\uA779': 'D', + '\u01F1': 'DZ', + '\u01C4': 'DZ', + '\u01F2': 'Dz', + '\u01C5': 'Dz', + '\u24BA': 'E', + '\uFF25': 'E', + '\u00C8': 'E', + '\u00C9': 'E', + '\u00CA': 'E', + '\u1EC0': 'E', + '\u1EBE': 'E', + '\u1EC4': 'E', + '\u1EC2': 'E', + '\u1EBC': 'E', + '\u0112': 'E', + '\u1E14': 'E', + '\u1E16': 'E', + '\u0114': 'E', + '\u0116': 'E', + '\u00CB': 'E', + '\u1EBA': 'E', + '\u011A': 'E', + '\u0204': 'E', + '\u0206': 'E', + '\u1EB8': 'E', + '\u1EC6': 'E', + '\u0228': 'E', + '\u1E1C': 'E', + '\u0118': 'E', + '\u1E18': 'E', + '\u1E1A': 'E', + '\u0190': 'E', + '\u018E': 'E', + '\u24BB': 'F', + '\uFF26': 'F', + '\u1E1E': 'F', + '\u0191': 'F', + '\uA77B': 'F', + '\u24BC': 'G', + '\uFF27': 'G', + '\u01F4': 'G', + '\u011C': 'G', + '\u1E20': 'G', + '\u011E': 'G', + '\u0120': 'G', + '\u01E6': 'G', + '\u0122': 'G', + '\u01E4': 'G', + '\u0193': 'G', + '\uA7A0': 'G', + '\uA77D': 'G', + '\uA77E': 'G', + '\u24BD': 'H', + '\uFF28': 'H', + '\u0124': 'H', + '\u1E22': 'H', + '\u1E26': 'H', + '\u021E': 'H', + '\u1E24': 'H', + '\u1E28': 'H', + '\u1E2A': 'H', + '\u0126': 'H', + '\u2C67': 'H', + '\u2C75': 'H', + '\uA78D': 'H', + '\u24BE': 'I', + '\uFF29': 'I', + '\u00CC': 'I', + '\u00CD': 'I', + '\u00CE': 'I', + '\u0128': 'I', + '\u012A': 'I', + '\u012C': 'I', + '\u0130': 'I', + '\u00CF': 'I', + '\u1E2E': 'I', + '\u1EC8': 'I', + '\u01CF': 'I', + '\u0208': 'I', + '\u020A': 'I', + '\u1ECA': 'I', + '\u012E': 'I', + '\u1E2C': 'I', + '\u0197': 'I', + '\u24BF': 'J', + '\uFF2A': 'J', + '\u0134': 'J', + '\u0248': 'J', + '\u24C0': 'K', + '\uFF2B': 'K', + '\u1E30': 'K', + '\u01E8': 'K', + '\u1E32': 'K', + '\u0136': 'K', + '\u1E34': 'K', + '\u0198': 'K', + '\u2C69': 'K', + '\uA740': 'K', + '\uA742': 'K', + '\uA744': 'K', + '\uA7A2': 'K', + '\u24C1': 'L', + '\uFF2C': 'L', + '\u013F': 'L', + '\u0139': 'L', + '\u013D': 'L', + '\u1E36': 'L', + '\u1E38': 'L', + '\u013B': 'L', + '\u1E3C': 'L', + '\u1E3A': 'L', + '\u0141': 'L', + '\u023D': 'L', + '\u2C62': 'L', + '\u2C60': 'L', + '\uA748': 'L', + '\uA746': 'L', + '\uA780': 'L', + '\u01C7': 'LJ', + '\u01C8': 'Lj', + '\u24C2': 'M', + '\uFF2D': 'M', + '\u1E3E': 'M', + '\u1E40': 'M', + '\u1E42': 'M', + '\u2C6E': 'M', + '\u019C': 'M', + '\u24C3': 'N', + '\uFF2E': 'N', + '\u01F8': 'N', + '\u0143': 'N', + '\u00D1': 'N', + '\u1E44': 'N', + '\u0147': 'N', + '\u1E46': 'N', + '\u0145': 'N', + '\u1E4A': 'N', + '\u1E48': 'N', + '\u0220': 'N', + '\u019D': 'N', + '\uA790': 'N', + '\uA7A4': 'N', + '\u01CA': 'NJ', + '\u01CB': 'Nj', + '\u24C4': 'O', + '\uFF2F': 'O', + '\u00D2': 'O', + '\u00D3': 'O', + '\u00D4': 'O', + '\u1ED2': 'O', + '\u1ED0': 'O', + '\u1ED6': 'O', + '\u1ED4': 'O', + '\u00D5': 'O', + '\u1E4C': 'O', + '\u022C': 'O', + '\u1E4E': 'O', + '\u014C': 'O', + '\u1E50': 'O', + '\u1E52': 'O', + '\u014E': 'O', + '\u022E': 'O', + '\u0230': 'O', + '\u00D6': 'O', + '\u022A': 'O', + '\u1ECE': 'O', + '\u0150': 'O', + '\u01D1': 'O', + '\u020C': 'O', + '\u020E': 'O', + '\u01A0': 'O', + '\u1EDC': 'O', + '\u1EDA': 'O', + '\u1EE0': 'O', + '\u1EDE': 'O', + '\u1EE2': 'O', + '\u1ECC': 'O', + '\u1ED8': 'O', + '\u01EA': 'O', + '\u01EC': 'O', + '\u00D8': 'O', + '\u01FE': 'O', + '\u0186': 'O', + '\u019F': 'O', + '\uA74A': 'O', + '\uA74C': 'O', + '\u0152': 'OE', + '\u01A2': 'OI', + '\uA74E': 'OO', + '\u0222': 'OU', + '\u24C5': 'P', + '\uFF30': 'P', + '\u1E54': 'P', + '\u1E56': 'P', + '\u01A4': 'P', + '\u2C63': 'P', + '\uA750': 'P', + '\uA752': 'P', + '\uA754': 'P', + '\u24C6': 'Q', + '\uFF31': 'Q', + '\uA756': 'Q', + '\uA758': 'Q', + '\u024A': 'Q', + '\u24C7': 'R', + '\uFF32': 'R', + '\u0154': 'R', + '\u1E58': 'R', + '\u0158': 'R', + '\u0210': 'R', + '\u0212': 'R', + '\u1E5A': 'R', + '\u1E5C': 'R', + '\u0156': 'R', + '\u1E5E': 'R', + '\u024C': 'R', + '\u2C64': 'R', + '\uA75A': 'R', + '\uA7A6': 'R', + '\uA782': 'R', + '\u24C8': 'S', + '\uFF33': 'S', + '\u1E9E': 'S', + '\u015A': 'S', + '\u1E64': 'S', + '\u015C': 'S', + '\u1E60': 'S', + '\u0160': 'S', + '\u1E66': 'S', + '\u1E62': 'S', + '\u1E68': 'S', + '\u0218': 'S', + '\u015E': 'S', + '\u2C7E': 'S', + '\uA7A8': 'S', + '\uA784': 'S', + '\u24C9': 'T', + '\uFF34': 'T', + '\u1E6A': 'T', + '\u0164': 'T', + '\u1E6C': 'T', + '\u021A': 'T', + '\u0162': 'T', + '\u1E70': 'T', + '\u1E6E': 'T', + '\u0166': 'T', + '\u01AC': 'T', + '\u01AE': 'T', + '\u023E': 'T', + '\uA786': 'T', + '\uA728': 'TZ', + '\u24CA': 'U', + '\uFF35': 'U', + '\u00D9': 'U', + '\u00DA': 'U', + '\u00DB': 'U', + '\u0168': 'U', + '\u1E78': 'U', + '\u016A': 'U', + '\u1E7A': 'U', + '\u016C': 'U', + '\u00DC': 'U', + '\u01DB': 'U', + '\u01D7': 'U', + '\u01D5': 'U', + '\u01D9': 'U', + '\u1EE6': 'U', + '\u016E': 'U', + '\u0170': 'U', + '\u01D3': 'U', + '\u0214': 'U', + '\u0216': 'U', + '\u01AF': 'U', + '\u1EEA': 'U', + '\u1EE8': 'U', + '\u1EEE': 'U', + '\u1EEC': 'U', + '\u1EF0': 'U', + '\u1EE4': 'U', + '\u1E72': 'U', + '\u0172': 'U', + '\u1E76': 'U', + '\u1E74': 'U', + '\u0244': 'U', + '\u24CB': 'V', + '\uFF36': 'V', + '\u1E7C': 'V', + '\u1E7E': 'V', + '\u01B2': 'V', + '\uA75E': 'V', + '\u0245': 'V', + '\uA760': 'VY', + '\u24CC': 'W', + '\uFF37': 'W', + '\u1E80': 'W', + '\u1E82': 'W', + '\u0174': 'W', + '\u1E86': 'W', + '\u1E84': 'W', + '\u1E88': 'W', + '\u2C72': 'W', + '\u24CD': 'X', + '\uFF38': 'X', + '\u1E8A': 'X', + '\u1E8C': 'X', + '\u24CE': 'Y', + '\uFF39': 'Y', + '\u1EF2': 'Y', + '\u00DD': 'Y', + '\u0176': 'Y', + '\u1EF8': 'Y', + '\u0232': 'Y', + '\u1E8E': 'Y', + '\u0178': 'Y', + '\u1EF6': 'Y', + '\u1EF4': 'Y', + '\u01B3': 'Y', + '\u024E': 'Y', + '\u1EFE': 'Y', + '\u24CF': 'Z', + '\uFF3A': 'Z', + '\u0179': 'Z', + '\u1E90': 'Z', + '\u017B': 'Z', + '\u017D': 'Z', + '\u1E92': 'Z', + '\u1E94': 'Z', + '\u01B5': 'Z', + '\u0224': 'Z', + '\u2C7F': 'Z', + '\u2C6B': 'Z', + '\uA762': 'Z', + '\u24D0': 'a', + '\uFF41': 'a', + '\u1E9A': 'a', + '\u00E0': 'a', + '\u00E1': 'a', + '\u00E2': 'a', + '\u1EA7': 'a', + '\u1EA5': 'a', + '\u1EAB': 'a', + '\u1EA9': 'a', + '\u00E3': 'a', + '\u0101': 'a', + '\u0103': 'a', + '\u1EB1': 'a', + '\u1EAF': 'a', + '\u1EB5': 'a', + '\u1EB3': 'a', + '\u0227': 'a', + '\u01E1': 'a', + '\u00E4': 'a', + '\u01DF': 'a', + '\u1EA3': 'a', + '\u00E5': 'a', + '\u01FB': 'a', + '\u01CE': 'a', + '\u0201': 'a', + '\u0203': 'a', + '\u1EA1': 'a', + '\u1EAD': 'a', + '\u1EB7': 'a', + '\u1E01': 'a', + '\u0105': 'a', + '\u2C65': 'a', + '\u0250': 'a', + '\uA733': 'aa', + '\u00E6': 'ae', + '\u01FD': 'ae', + '\u01E3': 'ae', + '\uA735': 'ao', + '\uA737': 'au', + '\uA739': 'av', + '\uA73B': 'av', + '\uA73D': 'ay', + '\u24D1': 'b', + '\uFF42': 'b', + '\u1E03': 'b', + '\u1E05': 'b', + '\u1E07': 'b', + '\u0180': 'b', + '\u0183': 'b', + '\u0253': 'b', + '\u24D2': 'c', + '\uFF43': 'c', + '\u0107': 'c', + '\u0109': 'c', + '\u010B': 'c', + '\u010D': 'c', + '\u00E7': 'c', + '\u1E09': 'c', + '\u0188': 'c', + '\u023C': 'c', + '\uA73F': 'c', + '\u2184': 'c', + '\u24D3': 'd', + '\uFF44': 'd', + '\u1E0B': 'd', + '\u010F': 'd', + '\u1E0D': 'd', + '\u1E11': 'd', + '\u1E13': 'd', + '\u1E0F': 'd', + '\u0111': 'd', + '\u018C': 'd', + '\u0256': 'd', + '\u0257': 'd', + '\uA77A': 'd', + '\u01F3': 'dz', + '\u01C6': 'dz', + '\u24D4': 'e', + '\uFF45': 'e', + '\u00E8': 'e', + '\u00E9': 'e', + '\u00EA': 'e', + '\u1EC1': 'e', + '\u1EBF': 'e', + '\u1EC5': 'e', + '\u1EC3': 'e', + '\u1EBD': 'e', + '\u0113': 'e', + '\u1E15': 'e', + '\u1E17': 'e', + '\u0115': 'e', + '\u0117': 'e', + '\u00EB': 'e', + '\u1EBB': 'e', + '\u011B': 'e', + '\u0205': 'e', + '\u0207': 'e', + '\u1EB9': 'e', + '\u1EC7': 'e', + '\u0229': 'e', + '\u1E1D': 'e', + '\u0119': 'e', + '\u1E19': 'e', + '\u1E1B': 'e', + '\u0247': 'e', + '\u025B': 'e', + '\u01DD': 'e', + '\u24D5': 'f', + '\uFF46': 'f', + '\u1E1F': 'f', + '\u0192': 'f', + '\uA77C': 'f', + '\u24D6': 'g', + '\uFF47': 'g', + '\u01F5': 'g', + '\u011D': 'g', + '\u1E21': 'g', + '\u011F': 'g', + '\u0121': 'g', + '\u01E7': 'g', + '\u0123': 'g', + '\u01E5': 'g', + '\u0260': 'g', + '\uA7A1': 'g', + '\u1D79': 'g', + '\uA77F': 'g', + '\u24D7': 'h', + '\uFF48': 'h', + '\u0125': 'h', + '\u1E23': 'h', + '\u1E27': 'h', + '\u021F': 'h', + '\u1E25': 'h', + '\u1E29': 'h', + '\u1E2B': 'h', + '\u1E96': 'h', + '\u0127': 'h', + '\u2C68': 'h', + '\u2C76': 'h', + '\u0265': 'h', + '\u0195': 'hv', + '\u24D8': 'i', + '\uFF49': 'i', + '\u00EC': 'i', + '\u00ED': 'i', + '\u00EE': 'i', + '\u0129': 'i', + '\u012B': 'i', + '\u012D': 'i', + '\u00EF': 'i', + '\u1E2F': 'i', + '\u1EC9': 'i', + '\u01D0': 'i', + '\u0209': 'i', + '\u020B': 'i', + '\u1ECB': 'i', + '\u012F': 'i', + '\u1E2D': 'i', + '\u0268': 'i', + '\u0131': 'i', + '\u24D9': 'j', + '\uFF4A': 'j', + '\u0135': 'j', + '\u01F0': 'j', + '\u0249': 'j', + '\u24DA': 'k', + '\uFF4B': 'k', + '\u1E31': 'k', + '\u01E9': 'k', + '\u1E33': 'k', + '\u0137': 'k', + '\u1E35': 'k', + '\u0199': 'k', + '\u2C6A': 'k', + '\uA741': 'k', + '\uA743': 'k', + '\uA745': 'k', + '\uA7A3': 'k', + '\u24DB': 'l', + '\uFF4C': 'l', + '\u0140': 'l', + '\u013A': 'l', + '\u013E': 'l', + '\u1E37': 'l', + '\u1E39': 'l', + '\u013C': 'l', + '\u1E3D': 'l', + '\u1E3B': 'l', + '\u017F': 'l', + '\u0142': 'l', + '\u019A': 'l', + '\u026B': 'l', + '\u2C61': 'l', + '\uA749': 'l', + '\uA781': 'l', + '\uA747': 'l', + '\u01C9': 'lj', + '\u24DC': 'm', + '\uFF4D': 'm', + '\u1E3F': 'm', + '\u1E41': 'm', + '\u1E43': 'm', + '\u0271': 'm', + '\u026F': 'm', + '\u24DD': 'n', + '\uFF4E': 'n', + '\u01F9': 'n', + '\u0144': 'n', + '\u00F1': 'n', + '\u1E45': 'n', + '\u0148': 'n', + '\u1E47': 'n', + '\u0146': 'n', + '\u1E4B': 'n', + '\u1E49': 'n', + '\u019E': 'n', + '\u0272': 'n', + '\u0149': 'n', + '\uA791': 'n', + '\uA7A5': 'n', + '\u01CC': 'nj', + '\u24DE': 'o', + '\uFF4F': 'o', + '\u00F2': 'o', + '\u00F3': 'o', + '\u00F4': 'o', + '\u1ED3': 'o', + '\u1ED1': 'o', + '\u1ED7': 'o', + '\u1ED5': 'o', + '\u00F5': 'o', + '\u1E4D': 'o', + '\u022D': 'o', + '\u1E4F': 'o', + '\u014D': 'o', + '\u1E51': 'o', + '\u1E53': 'o', + '\u014F': 'o', + '\u022F': 'o', + '\u0231': 'o', + '\u00F6': 'o', + '\u022B': 'o', + '\u1ECF': 'o', + '\u0151': 'o', + '\u01D2': 'o', + '\u020D': 'o', + '\u020F': 'o', + '\u01A1': 'o', + '\u1EDD': 'o', + '\u1EDB': 'o', + '\u1EE1': 'o', + '\u1EDF': 'o', + '\u1EE3': 'o', + '\u1ECD': 'o', + '\u1ED9': 'o', + '\u01EB': 'o', + '\u01ED': 'o', + '\u00F8': 'o', + '\u01FF': 'o', + '\u0254': 'o', + '\uA74B': 'o', + '\uA74D': 'o', + '\u0275': 'o', + '\u0153': 'oe', + '\u01A3': 'oi', + '\u0223': 'ou', + '\uA74F': 'oo', + '\u24DF': 'p', + '\uFF50': 'p', + '\u1E55': 'p', + '\u1E57': 'p', + '\u01A5': 'p', + '\u1D7D': 'p', + '\uA751': 'p', + '\uA753': 'p', + '\uA755': 'p', + '\u24E0': 'q', + '\uFF51': 'q', + '\u024B': 'q', + '\uA757': 'q', + '\uA759': 'q', + '\u24E1': 'r', + '\uFF52': 'r', + '\u0155': 'r', + '\u1E59': 'r', + '\u0159': 'r', + '\u0211': 'r', + '\u0213': 'r', + '\u1E5B': 'r', + '\u1E5D': 'r', + '\u0157': 'r', + '\u1E5F': 'r', + '\u024D': 'r', + '\u027D': 'r', + '\uA75B': 'r', + '\uA7A7': 'r', + '\uA783': 'r', + '\u24E2': 's', + '\uFF53': 's', + '\u00DF': 's', + '\u015B': 's', + '\u1E65': 's', + '\u015D': 's', + '\u1E61': 's', + '\u0161': 's', + '\u1E67': 's', + '\u1E63': 's', + '\u1E69': 's', + '\u0219': 's', + '\u015F': 's', + '\u023F': 's', + '\uA7A9': 's', + '\uA785': 's', + '\u1E9B': 's', + '\u24E3': 't', + '\uFF54': 't', + '\u1E6B': 't', + '\u1E97': 't', + '\u0165': 't', + '\u1E6D': 't', + '\u021B': 't', + '\u0163': 't', + '\u1E71': 't', + '\u1E6F': 't', + '\u0167': 't', + '\u01AD': 't', + '\u0288': 't', + '\u2C66': 't', + '\uA787': 't', + '\uA729': 'tz', + '\u24E4': 'u', + '\uFF55': 'u', + '\u00F9': 'u', + '\u00FA': 'u', + '\u00FB': 'u', + '\u0169': 'u', + '\u1E79': 'u', + '\u016B': 'u', + '\u1E7B': 'u', + '\u016D': 'u', + '\u00FC': 'u', + '\u01DC': 'u', + '\u01D8': 'u', + '\u01D6': 'u', + '\u01DA': 'u', + '\u1EE7': 'u', + '\u016F': 'u', + '\u0171': 'u', + '\u01D4': 'u', + '\u0215': 'u', + '\u0217': 'u', + '\u01B0': 'u', + '\u1EEB': 'u', + '\u1EE9': 'u', + '\u1EEF': 'u', + '\u1EED': 'u', + '\u1EF1': 'u', + '\u1EE5': 'u', + '\u1E73': 'u', + '\u0173': 'u', + '\u1E77': 'u', + '\u1E75': 'u', + '\u0289': 'u', + '\u24E5': 'v', + '\uFF56': 'v', + '\u1E7D': 'v', + '\u1E7F': 'v', + '\u028B': 'v', + '\uA75F': 'v', + '\u028C': 'v', + '\uA761': 'vy', + '\u24E6': 'w', + '\uFF57': 'w', + '\u1E81': 'w', + '\u1E83': 'w', + '\u0175': 'w', + '\u1E87': 'w', + '\u1E85': 'w', + '\u1E98': 'w', + '\u1E89': 'w', + '\u2C73': 'w', + '\u24E7': 'x', + '\uFF58': 'x', + '\u1E8B': 'x', + '\u1E8D': 'x', + '\u24E8': 'y', + '\uFF59': 'y', + '\u1EF3': 'y', + '\u00FD': 'y', + '\u0177': 'y', + '\u1EF9': 'y', + '\u0233': 'y', + '\u1E8F': 'y', + '\u00FF': 'y', + '\u1EF7': 'y', + '\u1E99': 'y', + '\u1EF5': 'y', + '\u01B4': 'y', + '\u024F': 'y', + '\u1EFF': 'y', + '\u24E9': 'z', + '\uFF5A': 'z', + '\u017A': 'z', + '\u1E91': 'z', + '\u017C': 'z', + '\u017E': 'z', + '\u1E93': 'z', + '\u1E95': 'z', + '\u01B6': 'z', + '\u0225': 'z', + '\u0240': 'z', + '\u2C6C': 'z', + '\uA763': 'z', + '\u0386': '\u0391', + '\u0388': '\u0395', + '\u0389': '\u0397', + '\u038A': '\u0399', + '\u03AA': '\u0399', + '\u038C': '\u039F', + '\u038E': '\u03A5', + '\u03AB': '\u03A5', + '\u038F': '\u03A9', + '\u03AC': '\u03B1', + '\u03AD': '\u03B5', + '\u03AE': '\u03B7', + '\u03AF': '\u03B9', + '\u03CA': '\u03B9', + '\u0390': '\u03B9', + '\u03CC': '\u03BF', + '\u03CD': '\u03C5', + '\u03CB': '\u03C5', + '\u03B0': '\u03C5', + '\u03CE': '\u03C9', + '\u03C2': '\u03C3', + '\u2019': '\'' + }; + + return diacritics; +}); + +S2.define('select2/data/base',[ + '../utils' +], function (Utils) { + function BaseAdapter ($element, options) { + BaseAdapter.__super__.constructor.call(this); + } + + Utils.Extend(BaseAdapter, Utils.Observable); + + BaseAdapter.prototype.current = function (callback) { + throw new Error('The `current` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.query = function (params, callback) { + throw new Error('The `query` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.bind = function (container, $container) { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.destroy = function () { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.generateResultId = function (container, data) { + var id = container.id + '-result-'; + + id += Utils.generateChars(4); + + if (data.id != null) { + id += '-' + data.id.toString(); + } else { + id += '-' + Utils.generateChars(4); + } + return id; + }; + + return BaseAdapter; +}); + +S2.define('select2/data/select',[ + './base', + '../utils', + 'jquery' +], function (BaseAdapter, Utils, $) { + function SelectAdapter ($element, options) { + this.$element = $element; + this.options = options; + + SelectAdapter.__super__.constructor.call(this); + } + + Utils.Extend(SelectAdapter, BaseAdapter); + + SelectAdapter.prototype.current = function (callback) { + var data = []; + var self = this; + + this.$element.find(':selected').each(function () { + var $option = $(this); + + var option = self.item($option); + + data.push(option); + }); + + callback(data); + }; + + SelectAdapter.prototype.select = function (data) { + var self = this; + + data.selected = true; + + // If data.element is a DOM node, use it instead + if ($(data.element).is('option')) { + data.element.selected = true; + + this.$element.trigger('change'); + + return; + } + + if (this.$element.prop('multiple')) { + this.current(function (currentData) { + var val = []; + + data = [data]; + data.push.apply(data, currentData); + + for (var d = 0; d < data.length; d++) { + var id = data[d].id; + + if ($.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + self.$element.trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('change'); + } + }; + + SelectAdapter.prototype.unselect = function (data) { + var self = this; + + if (!this.$element.prop('multiple')) { + return; + } + + data.selected = false; + + if ($(data.element).is('option')) { + data.element.selected = false; + + this.$element.trigger('change'); + + return; + } + + this.current(function (currentData) { + var val = []; + + for (var d = 0; d < currentData.length; d++) { + var id = currentData[d].id; + + if (id !== data.id && $.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + + self.$element.trigger('change'); + }); + }; + + SelectAdapter.prototype.bind = function (container, $container) { + var self = this; + + this.container = container; + + container.on('select', function (params) { + self.select(params.data); + }); + + container.on('unselect', function (params) { + self.unselect(params.data); + }); + }; + + SelectAdapter.prototype.destroy = function () { + // Remove anything added to child elements + this.$element.find('*').each(function () { + // Remove any custom data set by Select2 + Utils.RemoveData(this); + }); + }; + + SelectAdapter.prototype.query = function (params, callback) { + var data = []; + var self = this; + + var $options = this.$element.children(); + + $options.each(function () { + var $option = $(this); + + if (!$option.is('option') && !$option.is('optgroup')) { + return; + } + + var option = self.item($option); + + var matches = self.matches(params, option); + + if (matches !== null) { + data.push(matches); + } + }); + + callback({ + results: data + }); + }; + + SelectAdapter.prototype.addOptions = function ($options) { + Utils.appendMany(this.$element, $options); + }; + + SelectAdapter.prototype.option = function (data) { + var option; + + if (data.children) { + option = document.createElement('optgroup'); + option.label = data.text; + } else { + option = document.createElement('option'); + + if (option.textContent !== undefined) { + option.textContent = data.text; + } else { + option.innerText = data.text; + } + } + + if (data.id !== undefined) { + option.value = data.id; + } + + if (data.disabled) { + option.disabled = true; + } + + if (data.selected) { + option.selected = true; + } + + if (data.title) { + option.title = data.title; + } + + var $option = $(option); + + var normalizedData = this._normalizeItem(data); + normalizedData.element = option; + + // Override the option's data with the combined data + Utils.StoreData(option, 'data', normalizedData); + + return $option; + }; + + SelectAdapter.prototype.item = function ($option) { + var data = {}; + + data = Utils.GetData($option[0], 'data'); + + if (data != null) { + return data; + } + + if ($option.is('option')) { + data = { + id: $option.val(), + text: $option.text(), + disabled: $option.prop('disabled'), + selected: $option.prop('selected'), + title: $option.prop('title') + }; + } else if ($option.is('optgroup')) { + data = { + text: $option.prop('label'), + children: [], + title: $option.prop('title') + }; + + var $children = $option.children('option'); + var children = []; + + for (var c = 0; c < $children.length; c++) { + var $child = $($children[c]); + + var child = this.item($child); + + children.push(child); + } + + data.children = children; + } + + data = this._normalizeItem(data); + data.element = $option[0]; + + Utils.StoreData($option[0], 'data', data); + + return data; + }; + + SelectAdapter.prototype._normalizeItem = function (item) { + if (item !== Object(item)) { + item = { + id: item, + text: item + }; + } + + item = $.extend({}, { + text: '' + }, item); + + var defaults = { + selected: false, + disabled: false + }; + + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + + if (item._resultId == null && item.id && this.container != null) { + item._resultId = this.generateResultId(this.container, item); + } + + return $.extend({}, defaults, item); + }; + + SelectAdapter.prototype.matches = function (params, data) { + var matcher = this.options.get('matcher'); + + return matcher(params, data); + }; + + return SelectAdapter; +}); + +S2.define('select2/data/array',[ + './select', + '../utils', + 'jquery' +], function (SelectAdapter, Utils, $) { + function ArrayAdapter ($element, options) { + var data = options.get('data') || []; + + ArrayAdapter.__super__.constructor.call(this, $element, options); + + this.addOptions(this.convertToOptions(data)); + } + + Utils.Extend(ArrayAdapter, SelectAdapter); + + ArrayAdapter.prototype.select = function (data) { + var $option = this.$element.find('option').filter(function (i, elm) { + return elm.value == data.id.toString(); + }); + + if ($option.length === 0) { + $option = this.option(data); + + this.addOptions($option); + } + + ArrayAdapter.__super__.select.call(this, data); + }; + + ArrayAdapter.prototype.convertToOptions = function (data) { + var self = this; + + var $existing = this.$element.find('option'); + var existingIds = $existing.map(function () { + return self.item($(this)).id; + }).get(); + + var $options = []; + + // Filter out all items except for the one passed in the argument + function onlyItem (item) { + return function () { + return $(this).val() == item.id; + }; + } + + for (var d = 0; d < data.length; d++) { + var item = this._normalizeItem(data[d]); + + // Skip items which were pre-loaded, only merge the data + if ($.inArray(item.id, existingIds) >= 0) { + var $existingOption = $existing.filter(onlyItem(item)); + + var existingData = this.item($existingOption); + var newData = $.extend(true, {}, item, existingData); + + var $newOption = this.option(newData); + + $existingOption.replaceWith($newOption); + + continue; + } + + var $option = this.option(item); + + if (item.children) { + var $children = this.convertToOptions(item.children); + + Utils.appendMany($option, $children); + } + + $options.push($option); + } + + return $options; + }; + + return ArrayAdapter; +}); + +S2.define('select2/data/ajax',[ + './array', + '../utils', + 'jquery' +], function (ArrayAdapter, Utils, $) { + function AjaxAdapter ($element, options) { + this.ajaxOptions = this._applyDefaults(options.get('ajax')); + + if (this.ajaxOptions.processResults != null) { + this.processResults = this.ajaxOptions.processResults; + } + + AjaxAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(AjaxAdapter, ArrayAdapter); + + AjaxAdapter.prototype._applyDefaults = function (options) { + var defaults = { + data: function (params) { + return $.extend({}, params, { + q: params.term + }); + }, + transport: function (params, success, failure) { + var $request = $.ajax(params); + + $request.then(success); + $request.fail(failure); + + return $request; + } + }; + + return $.extend({}, defaults, options, true); + }; + + AjaxAdapter.prototype.processResults = function (results) { + return results; + }; + + AjaxAdapter.prototype.query = function (params, callback) { + var matches = []; + var self = this; + + if (this._request != null) { + // JSONP requests cannot always be aborted + if ($.isFunction(this._request.abort)) { + this._request.abort(); + } + + this._request = null; + } + + var options = $.extend({ + type: 'GET' + }, this.ajaxOptions); + + if (typeof options.url === 'function') { + options.url = options.url.call(this.$element, params); + } + + if (typeof options.data === 'function') { + options.data = options.data.call(this.$element, params); + } + + function request () { + var $request = options.transport(options, function (data) { + var results = self.processResults(data, params); + + if (self.options.get('debug') && window.console && console.error) { + // Check to make sure that the response included a `results` key. + if (!results || !results.results || !$.isArray(results.results)) { + console.error( + 'Select2: The AJAX results did not return an array in the ' + + '`results` key of the response.' + ); + } + } + + callback(results); + }, function () { + // Attempt to detect if a request was aborted + // Only works if the transport exposes a status property + if ('status' in $request && + ($request.status === 0 || $request.status === '0')) { + return; + } + + self.trigger('results:message', { + message: 'errorLoading' + }); + }); + + self._request = $request; + } + + if (this.ajaxOptions.delay && params.term != null) { + if (this._queryTimeout) { + window.clearTimeout(this._queryTimeout); + } + + this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); + } else { + request(); + } + }; + + return AjaxAdapter; +}); + +S2.define('select2/data/tags',[ + 'jquery' +], function ($) { + function Tags (decorated, $element, options) { + var tags = options.get('tags'); + + var createTag = options.get('createTag'); + + if (createTag !== undefined) { + this.createTag = createTag; + } + + var insertTag = options.get('insertTag'); + + if (insertTag !== undefined) { + this.insertTag = insertTag; + } + + decorated.call(this, $element, options); + + if ($.isArray(tags)) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + var item = this._normalizeItem(tag); + + var $option = this.option(item); + + this.$element.append($option); + } + } + } + + Tags.prototype.query = function (decorated, params, callback) { + var self = this; + + this._removeOldTags(); + + if (params.term == null || params.page != null) { + decorated.call(this, params, callback); + return; + } + + function wrapper (obj, child) { + var data = obj.results; + + for (var i = 0; i < data.length; i++) { + var option = data[i]; + + var checkChildren = ( + option.children != null && + !wrapper({ + results: option.children + }, true) + ); + + var optionText = (option.text || '').toUpperCase(); + var paramsTerm = (params.term || '').toUpperCase(); + + var checkText = optionText === paramsTerm; + + if (checkText || checkChildren) { + if (child) { + return false; + } + + obj.data = data; + callback(obj); + + return; + } + } + + if (child) { + return true; + } + + var tag = self.createTag(params); + + if (tag != null) { + var $option = self.option(tag); + $option.attr('data-select2-tag', true); + + self.addOptions([$option]); + + self.insertTag(data, tag); + } + + obj.results = data; + + callback(obj); + } + + decorated.call(this, params, wrapper); + }; + + Tags.prototype.createTag = function (decorated, params) { + var term = $.trim(params.term); + + if (term === '') { + return null; + } + + return { + id: term, + text: term + }; + }; + + Tags.prototype.insertTag = function (_, data, tag) { + data.unshift(tag); + }; + + Tags.prototype._removeOldTags = function (_) { + var tag = this._lastTag; + + var $options = this.$element.find('option[data-select2-tag]'); + + $options.each(function () { + if (this.selected) { + return; + } + + $(this).remove(); + }); + }; + + return Tags; +}); + +S2.define('select2/data/tokenizer',[ + 'jquery' +], function ($) { + function Tokenizer (decorated, $element, options) { + var tokenizer = options.get('tokenizer'); + + if (tokenizer !== undefined) { + this.tokenizer = tokenizer; + } + + decorated.call(this, $element, options); + } + + Tokenizer.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + this.$search = container.dropdown.$search || container.selection.$search || + $container.find('.select2-search__field'); + }; + + Tokenizer.prototype.query = function (decorated, params, callback) { + var self = this; + + function createAndSelect (data) { + // Normalize the data object so we can use it for checks + var item = self._normalizeItem(data); + + // Check if the data object already exists as a tag + // Select it if it doesn't + var $existingOptions = self.$element.find('option').filter(function () { + return $(this).val() === item.id; + }); + + // If an existing option wasn't found for it, create the option + if (!$existingOptions.length) { + var $option = self.option(item); + $option.attr('data-select2-tag', true); + + self._removeOldTags(); + self.addOptions([$option]); + } + + // Select the item, now that we know there is an option for it + select(item); + } + + function select (data) { + self.trigger('select', { + data: data + }); + } + + params.term = params.term || ''; + + var tokenData = this.tokenizer(params, this.options, createAndSelect); + + if (tokenData.term !== params.term) { + // Replace the search term if we have the search box + if (this.$search.length) { + this.$search.val(tokenData.term); + this.$search.focus(); + } + + params.term = tokenData.term; + } + + decorated.call(this, params, callback); + }; + + Tokenizer.prototype.tokenizer = function (_, params, options, callback) { + var separators = options.get('tokenSeparators') || []; + var term = params.term; + var i = 0; + + var createTag = this.createTag || function (params) { + return { + id: params.term, + text: params.term + }; + }; + + while (i < term.length) { + var termChar = term[i]; + + if ($.inArray(termChar, separators) === -1) { + i++; + + continue; + } + + var part = term.substr(0, i); + var partParams = $.extend({}, params, { + term: part + }); + + var data = createTag(partParams); + + if (data == null) { + i++; + continue; + } + + callback(data); + + // Reset the term to not include the tokenized portion + term = term.substr(i + 1) || ''; + i = 0; + } + + return { + term: term + }; + }; + + return Tokenizer; +}); + +S2.define('select2/data/minimumInputLength',[ + +], function () { + function MinimumInputLength (decorated, $e, options) { + this.minimumInputLength = options.get('minimumInputLength'); + + decorated.call(this, $e, options); + } + + MinimumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (params.term.length < this.minimumInputLength) { + this.trigger('results:message', { + message: 'inputTooShort', + args: { + minimum: this.minimumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MinimumInputLength; +}); + +S2.define('select2/data/maximumInputLength',[ + +], function () { + function MaximumInputLength (decorated, $e, options) { + this.maximumInputLength = options.get('maximumInputLength'); + + decorated.call(this, $e, options); + } + + MaximumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (this.maximumInputLength > 0 && + params.term.length > this.maximumInputLength) { + this.trigger('results:message', { + message: 'inputTooLong', + args: { + maximum: this.maximumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MaximumInputLength; +}); + +S2.define('select2/data/maximumSelectionLength',[ + +], function (){ + function MaximumSelectionLength (decorated, $e, options) { + this.maximumSelectionLength = options.get('maximumSelectionLength'); + + decorated.call(this, $e, options); + } + + MaximumSelectionLength.prototype.query = + function (decorated, params, callback) { + var self = this; + + this.current(function (currentData) { + var count = currentData != null ? currentData.length : 0; + if (self.maximumSelectionLength > 0 && + count >= self.maximumSelectionLength) { + self.trigger('results:message', { + message: 'maximumSelected', + args: { + maximum: self.maximumSelectionLength + } + }); + return; + } + decorated.call(self, params, callback); + }); + }; + + return MaximumSelectionLength; +}); + +S2.define('select2/dropdown',[ + 'jquery', + './utils' +], function ($, Utils) { + function Dropdown ($element, options) { + this.$element = $element; + this.options = options; + + Dropdown.__super__.constructor.call(this); + } + + Utils.Extend(Dropdown, Utils.Observable); + + Dropdown.prototype.render = function () { + var $dropdown = $( + '' + + '' + + '' + ); + + $dropdown.attr('dir', this.options.get('dir')); + + this.$dropdown = $dropdown; + + return $dropdown; + }; + + Dropdown.prototype.bind = function () { + // Should be implemented in subclasses + }; + + Dropdown.prototype.position = function ($dropdown, $container) { + // Should be implemented in subclasses + }; + + Dropdown.prototype.destroy = function () { + // Remove the dropdown from the DOM + this.$dropdown.remove(); + }; + + return Dropdown; +}); + +S2.define('select2/dropdown/search',[ + 'jquery', + '../utils' +], function ($, Utils) { + function Search () { } + + Search.prototype.render = function (decorated) { + var $rendered = decorated.call(this); + + var $search = $( + '' + + '' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + $rendered.prepend($search); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + this.$search.on('keydown', function (evt) { + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$search.on('input', function (evt) { + // Unbind the duplicated `keyup` event + $(this).off('keyup'); + }); + + this.$search.on('keyup input', function (evt) { + self.handleSearch(evt); + }); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + + self.$search.focus(); + + window.setTimeout(function () { + self.$search.focus(); + }, 0); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + + self.$search.val(''); + self.$search.blur(); + }); + + container.on('focus', function () { + if (!container.isOpen()) { + self.$search.focus(); + } + }); + + container.on('results:all', function (params) { + if (params.query.term == null || params.query.term === '') { + var showSearch = self.showSearch(params); + + if (showSearch) { + self.$searchContainer.removeClass('select2-search--hide'); + } else { + self.$searchContainer.addClass('select2-search--hide'); + } + } + }); + }; + + Search.prototype.handleSearch = function (evt) { + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.showSearch = function (_, params) { + return true; + }; + + return Search; +}); + +S2.define('select2/dropdown/hidePlaceholder',[ + +], function () { + function HidePlaceholder (decorated, $element, options, dataAdapter) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options, dataAdapter); + } + + HidePlaceholder.prototype.append = function (decorated, data) { + data.results = this.removePlaceholder(data.results); + + decorated.call(this, data); + }; + + HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + HidePlaceholder.prototype.removePlaceholder = function (_, data) { + var modifiedData = data.slice(0); + + for (var d = data.length - 1; d >= 0; d--) { + var item = data[d]; + + if (this.placeholder.id === item.id) { + modifiedData.splice(d, 1); + } + } + + return modifiedData; + }; + + return HidePlaceholder; +}); + +S2.define('select2/dropdown/infiniteScroll',[ + 'jquery' +], function ($) { + function InfiniteScroll (decorated, $element, options, dataAdapter) { + this.lastParams = {}; + + decorated.call(this, $element, options, dataAdapter); + + this.$loadingMore = this.createLoadingMore(); + this.loading = false; + } + + InfiniteScroll.prototype.append = function (decorated, data) { + this.$loadingMore.remove(); + this.loading = false; + + decorated.call(this, data); + + if (this.showLoadingMore(data)) { + this.$results.append(this.$loadingMore); + } + }; + + InfiniteScroll.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('query', function (params) { + self.lastParams = params; + self.loading = true; + }); + + container.on('query:append', function (params) { + self.lastParams = params; + self.loading = true; + }); + + this.$results.on('scroll', function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + self.$loadingMore[0] + ); + + if (self.loading || !isLoadMoreVisible) { + return; + } + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var loadingMoreOffset = self.$loadingMore.offset().top + + self.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + self.loadMore(); + } + }); + }; + + InfiniteScroll.prototype.loadMore = function () { + this.loading = true; + + var params = $.extend({}, {page: 1}, this.lastParams); + + params.page++; + + this.trigger('query:append', params); + }; + + InfiniteScroll.prototype.showLoadingMore = function (_, data) { + return data.pagination && data.pagination.more; + }; + + InfiniteScroll.prototype.createLoadingMore = function () { + var $option = $( + '
      • ' + ); + + var message = this.options.get('translations').get('loadingMore'); + + $option.html(message(this.lastParams)); + + return $option; + }; + + return InfiniteScroll; +}); + +S2.define('select2/dropdown/attachBody',[ + 'jquery', + '../utils' +], function ($, Utils) { + function AttachBody (decorated, $element, options) { + this.$dropdownParent = options.get('dropdownParent') || $(document.body); + + decorated.call(this, $element, options); + } + + AttachBody.prototype.bind = function (decorated, container, $container) { + var self = this; + + var setupResultsEvents = false; + + decorated.call(this, container, $container); + + container.on('open', function () { + self._showDropdown(); + self._attachPositioningHandler(container); + + if (!setupResultsEvents) { + setupResultsEvents = true; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + } + }); + + container.on('close', function () { + self._hideDropdown(); + self._detachPositioningHandler(container); + }); + + this.$dropdownContainer.on('mousedown', function (evt) { + evt.stopPropagation(); + }); + }; + + AttachBody.prototype.destroy = function (decorated) { + decorated.call(this); + + this.$dropdownContainer.remove(); + }; + + AttachBody.prototype.position = function (decorated, $dropdown, $container) { + // Clone all of the container classes + $dropdown.attr('class', $container.attr('class')); + + $dropdown.removeClass('select2'); + $dropdown.addClass('select2-container--open'); + + $dropdown.css({ + position: 'absolute', + top: -999999 + }); + + this.$container = $container; + }; + + AttachBody.prototype.render = function (decorated) { + var $container = $(''); + + var $dropdown = decorated.call(this); + $container.append($dropdown); + + this.$dropdownContainer = $container; + + return $container; + }; + + AttachBody.prototype._hideDropdown = function (decorated) { + this.$dropdownContainer.detach(); + }; + + AttachBody.prototype._attachPositioningHandler = + function (decorated, container) { + var self = this; + + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.each(function () { + Utils.StoreData(this, 'select2-scroll-position', { + x: $(this).scrollLeft(), + y: $(this).scrollTop() + }); + }); + + $watchers.on(scrollEvent, function (ev) { + var position = Utils.GetData(this, 'select2-scroll-position'); + $(this).scrollTop(position.y); + }); + + $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, + function (e) { + self._positionDropdown(); + self._resizeDropdown(); + }); + }; + + AttachBody.prototype._detachPositioningHandler = + function (decorated, container) { + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.off(scrollEvent); + + $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); + }; + + AttachBody.prototype._positionDropdown = function () { + var $window = $(window); + + var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); + var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); + + var newDirection = null; + + var offset = this.$container.offset(); + + offset.bottom = offset.top + this.$container.outerHeight(false); + + var container = { + height: this.$container.outerHeight(false) + }; + + container.top = offset.top; + container.bottom = offset.top + container.height; + + var dropdown = { + height: this.$dropdown.outerHeight(false) + }; + + var viewport = { + top: $window.scrollTop(), + bottom: $window.scrollTop() + $window.height() + }; + + var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); + var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); + + var css = { + left: offset.left, + top: container.bottom + }; + + // Determine what the parent element is to use for calculating the offset + var $offsetParent = this.$dropdownParent; + + // For statically positioned elements, we need to get the element + // that is determining the offset + if ($offsetParent.css('position') === 'static') { + $offsetParent = $offsetParent.offsetParent(); + } + + var parentOffset = $offsetParent.offset(); + + css.top -= parentOffset.top; + css.left -= parentOffset.left; + + if (!isCurrentlyAbove && !isCurrentlyBelow) { + newDirection = 'below'; + } + + if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { + newDirection = 'above'; + } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { + newDirection = 'below'; + } + + if (newDirection == 'above' || + (isCurrentlyAbove && newDirection !== 'below')) { + css.top = container.top - parentOffset.top - dropdown.height; + } + + if (newDirection != null) { + this.$dropdown + .removeClass('select2-dropdown--below select2-dropdown--above') + .addClass('select2-dropdown--' + newDirection); + this.$container + .removeClass('select2-container--below select2-container--above') + .addClass('select2-container--' + newDirection); + } + + this.$dropdownContainer.css(css); + }; + + AttachBody.prototype._resizeDropdown = function () { + var css = { + width: this.$container.outerWidth(false) + 'px' + }; + + if (this.options.get('dropdownAutoWidth')) { + css.minWidth = css.width; + css.position = 'relative'; + css.width = 'auto'; + } + + this.$dropdown.css(css); + }; + + AttachBody.prototype._showDropdown = function (decorated) { + this.$dropdownContainer.appendTo(this.$dropdownParent); + + this._positionDropdown(); + this._resizeDropdown(); + }; + + return AttachBody; +}); + +S2.define('select2/dropdown/minimumResultsForSearch',[ + +], function () { + function countResults (data) { + var count = 0; + + for (var d = 0; d < data.length; d++) { + var item = data[d]; + + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + } + + return count; + } + + function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { + this.minimumResultsForSearch = options.get('minimumResultsForSearch'); + + if (this.minimumResultsForSearch < 0) { + this.minimumResultsForSearch = Infinity; + } + + decorated.call(this, $element, options, dataAdapter); + } + + MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { + if (countResults(params.data.results) < this.minimumResultsForSearch) { + return false; + } + + return decorated.call(this, params); + }; + + return MinimumResultsForSearch; +}); + +S2.define('select2/dropdown/selectOnClose',[ + '../utils' +], function (Utils) { + function SelectOnClose () { } + + SelectOnClose.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('close', function (params) { + self._handleSelectOnClose(params); + }); + }; + + SelectOnClose.prototype._handleSelectOnClose = function (_, params) { + if (params && params.originalSelect2Event != null) { + var event = params.originalSelect2Event; + + // Don't select an item if the close event was triggered from a select or + // unselect event + if (event._type === 'select' || event._type === 'unselect') { + return; + } + } + + var $highlightedResults = this.getHighlightedResults(); + + // Only select highlighted results + if ($highlightedResults.length < 1) { + return; + } + + var data = Utils.GetData($highlightedResults[0], 'data'); + + // Don't re-select already selected resulte + if ( + (data.element != null && data.element.selected) || + (data.element == null && data.selected) + ) { + return; + } + + this.trigger('select', { + data: data + }); + }; + + return SelectOnClose; +}); + +S2.define('select2/dropdown/closeOnSelect',[ + +], function () { + function CloseOnSelect () { } + + CloseOnSelect.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function (evt) { + self._selectTriggered(evt); + }); + + container.on('unselect', function (evt) { + self._selectTriggered(evt); + }); + }; + + CloseOnSelect.prototype._selectTriggered = function (_, evt) { + var originalEvent = evt.originalEvent; + + // Don't close if the control key is being held + if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { + return; + } + + this.trigger('close', { + originalEvent: originalEvent, + originalSelect2Event: evt + }); + }; + + return CloseOnSelect; +}); + +S2.define('select2/i18n/en',[],function () { + // English + return { + errorLoading: function () { + return 'The results could not be loaded.'; + }, + inputTooLong: function (args) { + var overChars = args.input.length - args.maximum; + + var message = 'Please delete ' + overChars + ' character'; + + if (overChars != 1) { + message += 's'; + } + + return message; + }, + inputTooShort: function (args) { + var remainingChars = args.minimum - args.input.length; + + var message = 'Please enter ' + remainingChars + ' or more characters'; + + return message; + }, + loadingMore: function () { + return 'Loading more results…'; + }, + maximumSelected: function (args) { + var message = 'You can only select ' + args.maximum + ' item'; + + if (args.maximum != 1) { + message += 's'; + } + + return message; + }, + noResults: function () { + return 'No results found'; + }, + searching: function () { + return 'Searching…'; + }, + removeAllItems: function () { + return 'Remove all items'; + } + }; +}); + +S2.define('select2/defaults',[ + 'jquery', + 'require', + + './results', + + './selection/single', + './selection/multiple', + './selection/placeholder', + './selection/allowClear', + './selection/search', + './selection/eventRelay', + + './utils', + './translation', + './diacritics', + + './data/select', + './data/array', + './data/ajax', + './data/tags', + './data/tokenizer', + './data/minimumInputLength', + './data/maximumInputLength', + './data/maximumSelectionLength', + + './dropdown', + './dropdown/search', + './dropdown/hidePlaceholder', + './dropdown/infiniteScroll', + './dropdown/attachBody', + './dropdown/minimumResultsForSearch', + './dropdown/selectOnClose', + './dropdown/closeOnSelect', + + './i18n/en' +], function ($, require, + + ResultsList, + + SingleSelection, MultipleSelection, Placeholder, AllowClear, + SelectionSearch, EventRelay, + + Utils, Translation, DIACRITICS, + + SelectData, ArrayData, AjaxData, Tags, Tokenizer, + MinimumInputLength, MaximumInputLength, MaximumSelectionLength, + + Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, + AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, + + EnglishTranslation) { + function Defaults () { + this.reset(); + } + + Defaults.prototype.apply = function (options) { + options = $.extend(true, {}, this.defaults, options); + + if (options.dataAdapter == null) { + if (options.ajax != null) { + options.dataAdapter = AjaxData; + } else if (options.data != null) { + options.dataAdapter = ArrayData; + } else { + options.dataAdapter = SelectData; + } + + if (options.minimumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MinimumInputLength + ); + } + + if (options.maximumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumInputLength + ); + } + + if (options.maximumSelectionLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumSelectionLength + ); + } + + if (options.tags) { + options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); + } + + if (options.tokenSeparators != null || options.tokenizer != null) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Tokenizer + ); + } + + if (options.query != null) { + var Query = require(options.amdBase + 'compat/query'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Query + ); + } + + if (options.initSelection != null) { + var InitSelection = require(options.amdBase + 'compat/initSelection'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + InitSelection + ); + } + } + + if (options.resultsAdapter == null) { + options.resultsAdapter = ResultsList; + + if (options.ajax != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + InfiniteScroll + ); + } + + if (options.placeholder != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + HidePlaceholder + ); + } + + if (options.selectOnClose) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + SelectOnClose + ); + } + } + + if (options.dropdownAdapter == null) { + if (options.multiple) { + options.dropdownAdapter = Dropdown; + } else { + var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); + + options.dropdownAdapter = SearchableDropdown; + } + + if (options.minimumResultsForSearch !== 0) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + MinimumResultsForSearch + ); + } + + if (options.closeOnSelect) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + CloseOnSelect + ); + } + + if ( + options.dropdownCssClass != null || + options.dropdownCss != null || + options.adaptDropdownCssClass != null + ) { + var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + DropdownCSS + ); + } + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + AttachBody + ); + } + + if (options.selectionAdapter == null) { + if (options.multiple) { + options.selectionAdapter = MultipleSelection; + } else { + options.selectionAdapter = SingleSelection; + } + + // Add the placeholder mixin if a placeholder was specified + if (options.placeholder != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + Placeholder + ); + } + + if (options.allowClear) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + AllowClear + ); + } + + if (options.multiple) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionSearch + ); + } + + if ( + options.containerCssClass != null || + options.containerCss != null || + options.adaptContainerCssClass != null + ) { + var ContainerCSS = require(options.amdBase + 'compat/containerCss'); + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + ContainerCSS + ); + } + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + EventRelay + ); + } + + if (typeof options.language === 'string') { + // Check if the language is specified with a region + if (options.language.indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = options.language.split('-'); + var baseLanguage = languageParts[0]; + + options.language = [options.language, baseLanguage]; + } else { + options.language = [options.language]; + } + } + + if ($.isArray(options.language)) { + var languages = new Translation(); + options.language.push('en'); + + var languageNames = options.language; + + for (var l = 0; l < languageNames.length; l++) { + var name = languageNames[l]; + var language = {}; + + try { + // Try to load it with the original name + language = Translation.loadPath(name); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + name = this.defaults.amdLanguageBase + name; + language = Translation.loadPath(name); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files. + if (options.debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + name + '" could not be ' + + 'automatically loaded. A fallback will be used instead.' + ); + } + + continue; + } + } + + languages.extend(language); + } + + options.translations = languages; + } else { + var baseTranslation = Translation.loadPath( + this.defaults.amdLanguageBase + 'en' + ); + var customTranslation = new Translation(options.language); + + customTranslation.extend(baseTranslation); + + options.translations = customTranslation; + } + + return options; + }; + + Defaults.prototype.reset = function () { + function stripDiacritics (text) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return text.replace(/[^\u0000-\u007E]/g, match); + } + + function matcher (params, data) { + // Always return the object if there is nothing to compare + if ($.trim(params.term) === '') { + return data; + } + + // Do a recursive check for options with children + if (data.children && data.children.length > 0) { + // Clone the data object if there are children + // This is required as we modify the object to remove any non-matches + var match = $.extend(true, {}, data); + + // Check each child of the option + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + var matches = matcher(params, child); + + // If there wasn't a match, remove the object in the array + if (matches == null) { + match.children.splice(c, 1); + } + } + + // If any children matched, return the new object + if (match.children.length > 0) { + return match; + } + + // If there were no matching children, check just the plain object + return matcher(params, match); + } + + var original = stripDiacritics(data.text).toUpperCase(); + var term = stripDiacritics(params.term).toUpperCase(); + + // Check if the text contains the term + if (original.indexOf(term) > -1) { + return data; + } + + // If it doesn't contain the term, don't return anything + return null; + } + + this.defaults = { + amdBase: './', + amdLanguageBase: './i18n/', + closeOnSelect: true, + debug: false, + dropdownAutoWidth: false, + escapeMarkup: Utils.escapeMarkup, + language: EnglishTranslation, + matcher: matcher, + minimumInputLength: 0, + maximumInputLength: 0, + maximumSelectionLength: 0, + minimumResultsForSearch: 0, + selectOnClose: false, + scrollAfterSelect: false, + sorter: function (data) { + return data; + }, + templateResult: function (result) { + return result.text; + }, + templateSelection: function (selection) { + return selection.text; + }, + theme: 'default', + width: 'resolve' + }; + }; + + Defaults.prototype.set = function (key, value) { + var camelKey = $.camelCase(key); + + var data = {}; + data[camelKey] = value; + + var convertedData = Utils._convertData(data); + + $.extend(true, this.defaults, convertedData); + }; + + var defaults = new Defaults(); + + return defaults; +}); + +S2.define('select2/options',[ + 'require', + 'jquery', + './defaults', + './utils' +], function (require, $, Defaults, Utils) { + function Options (options, $element) { + this.options = options; + + if ($element != null) { + this.fromElement($element); + } + + this.options = Defaults.apply(this.options); + + if ($element && $element.is('input')) { + var InputCompat = require(this.get('amdBase') + 'compat/inputData'); + + this.options.dataAdapter = Utils.Decorate( + this.options.dataAdapter, + InputCompat + ); + } + } + + Options.prototype.fromElement = function ($e) { + var excludedData = ['select2']; + + if (this.options.multiple == null) { + this.options.multiple = $e.prop('multiple'); + } + + if (this.options.disabled == null) { + this.options.disabled = $e.prop('disabled'); + } + + if (this.options.language == null) { + if ($e.prop('lang')) { + this.options.language = $e.prop('lang').toLowerCase(); + } else if ($e.closest('[lang]').prop('lang')) { + this.options.language = $e.closest('[lang]').prop('lang'); + } + } + + if (this.options.dir == null) { + if ($e.prop('dir')) { + this.options.dir = $e.prop('dir'); + } else if ($e.closest('[dir]').prop('dir')) { + this.options.dir = $e.closest('[dir]').prop('dir'); + } else { + this.options.dir = 'ltr'; + } + } + + $e.prop('disabled', this.options.disabled); + $e.prop('multiple', this.options.multiple); + + if (Utils.GetData($e[0], 'select2Tags')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been changed to ' + + 'use the `data-data` and `data-tags="true"` attributes and will be ' + + 'removed in future versions of Select2.' + ); + } + + Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); + Utils.StoreData($e[0], 'tags', true); + } + + if (Utils.GetData($e[0], 'ajaxUrl')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-ajax-url` attribute has been changed to ' + + '`data-ajax--url` and support for the old attribute will be removed' + + ' in future versions of Select2.' + ); + } + + $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); + Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); + } + + var dataset = {}; + + function upperCaseLetter(_, letter) { + return letter.toUpperCase(); + } + + // Pre-load all of the attributes which are prefixed with `data-` + for (var attr = 0; attr < $e[0].attributes.length; attr++) { + var attributeName = $e[0].attributes[attr].name; + var prefix = 'data-'; + + if (attributeName.substr(0, prefix.length) == prefix) { + // Get the contents of the attribute after `data-` + var dataName = attributeName.substring(prefix.length); + + // Get the data contents from the consistent source + // This is more than likely the jQuery data helper + var dataValue = Utils.GetData($e[0], dataName); + + // camelCase the attribute name to match the spec + var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); + + // Store the data attribute contents into the dataset since + dataset[camelDataName] = dataValue; + } + } + + // Prefer the element's `dataset` attribute if it exists + // jQuery 1.x does not correctly handle data attributes with multiple dashes + if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { + dataset = $.extend(true, {}, $e[0].dataset, dataset); + } + + // Prefer our internal data cache if it exists + var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); + + data = Utils._convertData(data); + + for (var key in data) { + if ($.inArray(key, excludedData) > -1) { + continue; + } + + if ($.isPlainObject(this.options[key])) { + $.extend(this.options[key], data[key]); + } else { + this.options[key] = data[key]; + } + } + + return this; + }; + + Options.prototype.get = function (key) { + return this.options[key]; + }; + + Options.prototype.set = function (key, val) { + this.options[key] = val; + }; + + return Options; +}); + +S2.define('select2/core',[ + 'jquery', + './options', + './utils', + './keys' +], function ($, Options, Utils, KEYS) { + var Select2 = function ($element, options) { + if (Utils.GetData($element[0], 'select2') != null) { + Utils.GetData($element[0], 'select2').destroy(); + } + + this.$element = $element; + + this.id = this._generateId($element); + + options = options || {}; + + this.options = new Options(options, $element); + + Select2.__super__.constructor.call(this); + + // Set up the tabindex + + var tabindex = $element.attr('tabindex') || 0; + Utils.StoreData($element[0], 'old-tabindex', tabindex); + $element.attr('tabindex', '-1'); + + // Set up containers and adapters + + var DataAdapter = this.options.get('dataAdapter'); + this.dataAdapter = new DataAdapter($element, this.options); + + var $container = this.render(); + + this._placeContainer($container); + + var SelectionAdapter = this.options.get('selectionAdapter'); + this.selection = new SelectionAdapter($element, this.options); + this.$selection = this.selection.render(); + + this.selection.position(this.$selection, $container); + + var DropdownAdapter = this.options.get('dropdownAdapter'); + this.dropdown = new DropdownAdapter($element, this.options); + this.$dropdown = this.dropdown.render(); + + this.dropdown.position(this.$dropdown, $container); + + var ResultsAdapter = this.options.get('resultsAdapter'); + this.results = new ResultsAdapter($element, this.options, this.dataAdapter); + this.$results = this.results.render(); + + this.results.position(this.$results, this.$dropdown); + + // Bind events + + var self = this; + + // Bind the container to all of the adapters + this._bindAdapters(); + + // Register any DOM event handlers + this._registerDomEvents(); + + // Register any internal event handlers + this._registerDataEvents(); + this._registerSelectionEvents(); + this._registerDropdownEvents(); + this._registerResultsEvents(); + this._registerEvents(); + + // Set the initial state + this.dataAdapter.current(function (initialData) { + self.trigger('selection:update', { + data: initialData + }); + }); + + // Hide the original select + $element.addClass('select2-hidden-accessible'); + $element.attr('aria-hidden', 'true'); + + // Synchronize any monitored attributes + this._syncAttributes(); + + Utils.StoreData($element[0], 'select2', this); + + // Ensure backwards compatibility with $element.data('select2'). + $element.data('select2', this); + }; + + Utils.Extend(Select2, Utils.Observable); + + Select2.prototype._generateId = function ($element) { + var id = ''; + + if ($element.attr('id') != null) { + id = $element.attr('id'); + } else if ($element.attr('name') != null) { + id = $element.attr('name') + '-' + Utils.generateChars(2); + } else { + id = Utils.generateChars(4); + } + + id = id.replace(/(:|\.|\[|\]|,)/g, ''); + id = 'select2-' + id; + + return id; + }; + + Select2.prototype._placeContainer = function ($container) { + $container.insertAfter(this.$element); + + var width = this._resolveWidth(this.$element, this.options.get('width')); + + if (width != null) { + $container.css('width', width); + } + }; + + Select2.prototype._resolveWidth = function ($element, method) { + var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; + + if (method == 'resolve') { + var styleWidth = this._resolveWidth($element, 'style'); + + if (styleWidth != null) { + return styleWidth; + } + + return this._resolveWidth($element, 'element'); + } + + if (method == 'element') { + var elementWidth = $element.outerWidth(false); + + if (elementWidth <= 0) { + return 'auto'; + } + + return elementWidth + 'px'; + } + + if (method == 'style') { + var style = $element.attr('style'); + + if (typeof(style) !== 'string') { + return null; + } + + var attrs = style.split(';'); + + for (var i = 0, l = attrs.length; i < l; i = i + 1) { + var attr = attrs[i].replace(/\s/g, ''); + var matches = attr.match(WIDTH); + + if (matches !== null && matches.length >= 1) { + return matches[1]; + } + } + + return null; + } + + return method; + }; + + Select2.prototype._bindAdapters = function () { + this.dataAdapter.bind(this, this.$container); + this.selection.bind(this, this.$container); + + this.dropdown.bind(this, this.$container); + this.results.bind(this, this.$container); + }; + + Select2.prototype._registerDomEvents = function () { + var self = this; + + this.$element.on('change.select2', function () { + self.dataAdapter.current(function (data) { + self.trigger('selection:update', { + data: data + }); + }); + }); + + this.$element.on('focus.select2', function (evt) { + self.trigger('focus', evt); + }); + + this._syncA = Utils.bind(this._syncAttributes, this); + this._syncS = Utils.bind(this._syncSubtree, this); + + if (this.$element[0].attachEvent) { + this.$element[0].attachEvent('onpropertychange', this._syncA); + } + + var observer = window.MutationObserver || + window.WebKitMutationObserver || + window.MozMutationObserver + ; + + if (observer != null) { + this._observer = new observer(function (mutations) { + $.each(mutations, self._syncA); + $.each(mutations, self._syncS); + }); + this._observer.observe(this.$element[0], { + attributes: true, + childList: true, + subtree: false + }); + } else if (this.$element[0].addEventListener) { + this.$element[0].addEventListener( + 'DOMAttrModified', + self._syncA, + false + ); + this.$element[0].addEventListener( + 'DOMNodeInserted', + self._syncS, + false + ); + this.$element[0].addEventListener( + 'DOMNodeRemoved', + self._syncS, + false + ); + } + }; + + Select2.prototype._registerDataEvents = function () { + var self = this; + + this.dataAdapter.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerSelectionEvents = function () { + var self = this; + var nonRelayEvents = ['toggle', 'focus']; + + this.selection.on('toggle', function () { + self.toggleDropdown(); + }); + + this.selection.on('focus', function (params) { + self.focus(params); + }); + + this.selection.on('*', function (name, params) { + if ($.inArray(name, nonRelayEvents) !== -1) { + return; + } + + self.trigger(name, params); + }); + }; + + Select2.prototype._registerDropdownEvents = function () { + var self = this; + + this.dropdown.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerResultsEvents = function () { + var self = this; + + this.results.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerEvents = function () { + var self = this; + + this.on('open', function () { + self.$container.addClass('select2-container--open'); + }); + + this.on('close', function () { + self.$container.removeClass('select2-container--open'); + }); + + this.on('enable', function () { + self.$container.removeClass('select2-container--disabled'); + }); + + this.on('disable', function () { + self.$container.addClass('select2-container--disabled'); + }); + + this.on('blur', function () { + self.$container.removeClass('select2-container--focus'); + }); + + this.on('query', function (params) { + if (!self.isOpen()) { + self.trigger('open', {}); + } + + this.dataAdapter.query(params, function (data) { + self.trigger('results:all', { + data: data, + query: params + }); + }); + }); + + this.on('query:append', function (params) { + this.dataAdapter.query(params, function (data) { + self.trigger('results:append', { + data: data, + query: params + }); + }); + }); + + this.on('keypress', function (evt) { + var key = evt.which; + + if (self.isOpen()) { + if (key === KEYS.ESC || key === KEYS.TAB || + (key === KEYS.UP && evt.altKey)) { + self.close(); + + evt.preventDefault(); + } else if (key === KEYS.ENTER) { + self.trigger('results:select', {}); + + evt.preventDefault(); + } else if ((key === KEYS.SPACE && evt.ctrlKey)) { + self.trigger('results:toggle', {}); + + evt.preventDefault(); + } else if (key === KEYS.UP) { + self.trigger('results:previous', {}); + + evt.preventDefault(); + } else if (key === KEYS.DOWN) { + self.trigger('results:next', {}); + + evt.preventDefault(); + } + } else { + if (key === KEYS.ENTER || key === KEYS.SPACE || + (key === KEYS.DOWN && evt.altKey)) { + self.open(); + + evt.preventDefault(); + } + } + }); + }; + + Select2.prototype._syncAttributes = function () { + this.options.set('disabled', this.$element.prop('disabled')); + + if (this.options.get('disabled')) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable', {}); + } else { + this.trigger('enable', {}); + } + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = false; + var self = this; + + // Ignore any mutation events raised for elements that aren't options or + // optgroups. This handles the case when the select element is destroyed + if ( + evt && evt.target && ( + evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' + ) + ) { + return; + } + + if (!mutations) { + // If mutation events aren't supported, then we can only assume that the + // change affected the selections + changed = true; + } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { + for (var n = 0; n < mutations.addedNodes.length; n++) { + var node = mutations.addedNodes[n]; + + if (node.selected) { + changed = true; + } + } + } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { + changed = true; + } + + // Only re-pull the data if we think there is a change + if (changed) { + this.dataAdapter.current(function (currentData) { + self.trigger('selection:update', { + data: currentData + }); + }); + } + }; + + /** + * Override the trigger method to automatically trigger pre-events when + * there are events that can be prevented. + */ + Select2.prototype.trigger = function (name, args) { + var actualTrigger = Select2.__super__.trigger; + var preTriggerMap = { + 'open': 'opening', + 'close': 'closing', + 'select': 'selecting', + 'unselect': 'unselecting', + 'clear': 'clearing' + }; + + if (args === undefined) { + args = {}; + } + + if (name in preTriggerMap) { + var preTriggerName = preTriggerMap[name]; + var preTriggerArgs = { + prevented: false, + name: name, + args: args + }; + + actualTrigger.call(this, preTriggerName, preTriggerArgs); + + if (preTriggerArgs.prevented) { + args.prevented = true; + + return; + } + } + + actualTrigger.call(this, name, args); + }; + + Select2.prototype.toggleDropdown = function () { + if (this.options.get('disabled')) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + this.trigger('query', {}); + }; + + Select2.prototype.close = function () { + if (!this.isOpen()) { + return; + } + + this.trigger('close', {}); + }; + + Select2.prototype.isOpen = function () { + return this.$container.hasClass('select2-container--open'); + }; + + Select2.prototype.hasFocus = function () { + return this.$container.hasClass('select2-container--focus'); + }; + + Select2.prototype.focus = function (data) { + // No need to re-trigger focus events if we are already focused + if (this.hasFocus()) { + return; + } + + this.$container.addClass('select2-container--focus'); + this.trigger('focus', {}); + }; + + Select2.prototype.enable = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("enable")` method has been deprecated and will' + + ' be removed in later Select2 versions. Use $element.prop("disabled")' + + ' instead.' + ); + } + + if (args == null || args.length === 0) { + args = [true]; + } + + var disabled = !args[0]; + + this.$element.prop('disabled', disabled); + }; + + Select2.prototype.data = function () { + if (this.options.get('debug') && + arguments.length > 0 && window.console && console.warn) { + console.warn( + 'Select2: Data can no longer be set using `select2("data")`. You ' + + 'should consider setting the value instead using `$element.val()`.' + ); + } + + var data = []; + + this.dataAdapter.current(function (currentData) { + data = currentData; + }); + + return data; + }; + + Select2.prototype.val = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("val")` method has been deprecated and will be' + + ' removed in later Select2 versions. Use $element.val() instead.' + ); + } + + if (args == null || args.length === 0) { + return this.$element.val(); + } + + var newVal = args[0]; + + if ($.isArray(newVal)) { + newVal = $.map(newVal, function (obj) { + return obj.toString(); + }); + } + + this.$element.val(newVal).trigger('change'); + }; + + Select2.prototype.destroy = function () { + this.$container.remove(); + + if (this.$element[0].detachEvent) { + this.$element[0].detachEvent('onpropertychange', this._syncA); + } + + if (this._observer != null) { + this._observer.disconnect(); + this._observer = null; + } else if (this.$element[0].removeEventListener) { + this.$element[0] + .removeEventListener('DOMAttrModified', this._syncA, false); + this.$element[0] + .removeEventListener('DOMNodeInserted', this._syncS, false); + this.$element[0] + .removeEventListener('DOMNodeRemoved', this._syncS, false); + } + + this._syncA = null; + this._syncS = null; + + this.$element.off('.select2'); + this.$element.attr('tabindex', + Utils.GetData(this.$element[0], 'old-tabindex')); + + this.$element.removeClass('select2-hidden-accessible'); + this.$element.attr('aria-hidden', 'false'); + Utils.RemoveData(this.$element[0]); + this.$element.removeData('select2'); + + this.dataAdapter.destroy(); + this.selection.destroy(); + this.dropdown.destroy(); + this.results.destroy(); + + this.dataAdapter = null; + this.selection = null; + this.dropdown = null; + this.results = null; + }; + + Select2.prototype.render = function () { + var $container = $( + '' + + '' + + '' + + '' + ); + + $container.attr('dir', this.options.get('dir')); + + this.$container = $container; + + this.$container.addClass('select2-container--' + this.options.get('theme')); + + Utils.StoreData($container[0], 'element', this.$element); + + return $container; + }; + + return Select2; +}); + +S2.define('jquery-mousewheel',[ + 'jquery' +], function ($) { + // Used to shim jQuery.mousewheel for non-full builds. + return $; +}); + +S2.define('jquery.select2',[ + 'jquery', + 'jquery-mousewheel', + + './select2/core', + './select2/defaults', + './select2/utils' +], function ($, _, Select2, Defaults, Utils) { + if ($.fn.select2 == null) { + // All methods that should return the element + var thisMethods = ['open', 'close', 'destroy']; + + $.fn.select2 = function (options) { + options = options || {}; + + if (typeof options === 'object') { + this.each(function () { + var instanceOptions = $.extend(true, {}, options); + + var instance = new Select2($(this), instanceOptions); + }); + + return this; + } else if (typeof options === 'string') { + var ret; + var args = Array.prototype.slice.call(arguments, 1); + + this.each(function () { + var instance = Utils.GetData(this, 'select2'); + + if (instance == null && window.console && console.error) { + console.error( + 'The select2(\'' + options + '\') method was called on an ' + + 'element that is not using Select2.' + ); + } + + ret = instance[options].apply(instance, args); + }); + + // Check if we should be returning `this` + if ($.inArray(options, thisMethods) > -1) { + return this; + } + + return ret; + } else { + throw new Error('Invalid arguments for Select2: ' + options); + } + }; + } + + if ($.fn.select2.defaults == null) { + $.fn.select2.defaults = Defaults; + } + + return Select2; +}); + + // Return the AMD loader configuration so it can be used outside of this file + return { + define: S2.define, + require: S2.require + }; +}()); + + // Autoload the jQuery bindings + // We know that all of the modules exist above this, so we're safe + var select2 = S2.require('jquery.select2'); + + // Hold the AMD module references on the jQuery function that was just loaded + // This allows Select2 to use the internal loader outside of this file, such + // as in the language files. + jQuery.fn.select2.amd = S2; + + // Return the Select2 instance for anyone who is importing it. + return select2; +})); diff --git a/assets/3rd/select2/js/select2.min.js b/assets/3rd/select2/js/select2.min.js new file mode 100755 index 00000000..ee6bf6d0 --- /dev/null +++ b/assets/3rd/select2/js/select2.min.js @@ -0,0 +1,2 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */ +!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(u){var e=function(){if(u&&u.fn&&u.fn.select2&&u.fn.select2.amd)var e=u.fn.select2.amd;var t,n,r,h,o,s,f,g,m,v,y,_,i,a,w;function b(e,t){return i.call(e,t)}function l(e,t){var n,r,i,o,s,a,l,c,u,d,p,h=t&&t.split("/"),f=y.map,g=f&&f["*"]||{};if(e){for(s=(e=e.split("/")).length-1,y.nodeIdCompat&&w.test(e[s])&&(e[s]=e[s].replace(w,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),u=0;u":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},i.appendMany=function(e,t){if("1.7"===o.fn.jquery.substr(0,3)){var n=o();o.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},i.__cache={};var n=0;return i.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++n),t=n.toString())),t},i.StoreData=function(e,t,n){var r=i.GetUniqueElementId(e);i.__cache[r]||(i.__cache[r]={}),i.__cache[r][t]=n},i.GetData=function(e,t){var n=i.GetUniqueElementId(e);return t?i.__cache[n]&&null!=i.__cache[n][t]?i.__cache[n][t]:o(e).data(t):i.__cache[n]},i.RemoveData=function(e){var t=i.GetUniqueElementId(e);null!=i.__cache[t]&&delete i.__cache[t]},i}),e.define("select2/results",["jquery","./utils"],function(p,h){function r(e,t,n){this.$element=e,this.data=n,this.options=t,r.__super__.constructor.call(this)}return h.Extend(r,h.Observable),r.prototype.render=function(){var e=p('
          ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},r.prototype.clear=function(){this.$results.empty()},r.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=p('
        • '),r=this.options.get("translations").get(e.message);n.append(t(r(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},r.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},r.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested"});d.append(a),o.append(s),o.append(d)}else this.template(e,t);return h.StoreData(t,"data",e),t},r.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=h.GetData(e[0],"data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var r=n-1;0===e.length&&(r=0);var i=t.eq(r);i.trigger("mouseenter");var o=l.$results.offset().top,s=i.offset().top,a=l.$results.scrollTop()+(s-o);0===r?l.$results.scrollTop(0):s-o<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var r=t.eq(n);r.trigger("mouseenter");var i=l.$results.offset().top+l.$results.outerHeight(!1),o=r.offset().top+r.outerHeight(!1),s=l.$results.scrollTop()+o-i;0===n?l.$results.scrollTop(0):ithis.$results.outerHeight()||o<0)&&this.$results.scrollTop(i)}},r.prototype.template=function(e,t){var n=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),i=n(e,t);null==i?t.style.display="none":"string"==typeof i?t.innerHTML=r(i):p(t).append(i)},r}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(n,r,i){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return r.Extend(o,r.Observable),o.prototype.render=function(){var e=n('');return this._tabindex=0,null!=r.GetData(this.$element[0],"old-tabindex")?this._tabindex=r.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),this.$selection=e},o.prototype.bind=function(e,t){var n=this,r=(e.id,e.id+"-results");this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",r),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),window.setTimeout(function(){n.$selection.focus()},0),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex)}),e.on("disable",function(){n.$selection.attr("tabindex","-1")})},o.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},o.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){n(this);this!=t[0]&&r.GetData(this,"element").select2("close")})})},o.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,r){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var r=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",r).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",r),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.focus()})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("")},i.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),r=this.display(t,n);n.empty().append(r),n.attr("title",t.title||t.text)}else this.clear()},i}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,a){function n(e,t){n.__super__.constructor.apply(this,arguments)}return a.Extend(n,e),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('
            '),e},n.prototype.bind=function(e,t){var r=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){r.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!r.options.get("disabled")){var t=i(this).parent(),n=a.GetData(t[0],"data");r.trigger("unselect",{originalEvent:e,data:n})}})},n.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},n.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},n.prototype.selectionContainer=function(){return i('
          • ×
          • ')},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n×');a.StoreData(r[0],"data",t),this.$selection.find(".select2-selection__rendered").prepend(r)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(r,s,a){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=r('');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("open",function(){r.$search.trigger("focus")}),t.on("close",function(){r.$search.val(""),r.$search.removeAttr("aria-activedescendant"),r.$search.trigger("focus")}),t.on("enable",function(){r.$search.prop("disabled",!1),r._transferTabIndex()}),t.on("disable",function(){r.$search.prop("disabled",!0)}),t.on("focus",function(e){r.$search.trigger("focus")}),t.on("results:focus",function(e){r.$search.attr("aria-activedescendant",e.id)}),this.$selection.on("focusin",".select2-search--inline",function(e){r.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){r._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented(),e.which===a.BACKSPACE&&""===r.$search.val()){var t=r.$searchContainer.prev(".select2-selection__choice");if(0this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.query=function(n,r,i){var o=this;this.current(function(e){var t=null!=e?e.length:0;0=o.maximumSelectionLength?o.trigger("results:message",{message:"maximumSelected",args:{maximum:o.maximumSelectionLength}}):n.call(o,r,i)})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(i,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=i('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),this.$search.on("keydown",function(e){r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){i(this).off("keyup")}),this.$search.on("keyup input",function(e){r.handleSearch(e)}),t.on("open",function(){r.$search.attr("tabindex",0),r.$search.focus(),window.setTimeout(function(){r.$search.focus()},0)}),t.on("close",function(){r.$search.attr("tabindex",-1),r.$search.val(""),r.$search.blur()}),t.on("focus",function(){t.isOpen()||r.$search.focus()}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(r.showSearch(e)?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide"))})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,r){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,r)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),r=t.length-1;0<=r;r--){var i=t[r];this.placeholder.id===i.id&&n.splice(r,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(i){function e(e,t,n,r){this.lastParams={},e.call(this,t,n,r),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&this.$results.append(this.$loadingMore)},e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("query",function(e){r.lastParams=e,r.loading=!0}),t.on("query:append",function(e){r.lastParams=e,r.loading=!0}),this.$results.on("scroll",function(){var e=i.contains(document.documentElement,r.$loadingMore[0]);if(!r.loading&&e){var t=r.$results.offset().top+r.$results.outerHeight(!1);r.$loadingMore.offset().top+r.$loadingMore.outerHeight(!1)<=t+50&&r.loadMore()}})},e.prototype.loadMore=function(){this.loading=!0;var e=i.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=i('
          • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=n.get("dropdownParent")||f(document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this,i=!1;e.call(this,t,n),t.on("open",function(){r._showDropdown(),r._attachPositioningHandler(t),i||(i=!0,t.on("results:all",function(){r._positionDropdown(),r._resizeDropdown()}),t.on("results:append",function(){r._positionDropdown(),r._resizeDropdown()}))}),t.on("close",function(){r._hideDropdown(),r._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._attachPositioningHandler=function(e,t){var n=this,r="scroll.select2."+t.id,i="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(r,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(r+" "+i+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,r="resize.select2."+t.id,i="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+r+" "+i)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),r=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=i.top,o.bottom=i.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ai.bottom+s,d={left:i.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h=p.offset();d.top-=h.top,d.left-=h.left,t||n||(r="below"),u||!c||t?!c&&u&&t&&(r="below"):r="above",("above"==r||t&&"below"!==r)&&(d.top=o.top-h.top-s),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,r){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,r)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,r=0;r');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("jquery-mousewheel",["jquery"],function(e){return e}),e.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,o,t,s){if(null==i.fn.select2){var a=["open","close","destroy"];i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new o(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,r=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=s.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,r)}),-1"))&&h.css("position",a.css("position"));x=function(){var c,f,e;if(!G&&(I=A.height(),c=parseInt(g.css("border-top-width"),10),f=parseInt(g.css("padding-top"),10),d=parseInt(g.css("padding-bottom"),10),n=g.offset().top+c+f,C=g.height(),m&&(v=m=!1,null==p&&(a.insertAfter(h),h.detach()),a.css({position:"",top:"",width:"",bottom:""}).removeClass(t),e=!0),F=a.offset().top-(parseInt(a.css("margin-top"),10)||0)-q, +u=a.outerHeight(!0),r=a.css("float"),h&&h.css({width:a.outerWidth(!0),height:u,display:a.css("display"),"vertical-align":a.css("vertical-align"),"float":r}),e))return l()};x();if(u!==C)return D=void 0,c=q,z=E,l=function(){var b,l,e,k;if(!G&&(e=!1,null!=z&&(--z,0>=z&&(z=E,x(),e=!0)),e||A.height()===I||x(),e=f.scrollTop(),null!=D&&(l=e-D),D=e,m?(w&&(k=e+u+c>C+n,v&&!k&&(v=!1,a.css({position:"fixed",bottom:"",top:c}).trigger("sticky_kit:unbottom"))),eb&&!v&&(c-=l,c=Math.max(b-u,c),c=Math.min(q,c),m&&a.css({top:c+"px"})))):e>F&&(m=!0,b={position:"fixed",top:c},b.width="border-box"===a.css("box-sizing")?a.outerWidth()+"px":a.width()+"px",a.css(b).addClass(t),null==p&&(a.after(h),"left"!==r&&"right"!==r||h.append(a)),a.trigger("sticky_kit:stick")),m&&w&&(null==k&&(k=e+u+c>C+n),!v&&k)))return v=!0,"static"===g.css("position")&&g.css({position:"relative"}), +a.css({position:"absolute",bottom:d,top:"auto"}).trigger("sticky_kit:bottom")},y=function(){x();return l()},H=function(){G=!0;f.off("touchmove",l);f.off("scroll",l);f.off("resize",y);b(document.body).off("sticky_kit:recalc",y);a.off("sticky_kit:detach",H);a.removeData("sticky_kit");a.css({position:"",bottom:"",top:"",width:""});g.position("position","");if(m)return null==p&&("left"!==r&&"right"!==r||a.insertAfter(h),h.remove()),a.removeClass(t)},f.on("touchmove",l),f.on("scroll",l),f.on("resize", +y),b(document.body).on("sticky_kit:recalc",y),a.on("sticky_kit:detach",H),setTimeout(l,0)}};n=0;for(K=this.length;n .swiper-wrapper { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; +} +.swiper-wrapper { + position: relative; + width: 100%; + height: 100%; + z-index: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-transition-property: -webkit-transform; + transition-property: -webkit-transform; + -o-transition-property: transform; + transition-property: transform; + transition-property: transform, -webkit-transform; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +.swiper-container-android .swiper-slide, +.swiper-wrapper { + -webkit-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); +} +.swiper-container-multirow > .swiper-wrapper { + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} +.swiper-container-free-mode > .swiper-wrapper { + -webkit-transition-timing-function: ease-out; + -o-transition-timing-function: ease-out; + transition-timing-function: ease-out; + margin: 0 auto; +} +.swiper-slide { + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + width: 100%; + height: 100%; + position: relative; + -webkit-transition-property: -webkit-transform; + transition-property: -webkit-transform; + -o-transition-property: transform; + transition-property: transform; + transition-property: transform, -webkit-transform; +} +.swiper-slide-invisible-blank { + visibility: hidden; +} +/* Auto Height */ +.swiper-container-autoheight, +.swiper-container-autoheight .swiper-slide { + height: auto; +} +.swiper-container-autoheight .swiper-wrapper { + -webkit-box-align: start; + -webkit-align-items: flex-start; + -ms-flex-align: start; + align-items: flex-start; + -webkit-transition-property: height, -webkit-transform; + transition-property: height, -webkit-transform; + -o-transition-property: transform, height; + transition-property: transform, height; + transition-property: transform, height, -webkit-transform; +} +/* 3D Effects */ +.swiper-container-3d { + -webkit-perspective: 1200px; + perspective: 1200px; +} +.swiper-container-3d .swiper-wrapper, +.swiper-container-3d .swiper-slide, +.swiper-container-3d .swiper-slide-shadow-left, +.swiper-container-3d .swiper-slide-shadow-right, +.swiper-container-3d .swiper-slide-shadow-top, +.swiper-container-3d .swiper-slide-shadow-bottom, +.swiper-container-3d .swiper-cube-shadow { + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; +} +.swiper-container-3d .swiper-slide-shadow-left, +.swiper-container-3d .swiper-slide-shadow-right, +.swiper-container-3d .swiper-slide-shadow-top, +.swiper-container-3d .swiper-slide-shadow-bottom { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 10; +} +.swiper-container-3d .swiper-slide-shadow-left { + background-image: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0))); + background-image: -webkit-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + background-image: -o-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); +} +.swiper-container-3d .swiper-slide-shadow-right { + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0))); + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); +} +.swiper-container-3d .swiper-slide-shadow-top { + background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0))); + background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); +} +.swiper-container-3d .swiper-slide-shadow-bottom { + background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0))); + background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); + background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); +} +/* IE10 Windows Phone 8 Fixes */ +.swiper-container-wp8-horizontal, +.swiper-container-wp8-horizontal > .swiper-wrapper { + -ms-touch-action: pan-y; + touch-action: pan-y; +} +.swiper-container-wp8-vertical, +.swiper-container-wp8-vertical > .swiper-wrapper { + -ms-touch-action: pan-x; + touch-action: pan-x; +} +.swiper-button-prev, +.swiper-button-next { + position: absolute; + top: 50%; + width: 27px; + height: 44px; + margin-top: -22px; + z-index: 10; + cursor: pointer; + background-size: 27px 44px; + background-position: center; + background-repeat: no-repeat; +} +.swiper-button-prev.swiper-button-disabled, +.swiper-button-next.swiper-button-disabled { + opacity: 0.35; + cursor: auto; + pointer-events: none; +} +.swiper-button-prev, +.swiper-container-rtl .swiper-button-next { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E"); + left: 10px; + right: auto; +} +.swiper-button-next, +.swiper-container-rtl .swiper-button-prev { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E"); + right: 10px; + left: auto; +} +.swiper-button-prev.swiper-button-white, +.swiper-container-rtl .swiper-button-next.swiper-button-white { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E"); +} +.swiper-button-next.swiper-button-white, +.swiper-container-rtl .swiper-button-prev.swiper-button-white { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E"); +} +.swiper-button-prev.swiper-button-black, +.swiper-container-rtl .swiper-button-next.swiper-button-black { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E"); +} +.swiper-button-next.swiper-button-black, +.swiper-container-rtl .swiper-button-prev.swiper-button-black { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E"); +} +.swiper-button-lock { + display: none; +} +.swiper-pagination { + position: absolute; + text-align: center; + -webkit-transition: 300ms opacity; + -o-transition: 300ms opacity; + transition: 300ms opacity; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + z-index: 10; +} +.swiper-pagination.swiper-pagination-hidden { + opacity: 0; +} +/* Common Styles */ +.swiper-pagination-fraction, +.swiper-pagination-custom, +.swiper-container-horizontal > .swiper-pagination-bullets { + bottom: 10px; + left: 0; + width: 100%; +} +/* Bullets */ +.swiper-pagination-bullets-dynamic { + overflow: hidden; + font-size: 0; +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + -webkit-transform: scale(0.33); + -ms-transform: scale(0.33); + transform: scale(0.33); + position: relative; +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev { + -webkit-transform: scale(0.66); + -ms-transform: scale(0.66); + transform: scale(0.66); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev { + -webkit-transform: scale(0.33); + -ms-transform: scale(0.33); + transform: scale(0.33); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next { + -webkit-transform: scale(0.66); + -ms-transform: scale(0.66); + transform: scale(0.66); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next { + -webkit-transform: scale(0.33); + -ms-transform: scale(0.33); + transform: scale(0.33); +} +.swiper-pagination-bullet { + width: 8px; + height: 8px; + display: inline-block; + border-radius: 100%; + background: #000; + opacity: 0.2; +} +button.swiper-pagination-bullet { + border: none; + margin: 0; + padding: 0; + -webkit-box-shadow: none; + box-shadow: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.swiper-pagination-clickable .swiper-pagination-bullet { + cursor: pointer; +} +.swiper-pagination-bullet-active { + opacity: 1; + background: #007aff; +} +.swiper-container-vertical > .swiper-pagination-bullets { + right: 10px; + top: 50%; + -webkit-transform: translate3d(0px, -50%, 0); + transform: translate3d(0px, -50%, 0); +} +.swiper-container-vertical > .swiper-pagination-bullets .swiper-pagination-bullet { + margin: 6px 0; + display: block; +} +.swiper-container-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic { + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + width: 8px; +} +.swiper-container-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + display: inline-block; + -webkit-transition: 200ms top, 200ms -webkit-transform; + transition: 200ms top, 200ms -webkit-transform; + -o-transition: 200ms transform, 200ms top; + transition: 200ms transform, 200ms top; + transition: 200ms transform, 200ms top, 200ms -webkit-transform; +} +.swiper-container-horizontal > .swiper-pagination-bullets .swiper-pagination-bullet { + margin: 0 4px; +} +.swiper-container-horizontal > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic { + left: 50%; + -webkit-transform: translateX(-50%); + -ms-transform: translateX(-50%); + transform: translateX(-50%); + white-space: nowrap; +} +.swiper-container-horizontal > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + -webkit-transition: 200ms left, 200ms -webkit-transform; + transition: 200ms left, 200ms -webkit-transform; + -o-transition: 200ms transform, 200ms left; + transition: 200ms transform, 200ms left; + transition: 200ms transform, 200ms left, 200ms -webkit-transform; +} +.swiper-container-horizontal.swiper-container-rtl > .swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + -webkit-transition: 200ms right, 200ms -webkit-transform; + transition: 200ms right, 200ms -webkit-transform; + -o-transition: 200ms transform, 200ms right; + transition: 200ms transform, 200ms right; + transition: 200ms transform, 200ms right, 200ms -webkit-transform; +} +/* Progress */ +.swiper-pagination-progressbar { + background: rgba(0, 0, 0, 0.25); + position: absolute; +} +.swiper-pagination-progressbar .swiper-pagination-progressbar-fill { + background: #007aff; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: left top; + -ms-transform-origin: left top; + transform-origin: left top; +} +.swiper-container-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill { + -webkit-transform-origin: right top; + -ms-transform-origin: right top; + transform-origin: right top; +} +.swiper-container-horizontal > .swiper-pagination-progressbar, +.swiper-container-vertical > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite { + width: 100%; + height: 4px; + left: 0; + top: 0; +} +.swiper-container-vertical > .swiper-pagination-progressbar, +.swiper-container-horizontal > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite { + width: 4px; + height: 100%; + left: 0; + top: 0; +} +.swiper-pagination-white .swiper-pagination-bullet-active { + background: #ffffff; +} +.swiper-pagination-progressbar.swiper-pagination-white { + background: rgba(255, 255, 255, 0.25); +} +.swiper-pagination-progressbar.swiper-pagination-white .swiper-pagination-progressbar-fill { + background: #ffffff; +} +.swiper-pagination-black .swiper-pagination-bullet-active { + background: #000000; +} +.swiper-pagination-progressbar.swiper-pagination-black { + background: rgba(0, 0, 0, 0.25); +} +.swiper-pagination-progressbar.swiper-pagination-black .swiper-pagination-progressbar-fill { + background: #000000; +} +.swiper-pagination-lock { + display: none; +} +/* Scrollbar */ +.swiper-scrollbar { + border-radius: 10px; + position: relative; + -ms-touch-action: none; + background: rgba(0, 0, 0, 0.1); +} +.swiper-container-horizontal > .swiper-scrollbar { + position: absolute; + left: 1%; + bottom: 3px; + z-index: 50; + height: 5px; + width: 98%; +} +.swiper-container-vertical > .swiper-scrollbar { + position: absolute; + right: 3px; + top: 1%; + z-index: 50; + width: 5px; + height: 98%; +} +.swiper-scrollbar-drag { + height: 100%; + width: 100%; + position: relative; + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; + left: 0; + top: 0; +} +.swiper-scrollbar-cursor-drag { + cursor: move; +} +.swiper-scrollbar-lock { + display: none; +} +.swiper-zoom-container { + width: 100%; + height: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + text-align: center; +} +.swiper-zoom-container > img, +.swiper-zoom-container > svg, +.swiper-zoom-container > canvas { + max-width: 100%; + max-height: 100%; + -o-object-fit: contain; + object-fit: contain; +} +.swiper-slide-zoomed { + cursor: move; +} +/* Preloader */ +.swiper-lazy-preloader { + width: 42px; + height: 42px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -21px; + margin-top: -21px; + z-index: 10; + -webkit-transform-origin: 50%; + -ms-transform-origin: 50%; + transform-origin: 50%; + -webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite; + animation: swiper-preloader-spin 1s steps(12, end) infinite; +} +.swiper-lazy-preloader:after { + display: block; + content: ''; + width: 100%; + height: 100%; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); + background-position: 50%; + background-size: 100%; + background-repeat: no-repeat; +} +.swiper-lazy-preloader-white:after { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); +} +@-webkit-keyframes swiper-preloader-spin { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes swiper-preloader-spin { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +/* a11y */ +.swiper-container .swiper-notification { + position: absolute; + left: 0; + top: 0; + pointer-events: none; + opacity: 0; + z-index: -1000; +} +.swiper-container-fade.swiper-container-free-mode .swiper-slide { + -webkit-transition-timing-function: ease-out; + -o-transition-timing-function: ease-out; + transition-timing-function: ease-out; +} +.swiper-container-fade .swiper-slide { + pointer-events: none; + -webkit-transition-property: opacity; + -o-transition-property: opacity; + transition-property: opacity; +} +.swiper-container-fade .swiper-slide .swiper-slide { + pointer-events: none; +} +.swiper-container-fade .swiper-slide-active, +.swiper-container-fade .swiper-slide-active .swiper-slide-active { + pointer-events: auto; +} +.swiper-container-cube { + overflow: visible; +} +.swiper-container-cube .swiper-slide { + pointer-events: none; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + z-index: 1; + visibility: hidden; + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + width: 100%; + height: 100%; +} +.swiper-container-cube .swiper-slide .swiper-slide { + pointer-events: none; +} +.swiper-container-cube.swiper-container-rtl .swiper-slide { + -webkit-transform-origin: 100% 0; + -ms-transform-origin: 100% 0; + transform-origin: 100% 0; +} +.swiper-container-cube .swiper-slide-active, +.swiper-container-cube .swiper-slide-active .swiper-slide-active { + pointer-events: auto; +} +.swiper-container-cube .swiper-slide-active, +.swiper-container-cube .swiper-slide-next, +.swiper-container-cube .swiper-slide-prev, +.swiper-container-cube .swiper-slide-next + .swiper-slide { + pointer-events: auto; + visibility: visible; +} +.swiper-container-cube .swiper-slide-shadow-top, +.swiper-container-cube .swiper-slide-shadow-bottom, +.swiper-container-cube .swiper-slide-shadow-left, +.swiper-container-cube .swiper-slide-shadow-right { + z-index: 0; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +.swiper-container-cube .swiper-cube-shadow { + position: absolute; + left: 0; + bottom: 0px; + width: 100%; + height: 100%; + background: #000; + opacity: 0.6; + -webkit-filter: blur(50px); + filter: blur(50px); + z-index: 0; +} +.swiper-container-flip { + overflow: visible; +} +.swiper-container-flip .swiper-slide { + pointer-events: none; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + z-index: 1; +} +.swiper-container-flip .swiper-slide .swiper-slide { + pointer-events: none; +} +.swiper-container-flip .swiper-slide-active, +.swiper-container-flip .swiper-slide-active .swiper-slide-active { + pointer-events: auto; +} +.swiper-container-flip .swiper-slide-shadow-top, +.swiper-container-flip .swiper-slide-shadow-bottom, +.swiper-container-flip .swiper-slide-shadow-left, +.swiper-container-flip .swiper-slide-shadow-right { + z-index: 0; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +.swiper-container-coverflow .swiper-wrapper { + /* Windows 8 IE 10 fix */ + -ms-perspective: 1200px; +} diff --git a/assets/3rd/swiper/css/swiper.min.css b/assets/3rd/swiper/css/swiper.min.css new file mode 100755 index 00000000..c4a633d6 --- /dev/null +++ b/assets/3rd/swiper/css/swiper.min.css @@ -0,0 +1,12 @@ +/** + * Swiper 4.5.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * http://www.idangero.us/swiper/ + * + * Copyright 2014-2019 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: February 22, 2019 + */ +.swiper-container{margin:0 auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1}.swiper-container-no-flexbox .swiper-slide{float:left}.swiper-container-vertical>.swiper-wrapper{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-transition-property:-webkit-transform;transition-property:-webkit-transform;-o-transition-property:transform;transition-property:transform;transition-property:transform,-webkit-transform;-webkit-box-sizing:content-box;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.swiper-container-multirow>.swiper-wrapper{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.swiper-container-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100%;height:100%;position:relative;-webkit-transition-property:-webkit-transform;transition-property:-webkit-transform;-o-transition-property:transform;transition-property:transform;transition-property:transform,-webkit-transform}.swiper-slide-invisible-blank{visibility:hidden}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-transition-property:height,-webkit-transform;transition-property:height,-webkit-transform;-o-transition-property:transform,height;transition-property:transform,height;transition-property:transform,height,-webkit-transform}.swiper-container-3d{-webkit-perspective:1200px;perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-right{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-top{background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-wp8-horizontal,.swiper-container-wp8-horizontal>.swiper-wrapper{-ms-touch-action:pan-y;touch-action:pan-y}.swiper-container-wp8-vertical,.swiper-container-wp8-vertical>.swiper-wrapper{-ms-touch-action:pan-x;touch-action:pan-x}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:27px;height:44px;margin-top:-22px;z-index:10;cursor:pointer;background-size:27px 44px;background-position:center;background-repeat:no-repeat}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");left:10px;right:auto}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");right:10px;left:auto}.swiper-button-prev.swiper-button-white,.swiper-container-rtl .swiper-button-next.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-white,.swiper-container-rtl .swiper-button-prev.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-prev.swiper-button-black,.swiper-container-rtl .swiper-button-next.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-black,.swiper-container-rtl .swiper-button-prev.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-lock{display:none}.swiper-pagination{position:absolute;text-align:center;-webkit-transition:.3s opacity;-o-transition:.3s opacity;transition:.3s opacity;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-container-horizontal>.swiper-pagination-bullets,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:10px;left:0;width:100%}.swiper-pagination-bullets-dynamic{overflow:hidden;font-size:0}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{-webkit-transform:scale(.33);-ms-transform:scale(.33);transform:scale(.33);position:relative}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{-webkit-transform:scale(.66);-ms-transform:scale(.66);transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{-webkit-transform:scale(.33);-ms-transform:scale(.33);transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next{-webkit-transform:scale(.66);-ms-transform:scale(.66);transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next{-webkit-transform:scale(.33);-ms-transform:scale(.33);transform:scale(.33)}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;-webkit-box-shadow:none;box-shadow:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet-active{opacity:1;background:#007aff}.swiper-container-vertical>.swiper-pagination-bullets{right:10px;top:50%;-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:6px 0;display:block}.swiper-container-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);width:8px}.swiper-container-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;-webkit-transition:.2s top,.2s -webkit-transform;transition:.2s top,.2s -webkit-transform;-o-transition:.2s transform,.2s top;transition:.2s transform,.2s top;transition:.2s transform,.2s top,.2s -webkit-transform}.swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 4px}.swiper-container-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);white-space:nowrap}.swiper-container-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{-webkit-transition:.2s left,.2s -webkit-transform;transition:.2s left,.2s -webkit-transform;-o-transition:.2s transform,.2s left;transition:.2s transform,.2s left;transition:.2s transform,.2s left,.2s -webkit-transform}.swiper-container-horizontal.swiper-container-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{-webkit-transition:.2s right,.2s -webkit-transform;transition:.2s right,.2s -webkit-transform;-o-transition:.2s transform,.2s right;transition:.2s transform,.2s right;transition:.2s transform,.2s right,.2s -webkit-transform}.swiper-pagination-progressbar{background:rgba(0,0,0,.25);position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:#007aff;position:absolute;left:0;top:0;width:100%;height:100%;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transform-origin:left top;-ms-transform-origin:left top;transform-origin:left top}.swiper-container-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{-webkit-transform-origin:right top;-ms-transform-origin:right top;transform-origin:right top}.swiper-container-horizontal>.swiper-pagination-progressbar,.swiper-container-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{width:100%;height:4px;left:0;top:0}.swiper-container-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-container-vertical>.swiper-pagination-progressbar{width:4px;height:100%;left:0;top:0}.swiper-pagination-white .swiper-pagination-bullet-active{background:#fff}.swiper-pagination-progressbar.swiper-pagination-white{background:rgba(255,255,255,.25)}.swiper-pagination-progressbar.swiper-pagination-white .swiper-pagination-progressbar-fill{background:#fff}.swiper-pagination-black .swiper-pagination-bullet-active{background:#000}.swiper-pagination-progressbar.swiper-pagination-black{background:rgba(0,0,0,.25)}.swiper-pagination-progressbar.swiper-pagination-black .swiper-pagination-progressbar-fill{background:#000}.swiper-pagination-lock{display:none}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}.swiper-zoom-container{width:100%;height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;-o-object-fit:contain;object-fit:contain}.swiper-slide-zoomed{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;-webkit-transform-origin:50%;-ms-transform-origin:50%;transform-origin:50%;-webkit-animation:swiper-preloader-spin 1s steps(12,end) infinite;animation:swiper-preloader-spin 1s steps(12,end) infinite}.swiper-lazy-preloader:after{display:block;content:'';width:100%;height:100%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:50%;background-size:100%;background-repeat:no-repeat}.swiper-lazy-preloader-white:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}@-webkit-keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-container-fade.swiper-container-free-mode .swiper-slide{-webkit-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}.swiper-container-fade .swiper-slide{pointer-events:none;-webkit-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity}.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube{overflow:visible}.swiper-container-cube .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;width:100%;height:100%}.swiper-container-cube .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-cube.swiper-container-rtl .swiper-slide{-webkit-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;-webkit-filter:blur(50px);filter:blur(50px);z-index:0}.swiper-container-flip{overflow:visible}.swiper-container-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-container-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-flip .swiper-slide-active,.swiper-container-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-flip .swiper-slide-shadow-bottom,.swiper-container-flip .swiper-slide-shadow-left,.swiper-container-flip .swiper-slide-shadow-right,.swiper-container-flip .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-coverflow .swiper-wrapper{-ms-perspective:1200px} \ No newline at end of file diff --git a/assets/3rd/swiper/js/swiper.esm.bundle.js b/assets/3rd/swiper/js/swiper.esm.bundle.js new file mode 100755 index 00000000..585c5446 --- /dev/null +++ b/assets/3rd/swiper/js/swiper.esm.bundle.js @@ -0,0 +1,7151 @@ +/** + * Swiper 4.5.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * http://www.idangero.us/swiper/ + * + * Copyright 2014-2019 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: February 22, 2019 + */ + +import { $, addClass, removeClass, hasClass, toggleClass, attr, removeAttr, data, transform, transition as transition$1, on, off, trigger, transitionEnd as transitionEnd$1, outerWidth, outerHeight, offset, css, each, html, text, is, index, eq, append, prepend, next, nextAll, prev, prevAll, parent, parents, closest, find, children, remove, add, styles } from 'dom7/dist/dom7.modular'; +import { window, document } from 'ssr-window'; + +const Methods = { + addClass, + removeClass, + hasClass, + toggleClass, + attr, + removeAttr, + data, + transform, + transition: transition$1, + on, + off, + trigger, + transitionEnd: transitionEnd$1, + outerWidth, + outerHeight, + offset, + css, + each, + html, + text, + is, + index, + eq, + append, + prepend, + next, + nextAll, + prev, + prevAll, + parent, + parents, + closest, + find, + children, + remove, + add, + styles, +}; + +Object.keys(Methods).forEach((methodName) => { + $.fn[methodName] = Methods[methodName]; +}); + +const Utils = { + deleteProps(obj) { + const object = obj; + Object.keys(object).forEach((key) => { + try { + object[key] = null; + } catch (e) { + // no getter for object + } + try { + delete object[key]; + } catch (e) { + // something got wrong + } + }); + }, + nextTick(callback, delay = 0) { + return setTimeout(callback, delay); + }, + now() { + return Date.now(); + }, + getTranslate(el, axis = 'x') { + let matrix; + let curTransform; + let transformMatrix; + + const curStyle = window.getComputedStyle(el, null); + + if (window.WebKitCSSMatrix) { + curTransform = curStyle.transform || curStyle.webkitTransform; + if (curTransform.split(',').length > 6) { + curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', '); + } + // Some old versions of Webkit choke when 'none' is passed; pass + // empty string instead in this case + transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform); + } else { + transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,'); + matrix = transformMatrix.toString().split(','); + } + + if (axis === 'x') { + // Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; + // Crazy IE10 Matrix + else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); + // Normal Browsers + else curTransform = parseFloat(matrix[4]); + } + if (axis === 'y') { + // Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; + // Crazy IE10 Matrix + else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); + // Normal Browsers + else curTransform = parseFloat(matrix[5]); + } + return curTransform || 0; + }, + parseUrlQuery(url) { + const query = {}; + let urlToParse = url || window.location.href; + let i; + let params; + let param; + let length; + if (typeof urlToParse === 'string' && urlToParse.length) { + urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\S*\?/, '') : ''; + params = urlToParse.split('&').filter(paramsPart => paramsPart !== ''); + length = params.length; + + for (i = 0; i < length; i += 1) { + param = params[i].replace(/#\S+/g, '').split('='); + query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param[1]) || ''; + } + } + return query; + }, + isObject(o) { + return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object; + }, + extend(...args) { + const to = Object(args[0]); + for (let i = 1; i < args.length; i += 1) { + const nextSource = args[i]; + if (nextSource !== undefined && nextSource !== null) { + const keysArray = Object.keys(Object(nextSource)); + for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) { + const nextKey = keysArray[nextIndex]; + const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); + if (desc !== undefined && desc.enumerable) { + if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) { + Utils.extend(to[nextKey], nextSource[nextKey]); + } else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) { + to[nextKey] = {}; + Utils.extend(to[nextKey], nextSource[nextKey]); + } else { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + } + return to; + }, +}; + +const Support = (function Support() { + const testDiv = document.createElement('div'); + return { + touch: (window.Modernizr && window.Modernizr.touch === true) || (function checkTouch() { + return !!((window.navigator.maxTouchPoints > 0) || ('ontouchstart' in window) || (window.DocumentTouch && document instanceof window.DocumentTouch)); + }()), + + pointerEvents: !!(window.navigator.pointerEnabled || window.PointerEvent || ('maxTouchPoints' in window.navigator && window.navigator.maxTouchPoints > 0)), + prefixedPointerEvents: !!window.navigator.msPointerEnabled, + + transition: (function checkTransition() { + const style = testDiv.style; + return ('transition' in style || 'webkitTransition' in style || 'MozTransition' in style); + }()), + transforms3d: (window.Modernizr && window.Modernizr.csstransforms3d === true) || (function checkTransforms3d() { + const style = testDiv.style; + return ('webkitPerspective' in style || 'MozPerspective' in style || 'OPerspective' in style || 'MsPerspective' in style || 'perspective' in style); + }()), + + flexbox: (function checkFlexbox() { + const style = testDiv.style; + const styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' '); + for (let i = 0; i < styles.length; i += 1) { + if (styles[i] in style) return true; + } + return false; + }()), + + observer: (function checkObserver() { + return ('MutationObserver' in window || 'WebkitMutationObserver' in window); + }()), + + passiveListener: (function checkPassiveListener() { + let supportsPassive = false; + try { + const opts = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line + get() { + supportsPassive = true; + }, + }); + window.addEventListener('testPassiveListener', null, opts); + } catch (e) { + // No support + } + return supportsPassive; + }()), + + gestures: (function checkGestures() { + return 'ongesturestart' in window; + }()), + }; +}()); + +const Browser = (function Browser() { + function isSafari() { + const ua = window.navigator.userAgent.toLowerCase(); + return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0); + } + return { + isIE: !!window.navigator.userAgent.match(/Trident/g) || !!window.navigator.userAgent.match(/MSIE/g), + isEdge: !!window.navigator.userAgent.match(/Edge/g), + isSafari: isSafari(), + isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent), + }; +}()); + +class SwiperClass { + constructor(params = {}) { + const self = this; + self.params = params; + + // Events + self.eventsListeners = {}; + + if (self.params && self.params.on) { + Object.keys(self.params.on).forEach((eventName) => { + self.on(eventName, self.params.on[eventName]); + }); + } + } + + on(events, handler, priority) { + const self = this; + if (typeof handler !== 'function') return self; + const method = priority ? 'unshift' : 'push'; + events.split(' ').forEach((event) => { + if (!self.eventsListeners[event]) self.eventsListeners[event] = []; + self.eventsListeners[event][method](handler); + }); + return self; + } + + once(events, handler, priority) { + const self = this; + if (typeof handler !== 'function') return self; + function onceHandler(...args) { + handler.apply(self, args); + self.off(events, onceHandler); + if (onceHandler.f7proxy) { + delete onceHandler.f7proxy; + } + } + onceHandler.f7proxy = handler; + return self.on(events, onceHandler, priority); + } + + off(events, handler) { + const self = this; + if (!self.eventsListeners) return self; + events.split(' ').forEach((event) => { + if (typeof handler === 'undefined') { + self.eventsListeners[event] = []; + } else if (self.eventsListeners[event] && self.eventsListeners[event].length) { + self.eventsListeners[event].forEach((eventHandler, index) => { + if (eventHandler === handler || (eventHandler.f7proxy && eventHandler.f7proxy === handler)) { + self.eventsListeners[event].splice(index, 1); + } + }); + } + }); + return self; + } + + emit(...args) { + const self = this; + if (!self.eventsListeners) return self; + let events; + let data; + let context; + if (typeof args[0] === 'string' || Array.isArray(args[0])) { + events = args[0]; + data = args.slice(1, args.length); + context = self; + } else { + events = args[0].events; + data = args[0].data; + context = args[0].context || self; + } + const eventsArray = Array.isArray(events) ? events : events.split(' '); + eventsArray.forEach((event) => { + if (self.eventsListeners && self.eventsListeners[event]) { + const handlers = []; + self.eventsListeners[event].forEach((eventHandler) => { + handlers.push(eventHandler); + }); + handlers.forEach((eventHandler) => { + eventHandler.apply(context, data); + }); + } + }); + return self; + } + + useModulesParams(instanceParams) { + const instance = this; + if (!instance.modules) return; + Object.keys(instance.modules).forEach((moduleName) => { + const module = instance.modules[moduleName]; + // Extend params + if (module.params) { + Utils.extend(instanceParams, module.params); + } + }); + } + + useModules(modulesParams = {}) { + const instance = this; + if (!instance.modules) return; + Object.keys(instance.modules).forEach((moduleName) => { + const module = instance.modules[moduleName]; + const moduleParams = modulesParams[moduleName] || {}; + // Extend instance methods and props + if (module.instance) { + Object.keys(module.instance).forEach((modulePropName) => { + const moduleProp = module.instance[modulePropName]; + if (typeof moduleProp === 'function') { + instance[modulePropName] = moduleProp.bind(instance); + } else { + instance[modulePropName] = moduleProp; + } + }); + } + // Add event listeners + if (module.on && instance.on) { + Object.keys(module.on).forEach((moduleEventName) => { + instance.on(moduleEventName, module.on[moduleEventName]); + }); + } + + // Module create callback + if (module.create) { + module.create.bind(instance)(moduleParams); + } + }); + } + + static set components(components) { + const Class = this; + if (!Class.use) return; + Class.use(components); + } + + static installModule(module, ...params) { + const Class = this; + if (!Class.prototype.modules) Class.prototype.modules = {}; + const name = module.name || (`${Object.keys(Class.prototype.modules).length}_${Utils.now()}`); + Class.prototype.modules[name] = module; + // Prototype + if (module.proto) { + Object.keys(module.proto).forEach((key) => { + Class.prototype[key] = module.proto[key]; + }); + } + // Class + if (module.static) { + Object.keys(module.static).forEach((key) => { + Class[key] = module.static[key]; + }); + } + // Callback + if (module.install) { + module.install.apply(Class, params); + } + return Class; + } + + static use(module, ...params) { + const Class = this; + if (Array.isArray(module)) { + module.forEach(m => Class.installModule(m)); + return Class; + } + return Class.installModule(module, ...params); + } +} + +function updateSize () { + const swiper = this; + let width; + let height; + const $el = swiper.$el; + if (typeof swiper.params.width !== 'undefined') { + width = swiper.params.width; + } else { + width = $el[0].clientWidth; + } + if (typeof swiper.params.height !== 'undefined') { + height = swiper.params.height; + } else { + height = $el[0].clientHeight; + } + if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) { + return; + } + + // Subtract paddings + width = width - parseInt($el.css('padding-left'), 10) - parseInt($el.css('padding-right'), 10); + height = height - parseInt($el.css('padding-top'), 10) - parseInt($el.css('padding-bottom'), 10); + + Utils.extend(swiper, { + width, + height, + size: swiper.isHorizontal() ? width : height, + }); +} + +function updateSlides () { + const swiper = this; + const params = swiper.params; + + const { + $wrapperEl, size: swiperSize, rtlTranslate: rtl, wrongRTL, + } = swiper; + const isVirtual = swiper.virtual && params.virtual.enabled; + const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length; + const slides = $wrapperEl.children(`.${swiper.params.slideClass}`); + const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length; + let snapGrid = []; + const slidesGrid = []; + const slidesSizesGrid = []; + + let offsetBefore = params.slidesOffsetBefore; + if (typeof offsetBefore === 'function') { + offsetBefore = params.slidesOffsetBefore.call(swiper); + } + + let offsetAfter = params.slidesOffsetAfter; + if (typeof offsetAfter === 'function') { + offsetAfter = params.slidesOffsetAfter.call(swiper); + } + + const previousSnapGridLength = swiper.snapGrid.length; + const previousSlidesGridLength = swiper.snapGrid.length; + + let spaceBetween = params.spaceBetween; + let slidePosition = -offsetBefore; + let prevSlideSize = 0; + let index = 0; + if (typeof swiperSize === 'undefined') { + return; + } + if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) { + spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize; + } + + swiper.virtualSize = -spaceBetween; + + // reset margins + if (rtl) slides.css({ marginLeft: '', marginTop: '' }); + else slides.css({ marginRight: '', marginBottom: '' }); + + let slidesNumberEvenToRows; + if (params.slidesPerColumn > 1) { + if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) { + slidesNumberEvenToRows = slidesLength; + } else { + slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn; + } + if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') { + slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn); + } + } + + // Calc slides + let slideSize; + const slidesPerColumn = params.slidesPerColumn; + const slidesPerRow = slidesNumberEvenToRows / slidesPerColumn; + const numFullColumns = Math.floor(slidesLength / params.slidesPerColumn); + for (let i = 0; i < slidesLength; i += 1) { + slideSize = 0; + const slide = slides.eq(i); + if (params.slidesPerColumn > 1) { + // Set slides order + let newSlideOrderIndex; + let column; + let row; + if (params.slidesPerColumnFill === 'column') { + column = Math.floor(i / slidesPerColumn); + row = i - (column * slidesPerColumn); + if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) { + row += 1; + if (row >= slidesPerColumn) { + row = 0; + column += 1; + } + } + newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn); + slide + .css({ + '-webkit-box-ordinal-group': newSlideOrderIndex, + '-moz-box-ordinal-group': newSlideOrderIndex, + '-ms-flex-order': newSlideOrderIndex, + '-webkit-order': newSlideOrderIndex, + order: newSlideOrderIndex, + }); + } else { + row = Math.floor(i / slidesPerRow); + column = i - (row * slidesPerRow); + } + slide + .css( + `margin-${swiper.isHorizontal() ? 'top' : 'left'}`, + (row !== 0 && params.spaceBetween) && (`${params.spaceBetween}px`) + ) + .attr('data-swiper-column', column) + .attr('data-swiper-row', row); + } + if (slide.css('display') === 'none') continue; // eslint-disable-line + + if (params.slidesPerView === 'auto') { + const slideStyles = window.getComputedStyle(slide[0], null); + const currentTransform = slide[0].style.transform; + const currentWebKitTransform = slide[0].style.webkitTransform; + if (currentTransform) { + slide[0].style.transform = 'none'; + } + if (currentWebKitTransform) { + slide[0].style.webkitTransform = 'none'; + } + if (params.roundLengths) { + slideSize = swiper.isHorizontal() + ? slide.outerWidth(true) + : slide.outerHeight(true); + } else { + // eslint-disable-next-line + if (swiper.isHorizontal()) { + const width = parseFloat(slideStyles.getPropertyValue('width')); + const paddingLeft = parseFloat(slideStyles.getPropertyValue('padding-left')); + const paddingRight = parseFloat(slideStyles.getPropertyValue('padding-right')); + const marginLeft = parseFloat(slideStyles.getPropertyValue('margin-left')); + const marginRight = parseFloat(slideStyles.getPropertyValue('margin-right')); + const boxSizing = slideStyles.getPropertyValue('box-sizing'); + if (boxSizing && boxSizing === 'border-box') { + slideSize = width + marginLeft + marginRight; + } else { + slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight; + } + } else { + const height = parseFloat(slideStyles.getPropertyValue('height')); + const paddingTop = parseFloat(slideStyles.getPropertyValue('padding-top')); + const paddingBottom = parseFloat(slideStyles.getPropertyValue('padding-bottom')); + const marginTop = parseFloat(slideStyles.getPropertyValue('margin-top')); + const marginBottom = parseFloat(slideStyles.getPropertyValue('margin-bottom')); + const boxSizing = slideStyles.getPropertyValue('box-sizing'); + if (boxSizing && boxSizing === 'border-box') { + slideSize = height + marginTop + marginBottom; + } else { + slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom; + } + } + } + if (currentTransform) { + slide[0].style.transform = currentTransform; + } + if (currentWebKitTransform) { + slide[0].style.webkitTransform = currentWebKitTransform; + } + if (params.roundLengths) slideSize = Math.floor(slideSize); + } else { + slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView; + if (params.roundLengths) slideSize = Math.floor(slideSize); + + if (slides[i]) { + if (swiper.isHorizontal()) { + slides[i].style.width = `${slideSize}px`; + } else { + slides[i].style.height = `${slideSize}px`; + } + } + } + if (slides[i]) { + slides[i].swiperSlideSize = slideSize; + } + slidesSizesGrid.push(slideSize); + + + if (params.centeredSlides) { + slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween; + if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; + if (i === 0) slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; + if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0; + if (params.roundLengths) slidePosition = Math.floor(slidePosition); + if ((index) % params.slidesPerGroup === 0) snapGrid.push(slidePosition); + slidesGrid.push(slidePosition); + } else { + if (params.roundLengths) slidePosition = Math.floor(slidePosition); + if ((index) % params.slidesPerGroup === 0) snapGrid.push(slidePosition); + slidesGrid.push(slidePosition); + slidePosition = slidePosition + slideSize + spaceBetween; + } + + swiper.virtualSize += slideSize + spaceBetween; + + prevSlideSize = slideSize; + + index += 1; + } + swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter; + let newSlidesGrid; + + if ( + rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) { + $wrapperEl.css({ width: `${swiper.virtualSize + params.spaceBetween}px` }); + } + if (!Support.flexbox || params.setWrapperSize) { + if (swiper.isHorizontal()) $wrapperEl.css({ width: `${swiper.virtualSize + params.spaceBetween}px` }); + else $wrapperEl.css({ height: `${swiper.virtualSize + params.spaceBetween}px` }); + } + + if (params.slidesPerColumn > 1) { + swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows; + swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween; + if (swiper.isHorizontal()) $wrapperEl.css({ width: `${swiper.virtualSize + params.spaceBetween}px` }); + else $wrapperEl.css({ height: `${swiper.virtualSize + params.spaceBetween}px` }); + if (params.centeredSlides) { + newSlidesGrid = []; + for (let i = 0; i < snapGrid.length; i += 1) { + let slidesGridItem = snapGrid[i]; + if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem); + if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem); + } + snapGrid = newSlidesGrid; + } + } + + // Remove last grid elements depending on width + if (!params.centeredSlides) { + newSlidesGrid = []; + for (let i = 0; i < snapGrid.length; i += 1) { + let slidesGridItem = snapGrid[i]; + if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem); + if (snapGrid[i] <= swiper.virtualSize - swiperSize) { + newSlidesGrid.push(slidesGridItem); + } + } + snapGrid = newSlidesGrid; + if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) { + snapGrid.push(swiper.virtualSize - swiperSize); + } + } + if (snapGrid.length === 0) snapGrid = [0]; + + if (params.spaceBetween !== 0) { + if (swiper.isHorizontal()) { + if (rtl) slides.css({ marginLeft: `${spaceBetween}px` }); + else slides.css({ marginRight: `${spaceBetween}px` }); + } else slides.css({ marginBottom: `${spaceBetween}px` }); + } + + if (params.centerInsufficientSlides) { + let allSlidesSize = 0; + slidesSizesGrid.forEach((slideSizeValue) => { + allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0); + }); + allSlidesSize -= params.spaceBetween; + if (allSlidesSize < swiperSize) { + const allSlidesOffset = (swiperSize - allSlidesSize) / 2; + snapGrid.forEach((snap, snapIndex) => { + snapGrid[snapIndex] = snap - allSlidesOffset; + }); + slidesGrid.forEach((snap, snapIndex) => { + slidesGrid[snapIndex] = snap + allSlidesOffset; + }); + } + } + + Utils.extend(swiper, { + slides, + snapGrid, + slidesGrid, + slidesSizesGrid, + }); + + if (slidesLength !== previousSlidesLength) { + swiper.emit('slidesLengthChange'); + } + if (snapGrid.length !== previousSnapGridLength) { + if (swiper.params.watchOverflow) swiper.checkOverflow(); + swiper.emit('snapGridLengthChange'); + } + if (slidesGrid.length !== previousSlidesGridLength) { + swiper.emit('slidesGridLengthChange'); + } + + if (params.watchSlidesProgress || params.watchSlidesVisibility) { + swiper.updateSlidesOffset(); + } +} + +function updateAutoHeight (speed) { + const swiper = this; + const activeSlides = []; + let newHeight = 0; + let i; + if (typeof speed === 'number') { + swiper.setTransition(speed); + } else if (speed === true) { + swiper.setTransition(swiper.params.speed); + } + // Find slides currently in view + if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) { + for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) { + const index = swiper.activeIndex + i; + if (index > swiper.slides.length) break; + activeSlides.push(swiper.slides.eq(index)[0]); + } + } else { + activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]); + } + + // Find new height from highest slide in view + for (i = 0; i < activeSlides.length; i += 1) { + if (typeof activeSlides[i] !== 'undefined') { + const height = activeSlides[i].offsetHeight; + newHeight = height > newHeight ? height : newHeight; + } + } + + // Update Height + if (newHeight) swiper.$wrapperEl.css('height', `${newHeight}px`); +} + +function updateSlidesOffset () { + const swiper = this; + const slides = swiper.slides; + for (let i = 0; i < slides.length; i += 1) { + slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop; + } +} + +function updateSlidesProgress (translate = (this && this.translate) || 0) { + const swiper = this; + const params = swiper.params; + + const { slides, rtlTranslate: rtl } = swiper; + + if (slides.length === 0) return; + if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset(); + + let offsetCenter = -translate; + if (rtl) offsetCenter = translate; + + // Visible Slides + slides.removeClass(params.slideVisibleClass); + + swiper.visibleSlidesIndexes = []; + swiper.visibleSlides = []; + + for (let i = 0; i < slides.length; i += 1) { + const slide = slides[i]; + const slideProgress = ( + (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset + ) / (slide.swiperSlideSize + params.spaceBetween); + if (params.watchSlidesVisibility) { + const slideBefore = -(offsetCenter - slide.swiperSlideOffset); + const slideAfter = slideBefore + swiper.slidesSizesGrid[i]; + const isVisible = (slideBefore >= 0 && slideBefore < swiper.size) + || (slideAfter > 0 && slideAfter <= swiper.size) + || (slideBefore <= 0 && slideAfter >= swiper.size); + if (isVisible) { + swiper.visibleSlides.push(slide); + swiper.visibleSlidesIndexes.push(i); + slides.eq(i).addClass(params.slideVisibleClass); + } + } + slide.progress = rtl ? -slideProgress : slideProgress; + } + swiper.visibleSlides = $(swiper.visibleSlides); +} + +function updateProgress (translate = (this && this.translate) || 0) { + const swiper = this; + const params = swiper.params; + + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + let { progress, isBeginning, isEnd } = swiper; + const wasBeginning = isBeginning; + const wasEnd = isEnd; + if (translatesDiff === 0) { + progress = 0; + isBeginning = true; + isEnd = true; + } else { + progress = (translate - swiper.minTranslate()) / (translatesDiff); + isBeginning = progress <= 0; + isEnd = progress >= 1; + } + Utils.extend(swiper, { + progress, + isBeginning, + isEnd, + }); + + if (params.watchSlidesProgress || params.watchSlidesVisibility) swiper.updateSlidesProgress(translate); + + if (isBeginning && !wasBeginning) { + swiper.emit('reachBeginning toEdge'); + } + if (isEnd && !wasEnd) { + swiper.emit('reachEnd toEdge'); + } + if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) { + swiper.emit('fromEdge'); + } + + swiper.emit('progress', progress); +} + +function updateSlidesClasses () { + const swiper = this; + + const { + slides, params, $wrapperEl, activeIndex, realIndex, + } = swiper; + const isVirtual = swiper.virtual && params.virtual.enabled; + + slides.removeClass(`${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`); + + let activeSlide; + if (isVirtual) { + activeSlide = swiper.$wrapperEl.find(`.${params.slideClass}[data-swiper-slide-index="${activeIndex}"]`); + } else { + activeSlide = slides.eq(activeIndex); + } + + // Active classes + activeSlide.addClass(params.slideActiveClass); + + if (params.loop) { + // Duplicate to all looped slides + if (activeSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl + .children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${realIndex}"]`) + .addClass(params.slideDuplicateActiveClass); + } else { + $wrapperEl + .children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${realIndex}"]`) + .addClass(params.slideDuplicateActiveClass); + } + } + // Next Slide + let nextSlide = activeSlide.nextAll(`.${params.slideClass}`).eq(0).addClass(params.slideNextClass); + if (params.loop && nextSlide.length === 0) { + nextSlide = slides.eq(0); + nextSlide.addClass(params.slideNextClass); + } + // Prev Slide + let prevSlide = activeSlide.prevAll(`.${params.slideClass}`).eq(0).addClass(params.slidePrevClass); + if (params.loop && prevSlide.length === 0) { + prevSlide = slides.eq(-1); + prevSlide.addClass(params.slidePrevClass); + } + if (params.loop) { + // Duplicate to all looped slides + if (nextSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl + .children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${nextSlide.attr('data-swiper-slide-index')}"]`) + .addClass(params.slideDuplicateNextClass); + } else { + $wrapperEl + .children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${nextSlide.attr('data-swiper-slide-index')}"]`) + .addClass(params.slideDuplicateNextClass); + } + if (prevSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl + .children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${prevSlide.attr('data-swiper-slide-index')}"]`) + .addClass(params.slideDuplicatePrevClass); + } else { + $wrapperEl + .children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${prevSlide.attr('data-swiper-slide-index')}"]`) + .addClass(params.slideDuplicatePrevClass); + } + } +} + +function updateActiveIndex (newActiveIndex) { + const swiper = this; + const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; + const { + slidesGrid, snapGrid, params, activeIndex: previousIndex, realIndex: previousRealIndex, snapIndex: previousSnapIndex, + } = swiper; + let activeIndex = newActiveIndex; + let snapIndex; + if (typeof activeIndex === 'undefined') { + for (let i = 0; i < slidesGrid.length; i += 1) { + if (typeof slidesGrid[i + 1] !== 'undefined') { + if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) { + activeIndex = i; + } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) { + activeIndex = i + 1; + } + } else if (translate >= slidesGrid[i]) { + activeIndex = i; + } + } + // Normalize slideIndex + if (params.normalizeSlideIndex) { + if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0; + } + } + if (snapGrid.indexOf(translate) >= 0) { + snapIndex = snapGrid.indexOf(translate); + } else { + snapIndex = Math.floor(activeIndex / params.slidesPerGroup); + } + if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; + if (activeIndex === previousIndex) { + if (snapIndex !== previousSnapIndex) { + swiper.snapIndex = snapIndex; + swiper.emit('snapIndexChange'); + } + return; + } + + // Get real index + const realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10); + + Utils.extend(swiper, { + snapIndex, + realIndex, + previousIndex, + activeIndex, + }); + swiper.emit('activeIndexChange'); + swiper.emit('snapIndexChange'); + if (previousRealIndex !== realIndex) { + swiper.emit('realIndexChange'); + } + swiper.emit('slideChange'); +} + +function updateClickedSlide (e) { + const swiper = this; + const params = swiper.params; + const slide = $(e.target).closest(`.${params.slideClass}`)[0]; + let slideFound = false; + if (slide) { + for (let i = 0; i < swiper.slides.length; i += 1) { + if (swiper.slides[i] === slide) slideFound = true; + } + } + + if (slide && slideFound) { + swiper.clickedSlide = slide; + if (swiper.virtual && swiper.params.virtual.enabled) { + swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10); + } else { + swiper.clickedIndex = $(slide).index(); + } + } else { + swiper.clickedSlide = undefined; + swiper.clickedIndex = undefined; + return; + } + if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) { + swiper.slideToClickedSlide(); + } +} + +var update = { + updateSize, + updateSlides, + updateAutoHeight, + updateSlidesOffset, + updateSlidesProgress, + updateProgress, + updateSlidesClasses, + updateActiveIndex, + updateClickedSlide, +}; + +function getTranslate (axis = this.isHorizontal() ? 'x' : 'y') { + const swiper = this; + + const { + params, rtlTranslate: rtl, translate, $wrapperEl, + } = swiper; + + if (params.virtualTranslate) { + return rtl ? -translate : translate; + } + + let currentTranslate = Utils.getTranslate($wrapperEl[0], axis); + if (rtl) currentTranslate = -currentTranslate; + + return currentTranslate || 0; +} + +function setTranslate (translate, byController) { + const swiper = this; + const { + rtlTranslate: rtl, params, $wrapperEl, progress, + } = swiper; + let x = 0; + let y = 0; + const z = 0; + + if (swiper.isHorizontal()) { + x = rtl ? -translate : translate; + } else { + y = translate; + } + + if (params.roundLengths) { + x = Math.floor(x); + y = Math.floor(y); + } + + if (!params.virtualTranslate) { + if (Support.transforms3d) $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`); + else $wrapperEl.transform(`translate(${x}px, ${y}px)`); + } + swiper.previousTranslate = swiper.translate; + swiper.translate = swiper.isHorizontal() ? x : y; + + // Check if we need to update progress + let newProgress; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + if (translatesDiff === 0) { + newProgress = 0; + } else { + newProgress = (translate - swiper.minTranslate()) / (translatesDiff); + } + if (newProgress !== progress) { + swiper.updateProgress(translate); + } + + swiper.emit('setTranslate', swiper.translate, byController); +} + +function minTranslate () { + return (-this.snapGrid[0]); +} + +function maxTranslate () { + return (-this.snapGrid[this.snapGrid.length - 1]); +} + +var translate = { + getTranslate, + setTranslate, + minTranslate, + maxTranslate, +}; + +function setTransition (duration, byController) { + const swiper = this; + + swiper.$wrapperEl.transition(duration); + + swiper.emit('setTransition', duration, byController); +} + +function transitionStart (runCallbacks = true, direction) { + const swiper = this; + const { activeIndex, params, previousIndex } = swiper; + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + + let dir = direction; + if (!dir) { + if (activeIndex > previousIndex) dir = 'next'; + else if (activeIndex < previousIndex) dir = 'prev'; + else dir = 'reset'; + } + + swiper.emit('transitionStart'); + + if (runCallbacks && activeIndex !== previousIndex) { + if (dir === 'reset') { + swiper.emit('slideResetTransitionStart'); + return; + } + swiper.emit('slideChangeTransitionStart'); + if (dir === 'next') { + swiper.emit('slideNextTransitionStart'); + } else { + swiper.emit('slidePrevTransitionStart'); + } + } +} + +function transitionEnd (runCallbacks = true, direction) { + const swiper = this; + const { activeIndex, previousIndex } = swiper; + swiper.animating = false; + swiper.setTransition(0); + + let dir = direction; + if (!dir) { + if (activeIndex > previousIndex) dir = 'next'; + else if (activeIndex < previousIndex) dir = 'prev'; + else dir = 'reset'; + } + + swiper.emit('transitionEnd'); + + if (runCallbacks && activeIndex !== previousIndex) { + if (dir === 'reset') { + swiper.emit('slideResetTransitionEnd'); + return; + } + swiper.emit('slideChangeTransitionEnd'); + if (dir === 'next') { + swiper.emit('slideNextTransitionEnd'); + } else { + swiper.emit('slidePrevTransitionEnd'); + } + } +} + +var transition = { + setTransition, + transitionStart, + transitionEnd, +}; + +function slideTo (index = 0, speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + let slideIndex = index; + if (slideIndex < 0) slideIndex = 0; + + const { + params, snapGrid, slidesGrid, previousIndex, activeIndex, rtlTranslate: rtl, + } = swiper; + if (swiper.animating && params.preventInteractionOnTransition) { + return false; + } + + let snapIndex = Math.floor(slideIndex / params.slidesPerGroup); + if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; + + if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) { + swiper.emit('beforeSlideChangeStart'); + } + + const translate = -snapGrid[snapIndex]; + + // Update progress + swiper.updateProgress(translate); + + // Normalize slideIndex + if (params.normalizeSlideIndex) { + for (let i = 0; i < slidesGrid.length; i += 1) { + if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) { + slideIndex = i; + } + } + } + // Directions locks + if (swiper.initialized && slideIndex !== activeIndex) { + if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) { + return false; + } + if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) { + if ((activeIndex || 0) !== slideIndex) return false; + } + } + + let direction; + if (slideIndex > activeIndex) direction = 'next'; + else if (slideIndex < activeIndex) direction = 'prev'; + else direction = 'reset'; + + + // Update Index + if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) { + swiper.updateActiveIndex(slideIndex); + // Update Height + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + swiper.updateSlidesClasses(); + if (params.effect !== 'slide') { + swiper.setTranslate(translate); + } + if (direction !== 'reset') { + swiper.transitionStart(runCallbacks, direction); + swiper.transitionEnd(runCallbacks, direction); + } + return false; + } + + if (speed === 0 || !Support.transition) { + swiper.setTransition(0); + swiper.setTranslate(translate); + swiper.updateActiveIndex(slideIndex); + swiper.updateSlidesClasses(); + swiper.emit('beforeTransitionStart', speed, internal); + swiper.transitionStart(runCallbacks, direction); + swiper.transitionEnd(runCallbacks, direction); + } else { + swiper.setTransition(speed); + swiper.setTranslate(translate); + swiper.updateActiveIndex(slideIndex); + swiper.updateSlidesClasses(); + swiper.emit('beforeTransitionStart', speed, internal); + swiper.transitionStart(runCallbacks, direction); + if (!swiper.animating) { + swiper.animating = true; + if (!swiper.onSlideToWrapperTransitionEnd) { + swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) { + if (!swiper || swiper.destroyed) return; + if (e.target !== this) return; + swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); + swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); + swiper.onSlideToWrapperTransitionEnd = null; + delete swiper.onSlideToWrapperTransitionEnd; + swiper.transitionEnd(runCallbacks, direction); + }; + } + swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); + swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); + } + } + + return true; +} + +function slideToLoop (index = 0, speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + let newIndex = index; + if (swiper.params.loop) { + newIndex += swiper.loopedSlides; + } + + return swiper.slideTo(newIndex, speed, runCallbacks, internal); +} + +/* eslint no-unused-vars: "off" */ +function slideNext (speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + const { params, animating } = swiper; + if (params.loop) { + if (animating) return false; + swiper.loopFix(); + // eslint-disable-next-line + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal); + } + return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal); +} + +/* eslint no-unused-vars: "off" */ +function slidePrev (speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + const { + params, animating, snapGrid, slidesGrid, rtlTranslate, + } = swiper; + + if (params.loop) { + if (animating) return false; + swiper.loopFix(); + // eslint-disable-next-line + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + } + const translate = rtlTranslate ? swiper.translate : -swiper.translate; + function normalize(val) { + if (val < 0) return -Math.floor(Math.abs(val)); + return Math.floor(val); + } + const normalizedTranslate = normalize(translate); + const normalizedSnapGrid = snapGrid.map(val => normalize(val)); + const normalizedSlidesGrid = slidesGrid.map(val => normalize(val)); + + const currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)]; + const prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1]; + let prevIndex; + if (typeof prevSnap !== 'undefined') { + prevIndex = slidesGrid.indexOf(prevSnap); + if (prevIndex < 0) prevIndex = swiper.activeIndex - 1; + } + return swiper.slideTo(prevIndex, speed, runCallbacks, internal); +} + +/* eslint no-unused-vars: "off" */ +function slideReset (speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal); +} + +/* eslint no-unused-vars: "off" */ +function slideToClosest (speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + let index = swiper.activeIndex; + const snapIndex = Math.floor(index / swiper.params.slidesPerGroup); + + if (snapIndex < swiper.snapGrid.length - 1) { + const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; + + const currentSnap = swiper.snapGrid[snapIndex]; + const nextSnap = swiper.snapGrid[snapIndex + 1]; + + if ((translate - currentSnap) > (nextSnap - currentSnap) / 2) { + index = swiper.params.slidesPerGroup; + } + } + + return swiper.slideTo(index, speed, runCallbacks, internal); +} + +function slideToClickedSlide () { + const swiper = this; + const { params, $wrapperEl } = swiper; + + const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView; + let slideToIndex = swiper.clickedIndex; + let realIndex; + if (params.loop) { + if (swiper.animating) return; + realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10); + if (params.centeredSlides) { + if ( + (slideToIndex < swiper.loopedSlides - (slidesPerView / 2)) + || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2)) + ) { + swiper.loopFix(); + slideToIndex = $wrapperEl + .children(`.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`) + .eq(0) + .index(); + + Utils.nextTick(() => { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else if (slideToIndex > swiper.slides.length - slidesPerView) { + swiper.loopFix(); + slideToIndex = $wrapperEl + .children(`.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`) + .eq(0) + .index(); + + Utils.nextTick(() => { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else { + swiper.slideTo(slideToIndex); + } +} + +var slide = { + slideTo, + slideToLoop, + slideNext, + slidePrev, + slideReset, + slideToClosest, + slideToClickedSlide, +}; + +function loopCreate () { + const swiper = this; + const { params, $wrapperEl } = swiper; + // Remove duplicated slides + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove(); + + let slides = $wrapperEl.children(`.${params.slideClass}`); + + if (params.loopFillGroupWithBlank) { + const blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup); + if (blankSlidesNum !== params.slidesPerGroup) { + for (let i = 0; i < blankSlidesNum; i += 1) { + const blankNode = $(document.createElement('div')).addClass(`${params.slideClass} ${params.slideBlankClass}`); + $wrapperEl.append(blankNode); + } + slides = $wrapperEl.children(`.${params.slideClass}`); + } + } + + if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length; + + swiper.loopedSlides = parseInt(params.loopedSlides || params.slidesPerView, 10); + swiper.loopedSlides += params.loopAdditionalSlides; + if (swiper.loopedSlides > slides.length) { + swiper.loopedSlides = slides.length; + } + + const prependSlides = []; + const appendSlides = []; + slides.each((index, el) => { + const slide = $(el); + if (index < swiper.loopedSlides) appendSlides.push(el); + if (index < slides.length && index >= slides.length - swiper.loopedSlides) prependSlides.push(el); + slide.attr('data-swiper-slide-index', index); + }); + for (let i = 0; i < appendSlides.length; i += 1) { + $wrapperEl.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass)); + } + for (let i = prependSlides.length - 1; i >= 0; i -= 1) { + $wrapperEl.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass)); + } +} + +function loopFix () { + const swiper = this; + const { + params, activeIndex, slides, loopedSlides, allowSlidePrev, allowSlideNext, snapGrid, rtlTranslate: rtl, + } = swiper; + let newIndex; + swiper.allowSlidePrev = true; + swiper.allowSlideNext = true; + + const snapTranslate = -snapGrid[activeIndex]; + const diff = snapTranslate - swiper.getTranslate(); + + + // Fix For Negative Oversliding + if (activeIndex < loopedSlides) { + newIndex = (slides.length - (loopedSlides * 3)) + activeIndex; + newIndex += loopedSlides; + const slideChanged = swiper.slideTo(newIndex, 0, false, true); + if (slideChanged && diff !== 0) { + swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); + } + } else if ((params.slidesPerView === 'auto' && activeIndex >= loopedSlides * 2) || (activeIndex >= slides.length - loopedSlides)) { + // Fix For Positive Oversliding + newIndex = -slides.length + activeIndex + loopedSlides; + newIndex += loopedSlides; + const slideChanged = swiper.slideTo(newIndex, 0, false, true); + if (slideChanged && diff !== 0) { + swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); + } + } + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; +} + +function loopDestroy () { + const swiper = this; + const { $wrapperEl, params, slides } = swiper; + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`).remove(); + slides.removeAttr('data-swiper-slide-index'); +} + +var loop = { + loopCreate, + loopFix, + loopDestroy, +}; + +function setGrabCursor (moving) { + const swiper = this; + if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked)) return; + const el = swiper.el; + el.style.cursor = 'move'; + el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab'; + el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab'; + el.style.cursor = moving ? 'grabbing' : 'grab'; +} + +function unsetGrabCursor () { + const swiper = this; + if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked)) return; + swiper.el.style.cursor = ''; +} + +var grabCursor = { + setGrabCursor, + unsetGrabCursor, +}; + +function appendSlide (slides) { + const swiper = this; + const { $wrapperEl, params } = swiper; + if (params.loop) { + swiper.loopDestroy(); + } + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.append(slides[i]); + } + } else { + $wrapperEl.append(slides); + } + if (params.loop) { + swiper.loopCreate(); + } + if (!(params.observer && Support.observer)) { + swiper.update(); + } +} + +function prependSlide (slides) { + const swiper = this; + const { params, $wrapperEl, activeIndex } = swiper; + + if (params.loop) { + swiper.loopDestroy(); + } + let newActiveIndex = activeIndex + 1; + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.prepend(slides[i]); + } + newActiveIndex = activeIndex + slides.length; + } else { + $wrapperEl.prepend(slides); + } + if (params.loop) { + swiper.loopCreate(); + } + if (!(params.observer && Support.observer)) { + swiper.update(); + } + swiper.slideTo(newActiveIndex, 0, false); +} + +function addSlide (index, slides) { + const swiper = this; + const { $wrapperEl, params, activeIndex } = swiper; + let activeIndexBuffer = activeIndex; + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(`.${params.slideClass}`); + } + const baseLength = swiper.slides.length; + if (index <= 0) { + swiper.prependSlide(slides); + return; + } + if (index >= baseLength) { + swiper.appendSlide(slides); + return; + } + let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer; + + const slidesBuffer = []; + for (let i = baseLength - 1; i >= index; i -= 1) { + const currentSlide = swiper.slides.eq(i); + currentSlide.remove(); + slidesBuffer.unshift(currentSlide); + } + + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.append(slides[i]); + } + newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer; + } else { + $wrapperEl.append(slides); + } + + for (let i = 0; i < slidesBuffer.length; i += 1) { + $wrapperEl.append(slidesBuffer[i]); + } + + if (params.loop) { + swiper.loopCreate(); + } + if (!(params.observer && Support.observer)) { + swiper.update(); + } + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } +} + +function removeSlide (slidesIndexes) { + const swiper = this; + const { params, $wrapperEl, activeIndex } = swiper; + + let activeIndexBuffer = activeIndex; + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(`.${params.slideClass}`); + } + let newActiveIndex = activeIndexBuffer; + let indexToRemove; + + if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) { + for (let i = 0; i < slidesIndexes.length; i += 1) { + indexToRemove = slidesIndexes[i]; + if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex -= 1; + } + newActiveIndex = Math.max(newActiveIndex, 0); + } else { + indexToRemove = slidesIndexes; + if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex -= 1; + newActiveIndex = Math.max(newActiveIndex, 0); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!(params.observer && Support.observer)) { + swiper.update(); + } + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } +} + +function removeAllSlides () { + const swiper = this; + + const slidesIndexes = []; + for (let i = 0; i < swiper.slides.length; i += 1) { + slidesIndexes.push(i); + } + swiper.removeSlide(slidesIndexes); +} + +var manipulation = { + appendSlide, + prependSlide, + addSlide, + removeSlide, + removeAllSlides, +}; + +const Device = (function Device() { + const ua = window.navigator.userAgent; + + const device = { + ios: false, + android: false, + androidChrome: false, + desktop: false, + windows: false, + iphone: false, + ipod: false, + ipad: false, + cordova: window.cordova || window.phonegap, + phonegap: window.cordova || window.phonegap, + }; + + const windows = ua.match(/(Windows Phone);?[\s\/]+([\d.]+)?/); // eslint-disable-line + const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line + const ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); + + + // Windows + if (windows) { + device.os = 'windows'; + device.osVersion = windows[2]; + device.windows = true; + } + // Android + if (android && !windows) { + device.os = 'android'; + device.osVersion = android[2]; + device.android = true; + device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0; + } + if (ipad || iphone || ipod) { + device.os = 'ios'; + device.ios = true; + } + // iOS + if (iphone && !ipod) { + device.osVersion = iphone[2].replace(/_/g, '.'); + device.iphone = true; + } + if (ipad) { + device.osVersion = ipad[2].replace(/_/g, '.'); + device.ipad = true; + } + if (ipod) { + device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null; + device.iphone = true; + } + // iOS 8+ changed UA + if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) { + if (device.osVersion.split('.')[0] === '10') { + device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0]; + } + } + + // Desktop + device.desktop = !(device.os || device.android || device.webView); + + // Webview + device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i); + + // Minimal UI + if (device.os && device.os === 'ios') { + const osVersionArr = device.osVersion.split('.'); + const metaViewport = document.querySelector('meta[name="viewport"]'); + device.minimalUi = !device.webView + && (ipod || iphone) + && (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) + && metaViewport && metaViewport.getAttribute('content').indexOf('minimal-ui') >= 0; + } + + // Pixel Ratio + device.pixelRatio = window.devicePixelRatio || 1; + + // Export object + return device; +}()); + +function onTouchStart (event) { + const swiper = this; + const data = swiper.touchEventsData; + const { params, touches } = swiper; + if (swiper.animating && params.preventInteractionOnTransition) { + return; + } + let e = event; + if (e.originalEvent) e = e.originalEvent; + data.isTouchEvent = e.type === 'touchstart'; + if (!data.isTouchEvent && 'which' in e && e.which === 3) return; + if (!data.isTouchEvent && 'button' in e && e.button > 0) return; + if (data.isTouched && data.isMoved) return; + if (params.noSwiping && $(e.target).closest(params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`)[0]) { + swiper.allowClick = true; + return; + } + if (params.swipeHandler) { + if (!$(e).closest(params.swipeHandler)[0]) return; + } + + touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + const startX = touches.currentX; + const startY = touches.currentY; + + // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore + + const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection; + const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold; + if ( + edgeSwipeDetection + && ((startX <= edgeSwipeThreshold) + || (startX >= window.screen.width - edgeSwipeThreshold)) + ) { + return; + } + + Utils.extend(data, { + isTouched: true, + isMoved: false, + allowTouchCallbacks: true, + isScrolling: undefined, + startMoving: undefined, + }); + + touches.startX = startX; + touches.startY = startY; + data.touchStartTime = Utils.now(); + swiper.allowClick = true; + swiper.updateSize(); + swiper.swipeDirection = undefined; + if (params.threshold > 0) data.allowThresholdMove = false; + if (e.type !== 'touchstart') { + let preventDefault = true; + if ($(e.target).is(data.formElements)) preventDefault = false; + if ( + document.activeElement + && $(document.activeElement).is(data.formElements) + && document.activeElement !== e.target + ) { + document.activeElement.blur(); + } + + const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault; + if (params.touchStartForcePreventDefault || shouldPreventDefault) { + e.preventDefault(); + } + } + swiper.emit('touchStart', e); +} + +function onTouchMove (event) { + const swiper = this; + const data = swiper.touchEventsData; + const { params, touches, rtlTranslate: rtl } = swiper; + let e = event; + if (e.originalEvent) e = e.originalEvent; + if (!data.isTouched) { + if (data.startMoving && data.isScrolling) { + swiper.emit('touchMoveOpposite', e); + } + return; + } + if (data.isTouchEvent && e.type === 'mousemove') return; + const pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + const pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + if (e.preventedByNestedSwiper) { + touches.startX = pageX; + touches.startY = pageY; + return; + } + if (!swiper.allowTouchMove) { + // isMoved = true; + swiper.allowClick = false; + if (data.isTouched) { + Utils.extend(touches, { + startX: pageX, + startY: pageY, + currentX: pageX, + currentY: pageY, + }); + data.touchStartTime = Utils.now(); + } + return; + } + if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) { + if (swiper.isVertical()) { + // Vertical + if ( + (pageY < touches.startY && swiper.translate <= swiper.maxTranslate()) + || (pageY > touches.startY && swiper.translate >= swiper.minTranslate()) + ) { + data.isTouched = false; + data.isMoved = false; + return; + } + } else if ( + (pageX < touches.startX && swiper.translate <= swiper.maxTranslate()) + || (pageX > touches.startX && swiper.translate >= swiper.minTranslate()) + ) { + return; + } + } + if (data.isTouchEvent && document.activeElement) { + if (e.target === document.activeElement && $(e.target).is(data.formElements)) { + data.isMoved = true; + swiper.allowClick = false; + return; + } + } + if (data.allowTouchCallbacks) { + swiper.emit('touchMove', e); + } + if (e.targetTouches && e.targetTouches.length > 1) return; + + touches.currentX = pageX; + touches.currentY = pageY; + + const diffX = touches.currentX - touches.startX; + const diffY = touches.currentY - touches.startY; + if (swiper.params.threshold && Math.sqrt((diffX ** 2) + (diffY ** 2)) < swiper.params.threshold) return; + + if (typeof data.isScrolling === 'undefined') { + let touchAngle; + if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) { + data.isScrolling = false; + } else { + // eslint-disable-next-line + if ((diffX * diffX) + (diffY * diffY) >= 25) { + touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI; + data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle); + } + } + } + if (data.isScrolling) { + swiper.emit('touchMoveOpposite', e); + } + if (typeof data.startMoving === 'undefined') { + if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) { + data.startMoving = true; + } + } + if (data.isScrolling) { + data.isTouched = false; + return; + } + if (!data.startMoving) { + return; + } + swiper.allowClick = false; + e.preventDefault(); + if (params.touchMoveStopPropagation && !params.nested) { + e.stopPropagation(); + } + + if (!data.isMoved) { + if (params.loop) { + swiper.loopFix(); + } + data.startTranslate = swiper.getTranslate(); + swiper.setTransition(0); + if (swiper.animating) { + swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend'); + } + data.allowMomentumBounce = false; + // Grab Cursor + if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { + swiper.setGrabCursor(true); + } + swiper.emit('sliderFirstMove', e); + } + swiper.emit('sliderMove', e); + data.isMoved = true; + + let diff = swiper.isHorizontal() ? diffX : diffY; + touches.diff = diff; + + diff *= params.touchRatio; + if (rtl) diff = -diff; + + swiper.swipeDirection = diff > 0 ? 'prev' : 'next'; + data.currentTranslate = diff + data.startTranslate; + + let disableParentSwiper = true; + let resistanceRatio = params.resistanceRatio; + if (params.touchReleaseOnEdges) { + resistanceRatio = 0; + } + if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) { + disableParentSwiper = false; + if (params.resistance) data.currentTranslate = (swiper.minTranslate() - 1) + ((-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio); + } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) { + disableParentSwiper = false; + if (params.resistance) data.currentTranslate = (swiper.maxTranslate() + 1) - ((swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio); + } + + if (disableParentSwiper) { + e.preventedByNestedSwiper = true; + } + + // Directions locks + if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) { + data.currentTranslate = data.startTranslate; + } + if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) { + data.currentTranslate = data.startTranslate; + } + + + // Threshold + if (params.threshold > 0) { + if (Math.abs(diff) > params.threshold || data.allowThresholdMove) { + if (!data.allowThresholdMove) { + data.allowThresholdMove = true; + touches.startX = touches.currentX; + touches.startY = touches.currentY; + data.currentTranslate = data.startTranslate; + touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY; + return; + } + } else { + data.currentTranslate = data.startTranslate; + return; + } + } + + if (!params.followFinger) return; + + // Update active index in free mode + if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) { + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + if (params.freeMode) { + // Velocity + if (data.velocities.length === 0) { + data.velocities.push({ + position: touches[swiper.isHorizontal() ? 'startX' : 'startY'], + time: data.touchStartTime, + }); + } + data.velocities.push({ + position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'], + time: Utils.now(), + }); + } + // Update progress + swiper.updateProgress(data.currentTranslate); + // Update translate + swiper.setTranslate(data.currentTranslate); +} + +function onTouchEnd (event) { + const swiper = this; + const data = swiper.touchEventsData; + + const { + params, touches, rtlTranslate: rtl, $wrapperEl, slidesGrid, snapGrid, + } = swiper; + let e = event; + if (e.originalEvent) e = e.originalEvent; + if (data.allowTouchCallbacks) { + swiper.emit('touchEnd', e); + } + data.allowTouchCallbacks = false; + if (!data.isTouched) { + if (data.isMoved && params.grabCursor) { + swiper.setGrabCursor(false); + } + data.isMoved = false; + data.startMoving = false; + return; + } + // Return Grab Cursor + if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { + swiper.setGrabCursor(false); + } + + // Time diff + const touchEndTime = Utils.now(); + const timeDiff = touchEndTime - data.touchStartTime; + + // Tap, doubleTap, Click + if (swiper.allowClick) { + swiper.updateClickedSlide(e); + swiper.emit('tap', e); + if (timeDiff < 300 && (touchEndTime - data.lastClickTime) > 300) { + if (data.clickTimeout) clearTimeout(data.clickTimeout); + data.clickTimeout = Utils.nextTick(() => { + if (!swiper || swiper.destroyed) return; + swiper.emit('click', e); + }, 300); + } + if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) { + if (data.clickTimeout) clearTimeout(data.clickTimeout); + swiper.emit('doubleTap', e); + } + } + + data.lastClickTime = Utils.now(); + Utils.nextTick(() => { + if (!swiper.destroyed) swiper.allowClick = true; + }); + + if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) { + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + return; + } + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + + let currentPos; + if (params.followFinger) { + currentPos = rtl ? swiper.translate : -swiper.translate; + } else { + currentPos = -data.currentTranslate; + } + + if (params.freeMode) { + if (currentPos < -swiper.minTranslate()) { + swiper.slideTo(swiper.activeIndex); + return; + } + if (currentPos > -swiper.maxTranslate()) { + if (swiper.slides.length < snapGrid.length) { + swiper.slideTo(snapGrid.length - 1); + } else { + swiper.slideTo(swiper.slides.length - 1); + } + return; + } + + if (params.freeModeMomentum) { + if (data.velocities.length > 1) { + const lastMoveEvent = data.velocities.pop(); + const velocityEvent = data.velocities.pop(); + + const distance = lastMoveEvent.position - velocityEvent.position; + const time = lastMoveEvent.time - velocityEvent.time; + swiper.velocity = distance / time; + swiper.velocity /= 2; + if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) { + swiper.velocity = 0; + } + // this implies that the user stopped moving a finger then released. + // There would be no events with distance zero, so the last event is stale. + if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) { + swiper.velocity = 0; + } + } else { + swiper.velocity = 0; + } + swiper.velocity *= params.freeModeMomentumVelocityRatio; + + data.velocities.length = 0; + let momentumDuration = 1000 * params.freeModeMomentumRatio; + const momentumDistance = swiper.velocity * momentumDuration; + + let newPosition = swiper.translate + momentumDistance; + if (rtl) newPosition = -newPosition; + + let doBounce = false; + let afterBouncePosition; + const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio; + let needsLoopFix; + if (newPosition < swiper.maxTranslate()) { + if (params.freeModeMomentumBounce) { + if (newPosition + swiper.maxTranslate() < -bounceAmount) { + newPosition = swiper.maxTranslate() - bounceAmount; + } + afterBouncePosition = swiper.maxTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.maxTranslate(); + } + if (params.loop && params.centeredSlides) needsLoopFix = true; + } else if (newPosition > swiper.minTranslate()) { + if (params.freeModeMomentumBounce) { + if (newPosition - swiper.minTranslate() > bounceAmount) { + newPosition = swiper.minTranslate() + bounceAmount; + } + afterBouncePosition = swiper.minTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.minTranslate(); + } + if (params.loop && params.centeredSlides) needsLoopFix = true; + } else if (params.freeModeSticky) { + let nextSlide; + for (let j = 0; j < snapGrid.length; j += 1) { + if (snapGrid[j] > -newPosition) { + nextSlide = j; + break; + } + } + + if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') { + newPosition = snapGrid[nextSlide]; + } else { + newPosition = snapGrid[nextSlide - 1]; + } + newPosition = -newPosition; + } + if (needsLoopFix) { + swiper.once('transitionEnd', () => { + swiper.loopFix(); + }); + } + // Fix duration + if (swiper.velocity !== 0) { + if (rtl) { + momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity); + } else { + momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity); + } + } else if (params.freeModeSticky) { + swiper.slideToClosest(); + return; + } + + if (params.freeModeMomentumBounce && doBounce) { + swiper.updateProgress(afterBouncePosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + swiper.animating = true; + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return; + swiper.emit('momentumBounce'); + + swiper.setTransition(params.speed); + swiper.setTranslate(afterBouncePosition); + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed) return; + swiper.transitionEnd(); + }); + }); + } else if (swiper.velocity) { + swiper.updateProgress(newPosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + if (!swiper.animating) { + swiper.animating = true; + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed) return; + swiper.transitionEnd(); + }); + } + } else { + swiper.updateProgress(newPosition); + } + + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } else if (params.freeModeSticky) { + swiper.slideToClosest(); + return; + } + + if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) { + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + return; + } + + // Find current slide + let stopIndex = 0; + let groupSize = swiper.slidesSizesGrid[0]; + for (let i = 0; i < slidesGrid.length; i += params.slidesPerGroup) { + if (typeof slidesGrid[i + params.slidesPerGroup] !== 'undefined') { + if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + params.slidesPerGroup]) { + stopIndex = i; + groupSize = slidesGrid[i + params.slidesPerGroup] - slidesGrid[i]; + } + } else if (currentPos >= slidesGrid[i]) { + stopIndex = i; + groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2]; + } + } + + // Find current slide size + const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize; + + if (timeDiff > params.longSwipesMs) { + // Long touches + if (!params.longSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + if (swiper.swipeDirection === 'next') { + if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + params.slidesPerGroup); + else swiper.slideTo(stopIndex); + } + if (swiper.swipeDirection === 'prev') { + if (ratio > (1 - params.longSwipesRatio)) swiper.slideTo(stopIndex + params.slidesPerGroup); + else swiper.slideTo(stopIndex); + } + } else { + // Short swipes + if (!params.shortSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + if (swiper.swipeDirection === 'next') { + swiper.slideTo(stopIndex + params.slidesPerGroup); + } + if (swiper.swipeDirection === 'prev') { + swiper.slideTo(stopIndex); + } + } +} + +function onResize () { + const swiper = this; + + const { params, el } = swiper; + + if (el && el.offsetWidth === 0) return; + + // Breakpoints + if (params.breakpoints) { + swiper.setBreakpoint(); + } + + // Save locks + const { allowSlideNext, allowSlidePrev, snapGrid } = swiper; + + // Disable locks on resize + swiper.allowSlideNext = true; + swiper.allowSlidePrev = true; + + swiper.updateSize(); + swiper.updateSlides(); + + if (params.freeMode) { + const newTranslate = Math.min(Math.max(swiper.translate, swiper.maxTranslate()), swiper.minTranslate()); + swiper.setTranslate(newTranslate); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + } else { + swiper.updateSlidesClasses(); + if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) { + swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + swiper.slideTo(swiper.activeIndex, 0, false, true); + } + } + // Return locks after resize + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; + + if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } +} + +function onClick (e) { + const swiper = this; + if (!swiper.allowClick) { + if (swiper.params.preventClicks) e.preventDefault(); + if (swiper.params.preventClicksPropagation && swiper.animating) { + e.stopPropagation(); + e.stopImmediatePropagation(); + } + } +} + +function attachEvents() { + const swiper = this; + const { + params, touchEvents, el, wrapperEl, + } = swiper; + + { + swiper.onTouchStart = onTouchStart.bind(swiper); + swiper.onTouchMove = onTouchMove.bind(swiper); + swiper.onTouchEnd = onTouchEnd.bind(swiper); + } + + swiper.onClick = onClick.bind(swiper); + + const target = params.touchEventsTarget === 'container' ? el : wrapperEl; + const capture = !!params.nested; + + // Touch Events + { + if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) { + target.addEventListener(touchEvents.start, swiper.onTouchStart, false); + document.addEventListener(touchEvents.move, swiper.onTouchMove, capture); + document.addEventListener(touchEvents.end, swiper.onTouchEnd, false); + } else { + if (Support.touch) { + const passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false; + target.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener); + target.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture } : capture); + target.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener); + } + if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) { + target.addEventListener('mousedown', swiper.onTouchStart, false); + document.addEventListener('mousemove', swiper.onTouchMove, capture); + document.addEventListener('mouseup', swiper.onTouchEnd, false); + } + } + // Prevent Links Clicks + if (params.preventClicks || params.preventClicksPropagation) { + target.addEventListener('click', swiper.onClick, true); + } + } + + // Resize handler + swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize, true); +} + +function detachEvents() { + const swiper = this; + + const { + params, touchEvents, el, wrapperEl, + } = swiper; + + const target = params.touchEventsTarget === 'container' ? el : wrapperEl; + const capture = !!params.nested; + + // Touch Events + { + if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) { + target.removeEventListener(touchEvents.start, swiper.onTouchStart, false); + document.removeEventListener(touchEvents.move, swiper.onTouchMove, capture); + document.removeEventListener(touchEvents.end, swiper.onTouchEnd, false); + } else { + if (Support.touch) { + const passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false; + target.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener); + target.removeEventListener(touchEvents.move, swiper.onTouchMove, capture); + target.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener); + } + if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) { + target.removeEventListener('mousedown', swiper.onTouchStart, false); + document.removeEventListener('mousemove', swiper.onTouchMove, capture); + document.removeEventListener('mouseup', swiper.onTouchEnd, false); + } + } + // Prevent Links Clicks + if (params.preventClicks || params.preventClicksPropagation) { + target.removeEventListener('click', swiper.onClick, true); + } + } + + // Resize handler + swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize); +} + +var events = { + attachEvents, + detachEvents, +}; + +function setBreakpoint () { + const swiper = this; + const { + activeIndex, initialized, loopedSlides = 0, params, + } = swiper; + const breakpoints = params.breakpoints; + if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) return; + + // Set breakpoint for window width and update parameters + const breakpoint = swiper.getBreakpoint(breakpoints); + + if (breakpoint && swiper.currentBreakpoint !== breakpoint) { + const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined; + if (breakpointOnlyParams) { + ['slidesPerView', 'spaceBetween', 'slidesPerGroup'].forEach((param) => { + const paramValue = breakpointOnlyParams[param]; + if (typeof paramValue === 'undefined') return; + if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) { + breakpointOnlyParams[param] = 'auto'; + } else if (param === 'slidesPerView') { + breakpointOnlyParams[param] = parseFloat(paramValue); + } else { + breakpointOnlyParams[param] = parseInt(paramValue, 10); + } + }); + } + + const breakpointParams = breakpointOnlyParams || swiper.originalParams; + const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction; + const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged); + + if (directionChanged && initialized) { + swiper.changeDirection(); + } + + Utils.extend(swiper.params, breakpointParams); + + Utils.extend(swiper, { + allowTouchMove: swiper.params.allowTouchMove, + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev, + }); + + swiper.currentBreakpoint = breakpoint; + + if (needsReLoop && initialized) { + swiper.loopDestroy(); + swiper.loopCreate(); + swiper.updateSlides(); + swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false); + } + + swiper.emit('breakpoint', breakpointParams); + } +} + +function getBreakpoint (breakpoints) { + const swiper = this; + // Get breakpoint for window width + if (!breakpoints) return undefined; + let breakpoint = false; + const points = []; + Object.keys(breakpoints).forEach((point) => { + points.push(point); + }); + points.sort((a, b) => parseInt(a, 10) - parseInt(b, 10)); + for (let i = 0; i < points.length; i += 1) { + const point = points[i]; + if (swiper.params.breakpointsInverse) { + if (point <= window.innerWidth) { + breakpoint = point; + } + } else if (point >= window.innerWidth && !breakpoint) { + breakpoint = point; + } + } + return breakpoint || 'max'; +} + +var breakpoints = { setBreakpoint, getBreakpoint }; + +function addClasses () { + const swiper = this; + const { + classNames, params, rtl, $el, + } = swiper; + const suffixes = []; + + suffixes.push('initialized'); + suffixes.push(params.direction); + + if (params.freeMode) { + suffixes.push('free-mode'); + } + if (!Support.flexbox) { + suffixes.push('no-flexbox'); + } + if (params.autoHeight) { + suffixes.push('autoheight'); + } + if (rtl) { + suffixes.push('rtl'); + } + if (params.slidesPerColumn > 1) { + suffixes.push('multirow'); + } + if (Device.android) { + suffixes.push('android'); + } + if (Device.ios) { + suffixes.push('ios'); + } + // WP8 Touch Events Fix + if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) { + suffixes.push(`wp8-${params.direction}`); + } + + suffixes.forEach((suffix) => { + classNames.push(params.containerModifierClass + suffix); + }); + + $el.addClass(classNames.join(' ')); +} + +function removeClasses () { + const swiper = this; + const { $el, classNames } = swiper; + + $el.removeClass(classNames.join(' ')); +} + +var classes = { addClasses, removeClasses }; + +function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) { + let image; + function onReady() { + if (callback) callback(); + } + if (!imageEl.complete || !checkForComplete) { + if (src) { + image = new window.Image(); + image.onload = onReady; + image.onerror = onReady; + if (sizes) { + image.sizes = sizes; + } + if (srcset) { + image.srcset = srcset; + } + if (src) { + image.src = src; + } + } else { + onReady(); + } + } else { + // image already loaded... + onReady(); + } +} + +function preloadImages () { + const swiper = this; + swiper.imagesToLoad = swiper.$el.find('img'); + function onReady() { + if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return; + if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1; + if (swiper.imagesLoaded === swiper.imagesToLoad.length) { + if (swiper.params.updateOnImagesReady) swiper.update(); + swiper.emit('imagesReady'); + } + } + for (let i = 0; i < swiper.imagesToLoad.length; i += 1) { + const imageEl = swiper.imagesToLoad[i]; + swiper.loadImage( + imageEl, + imageEl.currentSrc || imageEl.getAttribute('src'), + imageEl.srcset || imageEl.getAttribute('srcset'), + imageEl.sizes || imageEl.getAttribute('sizes'), + true, + onReady + ); + } +} + +var images = { + loadImage, + preloadImages, +}; + +function checkOverflow() { + const swiper = this; + const wasLocked = swiper.isLocked; + + swiper.isLocked = swiper.snapGrid.length === 1; + swiper.allowSlideNext = !swiper.isLocked; + swiper.allowSlidePrev = !swiper.isLocked; + + // events + if (wasLocked !== swiper.isLocked) swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); + + if (wasLocked && wasLocked !== swiper.isLocked) { + swiper.isEnd = false; + swiper.navigation.update(); + } +} + +var checkOverflow$1 = { checkOverflow }; + +var defaults = { + init: true, + direction: 'horizontal', + touchEventsTarget: 'container', + initialSlide: 0, + speed: 300, + // + preventInteractionOnTransition: false, + + // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView). + edgeSwipeDetection: false, + edgeSwipeThreshold: 20, + + // Free mode + freeMode: false, + freeModeMomentum: true, + freeModeMomentumRatio: 1, + freeModeMomentumBounce: true, + freeModeMomentumBounceRatio: 1, + freeModeMomentumVelocityRatio: 1, + freeModeSticky: false, + freeModeMinimumVelocity: 0.02, + + // Autoheight + autoHeight: false, + + // Set wrapper width + setWrapperSize: false, + + // Virtual Translate + virtualTranslate: false, + + // Effects + effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip' + + // Breakpoints + breakpoints: undefined, + breakpointsInverse: false, + + // Slides grid + spaceBetween: 0, + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerColumnFill: 'column', + slidesPerGroup: 1, + centeredSlides: false, + slidesOffsetBefore: 0, // in px + slidesOffsetAfter: 0, // in px + normalizeSlideIndex: true, + centerInsufficientSlides: false, + + // Disable swiper and hide navigation when container not overflow + watchOverflow: false, + + // Round length + roundLengths: false, + + // Touches + touchRatio: 1, + touchAngle: 45, + simulateTouch: true, + shortSwipes: true, + longSwipes: true, + longSwipesRatio: 0.5, + longSwipesMs: 300, + followFinger: true, + allowTouchMove: true, + threshold: 0, + touchMoveStopPropagation: true, + touchStartPreventDefault: true, + touchStartForcePreventDefault: false, + touchReleaseOnEdges: false, + + // Unique Navigation Elements + uniqueNavElements: true, + + // Resistance + resistance: true, + resistanceRatio: 0.85, + + // Progress + watchSlidesProgress: false, + watchSlidesVisibility: false, + + // Cursor + grabCursor: false, + + // Clicks + preventClicks: true, + preventClicksPropagation: true, + slideToClickedSlide: false, + + // Images + preloadImages: true, + updateOnImagesReady: true, + + // loop + loop: false, + loopAdditionalSlides: 0, + loopedSlides: null, + loopFillGroupWithBlank: false, + + // Swiping/no swiping + allowSlidePrev: true, + allowSlideNext: true, + swipeHandler: null, // '.swipe-handler', + noSwiping: true, + noSwipingClass: 'swiper-no-swiping', + noSwipingSelector: null, + + // Passive Listeners + passiveListeners: true, + + // NS + containerModifierClass: 'swiper-container-', // NEW + slideClass: 'swiper-slide', + slideBlankClass: 'swiper-slide-invisible-blank', + slideActiveClass: 'swiper-slide-active', + slideDuplicateActiveClass: 'swiper-slide-duplicate-active', + slideVisibleClass: 'swiper-slide-visible', + slideDuplicateClass: 'swiper-slide-duplicate', + slideNextClass: 'swiper-slide-next', + slideDuplicateNextClass: 'swiper-slide-duplicate-next', + slidePrevClass: 'swiper-slide-prev', + slideDuplicatePrevClass: 'swiper-slide-duplicate-prev', + wrapperClass: 'swiper-wrapper', + + // Callbacks + runCallbacksOnInit: true, +}; + +/* eslint no-param-reassign: "off" */ + +const prototypes = { + update, + translate, + transition, + slide, + loop, + grabCursor, + manipulation, + events, + breakpoints, + checkOverflow: checkOverflow$1, + classes, + images, +}; + +const extendedDefaults = {}; + +class Swiper extends SwiperClass { + constructor(...args) { + let el; + let params; + if (args.length === 1 && args[0].constructor && args[0].constructor === Object) { + params = args[0]; + } else { + [el, params] = args; + } + if (!params) params = {}; + + params = Utils.extend({}, params); + if (el && !params.el) params.el = el; + + super(params); + + Object.keys(prototypes).forEach((prototypeGroup) => { + Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => { + if (!Swiper.prototype[protoMethod]) { + Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod]; + } + }); + }); + + // Swiper Instance + const swiper = this; + if (typeof swiper.modules === 'undefined') { + swiper.modules = {}; + } + Object.keys(swiper.modules).forEach((moduleName) => { + const module = swiper.modules[moduleName]; + if (module.params) { + const moduleParamName = Object.keys(module.params)[0]; + const moduleParams = module.params[moduleParamName]; + if (typeof moduleParams !== 'object' || moduleParams === null) return; + if (!(moduleParamName in params && 'enabled' in moduleParams)) return; + if (params[moduleParamName] === true) { + params[moduleParamName] = { enabled: true }; + } + if ( + typeof params[moduleParamName] === 'object' + && !('enabled' in params[moduleParamName]) + ) { + params[moduleParamName].enabled = true; + } + if (!params[moduleParamName]) params[moduleParamName] = { enabled: false }; + } + }); + + // Extend defaults with modules params + const swiperParams = Utils.extend({}, defaults); + swiper.useModulesParams(swiperParams); + + // Extend defaults with passed params + swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params); + swiper.originalParams = Utils.extend({}, swiper.params); + swiper.passedParams = Utils.extend({}, params); + + // Save Dom lib + swiper.$ = $; + + // Find el + const $el = $(swiper.params.el); + el = $el[0]; + + if (!el) { + return undefined; + } + + if ($el.length > 1) { + const swipers = []; + $el.each((index, containerEl) => { + const newParams = Utils.extend({}, params, { el: containerEl }); + swipers.push(new Swiper(newParams)); + }); + return swipers; + } + + el.swiper = swiper; + $el.data('swiper', swiper); + + // Find Wrapper + const $wrapperEl = $el.children(`.${swiper.params.wrapperClass}`); + + // Extend Swiper + Utils.extend(swiper, { + $el, + el, + $wrapperEl, + wrapperEl: $wrapperEl[0], + + // Classes + classNames: [], + + // Slides + slides: $(), + slidesGrid: [], + snapGrid: [], + slidesSizesGrid: [], + + // isDirection + isHorizontal() { + return swiper.params.direction === 'horizontal'; + }, + isVertical() { + return swiper.params.direction === 'vertical'; + }, + // RTL + rtl: (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'), + rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'), + wrongRTL: $wrapperEl.css('display') === '-webkit-box', + + // Indexes + activeIndex: 0, + realIndex: 0, + + // + isBeginning: true, + isEnd: false, + + // Props + translate: 0, + previousTranslate: 0, + progress: 0, + velocity: 0, + animating: false, + + // Locks + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev, + + // Touch Events + touchEvents: (function touchEvents() { + const touch = ['touchstart', 'touchmove', 'touchend']; + let desktop = ['mousedown', 'mousemove', 'mouseup']; + if (Support.pointerEvents) { + desktop = ['pointerdown', 'pointermove', 'pointerup']; + } else if (Support.prefixedPointerEvents) { + desktop = ['MSPointerDown', 'MSPointerMove', 'MSPointerUp']; + } + swiper.touchEventsTouch = { + start: touch[0], + move: touch[1], + end: touch[2], + }; + swiper.touchEventsDesktop = { + start: desktop[0], + move: desktop[1], + end: desktop[2], + }; + return Support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop; + }()), + touchEventsData: { + isTouched: undefined, + isMoved: undefined, + allowTouchCallbacks: undefined, + touchStartTime: undefined, + isScrolling: undefined, + currentTranslate: undefined, + startTranslate: undefined, + allowThresholdMove: undefined, + // Form elements to match + formElements: 'input, select, option, textarea, button, video', + // Last click time + lastClickTime: Utils.now(), + clickTimeout: undefined, + // Velocities + velocities: [], + allowMomentumBounce: undefined, + isTouchEvent: undefined, + startMoving: undefined, + }, + + // Clicks + allowClick: true, + + // Touches + allowTouchMove: swiper.params.allowTouchMove, + + touches: { + startX: 0, + startY: 0, + currentX: 0, + currentY: 0, + diff: 0, + }, + + // Images + imagesToLoad: [], + imagesLoaded: 0, + + }); + + // Install Modules + swiper.useModules(); + + // Init + if (swiper.params.init) { + swiper.init(); + } + + // Return app instance + return swiper; + } + + slidesPerViewDynamic() { + const swiper = this; + const { + params, slides, slidesGrid, size: swiperSize, activeIndex, + } = swiper; + let spv = 1; + if (params.centeredSlides) { + let slideSize = slides[activeIndex].swiperSlideSize; + let breakLoop; + for (let i = activeIndex + 1; i < slides.length; i += 1) { + if (slides[i] && !breakLoop) { + slideSize += slides[i].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) breakLoop = true; + } + } + for (let i = activeIndex - 1; i >= 0; i -= 1) { + if (slides[i] && !breakLoop) { + slideSize += slides[i].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) breakLoop = true; + } + } + } else { + for (let i = activeIndex + 1; i < slides.length; i += 1) { + if (slidesGrid[i] - slidesGrid[activeIndex] < swiperSize) { + spv += 1; + } + } + } + return spv; + } + + update() { + const swiper = this; + if (!swiper || swiper.destroyed) return; + const { snapGrid, params } = swiper; + // Breakpoints + if (params.breakpoints) { + swiper.setBreakpoint(); + } + swiper.updateSize(); + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + + function setTranslate() { + const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate; + const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate()); + swiper.setTranslate(newTranslate); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + let translated; + if (swiper.params.freeMode) { + setTranslate(); + if (swiper.params.autoHeight) { + swiper.updateAutoHeight(); + } + } else { + if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) { + translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + translated = swiper.slideTo(swiper.activeIndex, 0, false, true); + } + if (!translated) { + setTranslate(); + } + } + if (params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } + swiper.emit('update'); + } + + changeDirection(newDirection, needUpdate = true) { + const swiper = this; + const currentDirection = swiper.params.direction; + if (!newDirection) { + // eslint-disable-next-line + newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal'; + } + if ((newDirection === currentDirection) || (newDirection !== 'horizontal' && newDirection !== 'vertical')) { + return swiper; + } + + if (currentDirection === 'vertical') { + swiper.$el + .removeClass(`${swiper.params.containerModifierClass}vertical wp8-vertical`) + .addClass(`${swiper.params.containerModifierClass}${newDirection}`); + + if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) { + swiper.$el.addClass(`${swiper.params.containerModifierClass}wp8-${newDirection}`); + } + } + if (currentDirection === 'horizontal') { + swiper.$el + .removeClass(`${swiper.params.containerModifierClass}horizontal wp8-horizontal`) + .addClass(`${swiper.params.containerModifierClass}${newDirection}`); + + if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) { + swiper.$el.addClass(`${swiper.params.containerModifierClass}wp8-${newDirection}`); + } + } + + swiper.params.direction = newDirection; + + swiper.slides.each((slideIndex, slideEl) => { + if (newDirection === 'vertical') { + slideEl.style.width = ''; + } else { + slideEl.style.height = ''; + } + }); + + swiper.emit('changeDirection'); + if (needUpdate) swiper.update(); + + return swiper; + } + + init() { + const swiper = this; + if (swiper.initialized) return; + + swiper.emit('beforeInit'); + + // Set breakpoint + if (swiper.params.breakpoints) { + swiper.setBreakpoint(); + } + + // Add Classes + swiper.addClasses(); + + // Create loop + if (swiper.params.loop) { + swiper.loopCreate(); + } + + // Update size + swiper.updateSize(); + + // Update slides + swiper.updateSlides(); + + if (swiper.params.watchOverflow) { + swiper.checkOverflow(); + } + + // Set Grab Cursor + if (swiper.params.grabCursor) { + swiper.setGrabCursor(); + } + + if (swiper.params.preloadImages) { + swiper.preloadImages(); + } + + // Slide To Initial Slide + if (swiper.params.loop) { + swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit); + } else { + swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit); + } + + // Attach events + swiper.attachEvents(); + + // Init Flag + swiper.initialized = true; + + // Emit + swiper.emit('init'); + } + + destroy(deleteInstance = true, cleanStyles = true) { + const swiper = this; + const { + params, $el, $wrapperEl, slides, + } = swiper; + + if (typeof swiper.params === 'undefined' || swiper.destroyed) { + return null; + } + + swiper.emit('beforeDestroy'); + + // Init Flag + swiper.initialized = false; + + // Detach events + swiper.detachEvents(); + + // Destroy loop + if (params.loop) { + swiper.loopDestroy(); + } + + // Cleanup styles + if (cleanStyles) { + swiper.removeClasses(); + $el.removeAttr('style'); + $wrapperEl.removeAttr('style'); + if (slides && slides.length) { + slides + .removeClass([ + params.slideVisibleClass, + params.slideActiveClass, + params.slideNextClass, + params.slidePrevClass, + ].join(' ')) + .removeAttr('style') + .removeAttr('data-swiper-slide-index') + .removeAttr('data-swiper-column') + .removeAttr('data-swiper-row'); + } + } + + swiper.emit('destroy'); + + // Detach emitter events + Object.keys(swiper.eventsListeners).forEach((eventName) => { + swiper.off(eventName); + }); + + if (deleteInstance !== false) { + swiper.$el[0].swiper = null; + swiper.$el.data('swiper', null); + Utils.deleteProps(swiper); + } + swiper.destroyed = true; + + return null; + } + + static extendDefaults(newDefaults) { + Utils.extend(extendedDefaults, newDefaults); + } + + static get extendedDefaults() { + return extendedDefaults; + } + + static get defaults() { + return defaults; + } + + static get Class() { + return SwiperClass; + } + + static get $() { + return $; + } +} + +var Device$1 = { + name: 'device', + proto: { + device: Device, + }, + static: { + device: Device, + }, +}; + +var Support$1 = { + name: 'support', + proto: { + support: Support, + }, + static: { + support: Support, + }, +}; + +var Browser$1 = { + name: 'browser', + proto: { + browser: Browser, + }, + static: { + browser: Browser, + }, +}; + +var Resize = { + name: 'resize', + create() { + const swiper = this; + Utils.extend(swiper, { + resize: { + resizeHandler() { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + swiper.emit('beforeResize'); + swiper.emit('resize'); + }, + orientationChangeHandler() { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + swiper.emit('orientationchange'); + }, + }, + }); + }, + on: { + init() { + const swiper = this; + // Emit resize + window.addEventListener('resize', swiper.resize.resizeHandler); + + // Emit orientationchange + window.addEventListener('orientationchange', swiper.resize.orientationChangeHandler); + }, + destroy() { + const swiper = this; + window.removeEventListener('resize', swiper.resize.resizeHandler); + window.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler); + }, + }, +}; + +const Observer = { + func: window.MutationObserver || window.WebkitMutationObserver, + attach(target, options = {}) { + const swiper = this; + + const ObserverFunc = Observer.func; + const observer = new ObserverFunc((mutations) => { + // The observerUpdate event should only be triggered + // once despite the number of mutations. Additional + // triggers are redundant and are very costly + if (mutations.length === 1) { + swiper.emit('observerUpdate', mutations[0]); + return; + } + const observerUpdate = function observerUpdate() { + swiper.emit('observerUpdate', mutations[0]); + }; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(observerUpdate); + } else { + window.setTimeout(observerUpdate, 0); + } + }); + + observer.observe(target, { + attributes: typeof options.attributes === 'undefined' ? true : options.attributes, + childList: typeof options.childList === 'undefined' ? true : options.childList, + characterData: typeof options.characterData === 'undefined' ? true : options.characterData, + }); + + swiper.observer.observers.push(observer); + }, + init() { + const swiper = this; + if (!Support.observer || !swiper.params.observer) return; + if (swiper.params.observeParents) { + const containerParents = swiper.$el.parents(); + for (let i = 0; i < containerParents.length; i += 1) { + swiper.observer.attach(containerParents[i]); + } + } + // Observe container + swiper.observer.attach(swiper.$el[0], { childList: swiper.params.observeSlideChildren }); + + // Observe wrapper + swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false }); + }, + destroy() { + const swiper = this; + swiper.observer.observers.forEach((observer) => { + observer.disconnect(); + }); + swiper.observer.observers = []; + }, +}; + +var Observer$1 = { + name: 'observer', + params: { + observer: false, + observeParents: false, + observeSlideChildren: false, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + observer: { + init: Observer.init.bind(swiper), + attach: Observer.attach.bind(swiper), + destroy: Observer.destroy.bind(swiper), + observers: [], + }, + }); + }, + on: { + init() { + const swiper = this; + swiper.observer.init(); + }, + destroy() { + const swiper = this; + swiper.observer.destroy(); + }, + }, +}; + +const Virtual = { + update(force) { + const swiper = this; + const { slidesPerView, slidesPerGroup, centeredSlides } = swiper.params; + const { addSlidesBefore, addSlidesAfter } = swiper.params.virtual; + const { + from: previousFrom, + to: previousTo, + slides, + slidesGrid: previousSlidesGrid, + renderSlide, + offset: previousOffset, + } = swiper.virtual; + swiper.updateActiveIndex(); + const activeIndex = swiper.activeIndex || 0; + + let offsetProp; + if (swiper.rtlTranslate) offsetProp = 'right'; + else offsetProp = swiper.isHorizontal() ? 'left' : 'top'; + + let slidesAfter; + let slidesBefore; + if (centeredSlides) { + slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore; + slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter; + } else { + slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesBefore; + slidesBefore = slidesPerGroup + addSlidesAfter; + } + const from = Math.max((activeIndex || 0) - slidesBefore, 0); + const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1); + const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0); + + Utils.extend(swiper.virtual, { + from, + to, + offset, + slidesGrid: swiper.slidesGrid, + }); + + function onRendered() { + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + if (swiper.lazy && swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + } + + if (previousFrom === from && previousTo === to && !force) { + if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) { + swiper.slides.css(offsetProp, `${offset}px`); + } + swiper.updateProgress(); + return; + } + if (swiper.params.virtual.renderExternal) { + swiper.params.virtual.renderExternal.call(swiper, { + offset, + from, + to, + slides: (function getSlides() { + const slidesToRender = []; + for (let i = from; i <= to; i += 1) { + slidesToRender.push(slides[i]); + } + return slidesToRender; + }()), + }); + onRendered(); + return; + } + const prependIndexes = []; + const appendIndexes = []; + if (force) { + swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove(); + } else { + for (let i = previousFrom; i <= previousTo; i += 1) { + if (i < from || i > to) { + swiper.$wrapperEl.find(`.${swiper.params.slideClass}[data-swiper-slide-index="${i}"]`).remove(); + } + } + } + for (let i = 0; i < slides.length; i += 1) { + if (i >= from && i <= to) { + if (typeof previousTo === 'undefined' || force) { + appendIndexes.push(i); + } else { + if (i > previousTo) appendIndexes.push(i); + if (i < previousFrom) prependIndexes.push(i); + } + } + } + appendIndexes.forEach((index) => { + swiper.$wrapperEl.append(renderSlide(slides[index], index)); + }); + prependIndexes.sort((a, b) => b - a).forEach((index) => { + swiper.$wrapperEl.prepend(renderSlide(slides[index], index)); + }); + swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`); + onRendered(); + }, + renderSlide(slide, index) { + const swiper = this; + const params = swiper.params.virtual; + if (params.cache && swiper.virtual.cache[index]) { + return swiper.virtual.cache[index]; + } + const $slideEl = params.renderSlide + ? $(params.renderSlide.call(swiper, slide, index)) + : $(`
            ${slide}
            `); + if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index); + if (params.cache) swiper.virtual.cache[index] = $slideEl; + return $slideEl; + }, + appendSlide(slides) { + const swiper = this; + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) swiper.virtual.slides.push(slides[i]); + } + } else { + swiper.virtual.slides.push(slides); + } + swiper.virtual.update(true); + }, + prependSlide(slides) { + const swiper = this; + const activeIndex = swiper.activeIndex; + let newActiveIndex = activeIndex + 1; + let numberOfNewSlides = 1; + + if (Array.isArray(slides)) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) swiper.virtual.slides.unshift(slides[i]); + } + newActiveIndex = activeIndex + slides.length; + numberOfNewSlides = slides.length; + } else { + swiper.virtual.slides.unshift(slides); + } + if (swiper.params.virtual.cache) { + const cache = swiper.virtual.cache; + const newCache = {}; + Object.keys(cache).forEach((cachedIndex) => { + newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cache[cachedIndex]; + }); + swiper.virtual.cache = newCache; + } + swiper.virtual.update(true); + swiper.slideTo(newActiveIndex, 0); + }, + removeSlide(slidesIndexes) { + const swiper = this; + if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return; + let activeIndex = swiper.activeIndex; + if (Array.isArray(slidesIndexes)) { + for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) { + swiper.virtual.slides.splice(slidesIndexes[i], 1); + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes[i]]; + } + if (slidesIndexes[i] < activeIndex) activeIndex -= 1; + activeIndex = Math.max(activeIndex, 0); + } + } else { + swiper.virtual.slides.splice(slidesIndexes, 1); + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes]; + } + if (slidesIndexes < activeIndex) activeIndex -= 1; + activeIndex = Math.max(activeIndex, 0); + } + swiper.virtual.update(true); + swiper.slideTo(activeIndex, 0); + }, + removeAllSlides() { + const swiper = this; + swiper.virtual.slides = []; + if (swiper.params.virtual.cache) { + swiper.virtual.cache = {}; + } + swiper.virtual.update(true); + swiper.slideTo(0, 0); + }, +}; + +var Virtual$1 = { + name: 'virtual', + params: { + virtual: { + enabled: false, + slides: [], + cache: true, + renderSlide: null, + renderExternal: null, + addSlidesBefore: 0, + addSlidesAfter: 0, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + virtual: { + update: Virtual.update.bind(swiper), + appendSlide: Virtual.appendSlide.bind(swiper), + prependSlide: Virtual.prependSlide.bind(swiper), + removeSlide: Virtual.removeSlide.bind(swiper), + removeAllSlides: Virtual.removeAllSlides.bind(swiper), + renderSlide: Virtual.renderSlide.bind(swiper), + slides: swiper.params.virtual.slides, + cache: {}, + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (!swiper.params.virtual.enabled) return; + swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`); + const overwriteParams = { + watchSlidesProgress: true, + }; + Utils.extend(swiper.params, overwriteParams); + Utils.extend(swiper.originalParams, overwriteParams); + + if (!swiper.params.initialSlide) { + swiper.virtual.update(); + } + }, + setTranslate() { + const swiper = this; + if (!swiper.params.virtual.enabled) return; + swiper.virtual.update(); + }, + }, +}; + +const Keyboard = { + handle(event) { + const swiper = this; + const { rtlTranslate: rtl } = swiper; + let e = event; + if (e.originalEvent) e = e.originalEvent; // jquery fix + const kc = e.keyCode || e.charCode; + // Directions locks + if (!swiper.allowSlideNext && ((swiper.isHorizontal() && kc === 39) || (swiper.isVertical() && kc === 40))) { + return false; + } + if (!swiper.allowSlidePrev && ((swiper.isHorizontal() && kc === 37) || (swiper.isVertical() && kc === 38))) { + return false; + } + if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { + return undefined; + } + if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) { + return undefined; + } + if (swiper.params.keyboard.onlyInViewport && (kc === 37 || kc === 39 || kc === 38 || kc === 40)) { + let inView = false; + // Check that swiper should be inside of visible area of window + if (swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 && swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0) { + return undefined; + } + const windowWidth = window.innerWidth; + const windowHeight = window.innerHeight; + const swiperOffset = swiper.$el.offset(); + if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft; + const swiperCoord = [ + [swiperOffset.left, swiperOffset.top], + [swiperOffset.left + swiper.width, swiperOffset.top], + [swiperOffset.left, swiperOffset.top + swiper.height], + [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height], + ]; + for (let i = 0; i < swiperCoord.length; i += 1) { + const point = swiperCoord[i]; + if ( + point[0] >= 0 && point[0] <= windowWidth + && point[1] >= 0 && point[1] <= windowHeight + ) { + inView = true; + } + } + if (!inView) return undefined; + } + if (swiper.isHorizontal()) { + if (kc === 37 || kc === 39) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + if ((kc === 39 && !rtl) || (kc === 37 && rtl)) swiper.slideNext(); + if ((kc === 37 && !rtl) || (kc === 39 && rtl)) swiper.slidePrev(); + } else { + if (kc === 38 || kc === 40) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + if (kc === 40) swiper.slideNext(); + if (kc === 38) swiper.slidePrev(); + } + swiper.emit('keyPress', kc); + return undefined; + }, + enable() { + const swiper = this; + if (swiper.keyboard.enabled) return; + $(document).on('keydown', swiper.keyboard.handle); + swiper.keyboard.enabled = true; + }, + disable() { + const swiper = this; + if (!swiper.keyboard.enabled) return; + $(document).off('keydown', swiper.keyboard.handle); + swiper.keyboard.enabled = false; + }, +}; + +var Keyboard$1 = { + name: 'keyboard', + params: { + keyboard: { + enabled: false, + onlyInViewport: true, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + keyboard: { + enabled: false, + enable: Keyboard.enable.bind(swiper), + disable: Keyboard.disable.bind(swiper), + handle: Keyboard.handle.bind(swiper), + }, + }); + }, + on: { + init() { + const swiper = this; + if (swiper.params.keyboard.enabled) { + swiper.keyboard.enable(); + } + }, + destroy() { + const swiper = this; + if (swiper.keyboard.enabled) { + swiper.keyboard.disable(); + } + }, + }, +}; + +function isEventSupported() { + const eventName = 'onwheel'; + let isSupported = eventName in document; + + if (!isSupported) { + const element = document.createElement('div'); + element.setAttribute(eventName, 'return;'); + isSupported = typeof element[eventName] === 'function'; + } + + if (!isSupported + && document.implementation + && document.implementation.hasFeature + // always returns true in newer browsers as per the standard. + // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature + && document.implementation.hasFeature('', '') !== true + ) { + // This is the only way to test support for the `wheel` event in IE9+. + isSupported = document.implementation.hasFeature('Events.wheel', '3.0'); + } + + return isSupported; +} +const Mousewheel = { + lastScrollTime: Utils.now(), + event: (function getEvent() { + if (window.navigator.userAgent.indexOf('firefox') > -1) return 'DOMMouseScroll'; + return isEventSupported() ? 'wheel' : 'mousewheel'; + }()), + normalize(e) { + // Reasonable defaults + const PIXEL_STEP = 10; + const LINE_HEIGHT = 40; + const PAGE_HEIGHT = 800; + + let sX = 0; + let sY = 0; // spinX, spinY + let pX = 0; + let pY = 0; // pixelX, pixelY + + // Legacy + if ('detail' in e) { + sY = e.detail; + } + if ('wheelDelta' in e) { + sY = -e.wheelDelta / 120; + } + if ('wheelDeltaY' in e) { + sY = -e.wheelDeltaY / 120; + } + if ('wheelDeltaX' in e) { + sX = -e.wheelDeltaX / 120; + } + + // side scrolling on FF with DOMMouseScroll + if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) { + sX = sY; + sY = 0; + } + + pX = sX * PIXEL_STEP; + pY = sY * PIXEL_STEP; + + if ('deltaY' in e) { + pY = e.deltaY; + } + if ('deltaX' in e) { + pX = e.deltaX; + } + + if ((pX || pY) && e.deltaMode) { + if (e.deltaMode === 1) { // delta in LINE units + pX *= LINE_HEIGHT; + pY *= LINE_HEIGHT; + } else { // delta in PAGE units + pX *= PAGE_HEIGHT; + pY *= PAGE_HEIGHT; + } + } + + // Fall-back if spin cannot be determined + if (pX && !sX) { + sX = (pX < 1) ? -1 : 1; + } + if (pY && !sY) { + sY = (pY < 1) ? -1 : 1; + } + + return { + spinX: sX, + spinY: sY, + pixelX: pX, + pixelY: pY, + }; + }, + handleMouseEnter() { + const swiper = this; + swiper.mouseEntered = true; + }, + handleMouseLeave() { + const swiper = this; + swiper.mouseEntered = false; + }, + handle(event) { + let e = event; + const swiper = this; + const params = swiper.params.mousewheel; + + if (!swiper.mouseEntered && !params.releaseOnEdges) return true; + + if (e.originalEvent) e = e.originalEvent; // jquery fix + let delta = 0; + const rtlFactor = swiper.rtlTranslate ? -1 : 1; + + const data = Mousewheel.normalize(e); + + if (params.forceToAxis) { + if (swiper.isHorizontal()) { + if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = data.pixelX * rtlFactor; + else return true; + } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = data.pixelY; + else return true; + } else { + delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY; + } + + if (delta === 0) return true; + + if (params.invert) delta = -delta; + + if (!swiper.params.freeMode) { + if (Utils.now() - swiper.mousewheel.lastScrollTime > 60) { + if (delta < 0) { + if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) { + swiper.slideNext(); + swiper.emit('scroll', e); + } else if (params.releaseOnEdges) return true; + } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) { + swiper.slidePrev(); + swiper.emit('scroll', e); + } else if (params.releaseOnEdges) return true; + } + swiper.mousewheel.lastScrollTime = (new window.Date()).getTime(); + } else { + // Freemode or scrollContainer: + if (swiper.params.loop) { + swiper.loopFix(); + } + let position = swiper.getTranslate() + (delta * params.sensitivity); + const wasBeginning = swiper.isBeginning; + const wasEnd = swiper.isEnd; + + if (position >= swiper.minTranslate()) position = swiper.minTranslate(); + if (position <= swiper.maxTranslate()) position = swiper.maxTranslate(); + + swiper.setTransition(0); + swiper.setTranslate(position); + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + + if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) { + swiper.updateSlidesClasses(); + } + + if (swiper.params.freeModeSticky) { + clearTimeout(swiper.mousewheel.timeout); + swiper.mousewheel.timeout = Utils.nextTick(() => { + swiper.slideToClosest(); + }, 300); + } + // Emit event + swiper.emit('scroll', e); + + // Stop autoplay + if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop(); + // Return page scroll on edge positions + if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true; + } + + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + return false; + }, + enable() { + const swiper = this; + if (!Mousewheel.event) return false; + if (swiper.mousewheel.enabled) return false; + let target = swiper.$el; + if (swiper.params.mousewheel.eventsTarged !== 'container') { + target = $(swiper.params.mousewheel.eventsTarged); + } + target.on('mouseenter', swiper.mousewheel.handleMouseEnter); + target.on('mouseleave', swiper.mousewheel.handleMouseLeave); + target.on(Mousewheel.event, swiper.mousewheel.handle); + swiper.mousewheel.enabled = true; + return true; + }, + disable() { + const swiper = this; + if (!Mousewheel.event) return false; + if (!swiper.mousewheel.enabled) return false; + let target = swiper.$el; + if (swiper.params.mousewheel.eventsTarged !== 'container') { + target = $(swiper.params.mousewheel.eventsTarged); + } + target.off(Mousewheel.event, swiper.mousewheel.handle); + swiper.mousewheel.enabled = false; + return true; + }, +}; + +var Mousewheel$1 = { + name: 'mousewheel', + params: { + mousewheel: { + enabled: false, + releaseOnEdges: false, + invert: false, + forceToAxis: false, + sensitivity: 1, + eventsTarged: 'container', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + mousewheel: { + enabled: false, + enable: Mousewheel.enable.bind(swiper), + disable: Mousewheel.disable.bind(swiper), + handle: Mousewheel.handle.bind(swiper), + handleMouseEnter: Mousewheel.handleMouseEnter.bind(swiper), + handleMouseLeave: Mousewheel.handleMouseLeave.bind(swiper), + lastScrollTime: Utils.now(), + }, + }); + }, + on: { + init() { + const swiper = this; + if (swiper.params.mousewheel.enabled) swiper.mousewheel.enable(); + }, + destroy() { + const swiper = this; + if (swiper.mousewheel.enabled) swiper.mousewheel.disable(); + }, + }, +}; + +const Navigation = { + update() { + // Update Navigation Buttons + const swiper = this; + const params = swiper.params.navigation; + + if (swiper.params.loop) return; + const { $nextEl, $prevEl } = swiper.navigation; + + if ($prevEl && $prevEl.length > 0) { + if (swiper.isBeginning) { + $prevEl.addClass(params.disabledClass); + } else { + $prevEl.removeClass(params.disabledClass); + } + $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + } + if ($nextEl && $nextEl.length > 0) { + if (swiper.isEnd) { + $nextEl.addClass(params.disabledClass); + } else { + $nextEl.removeClass(params.disabledClass); + } + $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + } + }, + onPrevClick(e) { + const swiper = this; + e.preventDefault(); + if (swiper.isBeginning && !swiper.params.loop) return; + swiper.slidePrev(); + }, + onNextClick(e) { + const swiper = this; + e.preventDefault(); + if (swiper.isEnd && !swiper.params.loop) return; + swiper.slideNext(); + }, + init() { + const swiper = this; + const params = swiper.params.navigation; + if (!(params.nextEl || params.prevEl)) return; + + let $nextEl; + let $prevEl; + if (params.nextEl) { + $nextEl = $(params.nextEl); + if ( + swiper.params.uniqueNavElements + && typeof params.nextEl === 'string' + && $nextEl.length > 1 + && swiper.$el.find(params.nextEl).length === 1 + ) { + $nextEl = swiper.$el.find(params.nextEl); + } + } + if (params.prevEl) { + $prevEl = $(params.prevEl); + if ( + swiper.params.uniqueNavElements + && typeof params.prevEl === 'string' + && $prevEl.length > 1 + && swiper.$el.find(params.prevEl).length === 1 + ) { + $prevEl = swiper.$el.find(params.prevEl); + } + } + + if ($nextEl && $nextEl.length > 0) { + $nextEl.on('click', swiper.navigation.onNextClick); + } + if ($prevEl && $prevEl.length > 0) { + $prevEl.on('click', swiper.navigation.onPrevClick); + } + + Utils.extend(swiper.navigation, { + $nextEl, + nextEl: $nextEl && $nextEl[0], + $prevEl, + prevEl: $prevEl && $prevEl[0], + }); + }, + destroy() { + const swiper = this; + const { $nextEl, $prevEl } = swiper.navigation; + if ($nextEl && $nextEl.length) { + $nextEl.off('click', swiper.navigation.onNextClick); + $nextEl.removeClass(swiper.params.navigation.disabledClass); + } + if ($prevEl && $prevEl.length) { + $prevEl.off('click', swiper.navigation.onPrevClick); + $prevEl.removeClass(swiper.params.navigation.disabledClass); + } + }, +}; + +var Navigation$1 = { + name: 'navigation', + params: { + navigation: { + nextEl: null, + prevEl: null, + + hideOnClick: false, + disabledClass: 'swiper-button-disabled', + hiddenClass: 'swiper-button-hidden', + lockClass: 'swiper-button-lock', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + navigation: { + init: Navigation.init.bind(swiper), + update: Navigation.update.bind(swiper), + destroy: Navigation.destroy.bind(swiper), + onNextClick: Navigation.onNextClick.bind(swiper), + onPrevClick: Navigation.onPrevClick.bind(swiper), + }, + }); + }, + on: { + init() { + const swiper = this; + swiper.navigation.init(); + swiper.navigation.update(); + }, + toEdge() { + const swiper = this; + swiper.navigation.update(); + }, + fromEdge() { + const swiper = this; + swiper.navigation.update(); + }, + destroy() { + const swiper = this; + swiper.navigation.destroy(); + }, + click(e) { + const swiper = this; + const { $nextEl, $prevEl } = swiper.navigation; + if ( + swiper.params.navigation.hideOnClick + && !$(e.target).is($prevEl) + && !$(e.target).is($nextEl) + ) { + let isHidden; + if ($nextEl) { + isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass); + } else if ($prevEl) { + isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass); + } + if (isHidden === true) { + swiper.emit('navigationShow', swiper); + } else { + swiper.emit('navigationHide', swiper); + } + if ($nextEl) { + $nextEl.toggleClass(swiper.params.navigation.hiddenClass); + } + if ($prevEl) { + $prevEl.toggleClass(swiper.params.navigation.hiddenClass); + } + } + }, + }, +}; + +const Pagination = { + update() { + // Render || Update Pagination bullets/items + const swiper = this; + const rtl = swiper.rtl; + const params = swiper.params.pagination; + if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) return; + const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; + const $el = swiper.pagination.$el; + // Current/Total + let current; + const total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length; + if (swiper.params.loop) { + current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup); + if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) { + current -= (slidesLength - (swiper.loopedSlides * 2)); + } + if (current > total - 1) current -= total; + if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current; + } else if (typeof swiper.snapIndex !== 'undefined') { + current = swiper.snapIndex; + } else { + current = swiper.activeIndex || 0; + } + // Types + if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) { + const bullets = swiper.pagination.bullets; + let firstIndex; + let lastIndex; + let midIndex; + if (params.dynamicBullets) { + swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true); + $el.css(swiper.isHorizontal() ? 'width' : 'height', `${swiper.pagination.bulletSize * (params.dynamicMainBullets + 4)}px`); + if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) { + swiper.pagination.dynamicBulletIndex += (current - swiper.previousIndex); + if (swiper.pagination.dynamicBulletIndex > (params.dynamicMainBullets - 1)) { + swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1; + } else if (swiper.pagination.dynamicBulletIndex < 0) { + swiper.pagination.dynamicBulletIndex = 0; + } + } + firstIndex = current - swiper.pagination.dynamicBulletIndex; + lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1); + midIndex = (lastIndex + firstIndex) / 2; + } + bullets.removeClass(`${params.bulletActiveClass} ${params.bulletActiveClass}-next ${params.bulletActiveClass}-next-next ${params.bulletActiveClass}-prev ${params.bulletActiveClass}-prev-prev ${params.bulletActiveClass}-main`); + if ($el.length > 1) { + bullets.each((index, bullet) => { + const $bullet = $(bullet); + const bulletIndex = $bullet.index(); + if (bulletIndex === current) { + $bullet.addClass(params.bulletActiveClass); + } + if (params.dynamicBullets) { + if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) { + $bullet.addClass(`${params.bulletActiveClass}-main`); + } + if (bulletIndex === firstIndex) { + $bullet + .prev() + .addClass(`${params.bulletActiveClass}-prev`) + .prev() + .addClass(`${params.bulletActiveClass}-prev-prev`); + } + if (bulletIndex === lastIndex) { + $bullet + .next() + .addClass(`${params.bulletActiveClass}-next`) + .next() + .addClass(`${params.bulletActiveClass}-next-next`); + } + } + }); + } else { + const $bullet = bullets.eq(current); + $bullet.addClass(params.bulletActiveClass); + if (params.dynamicBullets) { + const $firstDisplayedBullet = bullets.eq(firstIndex); + const $lastDisplayedBullet = bullets.eq(lastIndex); + for (let i = firstIndex; i <= lastIndex; i += 1) { + bullets.eq(i).addClass(`${params.bulletActiveClass}-main`); + } + $firstDisplayedBullet + .prev() + .addClass(`${params.bulletActiveClass}-prev`) + .prev() + .addClass(`${params.bulletActiveClass}-prev-prev`); + $lastDisplayedBullet + .next() + .addClass(`${params.bulletActiveClass}-next`) + .next() + .addClass(`${params.bulletActiveClass}-next-next`); + } + } + if (params.dynamicBullets) { + const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4); + const bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (midIndex * swiper.pagination.bulletSize); + const offsetProp = rtl ? 'right' : 'left'; + bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`); + } + } + if (params.type === 'fraction') { + $el.find(`.${params.currentClass}`).text(params.formatFractionCurrent(current + 1)); + $el.find(`.${params.totalClass}`).text(params.formatFractionTotal(total)); + } + if (params.type === 'progressbar') { + let progressbarDirection; + if (params.progressbarOpposite) { + progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal'; + } else { + progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical'; + } + const scale = (current + 1) / total; + let scaleX = 1; + let scaleY = 1; + if (progressbarDirection === 'horizontal') { + scaleX = scale; + } else { + scaleY = scale; + } + $el.find(`.${params.progressbarFillClass}`).transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`).transition(swiper.params.speed); + } + if (params.type === 'custom' && params.renderCustom) { + $el.html(params.renderCustom(swiper, current + 1, total)); + swiper.emit('paginationRender', swiper, $el[0]); + } else { + swiper.emit('paginationUpdate', swiper, $el[0]); + } + $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + }, + render() { + // Render Container + const swiper = this; + const params = swiper.params.pagination; + if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) return; + const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; + + const $el = swiper.pagination.$el; + let paginationHTML = ''; + if (params.type === 'bullets') { + const numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length; + for (let i = 0; i < numberOfBullets; i += 1) { + if (params.renderBullet) { + paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass); + } else { + paginationHTML += `<${params.bulletElement} class="${params.bulletClass}">`; + } + } + $el.html(paginationHTML); + swiper.pagination.bullets = $el.find(`.${params.bulletClass}`); + } + if (params.type === 'fraction') { + if (params.renderFraction) { + paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass); + } else { + paginationHTML = `` + + ' / ' + + ``; + } + $el.html(paginationHTML); + } + if (params.type === 'progressbar') { + if (params.renderProgressbar) { + paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass); + } else { + paginationHTML = ``; + } + $el.html(paginationHTML); + } + if (params.type !== 'custom') { + swiper.emit('paginationRender', swiper.pagination.$el[0]); + } + }, + init() { + const swiper = this; + const params = swiper.params.pagination; + if (!params.el) return; + + let $el = $(params.el); + if ($el.length === 0) return; + + if ( + swiper.params.uniqueNavElements + && typeof params.el === 'string' + && $el.length > 1 + && swiper.$el.find(params.el).length === 1 + ) { + $el = swiper.$el.find(params.el); + } + + if (params.type === 'bullets' && params.clickable) { + $el.addClass(params.clickableClass); + } + + $el.addClass(params.modifierClass + params.type); + + if (params.type === 'bullets' && params.dynamicBullets) { + $el.addClass(`${params.modifierClass}${params.type}-dynamic`); + swiper.pagination.dynamicBulletIndex = 0; + if (params.dynamicMainBullets < 1) { + params.dynamicMainBullets = 1; + } + } + if (params.type === 'progressbar' && params.progressbarOpposite) { + $el.addClass(params.progressbarOppositeClass); + } + + if (params.clickable) { + $el.on('click', `.${params.bulletClass}`, function onClick(e) { + e.preventDefault(); + let index = $(this).index() * swiper.params.slidesPerGroup; + if (swiper.params.loop) index += swiper.loopedSlides; + swiper.slideTo(index); + }); + } + + Utils.extend(swiper.pagination, { + $el, + el: $el[0], + }); + }, + destroy() { + const swiper = this; + const params = swiper.params.pagination; + if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) return; + const $el = swiper.pagination.$el; + + $el.removeClass(params.hiddenClass); + $el.removeClass(params.modifierClass + params.type); + if (swiper.pagination.bullets) swiper.pagination.bullets.removeClass(params.bulletActiveClass); + if (params.clickable) { + $el.off('click', `.${params.bulletClass}`); + } + }, +}; + +var Pagination$1 = { + name: 'pagination', + params: { + pagination: { + el: null, + bulletElement: 'span', + clickable: false, + hideOnClick: false, + renderBullet: null, + renderProgressbar: null, + renderFraction: null, + renderCustom: null, + progressbarOpposite: false, + type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom' + dynamicBullets: false, + dynamicMainBullets: 1, + formatFractionCurrent: number => number, + formatFractionTotal: number => number, + bulletClass: 'swiper-pagination-bullet', + bulletActiveClass: 'swiper-pagination-bullet-active', + modifierClass: 'swiper-pagination-', // NEW + currentClass: 'swiper-pagination-current', + totalClass: 'swiper-pagination-total', + hiddenClass: 'swiper-pagination-hidden', + progressbarFillClass: 'swiper-pagination-progressbar-fill', + progressbarOppositeClass: 'swiper-pagination-progressbar-opposite', + clickableClass: 'swiper-pagination-clickable', // NEW + lockClass: 'swiper-pagination-lock', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + pagination: { + init: Pagination.init.bind(swiper), + render: Pagination.render.bind(swiper), + update: Pagination.update.bind(swiper), + destroy: Pagination.destroy.bind(swiper), + dynamicBulletIndex: 0, + }, + }); + }, + on: { + init() { + const swiper = this; + swiper.pagination.init(); + swiper.pagination.render(); + swiper.pagination.update(); + }, + activeIndexChange() { + const swiper = this; + if (swiper.params.loop) { + swiper.pagination.update(); + } else if (typeof swiper.snapIndex === 'undefined') { + swiper.pagination.update(); + } + }, + snapIndexChange() { + const swiper = this; + if (!swiper.params.loop) { + swiper.pagination.update(); + } + }, + slidesLengthChange() { + const swiper = this; + if (swiper.params.loop) { + swiper.pagination.render(); + swiper.pagination.update(); + } + }, + snapGridLengthChange() { + const swiper = this; + if (!swiper.params.loop) { + swiper.pagination.render(); + swiper.pagination.update(); + } + }, + destroy() { + const swiper = this; + swiper.pagination.destroy(); + }, + click(e) { + const swiper = this; + if ( + swiper.params.pagination.el + && swiper.params.pagination.hideOnClick + && swiper.pagination.$el.length > 0 + && !$(e.target).hasClass(swiper.params.pagination.bulletClass) + ) { + const isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass); + if (isHidden === true) { + swiper.emit('paginationShow', swiper); + } else { + swiper.emit('paginationHide', swiper); + } + swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass); + } + }, + }, +}; + +const Scrollbar = { + setTranslate() { + const swiper = this; + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + const { scrollbar, rtlTranslate: rtl, progress } = swiper; + const { + dragSize, trackSize, $dragEl, $el, + } = scrollbar; + const params = swiper.params.scrollbar; + + let newSize = dragSize; + let newPos = (trackSize - dragSize) * progress; + if (rtl) { + newPos = -newPos; + if (newPos > 0) { + newSize = dragSize - newPos; + newPos = 0; + } else if (-newPos + dragSize > trackSize) { + newSize = trackSize + newPos; + } + } else if (newPos < 0) { + newSize = dragSize + newPos; + newPos = 0; + } else if (newPos + dragSize > trackSize) { + newSize = trackSize - newPos; + } + if (swiper.isHorizontal()) { + if (Support.transforms3d) { + $dragEl.transform(`translate3d(${newPos}px, 0, 0)`); + } else { + $dragEl.transform(`translateX(${newPos}px)`); + } + $dragEl[0].style.width = `${newSize}px`; + } else { + if (Support.transforms3d) { + $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`); + } else { + $dragEl.transform(`translateY(${newPos}px)`); + } + $dragEl[0].style.height = `${newSize}px`; + } + if (params.hide) { + clearTimeout(swiper.scrollbar.timeout); + $el[0].style.opacity = 1; + swiper.scrollbar.timeout = setTimeout(() => { + $el[0].style.opacity = 0; + $el.transition(400); + }, 1000); + } + }, + setTransition(duration) { + const swiper = this; + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + swiper.scrollbar.$dragEl.transition(duration); + }, + updateSize() { + const swiper = this; + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + + const { scrollbar } = swiper; + const { $dragEl, $el } = scrollbar; + + $dragEl[0].style.width = ''; + $dragEl[0].style.height = ''; + const trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight; + + const divider = swiper.size / swiper.virtualSize; + const moveDivider = divider * (trackSize / swiper.size); + let dragSize; + if (swiper.params.scrollbar.dragSize === 'auto') { + dragSize = trackSize * divider; + } else { + dragSize = parseInt(swiper.params.scrollbar.dragSize, 10); + } + + if (swiper.isHorizontal()) { + $dragEl[0].style.width = `${dragSize}px`; + } else { + $dragEl[0].style.height = `${dragSize}px`; + } + + if (divider >= 1) { + $el[0].style.display = 'none'; + } else { + $el[0].style.display = ''; + } + if (swiper.params.scrollbar.hide) { + $el[0].style.opacity = 0; + } + Utils.extend(scrollbar, { + trackSize, + divider, + moveDivider, + dragSize, + }); + scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass); + }, + setDragPosition(e) { + const swiper = this; + const { scrollbar, rtlTranslate: rtl } = swiper; + const { $el, dragSize, trackSize } = scrollbar; + + let pointerPosition; + if (swiper.isHorizontal()) { + pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX); + } else { + pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY); + } + let positionRatio; + positionRatio = ((pointerPosition) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragSize / 2)) / (trackSize - dragSize); + positionRatio = Math.max(Math.min(positionRatio, 1), 0); + if (rtl) { + positionRatio = 1 - positionRatio; + } + + const position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio); + + swiper.updateProgress(position); + swiper.setTranslate(position); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + }, + onDragStart(e) { + const swiper = this; + const params = swiper.params.scrollbar; + const { scrollbar, $wrapperEl } = swiper; + const { $el, $dragEl } = scrollbar; + swiper.scrollbar.isTouched = true; + e.preventDefault(); + e.stopPropagation(); + + $wrapperEl.transition(100); + $dragEl.transition(100); + scrollbar.setDragPosition(e); + + clearTimeout(swiper.scrollbar.dragTimeout); + + $el.transition(0); + if (params.hide) { + $el.css('opacity', 1); + } + swiper.emit('scrollbarDragStart', e); + }, + onDragMove(e) { + const swiper = this; + const { scrollbar, $wrapperEl } = swiper; + const { $el, $dragEl } = scrollbar; + + if (!swiper.scrollbar.isTouched) return; + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + scrollbar.setDragPosition(e); + $wrapperEl.transition(0); + $el.transition(0); + $dragEl.transition(0); + swiper.emit('scrollbarDragMove', e); + }, + onDragEnd(e) { + const swiper = this; + + const params = swiper.params.scrollbar; + const { scrollbar } = swiper; + const { $el } = scrollbar; + + if (!swiper.scrollbar.isTouched) return; + swiper.scrollbar.isTouched = false; + if (params.hide) { + clearTimeout(swiper.scrollbar.dragTimeout); + swiper.scrollbar.dragTimeout = Utils.nextTick(() => { + $el.css('opacity', 0); + $el.transition(400); + }, 1000); + } + swiper.emit('scrollbarDragEnd', e); + if (params.snapOnRelease) { + swiper.slideToClosest(); + } + }, + enableDraggable() { + const swiper = this; + if (!swiper.params.scrollbar.el) return; + const { + scrollbar, touchEventsTouch, touchEventsDesktop, params, + } = swiper; + const $el = scrollbar.$el; + const target = $el[0]; + const activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false; + const passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false; + if (!Support.touch) { + target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener); + document.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener); + document.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener); + } else { + target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener); + target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener); + target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener); + } + }, + disableDraggable() { + const swiper = this; + if (!swiper.params.scrollbar.el) return; + const { + scrollbar, touchEventsTouch, touchEventsDesktop, params, + } = swiper; + const $el = scrollbar.$el; + const target = $el[0]; + const activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false; + const passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false; + if (!Support.touch) { + target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener); + document.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener); + document.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener); + } else { + target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener); + target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener); + target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener); + } + }, + init() { + const swiper = this; + if (!swiper.params.scrollbar.el) return; + const { scrollbar, $el: $swiperEl } = swiper; + const params = swiper.params.scrollbar; + + let $el = $(params.el); + if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) { + $el = $swiperEl.find(params.el); + } + + let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`); + if ($dragEl.length === 0) { + $dragEl = $(`
            `); + $el.append($dragEl); + } + + Utils.extend(scrollbar, { + $el, + el: $el[0], + $dragEl, + dragEl: $dragEl[0], + }); + + if (params.draggable) { + scrollbar.enableDraggable(); + } + }, + destroy() { + const swiper = this; + swiper.scrollbar.disableDraggable(); + }, +}; + +var Scrollbar$1 = { + name: 'scrollbar', + params: { + scrollbar: { + el: null, + dragSize: 'auto', + hide: false, + draggable: false, + snapOnRelease: true, + lockClass: 'swiper-scrollbar-lock', + dragClass: 'swiper-scrollbar-drag', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + scrollbar: { + init: Scrollbar.init.bind(swiper), + destroy: Scrollbar.destroy.bind(swiper), + updateSize: Scrollbar.updateSize.bind(swiper), + setTranslate: Scrollbar.setTranslate.bind(swiper), + setTransition: Scrollbar.setTransition.bind(swiper), + enableDraggable: Scrollbar.enableDraggable.bind(swiper), + disableDraggable: Scrollbar.disableDraggable.bind(swiper), + setDragPosition: Scrollbar.setDragPosition.bind(swiper), + onDragStart: Scrollbar.onDragStart.bind(swiper), + onDragMove: Scrollbar.onDragMove.bind(swiper), + onDragEnd: Scrollbar.onDragEnd.bind(swiper), + isTouched: false, + timeout: null, + dragTimeout: null, + }, + }); + }, + on: { + init() { + const swiper = this; + swiper.scrollbar.init(); + swiper.scrollbar.updateSize(); + swiper.scrollbar.setTranslate(); + }, + update() { + const swiper = this; + swiper.scrollbar.updateSize(); + }, + resize() { + const swiper = this; + swiper.scrollbar.updateSize(); + }, + observerUpdate() { + const swiper = this; + swiper.scrollbar.updateSize(); + }, + setTranslate() { + const swiper = this; + swiper.scrollbar.setTranslate(); + }, + setTransition(duration) { + const swiper = this; + swiper.scrollbar.setTransition(duration); + }, + destroy() { + const swiper = this; + swiper.scrollbar.destroy(); + }, + }, +}; + +const Parallax = { + setTransform(el, progress) { + const swiper = this; + const { rtl } = swiper; + + const $el = $(el); + const rtlFactor = rtl ? -1 : 1; + + const p = $el.attr('data-swiper-parallax') || '0'; + let x = $el.attr('data-swiper-parallax-x'); + let y = $el.attr('data-swiper-parallax-y'); + const scale = $el.attr('data-swiper-parallax-scale'); + const opacity = $el.attr('data-swiper-parallax-opacity'); + + if (x || y) { + x = x || '0'; + y = y || '0'; + } else if (swiper.isHorizontal()) { + x = p; + y = '0'; + } else { + y = p; + x = '0'; + } + + if ((x).indexOf('%') >= 0) { + x = `${parseInt(x, 10) * progress * rtlFactor}%`; + } else { + x = `${x * progress * rtlFactor}px`; + } + if ((y).indexOf('%') >= 0) { + y = `${parseInt(y, 10) * progress}%`; + } else { + y = `${y * progress}px`; + } + + if (typeof opacity !== 'undefined' && opacity !== null) { + const currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress))); + $el[0].style.opacity = currentOpacity; + } + if (typeof scale === 'undefined' || scale === null) { + $el.transform(`translate3d(${x}, ${y}, 0px)`); + } else { + const currentScale = scale - ((scale - 1) * (1 - Math.abs(progress))); + $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`); + } + }, + setTranslate() { + const swiper = this; + const { + $el, slides, progress, snapGrid, + } = swiper; + $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]') + .each((index, el) => { + swiper.parallax.setTransform(el, progress); + }); + slides.each((slideIndex, slideEl) => { + let slideProgress = slideEl.progress; + if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') { + slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1)); + } + slideProgress = Math.min(Math.max(slideProgress, -1), 1); + $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]') + .each((index, el) => { + swiper.parallax.setTransform(el, slideProgress); + }); + }); + }, + setTransition(duration = this.params.speed) { + const swiper = this; + const { $el } = swiper; + $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]') + .each((index, parallaxEl) => { + const $parallaxEl = $(parallaxEl); + let parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration; + if (duration === 0) parallaxDuration = 0; + $parallaxEl.transition(parallaxDuration); + }); + }, +}; + +var Parallax$1 = { + name: 'parallax', + params: { + parallax: { + enabled: false, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + parallax: { + setTransform: Parallax.setTransform.bind(swiper), + setTranslate: Parallax.setTranslate.bind(swiper), + setTransition: Parallax.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (!swiper.params.parallax.enabled) return; + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + }, + init() { + const swiper = this; + if (!swiper.params.parallax.enabled) return; + swiper.parallax.setTranslate(); + }, + setTranslate() { + const swiper = this; + if (!swiper.params.parallax.enabled) return; + swiper.parallax.setTranslate(); + }, + setTransition(duration) { + const swiper = this; + if (!swiper.params.parallax.enabled) return; + swiper.parallax.setTransition(duration); + }, + }, +}; + +const Zoom = { + // Calc Scale From Multi-touches + getDistanceBetweenTouches(e) { + if (e.targetTouches.length < 2) return 1; + const x1 = e.targetTouches[0].pageX; + const y1 = e.targetTouches[0].pageY; + const x2 = e.targetTouches[1].pageX; + const y2 = e.targetTouches[1].pageY; + const distance = Math.sqrt(((x2 - x1) ** 2) + ((y2 - y1) ** 2)); + return distance; + }, + // Events + onGestureStart(e) { + const swiper = this; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + const { gesture } = zoom; + zoom.fakeGestureTouched = false; + zoom.fakeGestureMoved = false; + if (!Support.gestures) { + if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) { + return; + } + zoom.fakeGestureTouched = true; + gesture.scaleStart = Zoom.getDistanceBetweenTouches(e); + } + if (!gesture.$slideEl || !gesture.$slideEl.length) { + gesture.$slideEl = $(e.target).closest('.swiper-slide'); + if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + if (gesture.$imageWrapEl.length === 0) { + gesture.$imageEl = undefined; + return; + } + } + gesture.$imageEl.transition(0); + swiper.zoom.isScaling = true; + }, + onGestureChange(e) { + const swiper = this; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + const { gesture } = zoom; + if (!Support.gestures) { + if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) { + return; + } + zoom.fakeGestureMoved = true; + gesture.scaleMove = Zoom.getDistanceBetweenTouches(e); + } + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + if (Support.gestures) { + zoom.scale = e.scale * zoom.currentScale; + } else { + zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale; + } + if (zoom.scale > gesture.maxRatio) { + zoom.scale = (gesture.maxRatio - 1) + (((zoom.scale - gesture.maxRatio) + 1) ** 0.5); + } + if (zoom.scale < params.minRatio) { + zoom.scale = (params.minRatio + 1) - (((params.minRatio - zoom.scale) + 1) ** 0.5); + } + gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`); + }, + onGestureEnd(e) { + const swiper = this; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + const { gesture } = zoom; + if (!Support.gestures) { + if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) { + return; + } + if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) { + return; + } + zoom.fakeGestureTouched = false; + zoom.fakeGestureMoved = false; + } + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio); + gesture.$imageEl.transition(swiper.params.speed).transform(`translate3d(0,0,0) scale(${zoom.scale})`); + zoom.currentScale = zoom.scale; + zoom.isScaling = false; + if (zoom.scale === 1) gesture.$slideEl = undefined; + }, + onTouchStart(e) { + const swiper = this; + const zoom = swiper.zoom; + const { gesture, image } = zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + if (image.isTouched) return; + if (Device.android) e.preventDefault(); + image.isTouched = true; + image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + }, + onTouchMove(e) { + const swiper = this; + const zoom = swiper.zoom; + const { gesture, image, velocity } = zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + swiper.allowClick = false; + if (!image.isTouched || !gesture.$slideEl) return; + + if (!image.isMoved) { + image.width = gesture.$imageEl[0].offsetWidth; + image.height = gesture.$imageEl[0].offsetHeight; + image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0; + image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0; + gesture.slideWidth = gesture.$slideEl[0].offsetWidth; + gesture.slideHeight = gesture.$slideEl[0].offsetHeight; + gesture.$imageWrapEl.transition(0); + if (swiper.rtl) { + image.startX = -image.startX; + image.startY = -image.startY; + } + } + // Define if we need image drag + const scaledWidth = image.width * zoom.scale; + const scaledHeight = image.height * zoom.scale; + + if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return; + + image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0); + image.maxX = -image.minX; + image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0); + image.maxY = -image.minY; + + image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + + if (!image.isMoved && !zoom.isScaling) { + if ( + swiper.isHorizontal() + && ( + (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x) + || (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x) + ) + ) { + image.isTouched = false; + return; + } if ( + !swiper.isHorizontal() + && ( + (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y) + || (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y) + ) + ) { + image.isTouched = false; + return; + } + } + e.preventDefault(); + e.stopPropagation(); + + image.isMoved = true; + image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX; + image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY; + + if (image.currentX < image.minX) { + image.currentX = (image.minX + 1) - (((image.minX - image.currentX) + 1) ** 0.8); + } + if (image.currentX > image.maxX) { + image.currentX = (image.maxX - 1) + (((image.currentX - image.maxX) + 1) ** 0.8); + } + + if (image.currentY < image.minY) { + image.currentY = (image.minY + 1) - (((image.minY - image.currentY) + 1) ** 0.8); + } + if (image.currentY > image.maxY) { + image.currentY = (image.maxY - 1) + (((image.currentY - image.maxY) + 1) ** 0.8); + } + + // Velocity + if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x; + if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y; + if (!velocity.prevTime) velocity.prevTime = Date.now(); + velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2; + velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2; + if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0; + if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0; + velocity.prevPositionX = image.touchesCurrent.x; + velocity.prevPositionY = image.touchesCurrent.y; + velocity.prevTime = Date.now(); + + gesture.$imageWrapEl.transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`); + }, + onTouchEnd() { + const swiper = this; + const zoom = swiper.zoom; + const { gesture, image, velocity } = zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + if (!image.isTouched || !image.isMoved) { + image.isTouched = false; + image.isMoved = false; + return; + } + image.isTouched = false; + image.isMoved = false; + let momentumDurationX = 300; + let momentumDurationY = 300; + const momentumDistanceX = velocity.x * momentumDurationX; + const newPositionX = image.currentX + momentumDistanceX; + const momentumDistanceY = velocity.y * momentumDurationY; + const newPositionY = image.currentY + momentumDistanceY; + + // Fix duration + if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); + if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); + const momentumDuration = Math.max(momentumDurationX, momentumDurationY); + + image.currentX = newPositionX; + image.currentY = newPositionY; + + // Define if we need image drag + const scaledWidth = image.width * zoom.scale; + const scaledHeight = image.height * zoom.scale; + image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0); + image.maxX = -image.minX; + image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0); + image.maxY = -image.minY; + image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX); + image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY); + + gesture.$imageWrapEl.transition(momentumDuration).transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`); + }, + onTransitionEnd() { + const swiper = this; + const zoom = swiper.zoom; + const { gesture } = zoom; + if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) { + gesture.$imageEl.transform('translate3d(0,0,0) scale(1)'); + gesture.$imageWrapEl.transform('translate3d(0,0,0)'); + + zoom.scale = 1; + zoom.currentScale = 1; + + gesture.$slideEl = undefined; + gesture.$imageEl = undefined; + gesture.$imageWrapEl = undefined; + } + }, + // Toggle Zoom + toggle(e) { + const swiper = this; + const zoom = swiper.zoom; + + if (zoom.scale && zoom.scale !== 1) { + // Zoom Out + zoom.out(); + } else { + // Zoom In + zoom.in(e); + } + }, + in(e) { + const swiper = this; + + const zoom = swiper.zoom; + const params = swiper.params.zoom; + const { gesture, image } = zoom; + + if (!gesture.$slideEl) { + gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex); + gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + } + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + + gesture.$slideEl.addClass(`${params.zoomedSlideClass}`); + + let touchX; + let touchY; + let offsetX; + let offsetY; + let diffX; + let diffY; + let translateX; + let translateY; + let imageWidth; + let imageHeight; + let scaledWidth; + let scaledHeight; + let translateMinX; + let translateMinY; + let translateMaxX; + let translateMaxY; + let slideWidth; + let slideHeight; + + if (typeof image.touchesStart.x === 'undefined' && e) { + touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX; + touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY; + } else { + touchX = image.touchesStart.x; + touchY = image.touchesStart.y; + } + + zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + if (e) { + slideWidth = gesture.$slideEl[0].offsetWidth; + slideHeight = gesture.$slideEl[0].offsetHeight; + offsetX = gesture.$slideEl.offset().left; + offsetY = gesture.$slideEl.offset().top; + diffX = (offsetX + (slideWidth / 2)) - touchX; + diffY = (offsetY + (slideHeight / 2)) - touchY; + + imageWidth = gesture.$imageEl[0].offsetWidth; + imageHeight = gesture.$imageEl[0].offsetHeight; + scaledWidth = imageWidth * zoom.scale; + scaledHeight = imageHeight * zoom.scale; + + translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0); + translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0); + translateMaxX = -translateMinX; + translateMaxY = -translateMinY; + + translateX = diffX * zoom.scale; + translateY = diffY * zoom.scale; + + if (translateX < translateMinX) { + translateX = translateMinX; + } + if (translateX > translateMaxX) { + translateX = translateMaxX; + } + + if (translateY < translateMinY) { + translateY = translateMinY; + } + if (translateY > translateMaxY) { + translateY = translateMaxY; + } + } else { + translateX = 0; + translateY = 0; + } + gesture.$imageWrapEl.transition(300).transform(`translate3d(${translateX}px, ${translateY}px,0)`); + gesture.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${zoom.scale})`); + }, + out() { + const swiper = this; + + const zoom = swiper.zoom; + const params = swiper.params.zoom; + const { gesture } = zoom; + + if (!gesture.$slideEl) { + gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex); + gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + } + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + + zoom.scale = 1; + zoom.currentScale = 1; + gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)'); + gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)'); + gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`); + gesture.$slideEl = undefined; + }, + // Attach/Detach Events + enable() { + const swiper = this; + const zoom = swiper.zoom; + if (zoom.enabled) return; + zoom.enabled = true; + + const passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false; + + // Scale image + if (Support.gestures) { + swiper.$wrapperEl.on('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener); + swiper.$wrapperEl.on('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener); + swiper.$wrapperEl.on('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener); + } else if (swiper.touchEvents.start === 'touchstart') { + swiper.$wrapperEl.on(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener); + swiper.$wrapperEl.on(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener); + swiper.$wrapperEl.on(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener); + } + + // Move image + swiper.$wrapperEl.on(swiper.touchEvents.move, `.${swiper.params.zoom.containerClass}`, zoom.onTouchMove); + }, + disable() { + const swiper = this; + const zoom = swiper.zoom; + if (!zoom.enabled) return; + + swiper.zoom.enabled = false; + + const passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false; + + // Scale image + if (Support.gestures) { + swiper.$wrapperEl.off('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener); + swiper.$wrapperEl.off('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener); + swiper.$wrapperEl.off('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener); + } else if (swiper.touchEvents.start === 'touchstart') { + swiper.$wrapperEl.off(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener); + swiper.$wrapperEl.off(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener); + swiper.$wrapperEl.off(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener); + } + + // Move image + swiper.$wrapperEl.off(swiper.touchEvents.move, `.${swiper.params.zoom.containerClass}`, zoom.onTouchMove); + }, +}; + +var Zoom$1 = { + name: 'zoom', + params: { + zoom: { + enabled: false, + maxRatio: 3, + minRatio: 1, + toggle: true, + containerClass: 'swiper-zoom-container', + zoomedSlideClass: 'swiper-slide-zoomed', + }, + }, + create() { + const swiper = this; + const zoom = { + enabled: false, + scale: 1, + currentScale: 1, + isScaling: false, + gesture: { + $slideEl: undefined, + slideWidth: undefined, + slideHeight: undefined, + $imageEl: undefined, + $imageWrapEl: undefined, + maxRatio: 3, + }, + image: { + isTouched: undefined, + isMoved: undefined, + currentX: undefined, + currentY: undefined, + minX: undefined, + minY: undefined, + maxX: undefined, + maxY: undefined, + width: undefined, + height: undefined, + startX: undefined, + startY: undefined, + touchesStart: {}, + touchesCurrent: {}, + }, + velocity: { + x: undefined, + y: undefined, + prevPositionX: undefined, + prevPositionY: undefined, + prevTime: undefined, + }, + }; + + ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach((methodName) => { + zoom[methodName] = Zoom[methodName].bind(swiper); + }); + Utils.extend(swiper, { + zoom, + }); + + let scale = 1; + Object.defineProperty(swiper.zoom, 'scale', { + get() { + return scale; + }, + set(value) { + if (scale !== value) { + const imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined; + const slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined; + swiper.emit('zoomChange', value, imageEl, slideEl); + } + scale = value; + }, + }); + }, + on: { + init() { + const swiper = this; + if (swiper.params.zoom.enabled) { + swiper.zoom.enable(); + } + }, + destroy() { + const swiper = this; + swiper.zoom.disable(); + }, + touchStart(e) { + const swiper = this; + if (!swiper.zoom.enabled) return; + swiper.zoom.onTouchStart(e); + }, + touchEnd(e) { + const swiper = this; + if (!swiper.zoom.enabled) return; + swiper.zoom.onTouchEnd(e); + }, + doubleTap(e) { + const swiper = this; + if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) { + swiper.zoom.toggle(e); + } + }, + transitionEnd() { + const swiper = this; + if (swiper.zoom.enabled && swiper.params.zoom.enabled) { + swiper.zoom.onTransitionEnd(); + } + }, + }, +}; + +const Lazy = { + loadInSlide(index, loadInDuplicate = true) { + const swiper = this; + const params = swiper.params.lazy; + if (typeof index === 'undefined') return; + if (swiper.slides.length === 0) return; + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + + const $slideEl = isVirtual + ? swiper.$wrapperEl.children(`.${swiper.params.slideClass}[data-swiper-slide-index="${index}"]`) + : swiper.slides.eq(index); + + let $images = $slideEl.find(`.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`); + if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) { + $images = $images.add($slideEl[0]); + } + if ($images.length === 0) return; + + $images.each((imageIndex, imageEl) => { + const $imageEl = $(imageEl); + $imageEl.addClass(params.loadingClass); + + const background = $imageEl.attr('data-background'); + const src = $imageEl.attr('data-src'); + const srcset = $imageEl.attr('data-srcset'); + const sizes = $imageEl.attr('data-sizes'); + + swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, () => { + if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) return; + if (background) { + $imageEl.css('background-image', `url("${background}")`); + $imageEl.removeAttr('data-background'); + } else { + if (srcset) { + $imageEl.attr('srcset', srcset); + $imageEl.removeAttr('data-srcset'); + } + if (sizes) { + $imageEl.attr('sizes', sizes); + $imageEl.removeAttr('data-sizes'); + } + if (src) { + $imageEl.attr('src', src); + $imageEl.removeAttr('data-src'); + } + } + + $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass); + $slideEl.find(`.${params.preloaderClass}`).remove(); + if (swiper.params.loop && loadInDuplicate) { + const slideOriginalIndex = $slideEl.attr('data-swiper-slide-index'); + if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) { + const originalSlide = swiper.$wrapperEl.children(`[data-swiper-slide-index="${slideOriginalIndex}"]:not(.${swiper.params.slideDuplicateClass})`); + swiper.lazy.loadInSlide(originalSlide.index(), false); + } else { + const duplicatedSlide = swiper.$wrapperEl.children(`.${swiper.params.slideDuplicateClass}[data-swiper-slide-index="${slideOriginalIndex}"]`); + swiper.lazy.loadInSlide(duplicatedSlide.index(), false); + } + } + swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]); + }); + + swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]); + }); + }, + load() { + const swiper = this; + const { + $wrapperEl, params: swiperParams, slides, activeIndex, + } = swiper; + const isVirtual = swiper.virtual && swiperParams.virtual.enabled; + const params = swiperParams.lazy; + + let slidesPerView = swiperParams.slidesPerView; + if (slidesPerView === 'auto') { + slidesPerView = 0; + } + + function slideExist(index) { + if (isVirtual) { + if ($wrapperEl.children(`.${swiperParams.slideClass}[data-swiper-slide-index="${index}"]`).length) { + return true; + } + } else if (slides[index]) return true; + return false; + } + function slideIndex(slideEl) { + if (isVirtual) { + return $(slideEl).attr('data-swiper-slide-index'); + } + return $(slideEl).index(); + } + + if (!swiper.lazy.initialImageLoaded) swiper.lazy.initialImageLoaded = true; + if (swiper.params.watchSlidesVisibility) { + $wrapperEl.children(`.${swiperParams.slideVisibleClass}`).each((elIndex, slideEl) => { + const index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index(); + swiper.lazy.loadInSlide(index); + }); + } else if (slidesPerView > 1) { + for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) { + if (slideExist(i)) swiper.lazy.loadInSlide(i); + } + } else { + swiper.lazy.loadInSlide(activeIndex); + } + if (params.loadPrevNext) { + if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) { + const amount = params.loadPrevNextAmount; + const spv = slidesPerView; + const maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length); + const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0); + // Next Slides + for (let i = activeIndex + slidesPerView; i < maxIndex; i += 1) { + if (slideExist(i)) swiper.lazy.loadInSlide(i); + } + // Prev Slides + for (let i = minIndex; i < activeIndex; i += 1) { + if (slideExist(i)) swiper.lazy.loadInSlide(i); + } + } else { + const nextSlide = $wrapperEl.children(`.${swiperParams.slideNextClass}`); + if (nextSlide.length > 0) swiper.lazy.loadInSlide(slideIndex(nextSlide)); + + const prevSlide = $wrapperEl.children(`.${swiperParams.slidePrevClass}`); + if (prevSlide.length > 0) swiper.lazy.loadInSlide(slideIndex(prevSlide)); + } + } + }, +}; + +var Lazy$1 = { + name: 'lazy', + params: { + lazy: { + enabled: false, + loadPrevNext: false, + loadPrevNextAmount: 1, + loadOnTransitionStart: false, + + elementClass: 'swiper-lazy', + loadingClass: 'swiper-lazy-loading', + loadedClass: 'swiper-lazy-loaded', + preloaderClass: 'swiper-lazy-preloader', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + lazy: { + initialImageLoaded: false, + load: Lazy.load.bind(swiper), + loadInSlide: Lazy.loadInSlide.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (swiper.params.lazy.enabled && swiper.params.preloadImages) { + swiper.params.preloadImages = false; + } + }, + init() { + const swiper = this; + if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) { + swiper.lazy.load(); + } + }, + scroll() { + const swiper = this; + if (swiper.params.freeMode && !swiper.params.freeModeSticky) { + swiper.lazy.load(); + } + }, + resize() { + const swiper = this; + if (swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + }, + scrollbarDragMove() { + const swiper = this; + if (swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + }, + transitionStart() { + const swiper = this; + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) { + swiper.lazy.load(); + } + } + }, + transitionEnd() { + const swiper = this; + if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) { + swiper.lazy.load(); + } + }, + }, +}; + +/* eslint no-bitwise: ["error", { "allow": [">>"] }] */ + +const Controller = { + LinearSpline: function LinearSpline(x, y) { + const binarySearch = (function search() { + let maxIndex; + let minIndex; + let guess; + return (array, val) => { + minIndex = -1; + maxIndex = array.length; + while (maxIndex - minIndex > 1) { + guess = maxIndex + minIndex >> 1; + if (array[guess] <= val) { + minIndex = guess; + } else { + maxIndex = guess; + } + } + return maxIndex; + }; + }()); + this.x = x; + this.y = y; + this.lastIndex = x.length - 1; + // Given an x value (x2), return the expected y2 value: + // (x1,y1) is the known point before given value, + // (x3,y3) is the known point after given value. + let i1; + let i3; + + this.interpolate = function interpolate(x2) { + if (!x2) return 0; + + // Get the indexes of x1 and x3 (the array indexes before and after given x2): + i3 = binarySearch(this.x, x2); + i1 = i3 - 1; + + // We have our indexes i1 & i3, so we can calculate already: + // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1 + return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1]; + }; + return this; + }, + // xxx: for now i will just save one spline function to to + getInterpolateFunction(c) { + const swiper = this; + if (!swiper.controller.spline) { + swiper.controller.spline = swiper.params.loop + ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid) + : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid); + } + }, + setTranslate(setTranslate, byController) { + const swiper = this; + const controlled = swiper.controller.control; + let multiplier; + let controlledTranslate; + function setControlledTranslate(c) { + // this will create an Interpolate function based on the snapGrids + // x is the Grid of the scrolled scroller and y will be the controlled scroller + // it makes sense to create this only once and recall it for the interpolation + // the function does a lot of value caching for performance + const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate; + if (swiper.params.controller.by === 'slide') { + swiper.controller.getInterpolateFunction(c); + // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid + // but it did not work out + controlledTranslate = -swiper.controller.spline.interpolate(-translate); + } + + if (!controlledTranslate || swiper.params.controller.by === 'container') { + multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate()); + controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate(); + } + + if (swiper.params.controller.inverse) { + controlledTranslate = c.maxTranslate() - controlledTranslate; + } + c.updateProgress(controlledTranslate); + c.setTranslate(controlledTranslate, swiper); + c.updateActiveIndex(); + c.updateSlidesClasses(); + } + if (Array.isArray(controlled)) { + for (let i = 0; i < controlled.length; i += 1) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTranslate(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTranslate(controlled); + } + }, + setTransition(duration, byController) { + const swiper = this; + const controlled = swiper.controller.control; + let i; + function setControlledTransition(c) { + c.setTransition(duration, swiper); + if (duration !== 0) { + c.transitionStart(); + if (c.params.autoHeight) { + Utils.nextTick(() => { + c.updateAutoHeight(); + }); + } + c.$wrapperEl.transitionEnd(() => { + if (!controlled) return; + if (c.params.loop && swiper.params.controller.by === 'slide') { + c.loopFix(); + } + c.transitionEnd(); + }); + } + } + if (Array.isArray(controlled)) { + for (i = 0; i < controlled.length; i += 1) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTransition(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTransition(controlled); + } + }, +}; +var Controller$1 = { + name: 'controller', + params: { + controller: { + control: undefined, + inverse: false, + by: 'slide', // or 'container' + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + controller: { + control: swiper.params.controller.control, + getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper), + setTranslate: Controller.setTranslate.bind(swiper), + setTransition: Controller.setTransition.bind(swiper), + }, + }); + }, + on: { + update() { + const swiper = this; + if (!swiper.controller.control) return; + if (swiper.controller.spline) { + swiper.controller.spline = undefined; + delete swiper.controller.spline; + } + }, + resize() { + const swiper = this; + if (!swiper.controller.control) return; + if (swiper.controller.spline) { + swiper.controller.spline = undefined; + delete swiper.controller.spline; + } + }, + observerUpdate() { + const swiper = this; + if (!swiper.controller.control) return; + if (swiper.controller.spline) { + swiper.controller.spline = undefined; + delete swiper.controller.spline; + } + }, + setTranslate(translate, byController) { + const swiper = this; + if (!swiper.controller.control) return; + swiper.controller.setTranslate(translate, byController); + }, + setTransition(duration, byController) { + const swiper = this; + if (!swiper.controller.control) return; + swiper.controller.setTransition(duration, byController); + }, + }, +}; + +const a11y = { + makeElFocusable($el) { + $el.attr('tabIndex', '0'); + return $el; + }, + addElRole($el, role) { + $el.attr('role', role); + return $el; + }, + addElLabel($el, label) { + $el.attr('aria-label', label); + return $el; + }, + disableEl($el) { + $el.attr('aria-disabled', true); + return $el; + }, + enableEl($el) { + $el.attr('aria-disabled', false); + return $el; + }, + onEnterKey(e) { + const swiper = this; + const params = swiper.params.a11y; + if (e.keyCode !== 13) return; + const $targetEl = $(e.target); + if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) { + if (!(swiper.isEnd && !swiper.params.loop)) { + swiper.slideNext(); + } + if (swiper.isEnd) { + swiper.a11y.notify(params.lastSlideMessage); + } else { + swiper.a11y.notify(params.nextSlideMessage); + } + } + if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) { + if (!(swiper.isBeginning && !swiper.params.loop)) { + swiper.slidePrev(); + } + if (swiper.isBeginning) { + swiper.a11y.notify(params.firstSlideMessage); + } else { + swiper.a11y.notify(params.prevSlideMessage); + } + } + if (swiper.pagination && $targetEl.is(`.${swiper.params.pagination.bulletClass}`)) { + $targetEl[0].click(); + } + }, + notify(message) { + const swiper = this; + const notification = swiper.a11y.liveRegion; + if (notification.length === 0) return; + notification.html(''); + notification.html(message); + }, + updateNavigation() { + const swiper = this; + + if (swiper.params.loop) return; + const { $nextEl, $prevEl } = swiper.navigation; + + if ($prevEl && $prevEl.length > 0) { + if (swiper.isBeginning) { + swiper.a11y.disableEl($prevEl); + } else { + swiper.a11y.enableEl($prevEl); + } + } + if ($nextEl && $nextEl.length > 0) { + if (swiper.isEnd) { + swiper.a11y.disableEl($nextEl); + } else { + swiper.a11y.enableEl($nextEl); + } + } + }, + updatePagination() { + const swiper = this; + const params = swiper.params.a11y; + if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) { + swiper.pagination.bullets.each((bulletIndex, bulletEl) => { + const $bulletEl = $(bulletEl); + swiper.a11y.makeElFocusable($bulletEl); + swiper.a11y.addElRole($bulletEl, 'button'); + swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/{{index}}/, $bulletEl.index() + 1)); + }); + } + }, + init() { + const swiper = this; + + swiper.$el.append(swiper.a11y.liveRegion); + + // Navigation + const params = swiper.params.a11y; + let $nextEl; + let $prevEl; + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + if ($nextEl) { + swiper.a11y.makeElFocusable($nextEl); + swiper.a11y.addElRole($nextEl, 'button'); + swiper.a11y.addElLabel($nextEl, params.nextSlideMessage); + $nextEl.on('keydown', swiper.a11y.onEnterKey); + } + if ($prevEl) { + swiper.a11y.makeElFocusable($prevEl); + swiper.a11y.addElRole($prevEl, 'button'); + swiper.a11y.addElLabel($prevEl, params.prevSlideMessage); + $prevEl.on('keydown', swiper.a11y.onEnterKey); + } + + // Pagination + if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) { + swiper.pagination.$el.on('keydown', `.${swiper.params.pagination.bulletClass}`, swiper.a11y.onEnterKey); + } + }, + destroy() { + const swiper = this; + if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) swiper.a11y.liveRegion.remove(); + + let $nextEl; + let $prevEl; + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + if ($nextEl) { + $nextEl.off('keydown', swiper.a11y.onEnterKey); + } + if ($prevEl) { + $prevEl.off('keydown', swiper.a11y.onEnterKey); + } + + // Pagination + if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) { + swiper.pagination.$el.off('keydown', `.${swiper.params.pagination.bulletClass}`, swiper.a11y.onEnterKey); + } + }, +}; +var A11y = { + name: 'a11y', + params: { + a11y: { + enabled: true, + notificationClass: 'swiper-notification', + prevSlideMessage: 'Previous slide', + nextSlideMessage: 'Next slide', + firstSlideMessage: 'This is the first slide', + lastSlideMessage: 'This is the last slide', + paginationBulletMessage: 'Go to slide {{index}}', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + a11y: { + liveRegion: $(``), + }, + }); + Object.keys(a11y).forEach((methodName) => { + swiper.a11y[methodName] = a11y[methodName].bind(swiper); + }); + }, + on: { + init() { + const swiper = this; + if (!swiper.params.a11y.enabled) return; + swiper.a11y.init(); + swiper.a11y.updateNavigation(); + }, + toEdge() { + const swiper = this; + if (!swiper.params.a11y.enabled) return; + swiper.a11y.updateNavigation(); + }, + fromEdge() { + const swiper = this; + if (!swiper.params.a11y.enabled) return; + swiper.a11y.updateNavigation(); + }, + paginationUpdate() { + const swiper = this; + if (!swiper.params.a11y.enabled) return; + swiper.a11y.updatePagination(); + }, + destroy() { + const swiper = this; + if (!swiper.params.a11y.enabled) return; + swiper.a11y.destroy(); + }, + }, +}; + +const History = { + init() { + const swiper = this; + if (!swiper.params.history) return; + if (!window.history || !window.history.pushState) { + swiper.params.history.enabled = false; + swiper.params.hashNavigation.enabled = true; + return; + } + const history = swiper.history; + history.initialized = true; + history.paths = History.getPathValues(); + if (!history.paths.key && !history.paths.value) return; + history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit); + if (!swiper.params.history.replaceState) { + window.addEventListener('popstate', swiper.history.setHistoryPopState); + } + }, + destroy() { + const swiper = this; + if (!swiper.params.history.replaceState) { + window.removeEventListener('popstate', swiper.history.setHistoryPopState); + } + }, + setHistoryPopState() { + const swiper = this; + swiper.history.paths = History.getPathValues(); + swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false); + }, + getPathValues() { + const pathArray = window.location.pathname.slice(1).split('/').filter(part => part !== ''); + const total = pathArray.length; + const key = pathArray[total - 2]; + const value = pathArray[total - 1]; + return { key, value }; + }, + setHistory(key, index) { + const swiper = this; + if (!swiper.history.initialized || !swiper.params.history.enabled) return; + const slide = swiper.slides.eq(index); + let value = History.slugify(slide.attr('data-history')); + if (!window.location.pathname.includes(key)) { + value = `${key}/${value}`; + } + const currentState = window.history.state; + if (currentState && currentState.value === value) { + return; + } + if (swiper.params.history.replaceState) { + window.history.replaceState({ value }, null, value); + } else { + window.history.pushState({ value }, null, value); + } + }, + slugify(text) { + return text.toString() + .replace(/\s+/g, '-') + .replace(/[^\w-]+/g, '') + .replace(/--+/g, '-') + .replace(/^-+/, '') + .replace(/-+$/, ''); + }, + scrollToSlide(speed, value, runCallbacks) { + const swiper = this; + if (value) { + for (let i = 0, length = swiper.slides.length; i < length; i += 1) { + const slide = swiper.slides.eq(i); + const slideHistory = History.slugify(slide.attr('data-history')); + if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) { + const index = slide.index(); + swiper.slideTo(index, speed, runCallbacks); + } + } + } else { + swiper.slideTo(0, speed, runCallbacks); + } + }, +}; + +var History$1 = { + name: 'history', + params: { + history: { + enabled: false, + replaceState: false, + key: 'slides', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + history: { + init: History.init.bind(swiper), + setHistory: History.setHistory.bind(swiper), + setHistoryPopState: History.setHistoryPopState.bind(swiper), + scrollToSlide: History.scrollToSlide.bind(swiper), + destroy: History.destroy.bind(swiper), + }, + }); + }, + on: { + init() { + const swiper = this; + if (swiper.params.history.enabled) { + swiper.history.init(); + } + }, + destroy() { + const swiper = this; + if (swiper.params.history.enabled) { + swiper.history.destroy(); + } + }, + transitionEnd() { + const swiper = this; + if (swiper.history.initialized) { + swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex); + } + }, + }, +}; + +const HashNavigation = { + onHashCange() { + const swiper = this; + const newHash = document.location.hash.replace('#', ''); + const activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash'); + if (newHash !== activeSlideHash) { + const newIndex = swiper.$wrapperEl.children(`.${swiper.params.slideClass}[data-hash="${newHash}"]`).index(); + if (typeof newIndex === 'undefined') return; + swiper.slideTo(newIndex); + } + }, + setHash() { + const swiper = this; + if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) return; + if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) { + window.history.replaceState(null, null, (`#${swiper.slides.eq(swiper.activeIndex).attr('data-hash')}` || '')); + } else { + const slide = swiper.slides.eq(swiper.activeIndex); + const hash = slide.attr('data-hash') || slide.attr('data-history'); + document.location.hash = hash || ''; + } + }, + init() { + const swiper = this; + if (!swiper.params.hashNavigation.enabled || (swiper.params.history && swiper.params.history.enabled)) return; + swiper.hashNavigation.initialized = true; + const hash = document.location.hash.replace('#', ''); + if (hash) { + const speed = 0; + for (let i = 0, length = swiper.slides.length; i < length; i += 1) { + const slide = swiper.slides.eq(i); + const slideHash = slide.attr('data-hash') || slide.attr('data-history'); + if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) { + const index = slide.index(); + swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true); + } + } + } + if (swiper.params.hashNavigation.watchState) { + $(window).on('hashchange', swiper.hashNavigation.onHashCange); + } + }, + destroy() { + const swiper = this; + if (swiper.params.hashNavigation.watchState) { + $(window).off('hashchange', swiper.hashNavigation.onHashCange); + } + }, +}; +var HashNavigation$1 = { + name: 'hash-navigation', + params: { + hashNavigation: { + enabled: false, + replaceState: false, + watchState: false, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + hashNavigation: { + initialized: false, + init: HashNavigation.init.bind(swiper), + destroy: HashNavigation.destroy.bind(swiper), + setHash: HashNavigation.setHash.bind(swiper), + onHashCange: HashNavigation.onHashCange.bind(swiper), + }, + }); + }, + on: { + init() { + const swiper = this; + if (swiper.params.hashNavigation.enabled) { + swiper.hashNavigation.init(); + } + }, + destroy() { + const swiper = this; + if (swiper.params.hashNavigation.enabled) { + swiper.hashNavigation.destroy(); + } + }, + transitionEnd() { + const swiper = this; + if (swiper.hashNavigation.initialized) { + swiper.hashNavigation.setHash(); + } + }, + }, +}; + +/* eslint no-underscore-dangle: "off" */ + +const Autoplay = { + run() { + const swiper = this; + const $activeSlideEl = swiper.slides.eq(swiper.activeIndex); + let delay = swiper.params.autoplay.delay; + if ($activeSlideEl.attr('data-swiper-autoplay')) { + delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay; + } + swiper.autoplay.timeout = Utils.nextTick(() => { + if (swiper.params.autoplay.reverseDirection) { + if (swiper.params.loop) { + swiper.loopFix(); + swiper.slidePrev(swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else if (!swiper.isBeginning) { + swiper.slidePrev(swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else { + swiper.autoplay.stop(); + } + } else if (swiper.params.loop) { + swiper.loopFix(); + swiper.slideNext(swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else if (!swiper.isEnd) { + swiper.slideNext(swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + swiper.slideTo(0, swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else { + swiper.autoplay.stop(); + } + }, delay); + }, + start() { + const swiper = this; + if (typeof swiper.autoplay.timeout !== 'undefined') return false; + if (swiper.autoplay.running) return false; + swiper.autoplay.running = true; + swiper.emit('autoplayStart'); + swiper.autoplay.run(); + return true; + }, + stop() { + const swiper = this; + if (!swiper.autoplay.running) return false; + if (typeof swiper.autoplay.timeout === 'undefined') return false; + + if (swiper.autoplay.timeout) { + clearTimeout(swiper.autoplay.timeout); + swiper.autoplay.timeout = undefined; + } + swiper.autoplay.running = false; + swiper.emit('autoplayStop'); + return true; + }, + pause(speed) { + const swiper = this; + if (!swiper.autoplay.running) return; + if (swiper.autoplay.paused) return; + if (swiper.autoplay.timeout) clearTimeout(swiper.autoplay.timeout); + swiper.autoplay.paused = true; + if (speed === 0 || !swiper.params.autoplay.waitForTransition) { + swiper.autoplay.paused = false; + swiper.autoplay.run(); + } else { + swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd); + swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd); + } + }, +}; + +var Autoplay$1 = { + name: 'autoplay', + params: { + autoplay: { + enabled: false, + delay: 3000, + waitForTransition: true, + disableOnInteraction: true, + stopOnLastSlide: false, + reverseDirection: false, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + autoplay: { + running: false, + paused: false, + run: Autoplay.run.bind(swiper), + start: Autoplay.start.bind(swiper), + stop: Autoplay.stop.bind(swiper), + pause: Autoplay.pause.bind(swiper), + onTransitionEnd(e) { + if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return; + if (e.target !== this) return; + swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd); + swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd); + swiper.autoplay.paused = false; + if (!swiper.autoplay.running) { + swiper.autoplay.stop(); + } else { + swiper.autoplay.run(); + } + }, + }, + }); + }, + on: { + init() { + const swiper = this; + if (swiper.params.autoplay.enabled) { + swiper.autoplay.start(); + } + }, + beforeTransitionStart(speed, internal) { + const swiper = this; + if (swiper.autoplay.running) { + if (internal || !swiper.params.autoplay.disableOnInteraction) { + swiper.autoplay.pause(speed); + } else { + swiper.autoplay.stop(); + } + } + }, + sliderFirstMove() { + const swiper = this; + if (swiper.autoplay.running) { + if (swiper.params.autoplay.disableOnInteraction) { + swiper.autoplay.stop(); + } else { + swiper.autoplay.pause(); + } + } + }, + destroy() { + const swiper = this; + if (swiper.autoplay.running) { + swiper.autoplay.stop(); + } + }, + }, +}; + +const Fade = { + setTranslate() { + const swiper = this; + const { slides } = swiper; + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = swiper.slides.eq(i); + const offset = $slideEl[0].swiperSlideOffset; + let tx = -offset; + if (!swiper.params.virtualTranslate) tx -= swiper.translate; + let ty = 0; + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + } + const slideOpacity = swiper.params.fadeEffect.crossFade + ? Math.max(1 - Math.abs($slideEl[0].progress), 0) + : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0); + $slideEl + .css({ + opacity: slideOpacity, + }) + .transform(`translate3d(${tx}px, ${ty}px, 0px)`); + } + }, + setTransition(duration) { + const swiper = this; + const { slides, $wrapperEl } = swiper; + slides.transition(duration); + if (swiper.params.virtualTranslate && duration !== 0) { + let eventTriggered = false; + slides.transitionEnd(() => { + if (eventTriggered) return; + if (!swiper || swiper.destroyed) return; + eventTriggered = true; + swiper.animating = false; + const triggerEvents = ['webkitTransitionEnd', 'transitionend']; + for (let i = 0; i < triggerEvents.length; i += 1) { + $wrapperEl.trigger(triggerEvents[i]); + } + }); + } + }, +}; + +var EffectFade = { + name: 'effect-fade', + params: { + fadeEffect: { + crossFade: false, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + fadeEffect: { + setTranslate: Fade.setTranslate.bind(swiper), + setTransition: Fade.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (swiper.params.effect !== 'fade') return; + swiper.classNames.push(`${swiper.params.containerModifierClass}fade`); + const overwriteParams = { + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: true, + }; + Utils.extend(swiper.params, overwriteParams); + Utils.extend(swiper.originalParams, overwriteParams); + }, + setTranslate() { + const swiper = this; + if (swiper.params.effect !== 'fade') return; + swiper.fadeEffect.setTranslate(); + }, + setTransition(duration) { + const swiper = this; + if (swiper.params.effect !== 'fade') return; + swiper.fadeEffect.setTransition(duration); + }, + }, +}; + +const Cube = { + setTranslate() { + const swiper = this; + const { + $el, $wrapperEl, slides, width: swiperWidth, height: swiperHeight, rtlTranslate: rtl, size: swiperSize, + } = swiper; + const params = swiper.params.cubeEffect; + const isHorizontal = swiper.isHorizontal(); + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + let wrapperRotate = 0; + let $cubeShadowEl; + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow'); + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
            '); + $wrapperEl.append($cubeShadowEl); + } + $cubeShadowEl.css({ height: `${swiperWidth}px` }); + } else { + $cubeShadowEl = $el.find('.swiper-cube-shadow'); + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
            '); + $el.append($cubeShadowEl); + } + } + } + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + let slideIndex = i; + if (isVirtual) { + slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10); + } + let slideAngle = slideIndex * 90; + let round = Math.floor(slideAngle / 360); + if (rtl) { + slideAngle = -slideAngle; + round = Math.floor(-slideAngle / 360); + } + const progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + let tx = 0; + let ty = 0; + let tz = 0; + if (slideIndex % 4 === 0) { + tx = -round * 4 * swiperSize; + tz = 0; + } else if ((slideIndex - 1) % 4 === 0) { + tx = 0; + tz = -round * 4 * swiperSize; + } else if ((slideIndex - 2) % 4 === 0) { + tx = swiperSize + (round * 4 * swiperSize); + tz = swiperSize; + } else if ((slideIndex - 3) % 4 === 0) { + tx = -swiperSize; + tz = (3 * swiperSize) + (swiperSize * 4 * round); + } + if (rtl) { + tx = -tx; + } + + if (!isHorizontal) { + ty = tx; + tx = 0; + } + + const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${isHorizontal ? slideAngle : 0}deg) translate3d(${tx}px, ${ty}px, ${tz}px)`; + if (progress <= 1 && progress > -1) { + wrapperRotate = (slideIndex * 90) + (progress * 90); + if (rtl) wrapperRotate = (-slideIndex * 90) - (progress * 90); + } + $slideEl.transform(transform); + if (params.slideShadows) { + // Set shadows + let shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + if (shadowBefore.length === 0) { + shadowBefore = $(`
            `); + $slideEl.append(shadowBefore); + } + if (shadowAfter.length === 0) { + shadowAfter = $(`
            `); + $slideEl.append(shadowAfter); + } + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + } + $wrapperEl.css({ + '-webkit-transform-origin': `50% 50% -${swiperSize / 2}px`, + '-moz-transform-origin': `50% 50% -${swiperSize / 2}px`, + '-ms-transform-origin': `50% 50% -${swiperSize / 2}px`, + 'transform-origin': `50% 50% -${swiperSize / 2}px`, + }); + + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl.transform(`translate3d(0px, ${(swiperWidth / 2) + params.shadowOffset}px, ${-swiperWidth / 2}px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`); + } else { + const shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90); + const multiplier = 1.5 - ( + (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2) + + (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2) + ); + const scale1 = params.shadowScale; + const scale2 = params.shadowScale / multiplier; + const offset = params.shadowOffset; + $cubeShadowEl.transform(`scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${(swiperHeight / 2) + offset}px, ${-swiperHeight / 2 / scale2}px) rotateX(-90deg)`); + } + } + const zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0; + $wrapperEl + .transform(`translate3d(0px,0,${zFactor}px) rotateX(${swiper.isHorizontal() ? 0 : wrapperRotate}deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`); + }, + setTransition(duration) { + const swiper = this; + const { $el, slides } = swiper; + slides + .transition(duration) + .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left') + .transition(duration); + if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) { + $el.find('.swiper-cube-shadow').transition(duration); + } + }, +}; + +var EffectCube = { + name: 'effect-cube', + params: { + cubeEffect: { + slideShadows: true, + shadow: true, + shadowOffset: 20, + shadowScale: 0.94, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + cubeEffect: { + setTranslate: Cube.setTranslate.bind(swiper), + setTransition: Cube.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (swiper.params.effect !== 'cube') return; + swiper.classNames.push(`${swiper.params.containerModifierClass}cube`); + swiper.classNames.push(`${swiper.params.containerModifierClass}3d`); + const overwriteParams = { + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + resistanceRatio: 0, + spaceBetween: 0, + centeredSlides: false, + virtualTranslate: true, + }; + Utils.extend(swiper.params, overwriteParams); + Utils.extend(swiper.originalParams, overwriteParams); + }, + setTranslate() { + const swiper = this; + if (swiper.params.effect !== 'cube') return; + swiper.cubeEffect.setTranslate(); + }, + setTransition(duration) { + const swiper = this; + if (swiper.params.effect !== 'cube') return; + swiper.cubeEffect.setTransition(duration); + }, + }, +}; + +const Flip = { + setTranslate() { + const swiper = this; + const { slides, rtlTranslate: rtl } = swiper; + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + let progress = $slideEl[0].progress; + if (swiper.params.flipEffect.limitRotation) { + progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + } + const offset = $slideEl[0].swiperSlideOffset; + const rotate = -180 * progress; + let rotateY = rotate; + let rotateX = 0; + let tx = -offset; + let ty = 0; + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + rotateX = -rotateY; + rotateY = 0; + } else if (rtl) { + rotateY = -rotateY; + } + + $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length; + + if (swiper.params.flipEffect.slideShadows) { + // Set shadows + let shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + if (shadowBefore.length === 0) { + shadowBefore = $(`
            `); + $slideEl.append(shadowBefore); + } + if (shadowAfter.length === 0) { + shadowAfter = $(`
            `); + $slideEl.append(shadowAfter); + } + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + $slideEl + .transform(`translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`); + } + }, + setTransition(duration) { + const swiper = this; + const { slides, activeIndex, $wrapperEl } = swiper; + slides + .transition(duration) + .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left') + .transition(duration); + if (swiper.params.virtualTranslate && duration !== 0) { + let eventTriggered = false; + // eslint-disable-next-line + slides.eq(activeIndex).transitionEnd(function onTransitionEnd() { + if (eventTriggered) return; + if (!swiper || swiper.destroyed) return; + // if (!$(this).hasClass(swiper.params.slideActiveClass)) return; + eventTriggered = true; + swiper.animating = false; + const triggerEvents = ['webkitTransitionEnd', 'transitionend']; + for (let i = 0; i < triggerEvents.length; i += 1) { + $wrapperEl.trigger(triggerEvents[i]); + } + }); + } + }, +}; + +var EffectFlip = { + name: 'effect-flip', + params: { + flipEffect: { + slideShadows: true, + limitRotation: true, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + flipEffect: { + setTranslate: Flip.setTranslate.bind(swiper), + setTransition: Flip.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (swiper.params.effect !== 'flip') return; + swiper.classNames.push(`${swiper.params.containerModifierClass}flip`); + swiper.classNames.push(`${swiper.params.containerModifierClass}3d`); + const overwriteParams = { + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: true, + }; + Utils.extend(swiper.params, overwriteParams); + Utils.extend(swiper.originalParams, overwriteParams); + }, + setTranslate() { + const swiper = this; + if (swiper.params.effect !== 'flip') return; + swiper.flipEffect.setTranslate(); + }, + setTransition(duration) { + const swiper = this; + if (swiper.params.effect !== 'flip') return; + swiper.flipEffect.setTransition(duration); + }, + }, +}; + +const Coverflow = { + setTranslate() { + const swiper = this; + const { + width: swiperWidth, height: swiperHeight, slides, $wrapperEl, slidesSizesGrid, + } = swiper; + const params = swiper.params.coverflowEffect; + const isHorizontal = swiper.isHorizontal(); + const transform = swiper.translate; + const center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2); + const rotate = isHorizontal ? params.rotate : -params.rotate; + const translate = params.depth; + // Each slide offset from center + for (let i = 0, length = slides.length; i < length; i += 1) { + const $slideEl = slides.eq(i); + const slideSize = slidesSizesGrid[i]; + const slideOffset = $slideEl[0].swiperSlideOffset; + const offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier; + + let rotateY = isHorizontal ? rotate * offsetMultiplier : 0; + let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier; + // var rotateZ = 0 + let translateZ = -translate * Math.abs(offsetMultiplier); + + let translateY = isHorizontal ? 0 : params.stretch * (offsetMultiplier); + let translateX = isHorizontal ? params.stretch * (offsetMultiplier) : 0; + + // Fix for ultra small values + if (Math.abs(translateX) < 0.001) translateX = 0; + if (Math.abs(translateY) < 0.001) translateY = 0; + if (Math.abs(translateZ) < 0.001) translateZ = 0; + if (Math.abs(rotateY) < 0.001) rotateY = 0; + if (Math.abs(rotateX) < 0.001) rotateX = 0; + + const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`; + + $slideEl.transform(slideTransform); + $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1; + if (params.slideShadows) { + // Set shadows + let $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + if ($shadowBeforeEl.length === 0) { + $shadowBeforeEl = $(`
            `); + $slideEl.append($shadowBeforeEl); + } + if ($shadowAfterEl.length === 0) { + $shadowAfterEl = $(`
            `); + $slideEl.append($shadowAfterEl); + } + if ($shadowBeforeEl.length) $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; + if ($shadowAfterEl.length) $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; + } + } + + // Set correct perspective for IE10 + if (Support.pointerEvents || Support.prefixedPointerEvents) { + const ws = $wrapperEl[0].style; + ws.perspectiveOrigin = `${center}px 50%`; + } + }, + setTransition(duration) { + const swiper = this; + swiper.slides + .transition(duration) + .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left') + .transition(duration); + }, +}; + +var EffectCoverflow = { + name: 'effect-coverflow', + params: { + coverflowEffect: { + rotate: 50, + stretch: 0, + depth: 100, + modifier: 1, + slideShadows: true, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + coverflowEffect: { + setTranslate: Coverflow.setTranslate.bind(swiper), + setTransition: Coverflow.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (swiper.params.effect !== 'coverflow') return; + + swiper.classNames.push(`${swiper.params.containerModifierClass}coverflow`); + swiper.classNames.push(`${swiper.params.containerModifierClass}3d`); + + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + }, + setTranslate() { + const swiper = this; + if (swiper.params.effect !== 'coverflow') return; + swiper.coverflowEffect.setTranslate(); + }, + setTransition(duration) { + const swiper = this; + if (swiper.params.effect !== 'coverflow') return; + swiper.coverflowEffect.setTransition(duration); + }, + }, +}; + +const Thumbs = { + init() { + const swiper = this; + const { thumbs: thumbsParams } = swiper.params; + const SwiperClass = swiper.constructor; + if (thumbsParams.swiper instanceof SwiperClass) { + swiper.thumbs.swiper = thumbsParams.swiper; + Utils.extend(swiper.thumbs.swiper.originalParams, { + watchSlidesProgress: true, + slideToClickedSlide: false, + }); + Utils.extend(swiper.thumbs.swiper.params, { + watchSlidesProgress: true, + slideToClickedSlide: false, + }); + } else if (Utils.isObject(thumbsParams.swiper)) { + swiper.thumbs.swiper = new SwiperClass(Utils.extend({}, thumbsParams.swiper, { + watchSlidesVisibility: true, + watchSlidesProgress: true, + slideToClickedSlide: false, + })); + swiper.thumbs.swiperCreated = true; + } + swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass); + swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick); + }, + onThumbClick() { + const swiper = this; + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + const clickedIndex = thumbsSwiper.clickedIndex; + const clickedSlide = thumbsSwiper.clickedSlide; + if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) return; + if (typeof clickedIndex === 'undefined' || clickedIndex === null) return; + let slideToIndex; + if (thumbsSwiper.params.loop) { + slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10); + } else { + slideToIndex = clickedIndex; + } + if (swiper.params.loop) { + let currentIndex = swiper.activeIndex; + if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) { + swiper.loopFix(); + // eslint-disable-next-line + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + currentIndex = swiper.activeIndex; + } + const prevIndex = swiper.slides.eq(currentIndex).prevAll(`[data-swiper-slide-index="${slideToIndex}"]`).eq(0).index(); + const nextIndex = swiper.slides.eq(currentIndex).nextAll(`[data-swiper-slide-index="${slideToIndex}"]`).eq(0).index(); + if (typeof prevIndex === 'undefined') slideToIndex = nextIndex; + else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex; + else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex; + else slideToIndex = prevIndex; + } + swiper.slideTo(slideToIndex); + }, + update(initial) { + const swiper = this; + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + + const slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' + ? thumbsSwiper.slidesPerViewDynamic() + : thumbsSwiper.params.slidesPerView; + + if (swiper.realIndex !== thumbsSwiper.realIndex) { + let currentThumbsIndex = thumbsSwiper.activeIndex; + let newThumbsIndex; + if (thumbsSwiper.params.loop) { + if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) { + thumbsSwiper.loopFix(); + // eslint-disable-next-line + thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft; + currentThumbsIndex = thumbsSwiper.activeIndex; + } + // Find actual thumbs index to slide to + const prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll(`[data-swiper-slide-index="${swiper.realIndex}"]`).eq(0).index(); + const nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll(`[data-swiper-slide-index="${swiper.realIndex}"]`).eq(0).index(); + if (typeof prevThumbsIndex === 'undefined') newThumbsIndex = nextThumbsIndex; + else if (typeof nextThumbsIndex === 'undefined') newThumbsIndex = prevThumbsIndex; + else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) newThumbsIndex = currentThumbsIndex; + else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) newThumbsIndex = nextThumbsIndex; + else newThumbsIndex = prevThumbsIndex; + } else { + newThumbsIndex = swiper.realIndex; + } + if (thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) { + if (thumbsSwiper.params.centeredSlides) { + if (newThumbsIndex > currentThumbsIndex) { + newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1; + } else { + newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1; + } + } else if (newThumbsIndex > currentThumbsIndex) { + newThumbsIndex = newThumbsIndex - slidesPerView + 1; + } + thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined); + } + } + + // Activate thumbs + let thumbsToActivate = 1; + const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass; + + if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) { + thumbsToActivate = swiper.params.slidesPerView; + } + + thumbsSwiper.slides.removeClass(thumbActiveClass); + if (thumbsSwiper.params.loop) { + for (let i = 0; i < thumbsToActivate; i += 1) { + thumbsSwiper.$wrapperEl.children(`[data-swiper-slide-index="${swiper.realIndex + i}"]`).addClass(thumbActiveClass); + } + } else { + for (let i = 0; i < thumbsToActivate; i += 1) { + thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass); + } + } + }, +}; +var Thumbs$1 = { + name: 'thumbs', + params: { + thumbs: { + swiper: null, + slideThumbActiveClass: 'swiper-slide-thumb-active', + thumbsContainerClass: 'swiper-container-thumbs', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + thumbs: { + swiper: null, + init: Thumbs.init.bind(swiper), + update: Thumbs.update.bind(swiper), + onThumbClick: Thumbs.onThumbClick.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + const { thumbs } = swiper.params; + if (!thumbs || !thumbs.swiper) return; + swiper.thumbs.init(); + swiper.thumbs.update(true); + }, + slideChange() { + const swiper = this; + if (!swiper.thumbs.swiper) return; + swiper.thumbs.update(); + }, + update() { + const swiper = this; + if (!swiper.thumbs.swiper) return; + swiper.thumbs.update(); + }, + resize() { + const swiper = this; + if (!swiper.thumbs.swiper) return; + swiper.thumbs.update(); + }, + observerUpdate() { + const swiper = this; + if (!swiper.thumbs.swiper) return; + swiper.thumbs.update(); + }, + setTransition(duration) { + const swiper = this; + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + thumbsSwiper.setTransition(duration); + }, + beforeDestroy() { + const swiper = this; + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + if (swiper.thumbs.swiperCreated && thumbsSwiper) { + thumbsSwiper.destroy(); + } + }, + }, +}; + +// Swiper Class + +const components = [ + Device$1, + Support$1, + Browser$1, + Resize, + Observer$1, + Virtual$1, + Keyboard$1, + Mousewheel$1, + Navigation$1, + Pagination$1, + Scrollbar$1, + Parallax$1, + Zoom$1, + Lazy$1, + Controller$1, + A11y, + History$1, + HashNavigation$1, + Autoplay$1, + EffectFade, + EffectCube, + EffectFlip, + EffectCoverflow, + Thumbs$1 +]; + +if (typeof Swiper.use === 'undefined') { + Swiper.use = Swiper.Class.use; + Swiper.installModule = Swiper.Class.installModule; +} + +Swiper.use(components); + +export default Swiper; diff --git a/assets/3rd/swiper/js/swiper.esm.js b/assets/3rd/swiper/js/swiper.esm.js new file mode 100755 index 00000000..222f1802 --- /dev/null +++ b/assets/3rd/swiper/js/swiper.esm.js @@ -0,0 +1,7133 @@ +/** + * Swiper 4.5.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * http://www.idangero.us/swiper/ + * + * Copyright 2014-2019 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: February 22, 2019 + */ + +import { $, addClass, removeClass, hasClass, toggleClass, attr, removeAttr, data, transform, transition as transition$1, on, off, trigger, transitionEnd as transitionEnd$1, outerWidth, outerHeight, offset, css, each, html, text, is, index, eq, append, prepend, next, nextAll, prev, prevAll, parent, parents, closest, find, children, remove, add, styles } from 'dom7/dist/dom7.modular'; +import { window, document } from 'ssr-window'; + +const Methods = { + addClass, + removeClass, + hasClass, + toggleClass, + attr, + removeAttr, + data, + transform, + transition: transition$1, + on, + off, + trigger, + transitionEnd: transitionEnd$1, + outerWidth, + outerHeight, + offset, + css, + each, + html, + text, + is, + index, + eq, + append, + prepend, + next, + nextAll, + prev, + prevAll, + parent, + parents, + closest, + find, + children, + remove, + add, + styles, +}; + +Object.keys(Methods).forEach((methodName) => { + $.fn[methodName] = Methods[methodName]; +}); + +const Utils = { + deleteProps(obj) { + const object = obj; + Object.keys(object).forEach((key) => { + try { + object[key] = null; + } catch (e) { + // no getter for object + } + try { + delete object[key]; + } catch (e) { + // something got wrong + } + }); + }, + nextTick(callback, delay = 0) { + return setTimeout(callback, delay); + }, + now() { + return Date.now(); + }, + getTranslate(el, axis = 'x') { + let matrix; + let curTransform; + let transformMatrix; + + const curStyle = window.getComputedStyle(el, null); + + if (window.WebKitCSSMatrix) { + curTransform = curStyle.transform || curStyle.webkitTransform; + if (curTransform.split(',').length > 6) { + curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', '); + } + // Some old versions of Webkit choke when 'none' is passed; pass + // empty string instead in this case + transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform); + } else { + transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,'); + matrix = transformMatrix.toString().split(','); + } + + if (axis === 'x') { + // Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; + // Crazy IE10 Matrix + else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); + // Normal Browsers + else curTransform = parseFloat(matrix[4]); + } + if (axis === 'y') { + // Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; + // Crazy IE10 Matrix + else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); + // Normal Browsers + else curTransform = parseFloat(matrix[5]); + } + return curTransform || 0; + }, + parseUrlQuery(url) { + const query = {}; + let urlToParse = url || window.location.href; + let i; + let params; + let param; + let length; + if (typeof urlToParse === 'string' && urlToParse.length) { + urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\S*\?/, '') : ''; + params = urlToParse.split('&').filter(paramsPart => paramsPart !== ''); + length = params.length; + + for (i = 0; i < length; i += 1) { + param = params[i].replace(/#\S+/g, '').split('='); + query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param[1]) || ''; + } + } + return query; + }, + isObject(o) { + return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object; + }, + extend(...args) { + const to = Object(args[0]); + for (let i = 1; i < args.length; i += 1) { + const nextSource = args[i]; + if (nextSource !== undefined && nextSource !== null) { + const keysArray = Object.keys(Object(nextSource)); + for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) { + const nextKey = keysArray[nextIndex]; + const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); + if (desc !== undefined && desc.enumerable) { + if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) { + Utils.extend(to[nextKey], nextSource[nextKey]); + } else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) { + to[nextKey] = {}; + Utils.extend(to[nextKey], nextSource[nextKey]); + } else { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + } + return to; + }, +}; + +const Support = (function Support() { + const testDiv = document.createElement('div'); + return { + touch: (window.Modernizr && window.Modernizr.touch === true) || (function checkTouch() { + return !!((window.navigator.maxTouchPoints > 0) || ('ontouchstart' in window) || (window.DocumentTouch && document instanceof window.DocumentTouch)); + }()), + + pointerEvents: !!(window.navigator.pointerEnabled || window.PointerEvent || ('maxTouchPoints' in window.navigator && window.navigator.maxTouchPoints > 0)), + prefixedPointerEvents: !!window.navigator.msPointerEnabled, + + transition: (function checkTransition() { + const style = testDiv.style; + return ('transition' in style || 'webkitTransition' in style || 'MozTransition' in style); + }()), + transforms3d: (window.Modernizr && window.Modernizr.csstransforms3d === true) || (function checkTransforms3d() { + const style = testDiv.style; + return ('webkitPerspective' in style || 'MozPerspective' in style || 'OPerspective' in style || 'MsPerspective' in style || 'perspective' in style); + }()), + + flexbox: (function checkFlexbox() { + const style = testDiv.style; + const styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' '); + for (let i = 0; i < styles.length; i += 1) { + if (styles[i] in style) return true; + } + return false; + }()), + + observer: (function checkObserver() { + return ('MutationObserver' in window || 'WebkitMutationObserver' in window); + }()), + + passiveListener: (function checkPassiveListener() { + let supportsPassive = false; + try { + const opts = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line + get() { + supportsPassive = true; + }, + }); + window.addEventListener('testPassiveListener', null, opts); + } catch (e) { + // No support + } + return supportsPassive; + }()), + + gestures: (function checkGestures() { + return 'ongesturestart' in window; + }()), + }; +}()); + +const Browser = (function Browser() { + function isSafari() { + const ua = window.navigator.userAgent.toLowerCase(); + return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0); + } + return { + isIE: !!window.navigator.userAgent.match(/Trident/g) || !!window.navigator.userAgent.match(/MSIE/g), + isEdge: !!window.navigator.userAgent.match(/Edge/g), + isSafari: isSafari(), + isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent), + }; +}()); + +class SwiperClass { + constructor(params = {}) { + const self = this; + self.params = params; + + // Events + self.eventsListeners = {}; + + if (self.params && self.params.on) { + Object.keys(self.params.on).forEach((eventName) => { + self.on(eventName, self.params.on[eventName]); + }); + } + } + + on(events, handler, priority) { + const self = this; + if (typeof handler !== 'function') return self; + const method = priority ? 'unshift' : 'push'; + events.split(' ').forEach((event) => { + if (!self.eventsListeners[event]) self.eventsListeners[event] = []; + self.eventsListeners[event][method](handler); + }); + return self; + } + + once(events, handler, priority) { + const self = this; + if (typeof handler !== 'function') return self; + function onceHandler(...args) { + handler.apply(self, args); + self.off(events, onceHandler); + if (onceHandler.f7proxy) { + delete onceHandler.f7proxy; + } + } + onceHandler.f7proxy = handler; + return self.on(events, onceHandler, priority); + } + + off(events, handler) { + const self = this; + if (!self.eventsListeners) return self; + events.split(' ').forEach((event) => { + if (typeof handler === 'undefined') { + self.eventsListeners[event] = []; + } else if (self.eventsListeners[event] && self.eventsListeners[event].length) { + self.eventsListeners[event].forEach((eventHandler, index) => { + if (eventHandler === handler || (eventHandler.f7proxy && eventHandler.f7proxy === handler)) { + self.eventsListeners[event].splice(index, 1); + } + }); + } + }); + return self; + } + + emit(...args) { + const self = this; + if (!self.eventsListeners) return self; + let events; + let data; + let context; + if (typeof args[0] === 'string' || Array.isArray(args[0])) { + events = args[0]; + data = args.slice(1, args.length); + context = self; + } else { + events = args[0].events; + data = args[0].data; + context = args[0].context || self; + } + const eventsArray = Array.isArray(events) ? events : events.split(' '); + eventsArray.forEach((event) => { + if (self.eventsListeners && self.eventsListeners[event]) { + const handlers = []; + self.eventsListeners[event].forEach((eventHandler) => { + handlers.push(eventHandler); + }); + handlers.forEach((eventHandler) => { + eventHandler.apply(context, data); + }); + } + }); + return self; + } + + useModulesParams(instanceParams) { + const instance = this; + if (!instance.modules) return; + Object.keys(instance.modules).forEach((moduleName) => { + const module = instance.modules[moduleName]; + // Extend params + if (module.params) { + Utils.extend(instanceParams, module.params); + } + }); + } + + useModules(modulesParams = {}) { + const instance = this; + if (!instance.modules) return; + Object.keys(instance.modules).forEach((moduleName) => { + const module = instance.modules[moduleName]; + const moduleParams = modulesParams[moduleName] || {}; + // Extend instance methods and props + if (module.instance) { + Object.keys(module.instance).forEach((modulePropName) => { + const moduleProp = module.instance[modulePropName]; + if (typeof moduleProp === 'function') { + instance[modulePropName] = moduleProp.bind(instance); + } else { + instance[modulePropName] = moduleProp; + } + }); + } + // Add event listeners + if (module.on && instance.on) { + Object.keys(module.on).forEach((moduleEventName) => { + instance.on(moduleEventName, module.on[moduleEventName]); + }); + } + + // Module create callback + if (module.create) { + module.create.bind(instance)(moduleParams); + } + }); + } + + static set components(components) { + const Class = this; + if (!Class.use) return; + Class.use(components); + } + + static installModule(module, ...params) { + const Class = this; + if (!Class.prototype.modules) Class.prototype.modules = {}; + const name = module.name || (`${Object.keys(Class.prototype.modules).length}_${Utils.now()}`); + Class.prototype.modules[name] = module; + // Prototype + if (module.proto) { + Object.keys(module.proto).forEach((key) => { + Class.prototype[key] = module.proto[key]; + }); + } + // Class + if (module.static) { + Object.keys(module.static).forEach((key) => { + Class[key] = module.static[key]; + }); + } + // Callback + if (module.install) { + module.install.apply(Class, params); + } + return Class; + } + + static use(module, ...params) { + const Class = this; + if (Array.isArray(module)) { + module.forEach(m => Class.installModule(m)); + return Class; + } + return Class.installModule(module, ...params); + } +} + +function updateSize () { + const swiper = this; + let width; + let height; + const $el = swiper.$el; + if (typeof swiper.params.width !== 'undefined') { + width = swiper.params.width; + } else { + width = $el[0].clientWidth; + } + if (typeof swiper.params.height !== 'undefined') { + height = swiper.params.height; + } else { + height = $el[0].clientHeight; + } + if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) { + return; + } + + // Subtract paddings + width = width - parseInt($el.css('padding-left'), 10) - parseInt($el.css('padding-right'), 10); + height = height - parseInt($el.css('padding-top'), 10) - parseInt($el.css('padding-bottom'), 10); + + Utils.extend(swiper, { + width, + height, + size: swiper.isHorizontal() ? width : height, + }); +} + +function updateSlides () { + const swiper = this; + const params = swiper.params; + + const { + $wrapperEl, size: swiperSize, rtlTranslate: rtl, wrongRTL, + } = swiper; + const isVirtual = swiper.virtual && params.virtual.enabled; + const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length; + const slides = $wrapperEl.children(`.${swiper.params.slideClass}`); + const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length; + let snapGrid = []; + const slidesGrid = []; + const slidesSizesGrid = []; + + let offsetBefore = params.slidesOffsetBefore; + if (typeof offsetBefore === 'function') { + offsetBefore = params.slidesOffsetBefore.call(swiper); + } + + let offsetAfter = params.slidesOffsetAfter; + if (typeof offsetAfter === 'function') { + offsetAfter = params.slidesOffsetAfter.call(swiper); + } + + const previousSnapGridLength = swiper.snapGrid.length; + const previousSlidesGridLength = swiper.snapGrid.length; + + let spaceBetween = params.spaceBetween; + let slidePosition = -offsetBefore; + let prevSlideSize = 0; + let index = 0; + if (typeof swiperSize === 'undefined') { + return; + } + if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) { + spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize; + } + + swiper.virtualSize = -spaceBetween; + + // reset margins + if (rtl) slides.css({ marginLeft: '', marginTop: '' }); + else slides.css({ marginRight: '', marginBottom: '' }); + + let slidesNumberEvenToRows; + if (params.slidesPerColumn > 1) { + if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) { + slidesNumberEvenToRows = slidesLength; + } else { + slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn; + } + if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') { + slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn); + } + } + + // Calc slides + let slideSize; + const slidesPerColumn = params.slidesPerColumn; + const slidesPerRow = slidesNumberEvenToRows / slidesPerColumn; + const numFullColumns = Math.floor(slidesLength / params.slidesPerColumn); + for (let i = 0; i < slidesLength; i += 1) { + slideSize = 0; + const slide = slides.eq(i); + if (params.slidesPerColumn > 1) { + // Set slides order + let newSlideOrderIndex; + let column; + let row; + if (params.slidesPerColumnFill === 'column') { + column = Math.floor(i / slidesPerColumn); + row = i - (column * slidesPerColumn); + if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) { + row += 1; + if (row >= slidesPerColumn) { + row = 0; + column += 1; + } + } + newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn); + slide + .css({ + '-webkit-box-ordinal-group': newSlideOrderIndex, + '-moz-box-ordinal-group': newSlideOrderIndex, + '-ms-flex-order': newSlideOrderIndex, + '-webkit-order': newSlideOrderIndex, + order: newSlideOrderIndex, + }); + } else { + row = Math.floor(i / slidesPerRow); + column = i - (row * slidesPerRow); + } + slide + .css( + `margin-${swiper.isHorizontal() ? 'top' : 'left'}`, + (row !== 0 && params.spaceBetween) && (`${params.spaceBetween}px`) + ) + .attr('data-swiper-column', column) + .attr('data-swiper-row', row); + } + if (slide.css('display') === 'none') continue; // eslint-disable-line + + if (params.slidesPerView === 'auto') { + const slideStyles = window.getComputedStyle(slide[0], null); + const currentTransform = slide[0].style.transform; + const currentWebKitTransform = slide[0].style.webkitTransform; + if (currentTransform) { + slide[0].style.transform = 'none'; + } + if (currentWebKitTransform) { + slide[0].style.webkitTransform = 'none'; + } + if (params.roundLengths) { + slideSize = swiper.isHorizontal() + ? slide.outerWidth(true) + : slide.outerHeight(true); + } else { + // eslint-disable-next-line + if (swiper.isHorizontal()) { + const width = parseFloat(slideStyles.getPropertyValue('width')); + const paddingLeft = parseFloat(slideStyles.getPropertyValue('padding-left')); + const paddingRight = parseFloat(slideStyles.getPropertyValue('padding-right')); + const marginLeft = parseFloat(slideStyles.getPropertyValue('margin-left')); + const marginRight = parseFloat(slideStyles.getPropertyValue('margin-right')); + const boxSizing = slideStyles.getPropertyValue('box-sizing'); + if (boxSizing && boxSizing === 'border-box') { + slideSize = width + marginLeft + marginRight; + } else { + slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight; + } + } else { + const height = parseFloat(slideStyles.getPropertyValue('height')); + const paddingTop = parseFloat(slideStyles.getPropertyValue('padding-top')); + const paddingBottom = parseFloat(slideStyles.getPropertyValue('padding-bottom')); + const marginTop = parseFloat(slideStyles.getPropertyValue('margin-top')); + const marginBottom = parseFloat(slideStyles.getPropertyValue('margin-bottom')); + const boxSizing = slideStyles.getPropertyValue('box-sizing'); + if (boxSizing && boxSizing === 'border-box') { + slideSize = height + marginTop + marginBottom; + } else { + slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom; + } + } + } + if (currentTransform) { + slide[0].style.transform = currentTransform; + } + if (currentWebKitTransform) { + slide[0].style.webkitTransform = currentWebKitTransform; + } + if (params.roundLengths) slideSize = Math.floor(slideSize); + } else { + slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView; + if (params.roundLengths) slideSize = Math.floor(slideSize); + + if (slides[i]) { + if (swiper.isHorizontal()) { + slides[i].style.width = `${slideSize}px`; + } else { + slides[i].style.height = `${slideSize}px`; + } + } + } + if (slides[i]) { + slides[i].swiperSlideSize = slideSize; + } + slidesSizesGrid.push(slideSize); + + + if (params.centeredSlides) { + slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween; + if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; + if (i === 0) slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; + if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0; + if (params.roundLengths) slidePosition = Math.floor(slidePosition); + if ((index) % params.slidesPerGroup === 0) snapGrid.push(slidePosition); + slidesGrid.push(slidePosition); + } else { + if (params.roundLengths) slidePosition = Math.floor(slidePosition); + if ((index) % params.slidesPerGroup === 0) snapGrid.push(slidePosition); + slidesGrid.push(slidePosition); + slidePosition = slidePosition + slideSize + spaceBetween; + } + + swiper.virtualSize += slideSize + spaceBetween; + + prevSlideSize = slideSize; + + index += 1; + } + swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter; + let newSlidesGrid; + + if ( + rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) { + $wrapperEl.css({ width: `${swiper.virtualSize + params.spaceBetween}px` }); + } + if (!Support.flexbox || params.setWrapperSize) { + if (swiper.isHorizontal()) $wrapperEl.css({ width: `${swiper.virtualSize + params.spaceBetween}px` }); + else $wrapperEl.css({ height: `${swiper.virtualSize + params.spaceBetween}px` }); + } + + if (params.slidesPerColumn > 1) { + swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows; + swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween; + if (swiper.isHorizontal()) $wrapperEl.css({ width: `${swiper.virtualSize + params.spaceBetween}px` }); + else $wrapperEl.css({ height: `${swiper.virtualSize + params.spaceBetween}px` }); + if (params.centeredSlides) { + newSlidesGrid = []; + for (let i = 0; i < snapGrid.length; i += 1) { + let slidesGridItem = snapGrid[i]; + if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem); + if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem); + } + snapGrid = newSlidesGrid; + } + } + + // Remove last grid elements depending on width + if (!params.centeredSlides) { + newSlidesGrid = []; + for (let i = 0; i < snapGrid.length; i += 1) { + let slidesGridItem = snapGrid[i]; + if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem); + if (snapGrid[i] <= swiper.virtualSize - swiperSize) { + newSlidesGrid.push(slidesGridItem); + } + } + snapGrid = newSlidesGrid; + if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) { + snapGrid.push(swiper.virtualSize - swiperSize); + } + } + if (snapGrid.length === 0) snapGrid = [0]; + + if (params.spaceBetween !== 0) { + if (swiper.isHorizontal()) { + if (rtl) slides.css({ marginLeft: `${spaceBetween}px` }); + else slides.css({ marginRight: `${spaceBetween}px` }); + } else slides.css({ marginBottom: `${spaceBetween}px` }); + } + + if (params.centerInsufficientSlides) { + let allSlidesSize = 0; + slidesSizesGrid.forEach((slideSizeValue) => { + allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0); + }); + allSlidesSize -= params.spaceBetween; + if (allSlidesSize < swiperSize) { + const allSlidesOffset = (swiperSize - allSlidesSize) / 2; + snapGrid.forEach((snap, snapIndex) => { + snapGrid[snapIndex] = snap - allSlidesOffset; + }); + slidesGrid.forEach((snap, snapIndex) => { + slidesGrid[snapIndex] = snap + allSlidesOffset; + }); + } + } + + Utils.extend(swiper, { + slides, + snapGrid, + slidesGrid, + slidesSizesGrid, + }); + + if (slidesLength !== previousSlidesLength) { + swiper.emit('slidesLengthChange'); + } + if (snapGrid.length !== previousSnapGridLength) { + if (swiper.params.watchOverflow) swiper.checkOverflow(); + swiper.emit('snapGridLengthChange'); + } + if (slidesGrid.length !== previousSlidesGridLength) { + swiper.emit('slidesGridLengthChange'); + } + + if (params.watchSlidesProgress || params.watchSlidesVisibility) { + swiper.updateSlidesOffset(); + } +} + +function updateAutoHeight (speed) { + const swiper = this; + const activeSlides = []; + let newHeight = 0; + let i; + if (typeof speed === 'number') { + swiper.setTransition(speed); + } else if (speed === true) { + swiper.setTransition(swiper.params.speed); + } + // Find slides currently in view + if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) { + for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) { + const index = swiper.activeIndex + i; + if (index > swiper.slides.length) break; + activeSlides.push(swiper.slides.eq(index)[0]); + } + } else { + activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]); + } + + // Find new height from highest slide in view + for (i = 0; i < activeSlides.length; i += 1) { + if (typeof activeSlides[i] !== 'undefined') { + const height = activeSlides[i].offsetHeight; + newHeight = height > newHeight ? height : newHeight; + } + } + + // Update Height + if (newHeight) swiper.$wrapperEl.css('height', `${newHeight}px`); +} + +function updateSlidesOffset () { + const swiper = this; + const slides = swiper.slides; + for (let i = 0; i < slides.length; i += 1) { + slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop; + } +} + +function updateSlidesProgress (translate = (this && this.translate) || 0) { + const swiper = this; + const params = swiper.params; + + const { slides, rtlTranslate: rtl } = swiper; + + if (slides.length === 0) return; + if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset(); + + let offsetCenter = -translate; + if (rtl) offsetCenter = translate; + + // Visible Slides + slides.removeClass(params.slideVisibleClass); + + swiper.visibleSlidesIndexes = []; + swiper.visibleSlides = []; + + for (let i = 0; i < slides.length; i += 1) { + const slide = slides[i]; + const slideProgress = ( + (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset + ) / (slide.swiperSlideSize + params.spaceBetween); + if (params.watchSlidesVisibility) { + const slideBefore = -(offsetCenter - slide.swiperSlideOffset); + const slideAfter = slideBefore + swiper.slidesSizesGrid[i]; + const isVisible = (slideBefore >= 0 && slideBefore < swiper.size) + || (slideAfter > 0 && slideAfter <= swiper.size) + || (slideBefore <= 0 && slideAfter >= swiper.size); + if (isVisible) { + swiper.visibleSlides.push(slide); + swiper.visibleSlidesIndexes.push(i); + slides.eq(i).addClass(params.slideVisibleClass); + } + } + slide.progress = rtl ? -slideProgress : slideProgress; + } + swiper.visibleSlides = $(swiper.visibleSlides); +} + +function updateProgress (translate = (this && this.translate) || 0) { + const swiper = this; + const params = swiper.params; + + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + let { progress, isBeginning, isEnd } = swiper; + const wasBeginning = isBeginning; + const wasEnd = isEnd; + if (translatesDiff === 0) { + progress = 0; + isBeginning = true; + isEnd = true; + } else { + progress = (translate - swiper.minTranslate()) / (translatesDiff); + isBeginning = progress <= 0; + isEnd = progress >= 1; + } + Utils.extend(swiper, { + progress, + isBeginning, + isEnd, + }); + + if (params.watchSlidesProgress || params.watchSlidesVisibility) swiper.updateSlidesProgress(translate); + + if (isBeginning && !wasBeginning) { + swiper.emit('reachBeginning toEdge'); + } + if (isEnd && !wasEnd) { + swiper.emit('reachEnd toEdge'); + } + if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) { + swiper.emit('fromEdge'); + } + + swiper.emit('progress', progress); +} + +function updateSlidesClasses () { + const swiper = this; + + const { + slides, params, $wrapperEl, activeIndex, realIndex, + } = swiper; + const isVirtual = swiper.virtual && params.virtual.enabled; + + slides.removeClass(`${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`); + + let activeSlide; + if (isVirtual) { + activeSlide = swiper.$wrapperEl.find(`.${params.slideClass}[data-swiper-slide-index="${activeIndex}"]`); + } else { + activeSlide = slides.eq(activeIndex); + } + + // Active classes + activeSlide.addClass(params.slideActiveClass); + + if (params.loop) { + // Duplicate to all looped slides + if (activeSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl + .children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${realIndex}"]`) + .addClass(params.slideDuplicateActiveClass); + } else { + $wrapperEl + .children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${realIndex}"]`) + .addClass(params.slideDuplicateActiveClass); + } + } + // Next Slide + let nextSlide = activeSlide.nextAll(`.${params.slideClass}`).eq(0).addClass(params.slideNextClass); + if (params.loop && nextSlide.length === 0) { + nextSlide = slides.eq(0); + nextSlide.addClass(params.slideNextClass); + } + // Prev Slide + let prevSlide = activeSlide.prevAll(`.${params.slideClass}`).eq(0).addClass(params.slidePrevClass); + if (params.loop && prevSlide.length === 0) { + prevSlide = slides.eq(-1); + prevSlide.addClass(params.slidePrevClass); + } + if (params.loop) { + // Duplicate to all looped slides + if (nextSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl + .children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${nextSlide.attr('data-swiper-slide-index')}"]`) + .addClass(params.slideDuplicateNextClass); + } else { + $wrapperEl + .children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${nextSlide.attr('data-swiper-slide-index')}"]`) + .addClass(params.slideDuplicateNextClass); + } + if (prevSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl + .children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${prevSlide.attr('data-swiper-slide-index')}"]`) + .addClass(params.slideDuplicatePrevClass); + } else { + $wrapperEl + .children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${prevSlide.attr('data-swiper-slide-index')}"]`) + .addClass(params.slideDuplicatePrevClass); + } + } +} + +function updateActiveIndex (newActiveIndex) { + const swiper = this; + const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; + const { + slidesGrid, snapGrid, params, activeIndex: previousIndex, realIndex: previousRealIndex, snapIndex: previousSnapIndex, + } = swiper; + let activeIndex = newActiveIndex; + let snapIndex; + if (typeof activeIndex === 'undefined') { + for (let i = 0; i < slidesGrid.length; i += 1) { + if (typeof slidesGrid[i + 1] !== 'undefined') { + if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) { + activeIndex = i; + } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) { + activeIndex = i + 1; + } + } else if (translate >= slidesGrid[i]) { + activeIndex = i; + } + } + // Normalize slideIndex + if (params.normalizeSlideIndex) { + if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0; + } + } + if (snapGrid.indexOf(translate) >= 0) { + snapIndex = snapGrid.indexOf(translate); + } else { + snapIndex = Math.floor(activeIndex / params.slidesPerGroup); + } + if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; + if (activeIndex === previousIndex) { + if (snapIndex !== previousSnapIndex) { + swiper.snapIndex = snapIndex; + swiper.emit('snapIndexChange'); + } + return; + } + + // Get real index + const realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10); + + Utils.extend(swiper, { + snapIndex, + realIndex, + previousIndex, + activeIndex, + }); + swiper.emit('activeIndexChange'); + swiper.emit('snapIndexChange'); + if (previousRealIndex !== realIndex) { + swiper.emit('realIndexChange'); + } + swiper.emit('slideChange'); +} + +function updateClickedSlide (e) { + const swiper = this; + const params = swiper.params; + const slide = $(e.target).closest(`.${params.slideClass}`)[0]; + let slideFound = false; + if (slide) { + for (let i = 0; i < swiper.slides.length; i += 1) { + if (swiper.slides[i] === slide) slideFound = true; + } + } + + if (slide && slideFound) { + swiper.clickedSlide = slide; + if (swiper.virtual && swiper.params.virtual.enabled) { + swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10); + } else { + swiper.clickedIndex = $(slide).index(); + } + } else { + swiper.clickedSlide = undefined; + swiper.clickedIndex = undefined; + return; + } + if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) { + swiper.slideToClickedSlide(); + } +} + +var update = { + updateSize, + updateSlides, + updateAutoHeight, + updateSlidesOffset, + updateSlidesProgress, + updateProgress, + updateSlidesClasses, + updateActiveIndex, + updateClickedSlide, +}; + +function getTranslate (axis = this.isHorizontal() ? 'x' : 'y') { + const swiper = this; + + const { + params, rtlTranslate: rtl, translate, $wrapperEl, + } = swiper; + + if (params.virtualTranslate) { + return rtl ? -translate : translate; + } + + let currentTranslate = Utils.getTranslate($wrapperEl[0], axis); + if (rtl) currentTranslate = -currentTranslate; + + return currentTranslate || 0; +} + +function setTranslate (translate, byController) { + const swiper = this; + const { + rtlTranslate: rtl, params, $wrapperEl, progress, + } = swiper; + let x = 0; + let y = 0; + const z = 0; + + if (swiper.isHorizontal()) { + x = rtl ? -translate : translate; + } else { + y = translate; + } + + if (params.roundLengths) { + x = Math.floor(x); + y = Math.floor(y); + } + + if (!params.virtualTranslate) { + if (Support.transforms3d) $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`); + else $wrapperEl.transform(`translate(${x}px, ${y}px)`); + } + swiper.previousTranslate = swiper.translate; + swiper.translate = swiper.isHorizontal() ? x : y; + + // Check if we need to update progress + let newProgress; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + if (translatesDiff === 0) { + newProgress = 0; + } else { + newProgress = (translate - swiper.minTranslate()) / (translatesDiff); + } + if (newProgress !== progress) { + swiper.updateProgress(translate); + } + + swiper.emit('setTranslate', swiper.translate, byController); +} + +function minTranslate () { + return (-this.snapGrid[0]); +} + +function maxTranslate () { + return (-this.snapGrid[this.snapGrid.length - 1]); +} + +var translate = { + getTranslate, + setTranslate, + minTranslate, + maxTranslate, +}; + +function setTransition (duration, byController) { + const swiper = this; + + swiper.$wrapperEl.transition(duration); + + swiper.emit('setTransition', duration, byController); +} + +function transitionStart (runCallbacks = true, direction) { + const swiper = this; + const { activeIndex, params, previousIndex } = swiper; + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + + let dir = direction; + if (!dir) { + if (activeIndex > previousIndex) dir = 'next'; + else if (activeIndex < previousIndex) dir = 'prev'; + else dir = 'reset'; + } + + swiper.emit('transitionStart'); + + if (runCallbacks && activeIndex !== previousIndex) { + if (dir === 'reset') { + swiper.emit('slideResetTransitionStart'); + return; + } + swiper.emit('slideChangeTransitionStart'); + if (dir === 'next') { + swiper.emit('slideNextTransitionStart'); + } else { + swiper.emit('slidePrevTransitionStart'); + } + } +} + +function transitionEnd (runCallbacks = true, direction) { + const swiper = this; + const { activeIndex, previousIndex } = swiper; + swiper.animating = false; + swiper.setTransition(0); + + let dir = direction; + if (!dir) { + if (activeIndex > previousIndex) dir = 'next'; + else if (activeIndex < previousIndex) dir = 'prev'; + else dir = 'reset'; + } + + swiper.emit('transitionEnd'); + + if (runCallbacks && activeIndex !== previousIndex) { + if (dir === 'reset') { + swiper.emit('slideResetTransitionEnd'); + return; + } + swiper.emit('slideChangeTransitionEnd'); + if (dir === 'next') { + swiper.emit('slideNextTransitionEnd'); + } else { + swiper.emit('slidePrevTransitionEnd'); + } + } +} + +var transition = { + setTransition, + transitionStart, + transitionEnd, +}; + +function slideTo (index = 0, speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + let slideIndex = index; + if (slideIndex < 0) slideIndex = 0; + + const { + params, snapGrid, slidesGrid, previousIndex, activeIndex, rtlTranslate: rtl, + } = swiper; + if (swiper.animating && params.preventInteractionOnTransition) { + return false; + } + + let snapIndex = Math.floor(slideIndex / params.slidesPerGroup); + if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; + + if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) { + swiper.emit('beforeSlideChangeStart'); + } + + const translate = -snapGrid[snapIndex]; + + // Update progress + swiper.updateProgress(translate); + + // Normalize slideIndex + if (params.normalizeSlideIndex) { + for (let i = 0; i < slidesGrid.length; i += 1) { + if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) { + slideIndex = i; + } + } + } + // Directions locks + if (swiper.initialized && slideIndex !== activeIndex) { + if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) { + return false; + } + if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) { + if ((activeIndex || 0) !== slideIndex) return false; + } + } + + let direction; + if (slideIndex > activeIndex) direction = 'next'; + else if (slideIndex < activeIndex) direction = 'prev'; + else direction = 'reset'; + + + // Update Index + if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) { + swiper.updateActiveIndex(slideIndex); + // Update Height + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + swiper.updateSlidesClasses(); + if (params.effect !== 'slide') { + swiper.setTranslate(translate); + } + if (direction !== 'reset') { + swiper.transitionStart(runCallbacks, direction); + swiper.transitionEnd(runCallbacks, direction); + } + return false; + } + + if (speed === 0 || !Support.transition) { + swiper.setTransition(0); + swiper.setTranslate(translate); + swiper.updateActiveIndex(slideIndex); + swiper.updateSlidesClasses(); + swiper.emit('beforeTransitionStart', speed, internal); + swiper.transitionStart(runCallbacks, direction); + swiper.transitionEnd(runCallbacks, direction); + } else { + swiper.setTransition(speed); + swiper.setTranslate(translate); + swiper.updateActiveIndex(slideIndex); + swiper.updateSlidesClasses(); + swiper.emit('beforeTransitionStart', speed, internal); + swiper.transitionStart(runCallbacks, direction); + if (!swiper.animating) { + swiper.animating = true; + if (!swiper.onSlideToWrapperTransitionEnd) { + swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) { + if (!swiper || swiper.destroyed) return; + if (e.target !== this) return; + swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); + swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); + swiper.onSlideToWrapperTransitionEnd = null; + delete swiper.onSlideToWrapperTransitionEnd; + swiper.transitionEnd(runCallbacks, direction); + }; + } + swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); + swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); + } + } + + return true; +} + +function slideToLoop (index = 0, speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + let newIndex = index; + if (swiper.params.loop) { + newIndex += swiper.loopedSlides; + } + + return swiper.slideTo(newIndex, speed, runCallbacks, internal); +} + +/* eslint no-unused-vars: "off" */ +function slideNext (speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + const { params, animating } = swiper; + if (params.loop) { + if (animating) return false; + swiper.loopFix(); + // eslint-disable-next-line + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal); + } + return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal); +} + +/* eslint no-unused-vars: "off" */ +function slidePrev (speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + const { + params, animating, snapGrid, slidesGrid, rtlTranslate, + } = swiper; + + if (params.loop) { + if (animating) return false; + swiper.loopFix(); + // eslint-disable-next-line + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + } + const translate = rtlTranslate ? swiper.translate : -swiper.translate; + function normalize(val) { + if (val < 0) return -Math.floor(Math.abs(val)); + return Math.floor(val); + } + const normalizedTranslate = normalize(translate); + const normalizedSnapGrid = snapGrid.map(val => normalize(val)); + const normalizedSlidesGrid = slidesGrid.map(val => normalize(val)); + + const currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)]; + const prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1]; + let prevIndex; + if (typeof prevSnap !== 'undefined') { + prevIndex = slidesGrid.indexOf(prevSnap); + if (prevIndex < 0) prevIndex = swiper.activeIndex - 1; + } + return swiper.slideTo(prevIndex, speed, runCallbacks, internal); +} + +/* eslint no-unused-vars: "off" */ +function slideReset (speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal); +} + +/* eslint no-unused-vars: "off" */ +function slideToClosest (speed = this.params.speed, runCallbacks = true, internal) { + const swiper = this; + let index = swiper.activeIndex; + const snapIndex = Math.floor(index / swiper.params.slidesPerGroup); + + if (snapIndex < swiper.snapGrid.length - 1) { + const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; + + const currentSnap = swiper.snapGrid[snapIndex]; + const nextSnap = swiper.snapGrid[snapIndex + 1]; + + if ((translate - currentSnap) > (nextSnap - currentSnap) / 2) { + index = swiper.params.slidesPerGroup; + } + } + + return swiper.slideTo(index, speed, runCallbacks, internal); +} + +function slideToClickedSlide () { + const swiper = this; + const { params, $wrapperEl } = swiper; + + const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView; + let slideToIndex = swiper.clickedIndex; + let realIndex; + if (params.loop) { + if (swiper.animating) return; + realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10); + if (params.centeredSlides) { + if ( + (slideToIndex < swiper.loopedSlides - (slidesPerView / 2)) + || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2)) + ) { + swiper.loopFix(); + slideToIndex = $wrapperEl + .children(`.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`) + .eq(0) + .index(); + + Utils.nextTick(() => { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else if (slideToIndex > swiper.slides.length - slidesPerView) { + swiper.loopFix(); + slideToIndex = $wrapperEl + .children(`.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`) + .eq(0) + .index(); + + Utils.nextTick(() => { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else { + swiper.slideTo(slideToIndex); + } +} + +var slide = { + slideTo, + slideToLoop, + slideNext, + slidePrev, + slideReset, + slideToClosest, + slideToClickedSlide, +}; + +function loopCreate () { + const swiper = this; + const { params, $wrapperEl } = swiper; + // Remove duplicated slides + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove(); + + let slides = $wrapperEl.children(`.${params.slideClass}`); + + if (params.loopFillGroupWithBlank) { + const blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup); + if (blankSlidesNum !== params.slidesPerGroup) { + for (let i = 0; i < blankSlidesNum; i += 1) { + const blankNode = $(document.createElement('div')).addClass(`${params.slideClass} ${params.slideBlankClass}`); + $wrapperEl.append(blankNode); + } + slides = $wrapperEl.children(`.${params.slideClass}`); + } + } + + if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length; + + swiper.loopedSlides = parseInt(params.loopedSlides || params.slidesPerView, 10); + swiper.loopedSlides += params.loopAdditionalSlides; + if (swiper.loopedSlides > slides.length) { + swiper.loopedSlides = slides.length; + } + + const prependSlides = []; + const appendSlides = []; + slides.each((index, el) => { + const slide = $(el); + if (index < swiper.loopedSlides) appendSlides.push(el); + if (index < slides.length && index >= slides.length - swiper.loopedSlides) prependSlides.push(el); + slide.attr('data-swiper-slide-index', index); + }); + for (let i = 0; i < appendSlides.length; i += 1) { + $wrapperEl.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass)); + } + for (let i = prependSlides.length - 1; i >= 0; i -= 1) { + $wrapperEl.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass)); + } +} + +function loopFix () { + const swiper = this; + const { + params, activeIndex, slides, loopedSlides, allowSlidePrev, allowSlideNext, snapGrid, rtlTranslate: rtl, + } = swiper; + let newIndex; + swiper.allowSlidePrev = true; + swiper.allowSlideNext = true; + + const snapTranslate = -snapGrid[activeIndex]; + const diff = snapTranslate - swiper.getTranslate(); + + + // Fix For Negative Oversliding + if (activeIndex < loopedSlides) { + newIndex = (slides.length - (loopedSlides * 3)) + activeIndex; + newIndex += loopedSlides; + const slideChanged = swiper.slideTo(newIndex, 0, false, true); + if (slideChanged && diff !== 0) { + swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); + } + } else if ((params.slidesPerView === 'auto' && activeIndex >= loopedSlides * 2) || (activeIndex >= slides.length - loopedSlides)) { + // Fix For Positive Oversliding + newIndex = -slides.length + activeIndex + loopedSlides; + newIndex += loopedSlides; + const slideChanged = swiper.slideTo(newIndex, 0, false, true); + if (slideChanged && diff !== 0) { + swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); + } + } + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; +} + +function loopDestroy () { + const swiper = this; + const { $wrapperEl, params, slides } = swiper; + $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`).remove(); + slides.removeAttr('data-swiper-slide-index'); +} + +var loop = { + loopCreate, + loopFix, + loopDestroy, +}; + +function setGrabCursor (moving) { + const swiper = this; + if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked)) return; + const el = swiper.el; + el.style.cursor = 'move'; + el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab'; + el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab'; + el.style.cursor = moving ? 'grabbing' : 'grab'; +} + +function unsetGrabCursor () { + const swiper = this; + if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked)) return; + swiper.el.style.cursor = ''; +} + +var grabCursor = { + setGrabCursor, + unsetGrabCursor, +}; + +function appendSlide (slides) { + const swiper = this; + const { $wrapperEl, params } = swiper; + if (params.loop) { + swiper.loopDestroy(); + } + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.append(slides[i]); + } + } else { + $wrapperEl.append(slides); + } + if (params.loop) { + swiper.loopCreate(); + } + if (!(params.observer && Support.observer)) { + swiper.update(); + } +} + +function prependSlide (slides) { + const swiper = this; + const { params, $wrapperEl, activeIndex } = swiper; + + if (params.loop) { + swiper.loopDestroy(); + } + let newActiveIndex = activeIndex + 1; + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.prepend(slides[i]); + } + newActiveIndex = activeIndex + slides.length; + } else { + $wrapperEl.prepend(slides); + } + if (params.loop) { + swiper.loopCreate(); + } + if (!(params.observer && Support.observer)) { + swiper.update(); + } + swiper.slideTo(newActiveIndex, 0, false); +} + +function addSlide (index, slides) { + const swiper = this; + const { $wrapperEl, params, activeIndex } = swiper; + let activeIndexBuffer = activeIndex; + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(`.${params.slideClass}`); + } + const baseLength = swiper.slides.length; + if (index <= 0) { + swiper.prependSlide(slides); + return; + } + if (index >= baseLength) { + swiper.appendSlide(slides); + return; + } + let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer; + + const slidesBuffer = []; + for (let i = baseLength - 1; i >= index; i -= 1) { + const currentSlide = swiper.slides.eq(i); + currentSlide.remove(); + slidesBuffer.unshift(currentSlide); + } + + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.append(slides[i]); + } + newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer; + } else { + $wrapperEl.append(slides); + } + + for (let i = 0; i < slidesBuffer.length; i += 1) { + $wrapperEl.append(slidesBuffer[i]); + } + + if (params.loop) { + swiper.loopCreate(); + } + if (!(params.observer && Support.observer)) { + swiper.update(); + } + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } +} + +function removeSlide (slidesIndexes) { + const swiper = this; + const { params, $wrapperEl, activeIndex } = swiper; + + let activeIndexBuffer = activeIndex; + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(`.${params.slideClass}`); + } + let newActiveIndex = activeIndexBuffer; + let indexToRemove; + + if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) { + for (let i = 0; i < slidesIndexes.length; i += 1) { + indexToRemove = slidesIndexes[i]; + if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex -= 1; + } + newActiveIndex = Math.max(newActiveIndex, 0); + } else { + indexToRemove = slidesIndexes; + if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex -= 1; + newActiveIndex = Math.max(newActiveIndex, 0); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!(params.observer && Support.observer)) { + swiper.update(); + } + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } +} + +function removeAllSlides () { + const swiper = this; + + const slidesIndexes = []; + for (let i = 0; i < swiper.slides.length; i += 1) { + slidesIndexes.push(i); + } + swiper.removeSlide(slidesIndexes); +} + +var manipulation = { + appendSlide, + prependSlide, + addSlide, + removeSlide, + removeAllSlides, +}; + +const Device = (function Device() { + const ua = window.navigator.userAgent; + + const device = { + ios: false, + android: false, + androidChrome: false, + desktop: false, + windows: false, + iphone: false, + ipod: false, + ipad: false, + cordova: window.cordova || window.phonegap, + phonegap: window.cordova || window.phonegap, + }; + + const windows = ua.match(/(Windows Phone);?[\s\/]+([\d.]+)?/); // eslint-disable-line + const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line + const ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); + + + // Windows + if (windows) { + device.os = 'windows'; + device.osVersion = windows[2]; + device.windows = true; + } + // Android + if (android && !windows) { + device.os = 'android'; + device.osVersion = android[2]; + device.android = true; + device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0; + } + if (ipad || iphone || ipod) { + device.os = 'ios'; + device.ios = true; + } + // iOS + if (iphone && !ipod) { + device.osVersion = iphone[2].replace(/_/g, '.'); + device.iphone = true; + } + if (ipad) { + device.osVersion = ipad[2].replace(/_/g, '.'); + device.ipad = true; + } + if (ipod) { + device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null; + device.iphone = true; + } + // iOS 8+ changed UA + if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) { + if (device.osVersion.split('.')[0] === '10') { + device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0]; + } + } + + // Desktop + device.desktop = !(device.os || device.android || device.webView); + + // Webview + device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i); + + // Minimal UI + if (device.os && device.os === 'ios') { + const osVersionArr = device.osVersion.split('.'); + const metaViewport = document.querySelector('meta[name="viewport"]'); + device.minimalUi = !device.webView + && (ipod || iphone) + && (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) + && metaViewport && metaViewport.getAttribute('content').indexOf('minimal-ui') >= 0; + } + + // Pixel Ratio + device.pixelRatio = window.devicePixelRatio || 1; + + // Export object + return device; +}()); + +function onTouchStart (event) { + const swiper = this; + const data = swiper.touchEventsData; + const { params, touches } = swiper; + if (swiper.animating && params.preventInteractionOnTransition) { + return; + } + let e = event; + if (e.originalEvent) e = e.originalEvent; + data.isTouchEvent = e.type === 'touchstart'; + if (!data.isTouchEvent && 'which' in e && e.which === 3) return; + if (!data.isTouchEvent && 'button' in e && e.button > 0) return; + if (data.isTouched && data.isMoved) return; + if (params.noSwiping && $(e.target).closest(params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`)[0]) { + swiper.allowClick = true; + return; + } + if (params.swipeHandler) { + if (!$(e).closest(params.swipeHandler)[0]) return; + } + + touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + const startX = touches.currentX; + const startY = touches.currentY; + + // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore + + const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection; + const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold; + if ( + edgeSwipeDetection + && ((startX <= edgeSwipeThreshold) + || (startX >= window.screen.width - edgeSwipeThreshold)) + ) { + return; + } + + Utils.extend(data, { + isTouched: true, + isMoved: false, + allowTouchCallbacks: true, + isScrolling: undefined, + startMoving: undefined, + }); + + touches.startX = startX; + touches.startY = startY; + data.touchStartTime = Utils.now(); + swiper.allowClick = true; + swiper.updateSize(); + swiper.swipeDirection = undefined; + if (params.threshold > 0) data.allowThresholdMove = false; + if (e.type !== 'touchstart') { + let preventDefault = true; + if ($(e.target).is(data.formElements)) preventDefault = false; + if ( + document.activeElement + && $(document.activeElement).is(data.formElements) + && document.activeElement !== e.target + ) { + document.activeElement.blur(); + } + + const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault; + if (params.touchStartForcePreventDefault || shouldPreventDefault) { + e.preventDefault(); + } + } + swiper.emit('touchStart', e); +} + +function onTouchMove (event) { + const swiper = this; + const data = swiper.touchEventsData; + const { params, touches, rtlTranslate: rtl } = swiper; + let e = event; + if (e.originalEvent) e = e.originalEvent; + if (!data.isTouched) { + if (data.startMoving && data.isScrolling) { + swiper.emit('touchMoveOpposite', e); + } + return; + } + if (data.isTouchEvent && e.type === 'mousemove') return; + const pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + const pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + if (e.preventedByNestedSwiper) { + touches.startX = pageX; + touches.startY = pageY; + return; + } + if (!swiper.allowTouchMove) { + // isMoved = true; + swiper.allowClick = false; + if (data.isTouched) { + Utils.extend(touches, { + startX: pageX, + startY: pageY, + currentX: pageX, + currentY: pageY, + }); + data.touchStartTime = Utils.now(); + } + return; + } + if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) { + if (swiper.isVertical()) { + // Vertical + if ( + (pageY < touches.startY && swiper.translate <= swiper.maxTranslate()) + || (pageY > touches.startY && swiper.translate >= swiper.minTranslate()) + ) { + data.isTouched = false; + data.isMoved = false; + return; + } + } else if ( + (pageX < touches.startX && swiper.translate <= swiper.maxTranslate()) + || (pageX > touches.startX && swiper.translate >= swiper.minTranslate()) + ) { + return; + } + } + if (data.isTouchEvent && document.activeElement) { + if (e.target === document.activeElement && $(e.target).is(data.formElements)) { + data.isMoved = true; + swiper.allowClick = false; + return; + } + } + if (data.allowTouchCallbacks) { + swiper.emit('touchMove', e); + } + if (e.targetTouches && e.targetTouches.length > 1) return; + + touches.currentX = pageX; + touches.currentY = pageY; + + const diffX = touches.currentX - touches.startX; + const diffY = touches.currentY - touches.startY; + if (swiper.params.threshold && Math.sqrt((diffX ** 2) + (diffY ** 2)) < swiper.params.threshold) return; + + if (typeof data.isScrolling === 'undefined') { + let touchAngle; + if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) { + data.isScrolling = false; + } else { + // eslint-disable-next-line + if ((diffX * diffX) + (diffY * diffY) >= 25) { + touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI; + data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle); + } + } + } + if (data.isScrolling) { + swiper.emit('touchMoveOpposite', e); + } + if (typeof data.startMoving === 'undefined') { + if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) { + data.startMoving = true; + } + } + if (data.isScrolling) { + data.isTouched = false; + return; + } + if (!data.startMoving) { + return; + } + swiper.allowClick = false; + e.preventDefault(); + if (params.touchMoveStopPropagation && !params.nested) { + e.stopPropagation(); + } + + if (!data.isMoved) { + if (params.loop) { + swiper.loopFix(); + } + data.startTranslate = swiper.getTranslate(); + swiper.setTransition(0); + if (swiper.animating) { + swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend'); + } + data.allowMomentumBounce = false; + // Grab Cursor + if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { + swiper.setGrabCursor(true); + } + swiper.emit('sliderFirstMove', e); + } + swiper.emit('sliderMove', e); + data.isMoved = true; + + let diff = swiper.isHorizontal() ? diffX : diffY; + touches.diff = diff; + + diff *= params.touchRatio; + if (rtl) diff = -diff; + + swiper.swipeDirection = diff > 0 ? 'prev' : 'next'; + data.currentTranslate = diff + data.startTranslate; + + let disableParentSwiper = true; + let resistanceRatio = params.resistanceRatio; + if (params.touchReleaseOnEdges) { + resistanceRatio = 0; + } + if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) { + disableParentSwiper = false; + if (params.resistance) data.currentTranslate = (swiper.minTranslate() - 1) + ((-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio); + } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) { + disableParentSwiper = false; + if (params.resistance) data.currentTranslate = (swiper.maxTranslate() + 1) - ((swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio); + } + + if (disableParentSwiper) { + e.preventedByNestedSwiper = true; + } + + // Directions locks + if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) { + data.currentTranslate = data.startTranslate; + } + if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) { + data.currentTranslate = data.startTranslate; + } + + + // Threshold + if (params.threshold > 0) { + if (Math.abs(diff) > params.threshold || data.allowThresholdMove) { + if (!data.allowThresholdMove) { + data.allowThresholdMove = true; + touches.startX = touches.currentX; + touches.startY = touches.currentY; + data.currentTranslate = data.startTranslate; + touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY; + return; + } + } else { + data.currentTranslate = data.startTranslate; + return; + } + } + + if (!params.followFinger) return; + + // Update active index in free mode + if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) { + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + if (params.freeMode) { + // Velocity + if (data.velocities.length === 0) { + data.velocities.push({ + position: touches[swiper.isHorizontal() ? 'startX' : 'startY'], + time: data.touchStartTime, + }); + } + data.velocities.push({ + position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'], + time: Utils.now(), + }); + } + // Update progress + swiper.updateProgress(data.currentTranslate); + // Update translate + swiper.setTranslate(data.currentTranslate); +} + +function onTouchEnd (event) { + const swiper = this; + const data = swiper.touchEventsData; + + const { + params, touches, rtlTranslate: rtl, $wrapperEl, slidesGrid, snapGrid, + } = swiper; + let e = event; + if (e.originalEvent) e = e.originalEvent; + if (data.allowTouchCallbacks) { + swiper.emit('touchEnd', e); + } + data.allowTouchCallbacks = false; + if (!data.isTouched) { + if (data.isMoved && params.grabCursor) { + swiper.setGrabCursor(false); + } + data.isMoved = false; + data.startMoving = false; + return; + } + // Return Grab Cursor + if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { + swiper.setGrabCursor(false); + } + + // Time diff + const touchEndTime = Utils.now(); + const timeDiff = touchEndTime - data.touchStartTime; + + // Tap, doubleTap, Click + if (swiper.allowClick) { + swiper.updateClickedSlide(e); + swiper.emit('tap', e); + if (timeDiff < 300 && (touchEndTime - data.lastClickTime) > 300) { + if (data.clickTimeout) clearTimeout(data.clickTimeout); + data.clickTimeout = Utils.nextTick(() => { + if (!swiper || swiper.destroyed) return; + swiper.emit('click', e); + }, 300); + } + if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) { + if (data.clickTimeout) clearTimeout(data.clickTimeout); + swiper.emit('doubleTap', e); + } + } + + data.lastClickTime = Utils.now(); + Utils.nextTick(() => { + if (!swiper.destroyed) swiper.allowClick = true; + }); + + if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) { + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + return; + } + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + + let currentPos; + if (params.followFinger) { + currentPos = rtl ? swiper.translate : -swiper.translate; + } else { + currentPos = -data.currentTranslate; + } + + if (params.freeMode) { + if (currentPos < -swiper.minTranslate()) { + swiper.slideTo(swiper.activeIndex); + return; + } + if (currentPos > -swiper.maxTranslate()) { + if (swiper.slides.length < snapGrid.length) { + swiper.slideTo(snapGrid.length - 1); + } else { + swiper.slideTo(swiper.slides.length - 1); + } + return; + } + + if (params.freeModeMomentum) { + if (data.velocities.length > 1) { + const lastMoveEvent = data.velocities.pop(); + const velocityEvent = data.velocities.pop(); + + const distance = lastMoveEvent.position - velocityEvent.position; + const time = lastMoveEvent.time - velocityEvent.time; + swiper.velocity = distance / time; + swiper.velocity /= 2; + if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) { + swiper.velocity = 0; + } + // this implies that the user stopped moving a finger then released. + // There would be no events with distance zero, so the last event is stale. + if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) { + swiper.velocity = 0; + } + } else { + swiper.velocity = 0; + } + swiper.velocity *= params.freeModeMomentumVelocityRatio; + + data.velocities.length = 0; + let momentumDuration = 1000 * params.freeModeMomentumRatio; + const momentumDistance = swiper.velocity * momentumDuration; + + let newPosition = swiper.translate + momentumDistance; + if (rtl) newPosition = -newPosition; + + let doBounce = false; + let afterBouncePosition; + const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio; + let needsLoopFix; + if (newPosition < swiper.maxTranslate()) { + if (params.freeModeMomentumBounce) { + if (newPosition + swiper.maxTranslate() < -bounceAmount) { + newPosition = swiper.maxTranslate() - bounceAmount; + } + afterBouncePosition = swiper.maxTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.maxTranslate(); + } + if (params.loop && params.centeredSlides) needsLoopFix = true; + } else if (newPosition > swiper.minTranslate()) { + if (params.freeModeMomentumBounce) { + if (newPosition - swiper.minTranslate() > bounceAmount) { + newPosition = swiper.minTranslate() + bounceAmount; + } + afterBouncePosition = swiper.minTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.minTranslate(); + } + if (params.loop && params.centeredSlides) needsLoopFix = true; + } else if (params.freeModeSticky) { + let nextSlide; + for (let j = 0; j < snapGrid.length; j += 1) { + if (snapGrid[j] > -newPosition) { + nextSlide = j; + break; + } + } + + if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') { + newPosition = snapGrid[nextSlide]; + } else { + newPosition = snapGrid[nextSlide - 1]; + } + newPosition = -newPosition; + } + if (needsLoopFix) { + swiper.once('transitionEnd', () => { + swiper.loopFix(); + }); + } + // Fix duration + if (swiper.velocity !== 0) { + if (rtl) { + momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity); + } else { + momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity); + } + } else if (params.freeModeSticky) { + swiper.slideToClosest(); + return; + } + + if (params.freeModeMomentumBounce && doBounce) { + swiper.updateProgress(afterBouncePosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + swiper.animating = true; + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return; + swiper.emit('momentumBounce'); + + swiper.setTransition(params.speed); + swiper.setTranslate(afterBouncePosition); + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed) return; + swiper.transitionEnd(); + }); + }); + } else if (swiper.velocity) { + swiper.updateProgress(newPosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + if (!swiper.animating) { + swiper.animating = true; + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed) return; + swiper.transitionEnd(); + }); + } + } else { + swiper.updateProgress(newPosition); + } + + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } else if (params.freeModeSticky) { + swiper.slideToClosest(); + return; + } + + if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) { + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + return; + } + + // Find current slide + let stopIndex = 0; + let groupSize = swiper.slidesSizesGrid[0]; + for (let i = 0; i < slidesGrid.length; i += params.slidesPerGroup) { + if (typeof slidesGrid[i + params.slidesPerGroup] !== 'undefined') { + if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + params.slidesPerGroup]) { + stopIndex = i; + groupSize = slidesGrid[i + params.slidesPerGroup] - slidesGrid[i]; + } + } else if (currentPos >= slidesGrid[i]) { + stopIndex = i; + groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2]; + } + } + + // Find current slide size + const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize; + + if (timeDiff > params.longSwipesMs) { + // Long touches + if (!params.longSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + if (swiper.swipeDirection === 'next') { + if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + params.slidesPerGroup); + else swiper.slideTo(stopIndex); + } + if (swiper.swipeDirection === 'prev') { + if (ratio > (1 - params.longSwipesRatio)) swiper.slideTo(stopIndex + params.slidesPerGroup); + else swiper.slideTo(stopIndex); + } + } else { + // Short swipes + if (!params.shortSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + if (swiper.swipeDirection === 'next') { + swiper.slideTo(stopIndex + params.slidesPerGroup); + } + if (swiper.swipeDirection === 'prev') { + swiper.slideTo(stopIndex); + } + } +} + +function onResize () { + const swiper = this; + + const { params, el } = swiper; + + if (el && el.offsetWidth === 0) return; + + // Breakpoints + if (params.breakpoints) { + swiper.setBreakpoint(); + } + + // Save locks + const { allowSlideNext, allowSlidePrev, snapGrid } = swiper; + + // Disable locks on resize + swiper.allowSlideNext = true; + swiper.allowSlidePrev = true; + + swiper.updateSize(); + swiper.updateSlides(); + + if (params.freeMode) { + const newTranslate = Math.min(Math.max(swiper.translate, swiper.maxTranslate()), swiper.minTranslate()); + swiper.setTranslate(newTranslate); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + } else { + swiper.updateSlidesClasses(); + if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) { + swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + swiper.slideTo(swiper.activeIndex, 0, false, true); + } + } + // Return locks after resize + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; + + if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } +} + +function onClick (e) { + const swiper = this; + if (!swiper.allowClick) { + if (swiper.params.preventClicks) e.preventDefault(); + if (swiper.params.preventClicksPropagation && swiper.animating) { + e.stopPropagation(); + e.stopImmediatePropagation(); + } + } +} + +function attachEvents() { + const swiper = this; + const { + params, touchEvents, el, wrapperEl, + } = swiper; + + { + swiper.onTouchStart = onTouchStart.bind(swiper); + swiper.onTouchMove = onTouchMove.bind(swiper); + swiper.onTouchEnd = onTouchEnd.bind(swiper); + } + + swiper.onClick = onClick.bind(swiper); + + const target = params.touchEventsTarget === 'container' ? el : wrapperEl; + const capture = !!params.nested; + + // Touch Events + { + if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) { + target.addEventListener(touchEvents.start, swiper.onTouchStart, false); + document.addEventListener(touchEvents.move, swiper.onTouchMove, capture); + document.addEventListener(touchEvents.end, swiper.onTouchEnd, false); + } else { + if (Support.touch) { + const passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false; + target.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener); + target.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture } : capture); + target.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener); + } + if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) { + target.addEventListener('mousedown', swiper.onTouchStart, false); + document.addEventListener('mousemove', swiper.onTouchMove, capture); + document.addEventListener('mouseup', swiper.onTouchEnd, false); + } + } + // Prevent Links Clicks + if (params.preventClicks || params.preventClicksPropagation) { + target.addEventListener('click', swiper.onClick, true); + } + } + + // Resize handler + swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize, true); +} + +function detachEvents() { + const swiper = this; + + const { + params, touchEvents, el, wrapperEl, + } = swiper; + + const target = params.touchEventsTarget === 'container' ? el : wrapperEl; + const capture = !!params.nested; + + // Touch Events + { + if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) { + target.removeEventListener(touchEvents.start, swiper.onTouchStart, false); + document.removeEventListener(touchEvents.move, swiper.onTouchMove, capture); + document.removeEventListener(touchEvents.end, swiper.onTouchEnd, false); + } else { + if (Support.touch) { + const passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false; + target.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener); + target.removeEventListener(touchEvents.move, swiper.onTouchMove, capture); + target.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener); + } + if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) { + target.removeEventListener('mousedown', swiper.onTouchStart, false); + document.removeEventListener('mousemove', swiper.onTouchMove, capture); + document.removeEventListener('mouseup', swiper.onTouchEnd, false); + } + } + // Prevent Links Clicks + if (params.preventClicks || params.preventClicksPropagation) { + target.removeEventListener('click', swiper.onClick, true); + } + } + + // Resize handler + swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize); +} + +var events = { + attachEvents, + detachEvents, +}; + +function setBreakpoint () { + const swiper = this; + const { + activeIndex, initialized, loopedSlides = 0, params, + } = swiper; + const breakpoints = params.breakpoints; + if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) return; + + // Set breakpoint for window width and update parameters + const breakpoint = swiper.getBreakpoint(breakpoints); + + if (breakpoint && swiper.currentBreakpoint !== breakpoint) { + const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined; + if (breakpointOnlyParams) { + ['slidesPerView', 'spaceBetween', 'slidesPerGroup'].forEach((param) => { + const paramValue = breakpointOnlyParams[param]; + if (typeof paramValue === 'undefined') return; + if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) { + breakpointOnlyParams[param] = 'auto'; + } else if (param === 'slidesPerView') { + breakpointOnlyParams[param] = parseFloat(paramValue); + } else { + breakpointOnlyParams[param] = parseInt(paramValue, 10); + } + }); + } + + const breakpointParams = breakpointOnlyParams || swiper.originalParams; + const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction; + const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged); + + if (directionChanged && initialized) { + swiper.changeDirection(); + } + + Utils.extend(swiper.params, breakpointParams); + + Utils.extend(swiper, { + allowTouchMove: swiper.params.allowTouchMove, + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev, + }); + + swiper.currentBreakpoint = breakpoint; + + if (needsReLoop && initialized) { + swiper.loopDestroy(); + swiper.loopCreate(); + swiper.updateSlides(); + swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false); + } + + swiper.emit('breakpoint', breakpointParams); + } +} + +function getBreakpoint (breakpoints) { + const swiper = this; + // Get breakpoint for window width + if (!breakpoints) return undefined; + let breakpoint = false; + const points = []; + Object.keys(breakpoints).forEach((point) => { + points.push(point); + }); + points.sort((a, b) => parseInt(a, 10) - parseInt(b, 10)); + for (let i = 0; i < points.length; i += 1) { + const point = points[i]; + if (swiper.params.breakpointsInverse) { + if (point <= window.innerWidth) { + breakpoint = point; + } + } else if (point >= window.innerWidth && !breakpoint) { + breakpoint = point; + } + } + return breakpoint || 'max'; +} + +var breakpoints = { setBreakpoint, getBreakpoint }; + +function addClasses () { + const swiper = this; + const { + classNames, params, rtl, $el, + } = swiper; + const suffixes = []; + + suffixes.push('initialized'); + suffixes.push(params.direction); + + if (params.freeMode) { + suffixes.push('free-mode'); + } + if (!Support.flexbox) { + suffixes.push('no-flexbox'); + } + if (params.autoHeight) { + suffixes.push('autoheight'); + } + if (rtl) { + suffixes.push('rtl'); + } + if (params.slidesPerColumn > 1) { + suffixes.push('multirow'); + } + if (Device.android) { + suffixes.push('android'); + } + if (Device.ios) { + suffixes.push('ios'); + } + // WP8 Touch Events Fix + if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) { + suffixes.push(`wp8-${params.direction}`); + } + + suffixes.forEach((suffix) => { + classNames.push(params.containerModifierClass + suffix); + }); + + $el.addClass(classNames.join(' ')); +} + +function removeClasses () { + const swiper = this; + const { $el, classNames } = swiper; + + $el.removeClass(classNames.join(' ')); +} + +var classes = { addClasses, removeClasses }; + +function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) { + let image; + function onReady() { + if (callback) callback(); + } + if (!imageEl.complete || !checkForComplete) { + if (src) { + image = new window.Image(); + image.onload = onReady; + image.onerror = onReady; + if (sizes) { + image.sizes = sizes; + } + if (srcset) { + image.srcset = srcset; + } + if (src) { + image.src = src; + } + } else { + onReady(); + } + } else { + // image already loaded... + onReady(); + } +} + +function preloadImages () { + const swiper = this; + swiper.imagesToLoad = swiper.$el.find('img'); + function onReady() { + if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return; + if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1; + if (swiper.imagesLoaded === swiper.imagesToLoad.length) { + if (swiper.params.updateOnImagesReady) swiper.update(); + swiper.emit('imagesReady'); + } + } + for (let i = 0; i < swiper.imagesToLoad.length; i += 1) { + const imageEl = swiper.imagesToLoad[i]; + swiper.loadImage( + imageEl, + imageEl.currentSrc || imageEl.getAttribute('src'), + imageEl.srcset || imageEl.getAttribute('srcset'), + imageEl.sizes || imageEl.getAttribute('sizes'), + true, + onReady + ); + } +} + +var images = { + loadImage, + preloadImages, +}; + +function checkOverflow() { + const swiper = this; + const wasLocked = swiper.isLocked; + + swiper.isLocked = swiper.snapGrid.length === 1; + swiper.allowSlideNext = !swiper.isLocked; + swiper.allowSlidePrev = !swiper.isLocked; + + // events + if (wasLocked !== swiper.isLocked) swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); + + if (wasLocked && wasLocked !== swiper.isLocked) { + swiper.isEnd = false; + swiper.navigation.update(); + } +} + +var checkOverflow$1 = { checkOverflow }; + +var defaults = { + init: true, + direction: 'horizontal', + touchEventsTarget: 'container', + initialSlide: 0, + speed: 300, + // + preventInteractionOnTransition: false, + + // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView). + edgeSwipeDetection: false, + edgeSwipeThreshold: 20, + + // Free mode + freeMode: false, + freeModeMomentum: true, + freeModeMomentumRatio: 1, + freeModeMomentumBounce: true, + freeModeMomentumBounceRatio: 1, + freeModeMomentumVelocityRatio: 1, + freeModeSticky: false, + freeModeMinimumVelocity: 0.02, + + // Autoheight + autoHeight: false, + + // Set wrapper width + setWrapperSize: false, + + // Virtual Translate + virtualTranslate: false, + + // Effects + effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip' + + // Breakpoints + breakpoints: undefined, + breakpointsInverse: false, + + // Slides grid + spaceBetween: 0, + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerColumnFill: 'column', + slidesPerGroup: 1, + centeredSlides: false, + slidesOffsetBefore: 0, // in px + slidesOffsetAfter: 0, // in px + normalizeSlideIndex: true, + centerInsufficientSlides: false, + + // Disable swiper and hide navigation when container not overflow + watchOverflow: false, + + // Round length + roundLengths: false, + + // Touches + touchRatio: 1, + touchAngle: 45, + simulateTouch: true, + shortSwipes: true, + longSwipes: true, + longSwipesRatio: 0.5, + longSwipesMs: 300, + followFinger: true, + allowTouchMove: true, + threshold: 0, + touchMoveStopPropagation: true, + touchStartPreventDefault: true, + touchStartForcePreventDefault: false, + touchReleaseOnEdges: false, + + // Unique Navigation Elements + uniqueNavElements: true, + + // Resistance + resistance: true, + resistanceRatio: 0.85, + + // Progress + watchSlidesProgress: false, + watchSlidesVisibility: false, + + // Cursor + grabCursor: false, + + // Clicks + preventClicks: true, + preventClicksPropagation: true, + slideToClickedSlide: false, + + // Images + preloadImages: true, + updateOnImagesReady: true, + + // loop + loop: false, + loopAdditionalSlides: 0, + loopedSlides: null, + loopFillGroupWithBlank: false, + + // Swiping/no swiping + allowSlidePrev: true, + allowSlideNext: true, + swipeHandler: null, // '.swipe-handler', + noSwiping: true, + noSwipingClass: 'swiper-no-swiping', + noSwipingSelector: null, + + // Passive Listeners + passiveListeners: true, + + // NS + containerModifierClass: 'swiper-container-', // NEW + slideClass: 'swiper-slide', + slideBlankClass: 'swiper-slide-invisible-blank', + slideActiveClass: 'swiper-slide-active', + slideDuplicateActiveClass: 'swiper-slide-duplicate-active', + slideVisibleClass: 'swiper-slide-visible', + slideDuplicateClass: 'swiper-slide-duplicate', + slideNextClass: 'swiper-slide-next', + slideDuplicateNextClass: 'swiper-slide-duplicate-next', + slidePrevClass: 'swiper-slide-prev', + slideDuplicatePrevClass: 'swiper-slide-duplicate-prev', + wrapperClass: 'swiper-wrapper', + + // Callbacks + runCallbacksOnInit: true, +}; + +/* eslint no-param-reassign: "off" */ + +const prototypes = { + update, + translate, + transition, + slide, + loop, + grabCursor, + manipulation, + events, + breakpoints, + checkOverflow: checkOverflow$1, + classes, + images, +}; + +const extendedDefaults = {}; + +class Swiper extends SwiperClass { + constructor(...args) { + let el; + let params; + if (args.length === 1 && args[0].constructor && args[0].constructor === Object) { + params = args[0]; + } else { + [el, params] = args; + } + if (!params) params = {}; + + params = Utils.extend({}, params); + if (el && !params.el) params.el = el; + + super(params); + + Object.keys(prototypes).forEach((prototypeGroup) => { + Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => { + if (!Swiper.prototype[protoMethod]) { + Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod]; + } + }); + }); + + // Swiper Instance + const swiper = this; + if (typeof swiper.modules === 'undefined') { + swiper.modules = {}; + } + Object.keys(swiper.modules).forEach((moduleName) => { + const module = swiper.modules[moduleName]; + if (module.params) { + const moduleParamName = Object.keys(module.params)[0]; + const moduleParams = module.params[moduleParamName]; + if (typeof moduleParams !== 'object' || moduleParams === null) return; + if (!(moduleParamName in params && 'enabled' in moduleParams)) return; + if (params[moduleParamName] === true) { + params[moduleParamName] = { enabled: true }; + } + if ( + typeof params[moduleParamName] === 'object' + && !('enabled' in params[moduleParamName]) + ) { + params[moduleParamName].enabled = true; + } + if (!params[moduleParamName]) params[moduleParamName] = { enabled: false }; + } + }); + + // Extend defaults with modules params + const swiperParams = Utils.extend({}, defaults); + swiper.useModulesParams(swiperParams); + + // Extend defaults with passed params + swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params); + swiper.originalParams = Utils.extend({}, swiper.params); + swiper.passedParams = Utils.extend({}, params); + + // Save Dom lib + swiper.$ = $; + + // Find el + const $el = $(swiper.params.el); + el = $el[0]; + + if (!el) { + return undefined; + } + + if ($el.length > 1) { + const swipers = []; + $el.each((index, containerEl) => { + const newParams = Utils.extend({}, params, { el: containerEl }); + swipers.push(new Swiper(newParams)); + }); + return swipers; + } + + el.swiper = swiper; + $el.data('swiper', swiper); + + // Find Wrapper + const $wrapperEl = $el.children(`.${swiper.params.wrapperClass}`); + + // Extend Swiper + Utils.extend(swiper, { + $el, + el, + $wrapperEl, + wrapperEl: $wrapperEl[0], + + // Classes + classNames: [], + + // Slides + slides: $(), + slidesGrid: [], + snapGrid: [], + slidesSizesGrid: [], + + // isDirection + isHorizontal() { + return swiper.params.direction === 'horizontal'; + }, + isVertical() { + return swiper.params.direction === 'vertical'; + }, + // RTL + rtl: (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'), + rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'), + wrongRTL: $wrapperEl.css('display') === '-webkit-box', + + // Indexes + activeIndex: 0, + realIndex: 0, + + // + isBeginning: true, + isEnd: false, + + // Props + translate: 0, + previousTranslate: 0, + progress: 0, + velocity: 0, + animating: false, + + // Locks + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev, + + // Touch Events + touchEvents: (function touchEvents() { + const touch = ['touchstart', 'touchmove', 'touchend']; + let desktop = ['mousedown', 'mousemove', 'mouseup']; + if (Support.pointerEvents) { + desktop = ['pointerdown', 'pointermove', 'pointerup']; + } else if (Support.prefixedPointerEvents) { + desktop = ['MSPointerDown', 'MSPointerMove', 'MSPointerUp']; + } + swiper.touchEventsTouch = { + start: touch[0], + move: touch[1], + end: touch[2], + }; + swiper.touchEventsDesktop = { + start: desktop[0], + move: desktop[1], + end: desktop[2], + }; + return Support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop; + }()), + touchEventsData: { + isTouched: undefined, + isMoved: undefined, + allowTouchCallbacks: undefined, + touchStartTime: undefined, + isScrolling: undefined, + currentTranslate: undefined, + startTranslate: undefined, + allowThresholdMove: undefined, + // Form elements to match + formElements: 'input, select, option, textarea, button, video', + // Last click time + lastClickTime: Utils.now(), + clickTimeout: undefined, + // Velocities + velocities: [], + allowMomentumBounce: undefined, + isTouchEvent: undefined, + startMoving: undefined, + }, + + // Clicks + allowClick: true, + + // Touches + allowTouchMove: swiper.params.allowTouchMove, + + touches: { + startX: 0, + startY: 0, + currentX: 0, + currentY: 0, + diff: 0, + }, + + // Images + imagesToLoad: [], + imagesLoaded: 0, + + }); + + // Install Modules + swiper.useModules(); + + // Init + if (swiper.params.init) { + swiper.init(); + } + + // Return app instance + return swiper; + } + + slidesPerViewDynamic() { + const swiper = this; + const { + params, slides, slidesGrid, size: swiperSize, activeIndex, + } = swiper; + let spv = 1; + if (params.centeredSlides) { + let slideSize = slides[activeIndex].swiperSlideSize; + let breakLoop; + for (let i = activeIndex + 1; i < slides.length; i += 1) { + if (slides[i] && !breakLoop) { + slideSize += slides[i].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) breakLoop = true; + } + } + for (let i = activeIndex - 1; i >= 0; i -= 1) { + if (slides[i] && !breakLoop) { + slideSize += slides[i].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) breakLoop = true; + } + } + } else { + for (let i = activeIndex + 1; i < slides.length; i += 1) { + if (slidesGrid[i] - slidesGrid[activeIndex] < swiperSize) { + spv += 1; + } + } + } + return spv; + } + + update() { + const swiper = this; + if (!swiper || swiper.destroyed) return; + const { snapGrid, params } = swiper; + // Breakpoints + if (params.breakpoints) { + swiper.setBreakpoint(); + } + swiper.updateSize(); + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + + function setTranslate() { + const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate; + const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate()); + swiper.setTranslate(newTranslate); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + let translated; + if (swiper.params.freeMode) { + setTranslate(); + if (swiper.params.autoHeight) { + swiper.updateAutoHeight(); + } + } else { + if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) { + translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + translated = swiper.slideTo(swiper.activeIndex, 0, false, true); + } + if (!translated) { + setTranslate(); + } + } + if (params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } + swiper.emit('update'); + } + + changeDirection(newDirection, needUpdate = true) { + const swiper = this; + const currentDirection = swiper.params.direction; + if (!newDirection) { + // eslint-disable-next-line + newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal'; + } + if ((newDirection === currentDirection) || (newDirection !== 'horizontal' && newDirection !== 'vertical')) { + return swiper; + } + + if (currentDirection === 'vertical') { + swiper.$el + .removeClass(`${swiper.params.containerModifierClass}vertical wp8-vertical`) + .addClass(`${swiper.params.containerModifierClass}${newDirection}`); + + if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) { + swiper.$el.addClass(`${swiper.params.containerModifierClass}wp8-${newDirection}`); + } + } + if (currentDirection === 'horizontal') { + swiper.$el + .removeClass(`${swiper.params.containerModifierClass}horizontal wp8-horizontal`) + .addClass(`${swiper.params.containerModifierClass}${newDirection}`); + + if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) { + swiper.$el.addClass(`${swiper.params.containerModifierClass}wp8-${newDirection}`); + } + } + + swiper.params.direction = newDirection; + + swiper.slides.each((slideIndex, slideEl) => { + if (newDirection === 'vertical') { + slideEl.style.width = ''; + } else { + slideEl.style.height = ''; + } + }); + + swiper.emit('changeDirection'); + if (needUpdate) swiper.update(); + + return swiper; + } + + init() { + const swiper = this; + if (swiper.initialized) return; + + swiper.emit('beforeInit'); + + // Set breakpoint + if (swiper.params.breakpoints) { + swiper.setBreakpoint(); + } + + // Add Classes + swiper.addClasses(); + + // Create loop + if (swiper.params.loop) { + swiper.loopCreate(); + } + + // Update size + swiper.updateSize(); + + // Update slides + swiper.updateSlides(); + + if (swiper.params.watchOverflow) { + swiper.checkOverflow(); + } + + // Set Grab Cursor + if (swiper.params.grabCursor) { + swiper.setGrabCursor(); + } + + if (swiper.params.preloadImages) { + swiper.preloadImages(); + } + + // Slide To Initial Slide + if (swiper.params.loop) { + swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit); + } else { + swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit); + } + + // Attach events + swiper.attachEvents(); + + // Init Flag + swiper.initialized = true; + + // Emit + swiper.emit('init'); + } + + destroy(deleteInstance = true, cleanStyles = true) { + const swiper = this; + const { + params, $el, $wrapperEl, slides, + } = swiper; + + if (typeof swiper.params === 'undefined' || swiper.destroyed) { + return null; + } + + swiper.emit('beforeDestroy'); + + // Init Flag + swiper.initialized = false; + + // Detach events + swiper.detachEvents(); + + // Destroy loop + if (params.loop) { + swiper.loopDestroy(); + } + + // Cleanup styles + if (cleanStyles) { + swiper.removeClasses(); + $el.removeAttr('style'); + $wrapperEl.removeAttr('style'); + if (slides && slides.length) { + slides + .removeClass([ + params.slideVisibleClass, + params.slideActiveClass, + params.slideNextClass, + params.slidePrevClass, + ].join(' ')) + .removeAttr('style') + .removeAttr('data-swiper-slide-index') + .removeAttr('data-swiper-column') + .removeAttr('data-swiper-row'); + } + } + + swiper.emit('destroy'); + + // Detach emitter events + Object.keys(swiper.eventsListeners).forEach((eventName) => { + swiper.off(eventName); + }); + + if (deleteInstance !== false) { + swiper.$el[0].swiper = null; + swiper.$el.data('swiper', null); + Utils.deleteProps(swiper); + } + swiper.destroyed = true; + + return null; + } + + static extendDefaults(newDefaults) { + Utils.extend(extendedDefaults, newDefaults); + } + + static get extendedDefaults() { + return extendedDefaults; + } + + static get defaults() { + return defaults; + } + + static get Class() { + return SwiperClass; + } + + static get $() { + return $; + } +} + +var Device$1 = { + name: 'device', + proto: { + device: Device, + }, + static: { + device: Device, + }, +}; + +var Support$1 = { + name: 'support', + proto: { + support: Support, + }, + static: { + support: Support, + }, +}; + +var Browser$1 = { + name: 'browser', + proto: { + browser: Browser, + }, + static: { + browser: Browser, + }, +}; + +var Resize = { + name: 'resize', + create() { + const swiper = this; + Utils.extend(swiper, { + resize: { + resizeHandler() { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + swiper.emit('beforeResize'); + swiper.emit('resize'); + }, + orientationChangeHandler() { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + swiper.emit('orientationchange'); + }, + }, + }); + }, + on: { + init() { + const swiper = this; + // Emit resize + window.addEventListener('resize', swiper.resize.resizeHandler); + + // Emit orientationchange + window.addEventListener('orientationchange', swiper.resize.orientationChangeHandler); + }, + destroy() { + const swiper = this; + window.removeEventListener('resize', swiper.resize.resizeHandler); + window.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler); + }, + }, +}; + +const Observer = { + func: window.MutationObserver || window.WebkitMutationObserver, + attach(target, options = {}) { + const swiper = this; + + const ObserverFunc = Observer.func; + const observer = new ObserverFunc((mutations) => { + // The observerUpdate event should only be triggered + // once despite the number of mutations. Additional + // triggers are redundant and are very costly + if (mutations.length === 1) { + swiper.emit('observerUpdate', mutations[0]); + return; + } + const observerUpdate = function observerUpdate() { + swiper.emit('observerUpdate', mutations[0]); + }; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(observerUpdate); + } else { + window.setTimeout(observerUpdate, 0); + } + }); + + observer.observe(target, { + attributes: typeof options.attributes === 'undefined' ? true : options.attributes, + childList: typeof options.childList === 'undefined' ? true : options.childList, + characterData: typeof options.characterData === 'undefined' ? true : options.characterData, + }); + + swiper.observer.observers.push(observer); + }, + init() { + const swiper = this; + if (!Support.observer || !swiper.params.observer) return; + if (swiper.params.observeParents) { + const containerParents = swiper.$el.parents(); + for (let i = 0; i < containerParents.length; i += 1) { + swiper.observer.attach(containerParents[i]); + } + } + // Observe container + swiper.observer.attach(swiper.$el[0], { childList: swiper.params.observeSlideChildren }); + + // Observe wrapper + swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false }); + }, + destroy() { + const swiper = this; + swiper.observer.observers.forEach((observer) => { + observer.disconnect(); + }); + swiper.observer.observers = []; + }, +}; + +var Observer$1 = { + name: 'observer', + params: { + observer: false, + observeParents: false, + observeSlideChildren: false, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + observer: { + init: Observer.init.bind(swiper), + attach: Observer.attach.bind(swiper), + destroy: Observer.destroy.bind(swiper), + observers: [], + }, + }); + }, + on: { + init() { + const swiper = this; + swiper.observer.init(); + }, + destroy() { + const swiper = this; + swiper.observer.destroy(); + }, + }, +}; + +const Virtual = { + update(force) { + const swiper = this; + const { slidesPerView, slidesPerGroup, centeredSlides } = swiper.params; + const { addSlidesBefore, addSlidesAfter } = swiper.params.virtual; + const { + from: previousFrom, + to: previousTo, + slides, + slidesGrid: previousSlidesGrid, + renderSlide, + offset: previousOffset, + } = swiper.virtual; + swiper.updateActiveIndex(); + const activeIndex = swiper.activeIndex || 0; + + let offsetProp; + if (swiper.rtlTranslate) offsetProp = 'right'; + else offsetProp = swiper.isHorizontal() ? 'left' : 'top'; + + let slidesAfter; + let slidesBefore; + if (centeredSlides) { + slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore; + slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter; + } else { + slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesBefore; + slidesBefore = slidesPerGroup + addSlidesAfter; + } + const from = Math.max((activeIndex || 0) - slidesBefore, 0); + const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1); + const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0); + + Utils.extend(swiper.virtual, { + from, + to, + offset, + slidesGrid: swiper.slidesGrid, + }); + + function onRendered() { + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + if (swiper.lazy && swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + } + + if (previousFrom === from && previousTo === to && !force) { + if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) { + swiper.slides.css(offsetProp, `${offset}px`); + } + swiper.updateProgress(); + return; + } + if (swiper.params.virtual.renderExternal) { + swiper.params.virtual.renderExternal.call(swiper, { + offset, + from, + to, + slides: (function getSlides() { + const slidesToRender = []; + for (let i = from; i <= to; i += 1) { + slidesToRender.push(slides[i]); + } + return slidesToRender; + }()), + }); + onRendered(); + return; + } + const prependIndexes = []; + const appendIndexes = []; + if (force) { + swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove(); + } else { + for (let i = previousFrom; i <= previousTo; i += 1) { + if (i < from || i > to) { + swiper.$wrapperEl.find(`.${swiper.params.slideClass}[data-swiper-slide-index="${i}"]`).remove(); + } + } + } + for (let i = 0; i < slides.length; i += 1) { + if (i >= from && i <= to) { + if (typeof previousTo === 'undefined' || force) { + appendIndexes.push(i); + } else { + if (i > previousTo) appendIndexes.push(i); + if (i < previousFrom) prependIndexes.push(i); + } + } + } + appendIndexes.forEach((index) => { + swiper.$wrapperEl.append(renderSlide(slides[index], index)); + }); + prependIndexes.sort((a, b) => b - a).forEach((index) => { + swiper.$wrapperEl.prepend(renderSlide(slides[index], index)); + }); + swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`); + onRendered(); + }, + renderSlide(slide, index) { + const swiper = this; + const params = swiper.params.virtual; + if (params.cache && swiper.virtual.cache[index]) { + return swiper.virtual.cache[index]; + } + const $slideEl = params.renderSlide + ? $(params.renderSlide.call(swiper, slide, index)) + : $(`
            ${slide}
            `); + if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index); + if (params.cache) swiper.virtual.cache[index] = $slideEl; + return $slideEl; + }, + appendSlide(slides) { + const swiper = this; + if (typeof slides === 'object' && 'length' in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) swiper.virtual.slides.push(slides[i]); + } + } else { + swiper.virtual.slides.push(slides); + } + swiper.virtual.update(true); + }, + prependSlide(slides) { + const swiper = this; + const activeIndex = swiper.activeIndex; + let newActiveIndex = activeIndex + 1; + let numberOfNewSlides = 1; + + if (Array.isArray(slides)) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) swiper.virtual.slides.unshift(slides[i]); + } + newActiveIndex = activeIndex + slides.length; + numberOfNewSlides = slides.length; + } else { + swiper.virtual.slides.unshift(slides); + } + if (swiper.params.virtual.cache) { + const cache = swiper.virtual.cache; + const newCache = {}; + Object.keys(cache).forEach((cachedIndex) => { + newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cache[cachedIndex]; + }); + swiper.virtual.cache = newCache; + } + swiper.virtual.update(true); + swiper.slideTo(newActiveIndex, 0); + }, + removeSlide(slidesIndexes) { + const swiper = this; + if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return; + let activeIndex = swiper.activeIndex; + if (Array.isArray(slidesIndexes)) { + for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) { + swiper.virtual.slides.splice(slidesIndexes[i], 1); + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes[i]]; + } + if (slidesIndexes[i] < activeIndex) activeIndex -= 1; + activeIndex = Math.max(activeIndex, 0); + } + } else { + swiper.virtual.slides.splice(slidesIndexes, 1); + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes]; + } + if (slidesIndexes < activeIndex) activeIndex -= 1; + activeIndex = Math.max(activeIndex, 0); + } + swiper.virtual.update(true); + swiper.slideTo(activeIndex, 0); + }, + removeAllSlides() { + const swiper = this; + swiper.virtual.slides = []; + if (swiper.params.virtual.cache) { + swiper.virtual.cache = {}; + } + swiper.virtual.update(true); + swiper.slideTo(0, 0); + }, +}; + +var virtual = { + name: 'virtual', + params: { + virtual: { + enabled: false, + slides: [], + cache: true, + renderSlide: null, + renderExternal: null, + addSlidesBefore: 0, + addSlidesAfter: 0, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + virtual: { + update: Virtual.update.bind(swiper), + appendSlide: Virtual.appendSlide.bind(swiper), + prependSlide: Virtual.prependSlide.bind(swiper), + removeSlide: Virtual.removeSlide.bind(swiper), + removeAllSlides: Virtual.removeAllSlides.bind(swiper), + renderSlide: Virtual.renderSlide.bind(swiper), + slides: swiper.params.virtual.slides, + cache: {}, + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (!swiper.params.virtual.enabled) return; + swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`); + const overwriteParams = { + watchSlidesProgress: true, + }; + Utils.extend(swiper.params, overwriteParams); + Utils.extend(swiper.originalParams, overwriteParams); + + if (!swiper.params.initialSlide) { + swiper.virtual.update(); + } + }, + setTranslate() { + const swiper = this; + if (!swiper.params.virtual.enabled) return; + swiper.virtual.update(); + }, + }, +}; + +const Keyboard = { + handle(event) { + const swiper = this; + const { rtlTranslate: rtl } = swiper; + let e = event; + if (e.originalEvent) e = e.originalEvent; // jquery fix + const kc = e.keyCode || e.charCode; + // Directions locks + if (!swiper.allowSlideNext && ((swiper.isHorizontal() && kc === 39) || (swiper.isVertical() && kc === 40))) { + return false; + } + if (!swiper.allowSlidePrev && ((swiper.isHorizontal() && kc === 37) || (swiper.isVertical() && kc === 38))) { + return false; + } + if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { + return undefined; + } + if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) { + return undefined; + } + if (swiper.params.keyboard.onlyInViewport && (kc === 37 || kc === 39 || kc === 38 || kc === 40)) { + let inView = false; + // Check that swiper should be inside of visible area of window + if (swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 && swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0) { + return undefined; + } + const windowWidth = window.innerWidth; + const windowHeight = window.innerHeight; + const swiperOffset = swiper.$el.offset(); + if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft; + const swiperCoord = [ + [swiperOffset.left, swiperOffset.top], + [swiperOffset.left + swiper.width, swiperOffset.top], + [swiperOffset.left, swiperOffset.top + swiper.height], + [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height], + ]; + for (let i = 0; i < swiperCoord.length; i += 1) { + const point = swiperCoord[i]; + if ( + point[0] >= 0 && point[0] <= windowWidth + && point[1] >= 0 && point[1] <= windowHeight + ) { + inView = true; + } + } + if (!inView) return undefined; + } + if (swiper.isHorizontal()) { + if (kc === 37 || kc === 39) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + if ((kc === 39 && !rtl) || (kc === 37 && rtl)) swiper.slideNext(); + if ((kc === 37 && !rtl) || (kc === 39 && rtl)) swiper.slidePrev(); + } else { + if (kc === 38 || kc === 40) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + if (kc === 40) swiper.slideNext(); + if (kc === 38) swiper.slidePrev(); + } + swiper.emit('keyPress', kc); + return undefined; + }, + enable() { + const swiper = this; + if (swiper.keyboard.enabled) return; + $(document).on('keydown', swiper.keyboard.handle); + swiper.keyboard.enabled = true; + }, + disable() { + const swiper = this; + if (!swiper.keyboard.enabled) return; + $(document).off('keydown', swiper.keyboard.handle); + swiper.keyboard.enabled = false; + }, +}; + +var keyboard = { + name: 'keyboard', + params: { + keyboard: { + enabled: false, + onlyInViewport: true, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + keyboard: { + enabled: false, + enable: Keyboard.enable.bind(swiper), + disable: Keyboard.disable.bind(swiper), + handle: Keyboard.handle.bind(swiper), + }, + }); + }, + on: { + init() { + const swiper = this; + if (swiper.params.keyboard.enabled) { + swiper.keyboard.enable(); + } + }, + destroy() { + const swiper = this; + if (swiper.keyboard.enabled) { + swiper.keyboard.disable(); + } + }, + }, +}; + +function isEventSupported() { + const eventName = 'onwheel'; + let isSupported = eventName in document; + + if (!isSupported) { + const element = document.createElement('div'); + element.setAttribute(eventName, 'return;'); + isSupported = typeof element[eventName] === 'function'; + } + + if (!isSupported + && document.implementation + && document.implementation.hasFeature + // always returns true in newer browsers as per the standard. + // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature + && document.implementation.hasFeature('', '') !== true + ) { + // This is the only way to test support for the `wheel` event in IE9+. + isSupported = document.implementation.hasFeature('Events.wheel', '3.0'); + } + + return isSupported; +} +const Mousewheel = { + lastScrollTime: Utils.now(), + event: (function getEvent() { + if (window.navigator.userAgent.indexOf('firefox') > -1) return 'DOMMouseScroll'; + return isEventSupported() ? 'wheel' : 'mousewheel'; + }()), + normalize(e) { + // Reasonable defaults + const PIXEL_STEP = 10; + const LINE_HEIGHT = 40; + const PAGE_HEIGHT = 800; + + let sX = 0; + let sY = 0; // spinX, spinY + let pX = 0; + let pY = 0; // pixelX, pixelY + + // Legacy + if ('detail' in e) { + sY = e.detail; + } + if ('wheelDelta' in e) { + sY = -e.wheelDelta / 120; + } + if ('wheelDeltaY' in e) { + sY = -e.wheelDeltaY / 120; + } + if ('wheelDeltaX' in e) { + sX = -e.wheelDeltaX / 120; + } + + // side scrolling on FF with DOMMouseScroll + if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) { + sX = sY; + sY = 0; + } + + pX = sX * PIXEL_STEP; + pY = sY * PIXEL_STEP; + + if ('deltaY' in e) { + pY = e.deltaY; + } + if ('deltaX' in e) { + pX = e.deltaX; + } + + if ((pX || pY) && e.deltaMode) { + if (e.deltaMode === 1) { // delta in LINE units + pX *= LINE_HEIGHT; + pY *= LINE_HEIGHT; + } else { // delta in PAGE units + pX *= PAGE_HEIGHT; + pY *= PAGE_HEIGHT; + } + } + + // Fall-back if spin cannot be determined + if (pX && !sX) { + sX = (pX < 1) ? -1 : 1; + } + if (pY && !sY) { + sY = (pY < 1) ? -1 : 1; + } + + return { + spinX: sX, + spinY: sY, + pixelX: pX, + pixelY: pY, + }; + }, + handleMouseEnter() { + const swiper = this; + swiper.mouseEntered = true; + }, + handleMouseLeave() { + const swiper = this; + swiper.mouseEntered = false; + }, + handle(event) { + let e = event; + const swiper = this; + const params = swiper.params.mousewheel; + + if (!swiper.mouseEntered && !params.releaseOnEdges) return true; + + if (e.originalEvent) e = e.originalEvent; // jquery fix + let delta = 0; + const rtlFactor = swiper.rtlTranslate ? -1 : 1; + + const data = Mousewheel.normalize(e); + + if (params.forceToAxis) { + if (swiper.isHorizontal()) { + if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = data.pixelX * rtlFactor; + else return true; + } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = data.pixelY; + else return true; + } else { + delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY; + } + + if (delta === 0) return true; + + if (params.invert) delta = -delta; + + if (!swiper.params.freeMode) { + if (Utils.now() - swiper.mousewheel.lastScrollTime > 60) { + if (delta < 0) { + if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) { + swiper.slideNext(); + swiper.emit('scroll', e); + } else if (params.releaseOnEdges) return true; + } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) { + swiper.slidePrev(); + swiper.emit('scroll', e); + } else if (params.releaseOnEdges) return true; + } + swiper.mousewheel.lastScrollTime = (new window.Date()).getTime(); + } else { + // Freemode or scrollContainer: + if (swiper.params.loop) { + swiper.loopFix(); + } + let position = swiper.getTranslate() + (delta * params.sensitivity); + const wasBeginning = swiper.isBeginning; + const wasEnd = swiper.isEnd; + + if (position >= swiper.minTranslate()) position = swiper.minTranslate(); + if (position <= swiper.maxTranslate()) position = swiper.maxTranslate(); + + swiper.setTransition(0); + swiper.setTranslate(position); + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + + if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) { + swiper.updateSlidesClasses(); + } + + if (swiper.params.freeModeSticky) { + clearTimeout(swiper.mousewheel.timeout); + swiper.mousewheel.timeout = Utils.nextTick(() => { + swiper.slideToClosest(); + }, 300); + } + // Emit event + swiper.emit('scroll', e); + + // Stop autoplay + if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop(); + // Return page scroll on edge positions + if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true; + } + + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + return false; + }, + enable() { + const swiper = this; + if (!Mousewheel.event) return false; + if (swiper.mousewheel.enabled) return false; + let target = swiper.$el; + if (swiper.params.mousewheel.eventsTarged !== 'container') { + target = $(swiper.params.mousewheel.eventsTarged); + } + target.on('mouseenter', swiper.mousewheel.handleMouseEnter); + target.on('mouseleave', swiper.mousewheel.handleMouseLeave); + target.on(Mousewheel.event, swiper.mousewheel.handle); + swiper.mousewheel.enabled = true; + return true; + }, + disable() { + const swiper = this; + if (!Mousewheel.event) return false; + if (!swiper.mousewheel.enabled) return false; + let target = swiper.$el; + if (swiper.params.mousewheel.eventsTarged !== 'container') { + target = $(swiper.params.mousewheel.eventsTarged); + } + target.off(Mousewheel.event, swiper.mousewheel.handle); + swiper.mousewheel.enabled = false; + return true; + }, +}; + +var mousewheel = { + name: 'mousewheel', + params: { + mousewheel: { + enabled: false, + releaseOnEdges: false, + invert: false, + forceToAxis: false, + sensitivity: 1, + eventsTarged: 'container', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + mousewheel: { + enabled: false, + enable: Mousewheel.enable.bind(swiper), + disable: Mousewheel.disable.bind(swiper), + handle: Mousewheel.handle.bind(swiper), + handleMouseEnter: Mousewheel.handleMouseEnter.bind(swiper), + handleMouseLeave: Mousewheel.handleMouseLeave.bind(swiper), + lastScrollTime: Utils.now(), + }, + }); + }, + on: { + init() { + const swiper = this; + if (swiper.params.mousewheel.enabled) swiper.mousewheel.enable(); + }, + destroy() { + const swiper = this; + if (swiper.mousewheel.enabled) swiper.mousewheel.disable(); + }, + }, +}; + +const Navigation = { + update() { + // Update Navigation Buttons + const swiper = this; + const params = swiper.params.navigation; + + if (swiper.params.loop) return; + const { $nextEl, $prevEl } = swiper.navigation; + + if ($prevEl && $prevEl.length > 0) { + if (swiper.isBeginning) { + $prevEl.addClass(params.disabledClass); + } else { + $prevEl.removeClass(params.disabledClass); + } + $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + } + if ($nextEl && $nextEl.length > 0) { + if (swiper.isEnd) { + $nextEl.addClass(params.disabledClass); + } else { + $nextEl.removeClass(params.disabledClass); + } + $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + } + }, + onPrevClick(e) { + const swiper = this; + e.preventDefault(); + if (swiper.isBeginning && !swiper.params.loop) return; + swiper.slidePrev(); + }, + onNextClick(e) { + const swiper = this; + e.preventDefault(); + if (swiper.isEnd && !swiper.params.loop) return; + swiper.slideNext(); + }, + init() { + const swiper = this; + const params = swiper.params.navigation; + if (!(params.nextEl || params.prevEl)) return; + + let $nextEl; + let $prevEl; + if (params.nextEl) { + $nextEl = $(params.nextEl); + if ( + swiper.params.uniqueNavElements + && typeof params.nextEl === 'string' + && $nextEl.length > 1 + && swiper.$el.find(params.nextEl).length === 1 + ) { + $nextEl = swiper.$el.find(params.nextEl); + } + } + if (params.prevEl) { + $prevEl = $(params.prevEl); + if ( + swiper.params.uniqueNavElements + && typeof params.prevEl === 'string' + && $prevEl.length > 1 + && swiper.$el.find(params.prevEl).length === 1 + ) { + $prevEl = swiper.$el.find(params.prevEl); + } + } + + if ($nextEl && $nextEl.length > 0) { + $nextEl.on('click', swiper.navigation.onNextClick); + } + if ($prevEl && $prevEl.length > 0) { + $prevEl.on('click', swiper.navigation.onPrevClick); + } + + Utils.extend(swiper.navigation, { + $nextEl, + nextEl: $nextEl && $nextEl[0], + $prevEl, + prevEl: $prevEl && $prevEl[0], + }); + }, + destroy() { + const swiper = this; + const { $nextEl, $prevEl } = swiper.navigation; + if ($nextEl && $nextEl.length) { + $nextEl.off('click', swiper.navigation.onNextClick); + $nextEl.removeClass(swiper.params.navigation.disabledClass); + } + if ($prevEl && $prevEl.length) { + $prevEl.off('click', swiper.navigation.onPrevClick); + $prevEl.removeClass(swiper.params.navigation.disabledClass); + } + }, +}; + +var navigation = { + name: 'navigation', + params: { + navigation: { + nextEl: null, + prevEl: null, + + hideOnClick: false, + disabledClass: 'swiper-button-disabled', + hiddenClass: 'swiper-button-hidden', + lockClass: 'swiper-button-lock', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + navigation: { + init: Navigation.init.bind(swiper), + update: Navigation.update.bind(swiper), + destroy: Navigation.destroy.bind(swiper), + onNextClick: Navigation.onNextClick.bind(swiper), + onPrevClick: Navigation.onPrevClick.bind(swiper), + }, + }); + }, + on: { + init() { + const swiper = this; + swiper.navigation.init(); + swiper.navigation.update(); + }, + toEdge() { + const swiper = this; + swiper.navigation.update(); + }, + fromEdge() { + const swiper = this; + swiper.navigation.update(); + }, + destroy() { + const swiper = this; + swiper.navigation.destroy(); + }, + click(e) { + const swiper = this; + const { $nextEl, $prevEl } = swiper.navigation; + if ( + swiper.params.navigation.hideOnClick + && !$(e.target).is($prevEl) + && !$(e.target).is($nextEl) + ) { + let isHidden; + if ($nextEl) { + isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass); + } else if ($prevEl) { + isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass); + } + if (isHidden === true) { + swiper.emit('navigationShow', swiper); + } else { + swiper.emit('navigationHide', swiper); + } + if ($nextEl) { + $nextEl.toggleClass(swiper.params.navigation.hiddenClass); + } + if ($prevEl) { + $prevEl.toggleClass(swiper.params.navigation.hiddenClass); + } + } + }, + }, +}; + +const Pagination = { + update() { + // Render || Update Pagination bullets/items + const swiper = this; + const rtl = swiper.rtl; + const params = swiper.params.pagination; + if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) return; + const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; + const $el = swiper.pagination.$el; + // Current/Total + let current; + const total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length; + if (swiper.params.loop) { + current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup); + if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) { + current -= (slidesLength - (swiper.loopedSlides * 2)); + } + if (current > total - 1) current -= total; + if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current; + } else if (typeof swiper.snapIndex !== 'undefined') { + current = swiper.snapIndex; + } else { + current = swiper.activeIndex || 0; + } + // Types + if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) { + const bullets = swiper.pagination.bullets; + let firstIndex; + let lastIndex; + let midIndex; + if (params.dynamicBullets) { + swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true); + $el.css(swiper.isHorizontal() ? 'width' : 'height', `${swiper.pagination.bulletSize * (params.dynamicMainBullets + 4)}px`); + if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) { + swiper.pagination.dynamicBulletIndex += (current - swiper.previousIndex); + if (swiper.pagination.dynamicBulletIndex > (params.dynamicMainBullets - 1)) { + swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1; + } else if (swiper.pagination.dynamicBulletIndex < 0) { + swiper.pagination.dynamicBulletIndex = 0; + } + } + firstIndex = current - swiper.pagination.dynamicBulletIndex; + lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1); + midIndex = (lastIndex + firstIndex) / 2; + } + bullets.removeClass(`${params.bulletActiveClass} ${params.bulletActiveClass}-next ${params.bulletActiveClass}-next-next ${params.bulletActiveClass}-prev ${params.bulletActiveClass}-prev-prev ${params.bulletActiveClass}-main`); + if ($el.length > 1) { + bullets.each((index, bullet) => { + const $bullet = $(bullet); + const bulletIndex = $bullet.index(); + if (bulletIndex === current) { + $bullet.addClass(params.bulletActiveClass); + } + if (params.dynamicBullets) { + if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) { + $bullet.addClass(`${params.bulletActiveClass}-main`); + } + if (bulletIndex === firstIndex) { + $bullet + .prev() + .addClass(`${params.bulletActiveClass}-prev`) + .prev() + .addClass(`${params.bulletActiveClass}-prev-prev`); + } + if (bulletIndex === lastIndex) { + $bullet + .next() + .addClass(`${params.bulletActiveClass}-next`) + .next() + .addClass(`${params.bulletActiveClass}-next-next`); + } + } + }); + } else { + const $bullet = bullets.eq(current); + $bullet.addClass(params.bulletActiveClass); + if (params.dynamicBullets) { + const $firstDisplayedBullet = bullets.eq(firstIndex); + const $lastDisplayedBullet = bullets.eq(lastIndex); + for (let i = firstIndex; i <= lastIndex; i += 1) { + bullets.eq(i).addClass(`${params.bulletActiveClass}-main`); + } + $firstDisplayedBullet + .prev() + .addClass(`${params.bulletActiveClass}-prev`) + .prev() + .addClass(`${params.bulletActiveClass}-prev-prev`); + $lastDisplayedBullet + .next() + .addClass(`${params.bulletActiveClass}-next`) + .next() + .addClass(`${params.bulletActiveClass}-next-next`); + } + } + if (params.dynamicBullets) { + const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4); + const bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (midIndex * swiper.pagination.bulletSize); + const offsetProp = rtl ? 'right' : 'left'; + bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`); + } + } + if (params.type === 'fraction') { + $el.find(`.${params.currentClass}`).text(params.formatFractionCurrent(current + 1)); + $el.find(`.${params.totalClass}`).text(params.formatFractionTotal(total)); + } + if (params.type === 'progressbar') { + let progressbarDirection; + if (params.progressbarOpposite) { + progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal'; + } else { + progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical'; + } + const scale = (current + 1) / total; + let scaleX = 1; + let scaleY = 1; + if (progressbarDirection === 'horizontal') { + scaleX = scale; + } else { + scaleY = scale; + } + $el.find(`.${params.progressbarFillClass}`).transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`).transition(swiper.params.speed); + } + if (params.type === 'custom' && params.renderCustom) { + $el.html(params.renderCustom(swiper, current + 1, total)); + swiper.emit('paginationRender', swiper, $el[0]); + } else { + swiper.emit('paginationUpdate', swiper, $el[0]); + } + $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + }, + render() { + // Render Container + const swiper = this; + const params = swiper.params.pagination; + if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) return; + const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; + + const $el = swiper.pagination.$el; + let paginationHTML = ''; + if (params.type === 'bullets') { + const numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length; + for (let i = 0; i < numberOfBullets; i += 1) { + if (params.renderBullet) { + paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass); + } else { + paginationHTML += `<${params.bulletElement} class="${params.bulletClass}">`; + } + } + $el.html(paginationHTML); + swiper.pagination.bullets = $el.find(`.${params.bulletClass}`); + } + if (params.type === 'fraction') { + if (params.renderFraction) { + paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass); + } else { + paginationHTML = `` + + ' / ' + + ``; + } + $el.html(paginationHTML); + } + if (params.type === 'progressbar') { + if (params.renderProgressbar) { + paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass); + } else { + paginationHTML = ``; + } + $el.html(paginationHTML); + } + if (params.type !== 'custom') { + swiper.emit('paginationRender', swiper.pagination.$el[0]); + } + }, + init() { + const swiper = this; + const params = swiper.params.pagination; + if (!params.el) return; + + let $el = $(params.el); + if ($el.length === 0) return; + + if ( + swiper.params.uniqueNavElements + && typeof params.el === 'string' + && $el.length > 1 + && swiper.$el.find(params.el).length === 1 + ) { + $el = swiper.$el.find(params.el); + } + + if (params.type === 'bullets' && params.clickable) { + $el.addClass(params.clickableClass); + } + + $el.addClass(params.modifierClass + params.type); + + if (params.type === 'bullets' && params.dynamicBullets) { + $el.addClass(`${params.modifierClass}${params.type}-dynamic`); + swiper.pagination.dynamicBulletIndex = 0; + if (params.dynamicMainBullets < 1) { + params.dynamicMainBullets = 1; + } + } + if (params.type === 'progressbar' && params.progressbarOpposite) { + $el.addClass(params.progressbarOppositeClass); + } + + if (params.clickable) { + $el.on('click', `.${params.bulletClass}`, function onClick(e) { + e.preventDefault(); + let index = $(this).index() * swiper.params.slidesPerGroup; + if (swiper.params.loop) index += swiper.loopedSlides; + swiper.slideTo(index); + }); + } + + Utils.extend(swiper.pagination, { + $el, + el: $el[0], + }); + }, + destroy() { + const swiper = this; + const params = swiper.params.pagination; + if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) return; + const $el = swiper.pagination.$el; + + $el.removeClass(params.hiddenClass); + $el.removeClass(params.modifierClass + params.type); + if (swiper.pagination.bullets) swiper.pagination.bullets.removeClass(params.bulletActiveClass); + if (params.clickable) { + $el.off('click', `.${params.bulletClass}`); + } + }, +}; + +var pagination = { + name: 'pagination', + params: { + pagination: { + el: null, + bulletElement: 'span', + clickable: false, + hideOnClick: false, + renderBullet: null, + renderProgressbar: null, + renderFraction: null, + renderCustom: null, + progressbarOpposite: false, + type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom' + dynamicBullets: false, + dynamicMainBullets: 1, + formatFractionCurrent: number => number, + formatFractionTotal: number => number, + bulletClass: 'swiper-pagination-bullet', + bulletActiveClass: 'swiper-pagination-bullet-active', + modifierClass: 'swiper-pagination-', // NEW + currentClass: 'swiper-pagination-current', + totalClass: 'swiper-pagination-total', + hiddenClass: 'swiper-pagination-hidden', + progressbarFillClass: 'swiper-pagination-progressbar-fill', + progressbarOppositeClass: 'swiper-pagination-progressbar-opposite', + clickableClass: 'swiper-pagination-clickable', // NEW + lockClass: 'swiper-pagination-lock', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + pagination: { + init: Pagination.init.bind(swiper), + render: Pagination.render.bind(swiper), + update: Pagination.update.bind(swiper), + destroy: Pagination.destroy.bind(swiper), + dynamicBulletIndex: 0, + }, + }); + }, + on: { + init() { + const swiper = this; + swiper.pagination.init(); + swiper.pagination.render(); + swiper.pagination.update(); + }, + activeIndexChange() { + const swiper = this; + if (swiper.params.loop) { + swiper.pagination.update(); + } else if (typeof swiper.snapIndex === 'undefined') { + swiper.pagination.update(); + } + }, + snapIndexChange() { + const swiper = this; + if (!swiper.params.loop) { + swiper.pagination.update(); + } + }, + slidesLengthChange() { + const swiper = this; + if (swiper.params.loop) { + swiper.pagination.render(); + swiper.pagination.update(); + } + }, + snapGridLengthChange() { + const swiper = this; + if (!swiper.params.loop) { + swiper.pagination.render(); + swiper.pagination.update(); + } + }, + destroy() { + const swiper = this; + swiper.pagination.destroy(); + }, + click(e) { + const swiper = this; + if ( + swiper.params.pagination.el + && swiper.params.pagination.hideOnClick + && swiper.pagination.$el.length > 0 + && !$(e.target).hasClass(swiper.params.pagination.bulletClass) + ) { + const isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass); + if (isHidden === true) { + swiper.emit('paginationShow', swiper); + } else { + swiper.emit('paginationHide', swiper); + } + swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass); + } + }, + }, +}; + +const Scrollbar = { + setTranslate() { + const swiper = this; + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + const { scrollbar, rtlTranslate: rtl, progress } = swiper; + const { + dragSize, trackSize, $dragEl, $el, + } = scrollbar; + const params = swiper.params.scrollbar; + + let newSize = dragSize; + let newPos = (trackSize - dragSize) * progress; + if (rtl) { + newPos = -newPos; + if (newPos > 0) { + newSize = dragSize - newPos; + newPos = 0; + } else if (-newPos + dragSize > trackSize) { + newSize = trackSize + newPos; + } + } else if (newPos < 0) { + newSize = dragSize + newPos; + newPos = 0; + } else if (newPos + dragSize > trackSize) { + newSize = trackSize - newPos; + } + if (swiper.isHorizontal()) { + if (Support.transforms3d) { + $dragEl.transform(`translate3d(${newPos}px, 0, 0)`); + } else { + $dragEl.transform(`translateX(${newPos}px)`); + } + $dragEl[0].style.width = `${newSize}px`; + } else { + if (Support.transforms3d) { + $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`); + } else { + $dragEl.transform(`translateY(${newPos}px)`); + } + $dragEl[0].style.height = `${newSize}px`; + } + if (params.hide) { + clearTimeout(swiper.scrollbar.timeout); + $el[0].style.opacity = 1; + swiper.scrollbar.timeout = setTimeout(() => { + $el[0].style.opacity = 0; + $el.transition(400); + }, 1000); + } + }, + setTransition(duration) { + const swiper = this; + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + swiper.scrollbar.$dragEl.transition(duration); + }, + updateSize() { + const swiper = this; + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + + const { scrollbar } = swiper; + const { $dragEl, $el } = scrollbar; + + $dragEl[0].style.width = ''; + $dragEl[0].style.height = ''; + const trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight; + + const divider = swiper.size / swiper.virtualSize; + const moveDivider = divider * (trackSize / swiper.size); + let dragSize; + if (swiper.params.scrollbar.dragSize === 'auto') { + dragSize = trackSize * divider; + } else { + dragSize = parseInt(swiper.params.scrollbar.dragSize, 10); + } + + if (swiper.isHorizontal()) { + $dragEl[0].style.width = `${dragSize}px`; + } else { + $dragEl[0].style.height = `${dragSize}px`; + } + + if (divider >= 1) { + $el[0].style.display = 'none'; + } else { + $el[0].style.display = ''; + } + if (swiper.params.scrollbar.hide) { + $el[0].style.opacity = 0; + } + Utils.extend(scrollbar, { + trackSize, + divider, + moveDivider, + dragSize, + }); + scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass); + }, + setDragPosition(e) { + const swiper = this; + const { scrollbar, rtlTranslate: rtl } = swiper; + const { $el, dragSize, trackSize } = scrollbar; + + let pointerPosition; + if (swiper.isHorizontal()) { + pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX); + } else { + pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY); + } + let positionRatio; + positionRatio = ((pointerPosition) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragSize / 2)) / (trackSize - dragSize); + positionRatio = Math.max(Math.min(positionRatio, 1), 0); + if (rtl) { + positionRatio = 1 - positionRatio; + } + + const position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio); + + swiper.updateProgress(position); + swiper.setTranslate(position); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + }, + onDragStart(e) { + const swiper = this; + const params = swiper.params.scrollbar; + const { scrollbar, $wrapperEl } = swiper; + const { $el, $dragEl } = scrollbar; + swiper.scrollbar.isTouched = true; + e.preventDefault(); + e.stopPropagation(); + + $wrapperEl.transition(100); + $dragEl.transition(100); + scrollbar.setDragPosition(e); + + clearTimeout(swiper.scrollbar.dragTimeout); + + $el.transition(0); + if (params.hide) { + $el.css('opacity', 1); + } + swiper.emit('scrollbarDragStart', e); + }, + onDragMove(e) { + const swiper = this; + const { scrollbar, $wrapperEl } = swiper; + const { $el, $dragEl } = scrollbar; + + if (!swiper.scrollbar.isTouched) return; + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + scrollbar.setDragPosition(e); + $wrapperEl.transition(0); + $el.transition(0); + $dragEl.transition(0); + swiper.emit('scrollbarDragMove', e); + }, + onDragEnd(e) { + const swiper = this; + + const params = swiper.params.scrollbar; + const { scrollbar } = swiper; + const { $el } = scrollbar; + + if (!swiper.scrollbar.isTouched) return; + swiper.scrollbar.isTouched = false; + if (params.hide) { + clearTimeout(swiper.scrollbar.dragTimeout); + swiper.scrollbar.dragTimeout = Utils.nextTick(() => { + $el.css('opacity', 0); + $el.transition(400); + }, 1000); + } + swiper.emit('scrollbarDragEnd', e); + if (params.snapOnRelease) { + swiper.slideToClosest(); + } + }, + enableDraggable() { + const swiper = this; + if (!swiper.params.scrollbar.el) return; + const { + scrollbar, touchEventsTouch, touchEventsDesktop, params, + } = swiper; + const $el = scrollbar.$el; + const target = $el[0]; + const activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false; + const passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false; + if (!Support.touch) { + target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener); + document.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener); + document.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener); + } else { + target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener); + target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener); + target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener); + } + }, + disableDraggable() { + const swiper = this; + if (!swiper.params.scrollbar.el) return; + const { + scrollbar, touchEventsTouch, touchEventsDesktop, params, + } = swiper; + const $el = scrollbar.$el; + const target = $el[0]; + const activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false; + const passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false; + if (!Support.touch) { + target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener); + document.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener); + document.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener); + } else { + target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener); + target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener); + target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener); + } + }, + init() { + const swiper = this; + if (!swiper.params.scrollbar.el) return; + const { scrollbar, $el: $swiperEl } = swiper; + const params = swiper.params.scrollbar; + + let $el = $(params.el); + if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) { + $el = $swiperEl.find(params.el); + } + + let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`); + if ($dragEl.length === 0) { + $dragEl = $(`
            `); + $el.append($dragEl); + } + + Utils.extend(scrollbar, { + $el, + el: $el[0], + $dragEl, + dragEl: $dragEl[0], + }); + + if (params.draggable) { + scrollbar.enableDraggable(); + } + }, + destroy() { + const swiper = this; + swiper.scrollbar.disableDraggable(); + }, +}; + +var scrollbar = { + name: 'scrollbar', + params: { + scrollbar: { + el: null, + dragSize: 'auto', + hide: false, + draggable: false, + snapOnRelease: true, + lockClass: 'swiper-scrollbar-lock', + dragClass: 'swiper-scrollbar-drag', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + scrollbar: { + init: Scrollbar.init.bind(swiper), + destroy: Scrollbar.destroy.bind(swiper), + updateSize: Scrollbar.updateSize.bind(swiper), + setTranslate: Scrollbar.setTranslate.bind(swiper), + setTransition: Scrollbar.setTransition.bind(swiper), + enableDraggable: Scrollbar.enableDraggable.bind(swiper), + disableDraggable: Scrollbar.disableDraggable.bind(swiper), + setDragPosition: Scrollbar.setDragPosition.bind(swiper), + onDragStart: Scrollbar.onDragStart.bind(swiper), + onDragMove: Scrollbar.onDragMove.bind(swiper), + onDragEnd: Scrollbar.onDragEnd.bind(swiper), + isTouched: false, + timeout: null, + dragTimeout: null, + }, + }); + }, + on: { + init() { + const swiper = this; + swiper.scrollbar.init(); + swiper.scrollbar.updateSize(); + swiper.scrollbar.setTranslate(); + }, + update() { + const swiper = this; + swiper.scrollbar.updateSize(); + }, + resize() { + const swiper = this; + swiper.scrollbar.updateSize(); + }, + observerUpdate() { + const swiper = this; + swiper.scrollbar.updateSize(); + }, + setTranslate() { + const swiper = this; + swiper.scrollbar.setTranslate(); + }, + setTransition(duration) { + const swiper = this; + swiper.scrollbar.setTransition(duration); + }, + destroy() { + const swiper = this; + swiper.scrollbar.destroy(); + }, + }, +}; + +const Parallax = { + setTransform(el, progress) { + const swiper = this; + const { rtl } = swiper; + + const $el = $(el); + const rtlFactor = rtl ? -1 : 1; + + const p = $el.attr('data-swiper-parallax') || '0'; + let x = $el.attr('data-swiper-parallax-x'); + let y = $el.attr('data-swiper-parallax-y'); + const scale = $el.attr('data-swiper-parallax-scale'); + const opacity = $el.attr('data-swiper-parallax-opacity'); + + if (x || y) { + x = x || '0'; + y = y || '0'; + } else if (swiper.isHorizontal()) { + x = p; + y = '0'; + } else { + y = p; + x = '0'; + } + + if ((x).indexOf('%') >= 0) { + x = `${parseInt(x, 10) * progress * rtlFactor}%`; + } else { + x = `${x * progress * rtlFactor}px`; + } + if ((y).indexOf('%') >= 0) { + y = `${parseInt(y, 10) * progress}%`; + } else { + y = `${y * progress}px`; + } + + if (typeof opacity !== 'undefined' && opacity !== null) { + const currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress))); + $el[0].style.opacity = currentOpacity; + } + if (typeof scale === 'undefined' || scale === null) { + $el.transform(`translate3d(${x}, ${y}, 0px)`); + } else { + const currentScale = scale - ((scale - 1) * (1 - Math.abs(progress))); + $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`); + } + }, + setTranslate() { + const swiper = this; + const { + $el, slides, progress, snapGrid, + } = swiper; + $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]') + .each((index, el) => { + swiper.parallax.setTransform(el, progress); + }); + slides.each((slideIndex, slideEl) => { + let slideProgress = slideEl.progress; + if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') { + slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1)); + } + slideProgress = Math.min(Math.max(slideProgress, -1), 1); + $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]') + .each((index, el) => { + swiper.parallax.setTransform(el, slideProgress); + }); + }); + }, + setTransition(duration = this.params.speed) { + const swiper = this; + const { $el } = swiper; + $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]') + .each((index, parallaxEl) => { + const $parallaxEl = $(parallaxEl); + let parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration; + if (duration === 0) parallaxDuration = 0; + $parallaxEl.transition(parallaxDuration); + }); + }, +}; + +var parallax = { + name: 'parallax', + params: { + parallax: { + enabled: false, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + parallax: { + setTransform: Parallax.setTransform.bind(swiper), + setTranslate: Parallax.setTranslate.bind(swiper), + setTransition: Parallax.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (!swiper.params.parallax.enabled) return; + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + }, + init() { + const swiper = this; + if (!swiper.params.parallax.enabled) return; + swiper.parallax.setTranslate(); + }, + setTranslate() { + const swiper = this; + if (!swiper.params.parallax.enabled) return; + swiper.parallax.setTranslate(); + }, + setTransition(duration) { + const swiper = this; + if (!swiper.params.parallax.enabled) return; + swiper.parallax.setTransition(duration); + }, + }, +}; + +const Zoom = { + // Calc Scale From Multi-touches + getDistanceBetweenTouches(e) { + if (e.targetTouches.length < 2) return 1; + const x1 = e.targetTouches[0].pageX; + const y1 = e.targetTouches[0].pageY; + const x2 = e.targetTouches[1].pageX; + const y2 = e.targetTouches[1].pageY; + const distance = Math.sqrt(((x2 - x1) ** 2) + ((y2 - y1) ** 2)); + return distance; + }, + // Events + onGestureStart(e) { + const swiper = this; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + const { gesture } = zoom; + zoom.fakeGestureTouched = false; + zoom.fakeGestureMoved = false; + if (!Support.gestures) { + if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) { + return; + } + zoom.fakeGestureTouched = true; + gesture.scaleStart = Zoom.getDistanceBetweenTouches(e); + } + if (!gesture.$slideEl || !gesture.$slideEl.length) { + gesture.$slideEl = $(e.target).closest('.swiper-slide'); + if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + if (gesture.$imageWrapEl.length === 0) { + gesture.$imageEl = undefined; + return; + } + } + gesture.$imageEl.transition(0); + swiper.zoom.isScaling = true; + }, + onGestureChange(e) { + const swiper = this; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + const { gesture } = zoom; + if (!Support.gestures) { + if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) { + return; + } + zoom.fakeGestureMoved = true; + gesture.scaleMove = Zoom.getDistanceBetweenTouches(e); + } + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + if (Support.gestures) { + zoom.scale = e.scale * zoom.currentScale; + } else { + zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale; + } + if (zoom.scale > gesture.maxRatio) { + zoom.scale = (gesture.maxRatio - 1) + (((zoom.scale - gesture.maxRatio) + 1) ** 0.5); + } + if (zoom.scale < params.minRatio) { + zoom.scale = (params.minRatio + 1) - (((params.minRatio - zoom.scale) + 1) ** 0.5); + } + gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`); + }, + onGestureEnd(e) { + const swiper = this; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + const { gesture } = zoom; + if (!Support.gestures) { + if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) { + return; + } + if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) { + return; + } + zoom.fakeGestureTouched = false; + zoom.fakeGestureMoved = false; + } + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio); + gesture.$imageEl.transition(swiper.params.speed).transform(`translate3d(0,0,0) scale(${zoom.scale})`); + zoom.currentScale = zoom.scale; + zoom.isScaling = false; + if (zoom.scale === 1) gesture.$slideEl = undefined; + }, + onTouchStart(e) { + const swiper = this; + const zoom = swiper.zoom; + const { gesture, image } = zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + if (image.isTouched) return; + if (Device.android) e.preventDefault(); + image.isTouched = true; + image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + }, + onTouchMove(e) { + const swiper = this; + const zoom = swiper.zoom; + const { gesture, image, velocity } = zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + swiper.allowClick = false; + if (!image.isTouched || !gesture.$slideEl) return; + + if (!image.isMoved) { + image.width = gesture.$imageEl[0].offsetWidth; + image.height = gesture.$imageEl[0].offsetHeight; + image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0; + image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0; + gesture.slideWidth = gesture.$slideEl[0].offsetWidth; + gesture.slideHeight = gesture.$slideEl[0].offsetHeight; + gesture.$imageWrapEl.transition(0); + if (swiper.rtl) { + image.startX = -image.startX; + image.startY = -image.startY; + } + } + // Define if we need image drag + const scaledWidth = image.width * zoom.scale; + const scaledHeight = image.height * zoom.scale; + + if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return; + + image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0); + image.maxX = -image.minX; + image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0); + image.maxY = -image.minY; + + image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + + if (!image.isMoved && !zoom.isScaling) { + if ( + swiper.isHorizontal() + && ( + (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x) + || (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x) + ) + ) { + image.isTouched = false; + return; + } if ( + !swiper.isHorizontal() + && ( + (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y) + || (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y) + ) + ) { + image.isTouched = false; + return; + } + } + e.preventDefault(); + e.stopPropagation(); + + image.isMoved = true; + image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX; + image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY; + + if (image.currentX < image.minX) { + image.currentX = (image.minX + 1) - (((image.minX - image.currentX) + 1) ** 0.8); + } + if (image.currentX > image.maxX) { + image.currentX = (image.maxX - 1) + (((image.currentX - image.maxX) + 1) ** 0.8); + } + + if (image.currentY < image.minY) { + image.currentY = (image.minY + 1) - (((image.minY - image.currentY) + 1) ** 0.8); + } + if (image.currentY > image.maxY) { + image.currentY = (image.maxY - 1) + (((image.currentY - image.maxY) + 1) ** 0.8); + } + + // Velocity + if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x; + if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y; + if (!velocity.prevTime) velocity.prevTime = Date.now(); + velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2; + velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2; + if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0; + if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0; + velocity.prevPositionX = image.touchesCurrent.x; + velocity.prevPositionY = image.touchesCurrent.y; + velocity.prevTime = Date.now(); + + gesture.$imageWrapEl.transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`); + }, + onTouchEnd() { + const swiper = this; + const zoom = swiper.zoom; + const { gesture, image, velocity } = zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + if (!image.isTouched || !image.isMoved) { + image.isTouched = false; + image.isMoved = false; + return; + } + image.isTouched = false; + image.isMoved = false; + let momentumDurationX = 300; + let momentumDurationY = 300; + const momentumDistanceX = velocity.x * momentumDurationX; + const newPositionX = image.currentX + momentumDistanceX; + const momentumDistanceY = velocity.y * momentumDurationY; + const newPositionY = image.currentY + momentumDistanceY; + + // Fix duration + if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); + if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); + const momentumDuration = Math.max(momentumDurationX, momentumDurationY); + + image.currentX = newPositionX; + image.currentY = newPositionY; + + // Define if we need image drag + const scaledWidth = image.width * zoom.scale; + const scaledHeight = image.height * zoom.scale; + image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0); + image.maxX = -image.minX; + image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0); + image.maxY = -image.minY; + image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX); + image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY); + + gesture.$imageWrapEl.transition(momentumDuration).transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`); + }, + onTransitionEnd() { + const swiper = this; + const zoom = swiper.zoom; + const { gesture } = zoom; + if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) { + gesture.$imageEl.transform('translate3d(0,0,0) scale(1)'); + gesture.$imageWrapEl.transform('translate3d(0,0,0)'); + + zoom.scale = 1; + zoom.currentScale = 1; + + gesture.$slideEl = undefined; + gesture.$imageEl = undefined; + gesture.$imageWrapEl = undefined; + } + }, + // Toggle Zoom + toggle(e) { + const swiper = this; + const zoom = swiper.zoom; + + if (zoom.scale && zoom.scale !== 1) { + // Zoom Out + zoom.out(); + } else { + // Zoom In + zoom.in(e); + } + }, + in(e) { + const swiper = this; + + const zoom = swiper.zoom; + const params = swiper.params.zoom; + const { gesture, image } = zoom; + + if (!gesture.$slideEl) { + gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex); + gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + } + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + + gesture.$slideEl.addClass(`${params.zoomedSlideClass}`); + + let touchX; + let touchY; + let offsetX; + let offsetY; + let diffX; + let diffY; + let translateX; + let translateY; + let imageWidth; + let imageHeight; + let scaledWidth; + let scaledHeight; + let translateMinX; + let translateMinY; + let translateMaxX; + let translateMaxY; + let slideWidth; + let slideHeight; + + if (typeof image.touchesStart.x === 'undefined' && e) { + touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX; + touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY; + } else { + touchX = image.touchesStart.x; + touchY = image.touchesStart.y; + } + + zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + if (e) { + slideWidth = gesture.$slideEl[0].offsetWidth; + slideHeight = gesture.$slideEl[0].offsetHeight; + offsetX = gesture.$slideEl.offset().left; + offsetY = gesture.$slideEl.offset().top; + diffX = (offsetX + (slideWidth / 2)) - touchX; + diffY = (offsetY + (slideHeight / 2)) - touchY; + + imageWidth = gesture.$imageEl[0].offsetWidth; + imageHeight = gesture.$imageEl[0].offsetHeight; + scaledWidth = imageWidth * zoom.scale; + scaledHeight = imageHeight * zoom.scale; + + translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0); + translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0); + translateMaxX = -translateMinX; + translateMaxY = -translateMinY; + + translateX = diffX * zoom.scale; + translateY = diffY * zoom.scale; + + if (translateX < translateMinX) { + translateX = translateMinX; + } + if (translateX > translateMaxX) { + translateX = translateMaxX; + } + + if (translateY < translateMinY) { + translateY = translateMinY; + } + if (translateY > translateMaxY) { + translateY = translateMaxY; + } + } else { + translateX = 0; + translateY = 0; + } + gesture.$imageWrapEl.transition(300).transform(`translate3d(${translateX}px, ${translateY}px,0)`); + gesture.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${zoom.scale})`); + }, + out() { + const swiper = this; + + const zoom = swiper.zoom; + const params = swiper.params.zoom; + const { gesture } = zoom; + + if (!gesture.$slideEl) { + gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex); + gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas'); + gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`); + } + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + + zoom.scale = 1; + zoom.currentScale = 1; + gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)'); + gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)'); + gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`); + gesture.$slideEl = undefined; + }, + // Attach/Detach Events + enable() { + const swiper = this; + const zoom = swiper.zoom; + if (zoom.enabled) return; + zoom.enabled = true; + + const passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false; + + // Scale image + if (Support.gestures) { + swiper.$wrapperEl.on('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener); + swiper.$wrapperEl.on('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener); + swiper.$wrapperEl.on('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener); + } else if (swiper.touchEvents.start === 'touchstart') { + swiper.$wrapperEl.on(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener); + swiper.$wrapperEl.on(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener); + swiper.$wrapperEl.on(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener); + } + + // Move image + swiper.$wrapperEl.on(swiper.touchEvents.move, `.${swiper.params.zoom.containerClass}`, zoom.onTouchMove); + }, + disable() { + const swiper = this; + const zoom = swiper.zoom; + if (!zoom.enabled) return; + + swiper.zoom.enabled = false; + + const passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false; + + // Scale image + if (Support.gestures) { + swiper.$wrapperEl.off('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener); + swiper.$wrapperEl.off('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener); + swiper.$wrapperEl.off('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener); + } else if (swiper.touchEvents.start === 'touchstart') { + swiper.$wrapperEl.off(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener); + swiper.$wrapperEl.off(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener); + swiper.$wrapperEl.off(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener); + } + + // Move image + swiper.$wrapperEl.off(swiper.touchEvents.move, `.${swiper.params.zoom.containerClass}`, zoom.onTouchMove); + }, +}; + +var zoom = { + name: 'zoom', + params: { + zoom: { + enabled: false, + maxRatio: 3, + minRatio: 1, + toggle: true, + containerClass: 'swiper-zoom-container', + zoomedSlideClass: 'swiper-slide-zoomed', + }, + }, + create() { + const swiper = this; + const zoom = { + enabled: false, + scale: 1, + currentScale: 1, + isScaling: false, + gesture: { + $slideEl: undefined, + slideWidth: undefined, + slideHeight: undefined, + $imageEl: undefined, + $imageWrapEl: undefined, + maxRatio: 3, + }, + image: { + isTouched: undefined, + isMoved: undefined, + currentX: undefined, + currentY: undefined, + minX: undefined, + minY: undefined, + maxX: undefined, + maxY: undefined, + width: undefined, + height: undefined, + startX: undefined, + startY: undefined, + touchesStart: {}, + touchesCurrent: {}, + }, + velocity: { + x: undefined, + y: undefined, + prevPositionX: undefined, + prevPositionY: undefined, + prevTime: undefined, + }, + }; + + ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach((methodName) => { + zoom[methodName] = Zoom[methodName].bind(swiper); + }); + Utils.extend(swiper, { + zoom, + }); + + let scale = 1; + Object.defineProperty(swiper.zoom, 'scale', { + get() { + return scale; + }, + set(value) { + if (scale !== value) { + const imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined; + const slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined; + swiper.emit('zoomChange', value, imageEl, slideEl); + } + scale = value; + }, + }); + }, + on: { + init() { + const swiper = this; + if (swiper.params.zoom.enabled) { + swiper.zoom.enable(); + } + }, + destroy() { + const swiper = this; + swiper.zoom.disable(); + }, + touchStart(e) { + const swiper = this; + if (!swiper.zoom.enabled) return; + swiper.zoom.onTouchStart(e); + }, + touchEnd(e) { + const swiper = this; + if (!swiper.zoom.enabled) return; + swiper.zoom.onTouchEnd(e); + }, + doubleTap(e) { + const swiper = this; + if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) { + swiper.zoom.toggle(e); + } + }, + transitionEnd() { + const swiper = this; + if (swiper.zoom.enabled && swiper.params.zoom.enabled) { + swiper.zoom.onTransitionEnd(); + } + }, + }, +}; + +const Lazy = { + loadInSlide(index, loadInDuplicate = true) { + const swiper = this; + const params = swiper.params.lazy; + if (typeof index === 'undefined') return; + if (swiper.slides.length === 0) return; + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + + const $slideEl = isVirtual + ? swiper.$wrapperEl.children(`.${swiper.params.slideClass}[data-swiper-slide-index="${index}"]`) + : swiper.slides.eq(index); + + let $images = $slideEl.find(`.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`); + if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) { + $images = $images.add($slideEl[0]); + } + if ($images.length === 0) return; + + $images.each((imageIndex, imageEl) => { + const $imageEl = $(imageEl); + $imageEl.addClass(params.loadingClass); + + const background = $imageEl.attr('data-background'); + const src = $imageEl.attr('data-src'); + const srcset = $imageEl.attr('data-srcset'); + const sizes = $imageEl.attr('data-sizes'); + + swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, () => { + if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) return; + if (background) { + $imageEl.css('background-image', `url("${background}")`); + $imageEl.removeAttr('data-background'); + } else { + if (srcset) { + $imageEl.attr('srcset', srcset); + $imageEl.removeAttr('data-srcset'); + } + if (sizes) { + $imageEl.attr('sizes', sizes); + $imageEl.removeAttr('data-sizes'); + } + if (src) { + $imageEl.attr('src', src); + $imageEl.removeAttr('data-src'); + } + } + + $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass); + $slideEl.find(`.${params.preloaderClass}`).remove(); + if (swiper.params.loop && loadInDuplicate) { + const slideOriginalIndex = $slideEl.attr('data-swiper-slide-index'); + if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) { + const originalSlide = swiper.$wrapperEl.children(`[data-swiper-slide-index="${slideOriginalIndex}"]:not(.${swiper.params.slideDuplicateClass})`); + swiper.lazy.loadInSlide(originalSlide.index(), false); + } else { + const duplicatedSlide = swiper.$wrapperEl.children(`.${swiper.params.slideDuplicateClass}[data-swiper-slide-index="${slideOriginalIndex}"]`); + swiper.lazy.loadInSlide(duplicatedSlide.index(), false); + } + } + swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]); + }); + + swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]); + }); + }, + load() { + const swiper = this; + const { + $wrapperEl, params: swiperParams, slides, activeIndex, + } = swiper; + const isVirtual = swiper.virtual && swiperParams.virtual.enabled; + const params = swiperParams.lazy; + + let slidesPerView = swiperParams.slidesPerView; + if (slidesPerView === 'auto') { + slidesPerView = 0; + } + + function slideExist(index) { + if (isVirtual) { + if ($wrapperEl.children(`.${swiperParams.slideClass}[data-swiper-slide-index="${index}"]`).length) { + return true; + } + } else if (slides[index]) return true; + return false; + } + function slideIndex(slideEl) { + if (isVirtual) { + return $(slideEl).attr('data-swiper-slide-index'); + } + return $(slideEl).index(); + } + + if (!swiper.lazy.initialImageLoaded) swiper.lazy.initialImageLoaded = true; + if (swiper.params.watchSlidesVisibility) { + $wrapperEl.children(`.${swiperParams.slideVisibleClass}`).each((elIndex, slideEl) => { + const index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index(); + swiper.lazy.loadInSlide(index); + }); + } else if (slidesPerView > 1) { + for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) { + if (slideExist(i)) swiper.lazy.loadInSlide(i); + } + } else { + swiper.lazy.loadInSlide(activeIndex); + } + if (params.loadPrevNext) { + if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) { + const amount = params.loadPrevNextAmount; + const spv = slidesPerView; + const maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length); + const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0); + // Next Slides + for (let i = activeIndex + slidesPerView; i < maxIndex; i += 1) { + if (slideExist(i)) swiper.lazy.loadInSlide(i); + } + // Prev Slides + for (let i = minIndex; i < activeIndex; i += 1) { + if (slideExist(i)) swiper.lazy.loadInSlide(i); + } + } else { + const nextSlide = $wrapperEl.children(`.${swiperParams.slideNextClass}`); + if (nextSlide.length > 0) swiper.lazy.loadInSlide(slideIndex(nextSlide)); + + const prevSlide = $wrapperEl.children(`.${swiperParams.slidePrevClass}`); + if (prevSlide.length > 0) swiper.lazy.loadInSlide(slideIndex(prevSlide)); + } + } + }, +}; + +var lazy = { + name: 'lazy', + params: { + lazy: { + enabled: false, + loadPrevNext: false, + loadPrevNextAmount: 1, + loadOnTransitionStart: false, + + elementClass: 'swiper-lazy', + loadingClass: 'swiper-lazy-loading', + loadedClass: 'swiper-lazy-loaded', + preloaderClass: 'swiper-lazy-preloader', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + lazy: { + initialImageLoaded: false, + load: Lazy.load.bind(swiper), + loadInSlide: Lazy.loadInSlide.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (swiper.params.lazy.enabled && swiper.params.preloadImages) { + swiper.params.preloadImages = false; + } + }, + init() { + const swiper = this; + if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) { + swiper.lazy.load(); + } + }, + scroll() { + const swiper = this; + if (swiper.params.freeMode && !swiper.params.freeModeSticky) { + swiper.lazy.load(); + } + }, + resize() { + const swiper = this; + if (swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + }, + scrollbarDragMove() { + const swiper = this; + if (swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + }, + transitionStart() { + const swiper = this; + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) { + swiper.lazy.load(); + } + } + }, + transitionEnd() { + const swiper = this; + if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) { + swiper.lazy.load(); + } + }, + }, +}; + +/* eslint no-bitwise: ["error", { "allow": [">>"] }] */ + +const Controller = { + LinearSpline: function LinearSpline(x, y) { + const binarySearch = (function search() { + let maxIndex; + let minIndex; + let guess; + return (array, val) => { + minIndex = -1; + maxIndex = array.length; + while (maxIndex - minIndex > 1) { + guess = maxIndex + minIndex >> 1; + if (array[guess] <= val) { + minIndex = guess; + } else { + maxIndex = guess; + } + } + return maxIndex; + }; + }()); + this.x = x; + this.y = y; + this.lastIndex = x.length - 1; + // Given an x value (x2), return the expected y2 value: + // (x1,y1) is the known point before given value, + // (x3,y3) is the known point after given value. + let i1; + let i3; + + this.interpolate = function interpolate(x2) { + if (!x2) return 0; + + // Get the indexes of x1 and x3 (the array indexes before and after given x2): + i3 = binarySearch(this.x, x2); + i1 = i3 - 1; + + // We have our indexes i1 & i3, so we can calculate already: + // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1 + return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1]; + }; + return this; + }, + // xxx: for now i will just save one spline function to to + getInterpolateFunction(c) { + const swiper = this; + if (!swiper.controller.spline) { + swiper.controller.spline = swiper.params.loop + ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid) + : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid); + } + }, + setTranslate(setTranslate, byController) { + const swiper = this; + const controlled = swiper.controller.control; + let multiplier; + let controlledTranslate; + function setControlledTranslate(c) { + // this will create an Interpolate function based on the snapGrids + // x is the Grid of the scrolled scroller and y will be the controlled scroller + // it makes sense to create this only once and recall it for the interpolation + // the function does a lot of value caching for performance + const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate; + if (swiper.params.controller.by === 'slide') { + swiper.controller.getInterpolateFunction(c); + // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid + // but it did not work out + controlledTranslate = -swiper.controller.spline.interpolate(-translate); + } + + if (!controlledTranslate || swiper.params.controller.by === 'container') { + multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate()); + controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate(); + } + + if (swiper.params.controller.inverse) { + controlledTranslate = c.maxTranslate() - controlledTranslate; + } + c.updateProgress(controlledTranslate); + c.setTranslate(controlledTranslate, swiper); + c.updateActiveIndex(); + c.updateSlidesClasses(); + } + if (Array.isArray(controlled)) { + for (let i = 0; i < controlled.length; i += 1) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTranslate(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTranslate(controlled); + } + }, + setTransition(duration, byController) { + const swiper = this; + const controlled = swiper.controller.control; + let i; + function setControlledTransition(c) { + c.setTransition(duration, swiper); + if (duration !== 0) { + c.transitionStart(); + if (c.params.autoHeight) { + Utils.nextTick(() => { + c.updateAutoHeight(); + }); + } + c.$wrapperEl.transitionEnd(() => { + if (!controlled) return; + if (c.params.loop && swiper.params.controller.by === 'slide') { + c.loopFix(); + } + c.transitionEnd(); + }); + } + } + if (Array.isArray(controlled)) { + for (i = 0; i < controlled.length; i += 1) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTransition(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTransition(controlled); + } + }, +}; +var controller = { + name: 'controller', + params: { + controller: { + control: undefined, + inverse: false, + by: 'slide', // or 'container' + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + controller: { + control: swiper.params.controller.control, + getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper), + setTranslate: Controller.setTranslate.bind(swiper), + setTransition: Controller.setTransition.bind(swiper), + }, + }); + }, + on: { + update() { + const swiper = this; + if (!swiper.controller.control) return; + if (swiper.controller.spline) { + swiper.controller.spline = undefined; + delete swiper.controller.spline; + } + }, + resize() { + const swiper = this; + if (!swiper.controller.control) return; + if (swiper.controller.spline) { + swiper.controller.spline = undefined; + delete swiper.controller.spline; + } + }, + observerUpdate() { + const swiper = this; + if (!swiper.controller.control) return; + if (swiper.controller.spline) { + swiper.controller.spline = undefined; + delete swiper.controller.spline; + } + }, + setTranslate(translate, byController) { + const swiper = this; + if (!swiper.controller.control) return; + swiper.controller.setTranslate(translate, byController); + }, + setTransition(duration, byController) { + const swiper = this; + if (!swiper.controller.control) return; + swiper.controller.setTransition(duration, byController); + }, + }, +}; + +const a11y = { + makeElFocusable($el) { + $el.attr('tabIndex', '0'); + return $el; + }, + addElRole($el, role) { + $el.attr('role', role); + return $el; + }, + addElLabel($el, label) { + $el.attr('aria-label', label); + return $el; + }, + disableEl($el) { + $el.attr('aria-disabled', true); + return $el; + }, + enableEl($el) { + $el.attr('aria-disabled', false); + return $el; + }, + onEnterKey(e) { + const swiper = this; + const params = swiper.params.a11y; + if (e.keyCode !== 13) return; + const $targetEl = $(e.target); + if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) { + if (!(swiper.isEnd && !swiper.params.loop)) { + swiper.slideNext(); + } + if (swiper.isEnd) { + swiper.a11y.notify(params.lastSlideMessage); + } else { + swiper.a11y.notify(params.nextSlideMessage); + } + } + if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) { + if (!(swiper.isBeginning && !swiper.params.loop)) { + swiper.slidePrev(); + } + if (swiper.isBeginning) { + swiper.a11y.notify(params.firstSlideMessage); + } else { + swiper.a11y.notify(params.prevSlideMessage); + } + } + if (swiper.pagination && $targetEl.is(`.${swiper.params.pagination.bulletClass}`)) { + $targetEl[0].click(); + } + }, + notify(message) { + const swiper = this; + const notification = swiper.a11y.liveRegion; + if (notification.length === 0) return; + notification.html(''); + notification.html(message); + }, + updateNavigation() { + const swiper = this; + + if (swiper.params.loop) return; + const { $nextEl, $prevEl } = swiper.navigation; + + if ($prevEl && $prevEl.length > 0) { + if (swiper.isBeginning) { + swiper.a11y.disableEl($prevEl); + } else { + swiper.a11y.enableEl($prevEl); + } + } + if ($nextEl && $nextEl.length > 0) { + if (swiper.isEnd) { + swiper.a11y.disableEl($nextEl); + } else { + swiper.a11y.enableEl($nextEl); + } + } + }, + updatePagination() { + const swiper = this; + const params = swiper.params.a11y; + if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) { + swiper.pagination.bullets.each((bulletIndex, bulletEl) => { + const $bulletEl = $(bulletEl); + swiper.a11y.makeElFocusable($bulletEl); + swiper.a11y.addElRole($bulletEl, 'button'); + swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/{{index}}/, $bulletEl.index() + 1)); + }); + } + }, + init() { + const swiper = this; + + swiper.$el.append(swiper.a11y.liveRegion); + + // Navigation + const params = swiper.params.a11y; + let $nextEl; + let $prevEl; + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + if ($nextEl) { + swiper.a11y.makeElFocusable($nextEl); + swiper.a11y.addElRole($nextEl, 'button'); + swiper.a11y.addElLabel($nextEl, params.nextSlideMessage); + $nextEl.on('keydown', swiper.a11y.onEnterKey); + } + if ($prevEl) { + swiper.a11y.makeElFocusable($prevEl); + swiper.a11y.addElRole($prevEl, 'button'); + swiper.a11y.addElLabel($prevEl, params.prevSlideMessage); + $prevEl.on('keydown', swiper.a11y.onEnterKey); + } + + // Pagination + if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) { + swiper.pagination.$el.on('keydown', `.${swiper.params.pagination.bulletClass}`, swiper.a11y.onEnterKey); + } + }, + destroy() { + const swiper = this; + if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) swiper.a11y.liveRegion.remove(); + + let $nextEl; + let $prevEl; + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + if ($nextEl) { + $nextEl.off('keydown', swiper.a11y.onEnterKey); + } + if ($prevEl) { + $prevEl.off('keydown', swiper.a11y.onEnterKey); + } + + // Pagination + if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) { + swiper.pagination.$el.off('keydown', `.${swiper.params.pagination.bulletClass}`, swiper.a11y.onEnterKey); + } + }, +}; +var a11y$1 = { + name: 'a11y', + params: { + a11y: { + enabled: true, + notificationClass: 'swiper-notification', + prevSlideMessage: 'Previous slide', + nextSlideMessage: 'Next slide', + firstSlideMessage: 'This is the first slide', + lastSlideMessage: 'This is the last slide', + paginationBulletMessage: 'Go to slide {{index}}', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + a11y: { + liveRegion: $(``), + }, + }); + Object.keys(a11y).forEach((methodName) => { + swiper.a11y[methodName] = a11y[methodName].bind(swiper); + }); + }, + on: { + init() { + const swiper = this; + if (!swiper.params.a11y.enabled) return; + swiper.a11y.init(); + swiper.a11y.updateNavigation(); + }, + toEdge() { + const swiper = this; + if (!swiper.params.a11y.enabled) return; + swiper.a11y.updateNavigation(); + }, + fromEdge() { + const swiper = this; + if (!swiper.params.a11y.enabled) return; + swiper.a11y.updateNavigation(); + }, + paginationUpdate() { + const swiper = this; + if (!swiper.params.a11y.enabled) return; + swiper.a11y.updatePagination(); + }, + destroy() { + const swiper = this; + if (!swiper.params.a11y.enabled) return; + swiper.a11y.destroy(); + }, + }, +}; + +const History = { + init() { + const swiper = this; + if (!swiper.params.history) return; + if (!window.history || !window.history.pushState) { + swiper.params.history.enabled = false; + swiper.params.hashNavigation.enabled = true; + return; + } + const history = swiper.history; + history.initialized = true; + history.paths = History.getPathValues(); + if (!history.paths.key && !history.paths.value) return; + history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit); + if (!swiper.params.history.replaceState) { + window.addEventListener('popstate', swiper.history.setHistoryPopState); + } + }, + destroy() { + const swiper = this; + if (!swiper.params.history.replaceState) { + window.removeEventListener('popstate', swiper.history.setHistoryPopState); + } + }, + setHistoryPopState() { + const swiper = this; + swiper.history.paths = History.getPathValues(); + swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false); + }, + getPathValues() { + const pathArray = window.location.pathname.slice(1).split('/').filter(part => part !== ''); + const total = pathArray.length; + const key = pathArray[total - 2]; + const value = pathArray[total - 1]; + return { key, value }; + }, + setHistory(key, index) { + const swiper = this; + if (!swiper.history.initialized || !swiper.params.history.enabled) return; + const slide = swiper.slides.eq(index); + let value = History.slugify(slide.attr('data-history')); + if (!window.location.pathname.includes(key)) { + value = `${key}/${value}`; + } + const currentState = window.history.state; + if (currentState && currentState.value === value) { + return; + } + if (swiper.params.history.replaceState) { + window.history.replaceState({ value }, null, value); + } else { + window.history.pushState({ value }, null, value); + } + }, + slugify(text) { + return text.toString() + .replace(/\s+/g, '-') + .replace(/[^\w-]+/g, '') + .replace(/--+/g, '-') + .replace(/^-+/, '') + .replace(/-+$/, ''); + }, + scrollToSlide(speed, value, runCallbacks) { + const swiper = this; + if (value) { + for (let i = 0, length = swiper.slides.length; i < length; i += 1) { + const slide = swiper.slides.eq(i); + const slideHistory = History.slugify(slide.attr('data-history')); + if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) { + const index = slide.index(); + swiper.slideTo(index, speed, runCallbacks); + } + } + } else { + swiper.slideTo(0, speed, runCallbacks); + } + }, +}; + +var history = { + name: 'history', + params: { + history: { + enabled: false, + replaceState: false, + key: 'slides', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + history: { + init: History.init.bind(swiper), + setHistory: History.setHistory.bind(swiper), + setHistoryPopState: History.setHistoryPopState.bind(swiper), + scrollToSlide: History.scrollToSlide.bind(swiper), + destroy: History.destroy.bind(swiper), + }, + }); + }, + on: { + init() { + const swiper = this; + if (swiper.params.history.enabled) { + swiper.history.init(); + } + }, + destroy() { + const swiper = this; + if (swiper.params.history.enabled) { + swiper.history.destroy(); + } + }, + transitionEnd() { + const swiper = this; + if (swiper.history.initialized) { + swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex); + } + }, + }, +}; + +const HashNavigation = { + onHashCange() { + const swiper = this; + const newHash = document.location.hash.replace('#', ''); + const activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash'); + if (newHash !== activeSlideHash) { + const newIndex = swiper.$wrapperEl.children(`.${swiper.params.slideClass}[data-hash="${newHash}"]`).index(); + if (typeof newIndex === 'undefined') return; + swiper.slideTo(newIndex); + } + }, + setHash() { + const swiper = this; + if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) return; + if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) { + window.history.replaceState(null, null, (`#${swiper.slides.eq(swiper.activeIndex).attr('data-hash')}` || '')); + } else { + const slide = swiper.slides.eq(swiper.activeIndex); + const hash = slide.attr('data-hash') || slide.attr('data-history'); + document.location.hash = hash || ''; + } + }, + init() { + const swiper = this; + if (!swiper.params.hashNavigation.enabled || (swiper.params.history && swiper.params.history.enabled)) return; + swiper.hashNavigation.initialized = true; + const hash = document.location.hash.replace('#', ''); + if (hash) { + const speed = 0; + for (let i = 0, length = swiper.slides.length; i < length; i += 1) { + const slide = swiper.slides.eq(i); + const slideHash = slide.attr('data-hash') || slide.attr('data-history'); + if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) { + const index = slide.index(); + swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true); + } + } + } + if (swiper.params.hashNavigation.watchState) { + $(window).on('hashchange', swiper.hashNavigation.onHashCange); + } + }, + destroy() { + const swiper = this; + if (swiper.params.hashNavigation.watchState) { + $(window).off('hashchange', swiper.hashNavigation.onHashCange); + } + }, +}; +var hashNavigation = { + name: 'hash-navigation', + params: { + hashNavigation: { + enabled: false, + replaceState: false, + watchState: false, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + hashNavigation: { + initialized: false, + init: HashNavigation.init.bind(swiper), + destroy: HashNavigation.destroy.bind(swiper), + setHash: HashNavigation.setHash.bind(swiper), + onHashCange: HashNavigation.onHashCange.bind(swiper), + }, + }); + }, + on: { + init() { + const swiper = this; + if (swiper.params.hashNavigation.enabled) { + swiper.hashNavigation.init(); + } + }, + destroy() { + const swiper = this; + if (swiper.params.hashNavigation.enabled) { + swiper.hashNavigation.destroy(); + } + }, + transitionEnd() { + const swiper = this; + if (swiper.hashNavigation.initialized) { + swiper.hashNavigation.setHash(); + } + }, + }, +}; + +/* eslint no-underscore-dangle: "off" */ + +const Autoplay = { + run() { + const swiper = this; + const $activeSlideEl = swiper.slides.eq(swiper.activeIndex); + let delay = swiper.params.autoplay.delay; + if ($activeSlideEl.attr('data-swiper-autoplay')) { + delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay; + } + swiper.autoplay.timeout = Utils.nextTick(() => { + if (swiper.params.autoplay.reverseDirection) { + if (swiper.params.loop) { + swiper.loopFix(); + swiper.slidePrev(swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else if (!swiper.isBeginning) { + swiper.slidePrev(swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else { + swiper.autoplay.stop(); + } + } else if (swiper.params.loop) { + swiper.loopFix(); + swiper.slideNext(swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else if (!swiper.isEnd) { + swiper.slideNext(swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + swiper.slideTo(0, swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else { + swiper.autoplay.stop(); + } + }, delay); + }, + start() { + const swiper = this; + if (typeof swiper.autoplay.timeout !== 'undefined') return false; + if (swiper.autoplay.running) return false; + swiper.autoplay.running = true; + swiper.emit('autoplayStart'); + swiper.autoplay.run(); + return true; + }, + stop() { + const swiper = this; + if (!swiper.autoplay.running) return false; + if (typeof swiper.autoplay.timeout === 'undefined') return false; + + if (swiper.autoplay.timeout) { + clearTimeout(swiper.autoplay.timeout); + swiper.autoplay.timeout = undefined; + } + swiper.autoplay.running = false; + swiper.emit('autoplayStop'); + return true; + }, + pause(speed) { + const swiper = this; + if (!swiper.autoplay.running) return; + if (swiper.autoplay.paused) return; + if (swiper.autoplay.timeout) clearTimeout(swiper.autoplay.timeout); + swiper.autoplay.paused = true; + if (speed === 0 || !swiper.params.autoplay.waitForTransition) { + swiper.autoplay.paused = false; + swiper.autoplay.run(); + } else { + swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd); + swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd); + } + }, +}; + +var autoplay = { + name: 'autoplay', + params: { + autoplay: { + enabled: false, + delay: 3000, + waitForTransition: true, + disableOnInteraction: true, + stopOnLastSlide: false, + reverseDirection: false, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + autoplay: { + running: false, + paused: false, + run: Autoplay.run.bind(swiper), + start: Autoplay.start.bind(swiper), + stop: Autoplay.stop.bind(swiper), + pause: Autoplay.pause.bind(swiper), + onTransitionEnd(e) { + if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return; + if (e.target !== this) return; + swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd); + swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd); + swiper.autoplay.paused = false; + if (!swiper.autoplay.running) { + swiper.autoplay.stop(); + } else { + swiper.autoplay.run(); + } + }, + }, + }); + }, + on: { + init() { + const swiper = this; + if (swiper.params.autoplay.enabled) { + swiper.autoplay.start(); + } + }, + beforeTransitionStart(speed, internal) { + const swiper = this; + if (swiper.autoplay.running) { + if (internal || !swiper.params.autoplay.disableOnInteraction) { + swiper.autoplay.pause(speed); + } else { + swiper.autoplay.stop(); + } + } + }, + sliderFirstMove() { + const swiper = this; + if (swiper.autoplay.running) { + if (swiper.params.autoplay.disableOnInteraction) { + swiper.autoplay.stop(); + } else { + swiper.autoplay.pause(); + } + } + }, + destroy() { + const swiper = this; + if (swiper.autoplay.running) { + swiper.autoplay.stop(); + } + }, + }, +}; + +const Fade = { + setTranslate() { + const swiper = this; + const { slides } = swiper; + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = swiper.slides.eq(i); + const offset = $slideEl[0].swiperSlideOffset; + let tx = -offset; + if (!swiper.params.virtualTranslate) tx -= swiper.translate; + let ty = 0; + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + } + const slideOpacity = swiper.params.fadeEffect.crossFade + ? Math.max(1 - Math.abs($slideEl[0].progress), 0) + : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0); + $slideEl + .css({ + opacity: slideOpacity, + }) + .transform(`translate3d(${tx}px, ${ty}px, 0px)`); + } + }, + setTransition(duration) { + const swiper = this; + const { slides, $wrapperEl } = swiper; + slides.transition(duration); + if (swiper.params.virtualTranslate && duration !== 0) { + let eventTriggered = false; + slides.transitionEnd(() => { + if (eventTriggered) return; + if (!swiper || swiper.destroyed) return; + eventTriggered = true; + swiper.animating = false; + const triggerEvents = ['webkitTransitionEnd', 'transitionend']; + for (let i = 0; i < triggerEvents.length; i += 1) { + $wrapperEl.trigger(triggerEvents[i]); + } + }); + } + }, +}; + +var effectFade = { + name: 'effect-fade', + params: { + fadeEffect: { + crossFade: false, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + fadeEffect: { + setTranslate: Fade.setTranslate.bind(swiper), + setTransition: Fade.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (swiper.params.effect !== 'fade') return; + swiper.classNames.push(`${swiper.params.containerModifierClass}fade`); + const overwriteParams = { + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: true, + }; + Utils.extend(swiper.params, overwriteParams); + Utils.extend(swiper.originalParams, overwriteParams); + }, + setTranslate() { + const swiper = this; + if (swiper.params.effect !== 'fade') return; + swiper.fadeEffect.setTranslate(); + }, + setTransition(duration) { + const swiper = this; + if (swiper.params.effect !== 'fade') return; + swiper.fadeEffect.setTransition(duration); + }, + }, +}; + +const Cube = { + setTranslate() { + const swiper = this; + const { + $el, $wrapperEl, slides, width: swiperWidth, height: swiperHeight, rtlTranslate: rtl, size: swiperSize, + } = swiper; + const params = swiper.params.cubeEffect; + const isHorizontal = swiper.isHorizontal(); + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + let wrapperRotate = 0; + let $cubeShadowEl; + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow'); + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
            '); + $wrapperEl.append($cubeShadowEl); + } + $cubeShadowEl.css({ height: `${swiperWidth}px` }); + } else { + $cubeShadowEl = $el.find('.swiper-cube-shadow'); + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
            '); + $el.append($cubeShadowEl); + } + } + } + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + let slideIndex = i; + if (isVirtual) { + slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10); + } + let slideAngle = slideIndex * 90; + let round = Math.floor(slideAngle / 360); + if (rtl) { + slideAngle = -slideAngle; + round = Math.floor(-slideAngle / 360); + } + const progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + let tx = 0; + let ty = 0; + let tz = 0; + if (slideIndex % 4 === 0) { + tx = -round * 4 * swiperSize; + tz = 0; + } else if ((slideIndex - 1) % 4 === 0) { + tx = 0; + tz = -round * 4 * swiperSize; + } else if ((slideIndex - 2) % 4 === 0) { + tx = swiperSize + (round * 4 * swiperSize); + tz = swiperSize; + } else if ((slideIndex - 3) % 4 === 0) { + tx = -swiperSize; + tz = (3 * swiperSize) + (swiperSize * 4 * round); + } + if (rtl) { + tx = -tx; + } + + if (!isHorizontal) { + ty = tx; + tx = 0; + } + + const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${isHorizontal ? slideAngle : 0}deg) translate3d(${tx}px, ${ty}px, ${tz}px)`; + if (progress <= 1 && progress > -1) { + wrapperRotate = (slideIndex * 90) + (progress * 90); + if (rtl) wrapperRotate = (-slideIndex * 90) - (progress * 90); + } + $slideEl.transform(transform); + if (params.slideShadows) { + // Set shadows + let shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + if (shadowBefore.length === 0) { + shadowBefore = $(`
            `); + $slideEl.append(shadowBefore); + } + if (shadowAfter.length === 0) { + shadowAfter = $(`
            `); + $slideEl.append(shadowAfter); + } + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + } + $wrapperEl.css({ + '-webkit-transform-origin': `50% 50% -${swiperSize / 2}px`, + '-moz-transform-origin': `50% 50% -${swiperSize / 2}px`, + '-ms-transform-origin': `50% 50% -${swiperSize / 2}px`, + 'transform-origin': `50% 50% -${swiperSize / 2}px`, + }); + + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl.transform(`translate3d(0px, ${(swiperWidth / 2) + params.shadowOffset}px, ${-swiperWidth / 2}px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`); + } else { + const shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90); + const multiplier = 1.5 - ( + (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2) + + (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2) + ); + const scale1 = params.shadowScale; + const scale2 = params.shadowScale / multiplier; + const offset = params.shadowOffset; + $cubeShadowEl.transform(`scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${(swiperHeight / 2) + offset}px, ${-swiperHeight / 2 / scale2}px) rotateX(-90deg)`); + } + } + const zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0; + $wrapperEl + .transform(`translate3d(0px,0,${zFactor}px) rotateX(${swiper.isHorizontal() ? 0 : wrapperRotate}deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`); + }, + setTransition(duration) { + const swiper = this; + const { $el, slides } = swiper; + slides + .transition(duration) + .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left') + .transition(duration); + if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) { + $el.find('.swiper-cube-shadow').transition(duration); + } + }, +}; + +var effectCube = { + name: 'effect-cube', + params: { + cubeEffect: { + slideShadows: true, + shadow: true, + shadowOffset: 20, + shadowScale: 0.94, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + cubeEffect: { + setTranslate: Cube.setTranslate.bind(swiper), + setTransition: Cube.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (swiper.params.effect !== 'cube') return; + swiper.classNames.push(`${swiper.params.containerModifierClass}cube`); + swiper.classNames.push(`${swiper.params.containerModifierClass}3d`); + const overwriteParams = { + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + resistanceRatio: 0, + spaceBetween: 0, + centeredSlides: false, + virtualTranslate: true, + }; + Utils.extend(swiper.params, overwriteParams); + Utils.extend(swiper.originalParams, overwriteParams); + }, + setTranslate() { + const swiper = this; + if (swiper.params.effect !== 'cube') return; + swiper.cubeEffect.setTranslate(); + }, + setTransition(duration) { + const swiper = this; + if (swiper.params.effect !== 'cube') return; + swiper.cubeEffect.setTransition(duration); + }, + }, +}; + +const Flip = { + setTranslate() { + const swiper = this; + const { slides, rtlTranslate: rtl } = swiper; + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + let progress = $slideEl[0].progress; + if (swiper.params.flipEffect.limitRotation) { + progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + } + const offset = $slideEl[0].swiperSlideOffset; + const rotate = -180 * progress; + let rotateY = rotate; + let rotateX = 0; + let tx = -offset; + let ty = 0; + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + rotateX = -rotateY; + rotateY = 0; + } else if (rtl) { + rotateY = -rotateY; + } + + $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length; + + if (swiper.params.flipEffect.slideShadows) { + // Set shadows + let shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + if (shadowBefore.length === 0) { + shadowBefore = $(`
            `); + $slideEl.append(shadowBefore); + } + if (shadowAfter.length === 0) { + shadowAfter = $(`
            `); + $slideEl.append(shadowAfter); + } + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + $slideEl + .transform(`translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`); + } + }, + setTransition(duration) { + const swiper = this; + const { slides, activeIndex, $wrapperEl } = swiper; + slides + .transition(duration) + .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left') + .transition(duration); + if (swiper.params.virtualTranslate && duration !== 0) { + let eventTriggered = false; + // eslint-disable-next-line + slides.eq(activeIndex).transitionEnd(function onTransitionEnd() { + if (eventTriggered) return; + if (!swiper || swiper.destroyed) return; + // if (!$(this).hasClass(swiper.params.slideActiveClass)) return; + eventTriggered = true; + swiper.animating = false; + const triggerEvents = ['webkitTransitionEnd', 'transitionend']; + for (let i = 0; i < triggerEvents.length; i += 1) { + $wrapperEl.trigger(triggerEvents[i]); + } + }); + } + }, +}; + +var effectFlip = { + name: 'effect-flip', + params: { + flipEffect: { + slideShadows: true, + limitRotation: true, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + flipEffect: { + setTranslate: Flip.setTranslate.bind(swiper), + setTransition: Flip.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (swiper.params.effect !== 'flip') return; + swiper.classNames.push(`${swiper.params.containerModifierClass}flip`); + swiper.classNames.push(`${swiper.params.containerModifierClass}3d`); + const overwriteParams = { + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: true, + }; + Utils.extend(swiper.params, overwriteParams); + Utils.extend(swiper.originalParams, overwriteParams); + }, + setTranslate() { + const swiper = this; + if (swiper.params.effect !== 'flip') return; + swiper.flipEffect.setTranslate(); + }, + setTransition(duration) { + const swiper = this; + if (swiper.params.effect !== 'flip') return; + swiper.flipEffect.setTransition(duration); + }, + }, +}; + +const Coverflow = { + setTranslate() { + const swiper = this; + const { + width: swiperWidth, height: swiperHeight, slides, $wrapperEl, slidesSizesGrid, + } = swiper; + const params = swiper.params.coverflowEffect; + const isHorizontal = swiper.isHorizontal(); + const transform = swiper.translate; + const center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2); + const rotate = isHorizontal ? params.rotate : -params.rotate; + const translate = params.depth; + // Each slide offset from center + for (let i = 0, length = slides.length; i < length; i += 1) { + const $slideEl = slides.eq(i); + const slideSize = slidesSizesGrid[i]; + const slideOffset = $slideEl[0].swiperSlideOffset; + const offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier; + + let rotateY = isHorizontal ? rotate * offsetMultiplier : 0; + let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier; + // var rotateZ = 0 + let translateZ = -translate * Math.abs(offsetMultiplier); + + let translateY = isHorizontal ? 0 : params.stretch * (offsetMultiplier); + let translateX = isHorizontal ? params.stretch * (offsetMultiplier) : 0; + + // Fix for ultra small values + if (Math.abs(translateX) < 0.001) translateX = 0; + if (Math.abs(translateY) < 0.001) translateY = 0; + if (Math.abs(translateZ) < 0.001) translateZ = 0; + if (Math.abs(rotateY) < 0.001) rotateY = 0; + if (Math.abs(rotateX) < 0.001) rotateX = 0; + + const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`; + + $slideEl.transform(slideTransform); + $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1; + if (params.slideShadows) { + // Set shadows + let $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + let $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + if ($shadowBeforeEl.length === 0) { + $shadowBeforeEl = $(`
            `); + $slideEl.append($shadowBeforeEl); + } + if ($shadowAfterEl.length === 0) { + $shadowAfterEl = $(`
            `); + $slideEl.append($shadowAfterEl); + } + if ($shadowBeforeEl.length) $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; + if ($shadowAfterEl.length) $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; + } + } + + // Set correct perspective for IE10 + if (Support.pointerEvents || Support.prefixedPointerEvents) { + const ws = $wrapperEl[0].style; + ws.perspectiveOrigin = `${center}px 50%`; + } + }, + setTransition(duration) { + const swiper = this; + swiper.slides + .transition(duration) + .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left') + .transition(duration); + }, +}; + +var effectCoverflow = { + name: 'effect-coverflow', + params: { + coverflowEffect: { + rotate: 50, + stretch: 0, + depth: 100, + modifier: 1, + slideShadows: true, + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + coverflowEffect: { + setTranslate: Coverflow.setTranslate.bind(swiper), + setTransition: Coverflow.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + if (swiper.params.effect !== 'coverflow') return; + + swiper.classNames.push(`${swiper.params.containerModifierClass}coverflow`); + swiper.classNames.push(`${swiper.params.containerModifierClass}3d`); + + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + }, + setTranslate() { + const swiper = this; + if (swiper.params.effect !== 'coverflow') return; + swiper.coverflowEffect.setTranslate(); + }, + setTransition(duration) { + const swiper = this; + if (swiper.params.effect !== 'coverflow') return; + swiper.coverflowEffect.setTransition(duration); + }, + }, +}; + +const Thumbs = { + init() { + const swiper = this; + const { thumbs: thumbsParams } = swiper.params; + const SwiperClass = swiper.constructor; + if (thumbsParams.swiper instanceof SwiperClass) { + swiper.thumbs.swiper = thumbsParams.swiper; + Utils.extend(swiper.thumbs.swiper.originalParams, { + watchSlidesProgress: true, + slideToClickedSlide: false, + }); + Utils.extend(swiper.thumbs.swiper.params, { + watchSlidesProgress: true, + slideToClickedSlide: false, + }); + } else if (Utils.isObject(thumbsParams.swiper)) { + swiper.thumbs.swiper = new SwiperClass(Utils.extend({}, thumbsParams.swiper, { + watchSlidesVisibility: true, + watchSlidesProgress: true, + slideToClickedSlide: false, + })); + swiper.thumbs.swiperCreated = true; + } + swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass); + swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick); + }, + onThumbClick() { + const swiper = this; + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + const clickedIndex = thumbsSwiper.clickedIndex; + const clickedSlide = thumbsSwiper.clickedSlide; + if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) return; + if (typeof clickedIndex === 'undefined' || clickedIndex === null) return; + let slideToIndex; + if (thumbsSwiper.params.loop) { + slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10); + } else { + slideToIndex = clickedIndex; + } + if (swiper.params.loop) { + let currentIndex = swiper.activeIndex; + if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) { + swiper.loopFix(); + // eslint-disable-next-line + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + currentIndex = swiper.activeIndex; + } + const prevIndex = swiper.slides.eq(currentIndex).prevAll(`[data-swiper-slide-index="${slideToIndex}"]`).eq(0).index(); + const nextIndex = swiper.slides.eq(currentIndex).nextAll(`[data-swiper-slide-index="${slideToIndex}"]`).eq(0).index(); + if (typeof prevIndex === 'undefined') slideToIndex = nextIndex; + else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex; + else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex; + else slideToIndex = prevIndex; + } + swiper.slideTo(slideToIndex); + }, + update(initial) { + const swiper = this; + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + + const slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' + ? thumbsSwiper.slidesPerViewDynamic() + : thumbsSwiper.params.slidesPerView; + + if (swiper.realIndex !== thumbsSwiper.realIndex) { + let currentThumbsIndex = thumbsSwiper.activeIndex; + let newThumbsIndex; + if (thumbsSwiper.params.loop) { + if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) { + thumbsSwiper.loopFix(); + // eslint-disable-next-line + thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft; + currentThumbsIndex = thumbsSwiper.activeIndex; + } + // Find actual thumbs index to slide to + const prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll(`[data-swiper-slide-index="${swiper.realIndex}"]`).eq(0).index(); + const nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll(`[data-swiper-slide-index="${swiper.realIndex}"]`).eq(0).index(); + if (typeof prevThumbsIndex === 'undefined') newThumbsIndex = nextThumbsIndex; + else if (typeof nextThumbsIndex === 'undefined') newThumbsIndex = prevThumbsIndex; + else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) newThumbsIndex = currentThumbsIndex; + else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) newThumbsIndex = nextThumbsIndex; + else newThumbsIndex = prevThumbsIndex; + } else { + newThumbsIndex = swiper.realIndex; + } + if (thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) { + if (thumbsSwiper.params.centeredSlides) { + if (newThumbsIndex > currentThumbsIndex) { + newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1; + } else { + newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1; + } + } else if (newThumbsIndex > currentThumbsIndex) { + newThumbsIndex = newThumbsIndex - slidesPerView + 1; + } + thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined); + } + } + + // Activate thumbs + let thumbsToActivate = 1; + const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass; + + if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) { + thumbsToActivate = swiper.params.slidesPerView; + } + + thumbsSwiper.slides.removeClass(thumbActiveClass); + if (thumbsSwiper.params.loop) { + for (let i = 0; i < thumbsToActivate; i += 1) { + thumbsSwiper.$wrapperEl.children(`[data-swiper-slide-index="${swiper.realIndex + i}"]`).addClass(thumbActiveClass); + } + } else { + for (let i = 0; i < thumbsToActivate; i += 1) { + thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass); + } + } + }, +}; +var thumbs = { + name: 'thumbs', + params: { + thumbs: { + swiper: null, + slideThumbActiveClass: 'swiper-slide-thumb-active', + thumbsContainerClass: 'swiper-container-thumbs', + }, + }, + create() { + const swiper = this; + Utils.extend(swiper, { + thumbs: { + swiper: null, + init: Thumbs.init.bind(swiper), + update: Thumbs.update.bind(swiper), + onThumbClick: Thumbs.onThumbClick.bind(swiper), + }, + }); + }, + on: { + beforeInit() { + const swiper = this; + const { thumbs } = swiper.params; + if (!thumbs || !thumbs.swiper) return; + swiper.thumbs.init(); + swiper.thumbs.update(true); + }, + slideChange() { + const swiper = this; + if (!swiper.thumbs.swiper) return; + swiper.thumbs.update(); + }, + update() { + const swiper = this; + if (!swiper.thumbs.swiper) return; + swiper.thumbs.update(); + }, + resize() { + const swiper = this; + if (!swiper.thumbs.swiper) return; + swiper.thumbs.update(); + }, + observerUpdate() { + const swiper = this; + if (!swiper.thumbs.swiper) return; + swiper.thumbs.update(); + }, + setTransition(duration) { + const swiper = this; + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + thumbsSwiper.setTransition(duration); + }, + beforeDestroy() { + const swiper = this; + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + if (swiper.thumbs.swiperCreated && thumbsSwiper) { + thumbsSwiper.destroy(); + } + }, + }, +}; + +// Swiper Class + +const components = [ + Device$1, + Support$1, + Browser$1, + Resize, + Observer$1, + +]; + +if (typeof Swiper.use === 'undefined') { + Swiper.use = Swiper.Class.use; + Swiper.installModule = Swiper.Class.installModule; +} + +Swiper.use(components); + +export { Swiper, virtual as Virtual, keyboard as Keyboard, mousewheel as Mousewheel, navigation as Navigation, pagination as Pagination, scrollbar as Scrollbar, parallax as Parallax, zoom as Zoom, lazy as Lazy, controller as Controller, a11y$1 as A11y, history as History, hashNavigation as HashNavigation, autoplay as Autoplay, effectFade as EffectFade, effectCube as EffectCube, effectFlip as EffectFlip, effectCoverflow as EffectCoverflow, thumbs as Thumbs }; diff --git a/assets/3rd/swiper/js/swiper.js b/assets/3rd/swiper/js/swiper.js new file mode 100755 index 00000000..54b903a3 --- /dev/null +++ b/assets/3rd/swiper/js/swiper.js @@ -0,0 +1,8124 @@ +/** + * Swiper 4.5.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * http://www.idangero.us/swiper/ + * + * Copyright 2014-2019 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: February 22, 2019 + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.Swiper = factory()); +}(this, function () { 'use strict'; + + /** + * SSR Window 1.0.1 + * Better handling for window object in SSR environment + * https://github.com/nolimits4web/ssr-window + * + * Copyright 2018, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: July 18, 2018 + */ + var doc = (typeof document === 'undefined') ? { + body: {}, + addEventListener: function addEventListener() {}, + removeEventListener: function removeEventListener() {}, + activeElement: { + blur: function blur() {}, + nodeName: '', + }, + querySelector: function querySelector() { + return null; + }, + querySelectorAll: function querySelectorAll() { + return []; + }, + getElementById: function getElementById() { + return null; + }, + createEvent: function createEvent() { + return { + initEvent: function initEvent() {}, + }; + }, + createElement: function createElement() { + return { + children: [], + childNodes: [], + style: {}, + setAttribute: function setAttribute() {}, + getElementsByTagName: function getElementsByTagName() { + return []; + }, + }; + }, + location: { hash: '' }, + } : document; // eslint-disable-line + + var win = (typeof window === 'undefined') ? { + document: doc, + navigator: { + userAgent: '', + }, + location: {}, + history: {}, + CustomEvent: function CustomEvent() { + return this; + }, + addEventListener: function addEventListener() {}, + removeEventListener: function removeEventListener() {}, + getComputedStyle: function getComputedStyle() { + return { + getPropertyValue: function getPropertyValue() { + return ''; + }, + }; + }, + Image: function Image() {}, + Date: function Date() {}, + screen: {}, + setTimeout: function setTimeout() {}, + clearTimeout: function clearTimeout() {}, + } : window; // eslint-disable-line + + /** + * Dom7 2.1.3 + * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API + * http://framework7.io/docs/dom.html + * + * Copyright 2019, Vladimir Kharlampidi + * The iDangero.us + * http://www.idangero.us/ + * + * Licensed under MIT + * + * Released on: February 11, 2019 + */ + + var Dom7 = function Dom7(arr) { + var self = this; + // Create array-like object + for (var i = 0; i < arr.length; i += 1) { + self[i] = arr[i]; + } + self.length = arr.length; + // Return collection with methods + return this; + }; + + function $(selector, context) { + var arr = []; + var i = 0; + if (selector && !context) { + if (selector instanceof Dom7) { + return selector; + } + } + if (selector) { + // String + if (typeof selector === 'string') { + var els; + var tempParent; + var html = selector.trim(); + if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) { + var toCreate = 'div'; + if (html.indexOf(':~]/)) { + // Pure ID selector + els = [doc.getElementById(selector.trim().split('#')[1])]; + } else { + // Other selectors + els = (context || doc).querySelectorAll(selector.trim()); + } + for (i = 0; i < els.length; i += 1) { + if (els[i]) { arr.push(els[i]); } + } + } + } else if (selector.nodeType || selector === win || selector === doc) { + // Node/element + arr.push(selector); + } else if (selector.length > 0 && selector[0].nodeType) { + // Array of elements or instance of Dom + for (i = 0; i < selector.length; i += 1) { + arr.push(selector[i]); + } + } + } + return new Dom7(arr); + } + + $.fn = Dom7.prototype; + $.Class = Dom7; + $.Dom7 = Dom7; + + function unique(arr) { + var uniqueArray = []; + for (var i = 0; i < arr.length; i += 1) { + if (uniqueArray.indexOf(arr[i]) === -1) { uniqueArray.push(arr[i]); } + } + return uniqueArray; + } + + // Classes and attributes + function addClass(className) { + if (typeof className === 'undefined') { + return this; + } + var classes = className.split(' '); + for (var i = 0; i < classes.length; i += 1) { + for (var j = 0; j < this.length; j += 1) { + if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.add(classes[i]); } + } + } + return this; + } + function removeClass(className) { + var classes = className.split(' '); + for (var i = 0; i < classes.length; i += 1) { + for (var j = 0; j < this.length; j += 1) { + if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.remove(classes[i]); } + } + } + return this; + } + function hasClass(className) { + if (!this[0]) { return false; } + return this[0].classList.contains(className); + } + function toggleClass(className) { + var classes = className.split(' '); + for (var i = 0; i < classes.length; i += 1) { + for (var j = 0; j < this.length; j += 1) { + if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.toggle(classes[i]); } + } + } + return this; + } + function attr(attrs, value) { + var arguments$1 = arguments; + + if (arguments.length === 1 && typeof attrs === 'string') { + // Get attr + if (this[0]) { return this[0].getAttribute(attrs); } + return undefined; + } + + // Set attrs + for (var i = 0; i < this.length; i += 1) { + if (arguments$1.length === 2) { + // String + this[i].setAttribute(attrs, value); + } else { + // Object + // eslint-disable-next-line + for (var attrName in attrs) { + this[i][attrName] = attrs[attrName]; + this[i].setAttribute(attrName, attrs[attrName]); + } + } + } + return this; + } + // eslint-disable-next-line + function removeAttr(attr) { + for (var i = 0; i < this.length; i += 1) { + this[i].removeAttribute(attr); + } + return this; + } + function data(key, value) { + var el; + if (typeof value === 'undefined') { + el = this[0]; + // Get value + if (el) { + if (el.dom7ElementDataStorage && (key in el.dom7ElementDataStorage)) { + return el.dom7ElementDataStorage[key]; + } + + var dataKey = el.getAttribute(("data-" + key)); + if (dataKey) { + return dataKey; + } + return undefined; + } + return undefined; + } + + // Set value + for (var i = 0; i < this.length; i += 1) { + el = this[i]; + if (!el.dom7ElementDataStorage) { el.dom7ElementDataStorage = {}; } + el.dom7ElementDataStorage[key] = value; + } + return this; + } + // Transforms + // eslint-disable-next-line + function transform(transform) { + for (var i = 0; i < this.length; i += 1) { + var elStyle = this[i].style; + elStyle.webkitTransform = transform; + elStyle.transform = transform; + } + return this; + } + function transition(duration) { + if (typeof duration !== 'string') { + duration = duration + "ms"; // eslint-disable-line + } + for (var i = 0; i < this.length; i += 1) { + var elStyle = this[i].style; + elStyle.webkitTransitionDuration = duration; + elStyle.transitionDuration = duration; + } + return this; + } + // Events + function on() { + var assign; + + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + var eventType = args[0]; + var targetSelector = args[1]; + var listener = args[2]; + var capture = args[3]; + if (typeof args[1] === 'function') { + (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]); + targetSelector = undefined; + } + if (!capture) { capture = false; } + + function handleLiveEvent(e) { + var target = e.target; + if (!target) { return; } + var eventData = e.target.dom7EventData || []; + if (eventData.indexOf(e) < 0) { + eventData.unshift(e); + } + if ($(target).is(targetSelector)) { listener.apply(target, eventData); } + else { + var parents = $(target).parents(); // eslint-disable-line + for (var k = 0; k < parents.length; k += 1) { + if ($(parents[k]).is(targetSelector)) { listener.apply(parents[k], eventData); } + } + } + } + function handleEvent(e) { + var eventData = e && e.target ? e.target.dom7EventData || [] : []; + if (eventData.indexOf(e) < 0) { + eventData.unshift(e); + } + listener.apply(this, eventData); + } + var events = eventType.split(' '); + var j; + for (var i = 0; i < this.length; i += 1) { + var el = this[i]; + if (!targetSelector) { + for (j = 0; j < events.length; j += 1) { + var event = events[j]; + if (!el.dom7Listeners) { el.dom7Listeners = {}; } + if (!el.dom7Listeners[event]) { el.dom7Listeners[event] = []; } + el.dom7Listeners[event].push({ + listener: listener, + proxyListener: handleEvent, + }); + el.addEventListener(event, handleEvent, capture); + } + } else { + // Live events + for (j = 0; j < events.length; j += 1) { + var event$1 = events[j]; + if (!el.dom7LiveListeners) { el.dom7LiveListeners = {}; } + if (!el.dom7LiveListeners[event$1]) { el.dom7LiveListeners[event$1] = []; } + el.dom7LiveListeners[event$1].push({ + listener: listener, + proxyListener: handleLiveEvent, + }); + el.addEventListener(event$1, handleLiveEvent, capture); + } + } + } + return this; + } + function off() { + var assign; + + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + var eventType = args[0]; + var targetSelector = args[1]; + var listener = args[2]; + var capture = args[3]; + if (typeof args[1] === 'function') { + (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]); + targetSelector = undefined; + } + if (!capture) { capture = false; } + + var events = eventType.split(' '); + for (var i = 0; i < events.length; i += 1) { + var event = events[i]; + for (var j = 0; j < this.length; j += 1) { + var el = this[j]; + var handlers = (void 0); + if (!targetSelector && el.dom7Listeners) { + handlers = el.dom7Listeners[event]; + } else if (targetSelector && el.dom7LiveListeners) { + handlers = el.dom7LiveListeners[event]; + } + if (handlers && handlers.length) { + for (var k = handlers.length - 1; k >= 0; k -= 1) { + var handler = handlers[k]; + if (listener && handler.listener === listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } else if (!listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } + } + } + } + } + return this; + } + function trigger() { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + var events = args[0].split(' '); + var eventData = args[1]; + for (var i = 0; i < events.length; i += 1) { + var event = events[i]; + for (var j = 0; j < this.length; j += 1) { + var el = this[j]; + var evt = (void 0); + try { + evt = new win.CustomEvent(event, { + detail: eventData, + bubbles: true, + cancelable: true, + }); + } catch (e) { + evt = doc.createEvent('Event'); + evt.initEvent(event, true, true); + evt.detail = eventData; + } + // eslint-disable-next-line + el.dom7EventData = args.filter(function (data, dataIndex) { return dataIndex > 0; }); + el.dispatchEvent(evt); + el.dom7EventData = []; + delete el.dom7EventData; + } + } + return this; + } + function transitionEnd(callback) { + var events = ['webkitTransitionEnd', 'transitionend']; + var dom = this; + var i; + function fireCallBack(e) { + /* jshint validthis:true */ + if (e.target !== this) { return; } + callback.call(this, e); + for (i = 0; i < events.length; i += 1) { + dom.off(events[i], fireCallBack); + } + } + if (callback) { + for (i = 0; i < events.length; i += 1) { + dom.on(events[i], fireCallBack); + } + } + return this; + } + function outerWidth(includeMargins) { + if (this.length > 0) { + if (includeMargins) { + // eslint-disable-next-line + var styles = this.styles(); + return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left')); + } + return this[0].offsetWidth; + } + return null; + } + function outerHeight(includeMargins) { + if (this.length > 0) { + if (includeMargins) { + // eslint-disable-next-line + var styles = this.styles(); + return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom')); + } + return this[0].offsetHeight; + } + return null; + } + function offset() { + if (this.length > 0) { + var el = this[0]; + var box = el.getBoundingClientRect(); + var body = doc.body; + var clientTop = el.clientTop || body.clientTop || 0; + var clientLeft = el.clientLeft || body.clientLeft || 0; + var scrollTop = el === win ? win.scrollY : el.scrollTop; + var scrollLeft = el === win ? win.scrollX : el.scrollLeft; + return { + top: (box.top + scrollTop) - clientTop, + left: (box.left + scrollLeft) - clientLeft, + }; + } + + return null; + } + function styles() { + if (this[0]) { return win.getComputedStyle(this[0], null); } + return {}; + } + function css(props, value) { + var i; + if (arguments.length === 1) { + if (typeof props === 'string') { + if (this[0]) { return win.getComputedStyle(this[0], null).getPropertyValue(props); } + } else { + for (i = 0; i < this.length; i += 1) { + // eslint-disable-next-line + for (var prop in props) { + this[i].style[prop] = props[prop]; + } + } + return this; + } + } + if (arguments.length === 2 && typeof props === 'string') { + for (i = 0; i < this.length; i += 1) { + this[i].style[props] = value; + } + return this; + } + return this; + } + // Iterate over the collection passing elements to `callback` + function each(callback) { + // Don't bother continuing without a callback + if (!callback) { return this; } + // Iterate over the current collection + for (var i = 0; i < this.length; i += 1) { + // If the callback returns false + if (callback.call(this[i], i, this[i]) === false) { + // End the loop early + return this; + } + } + // Return `this` to allow chained DOM operations + return this; + } + // eslint-disable-next-line + function html(html) { + if (typeof html === 'undefined') { + return this[0] ? this[0].innerHTML : undefined; + } + + for (var i = 0; i < this.length; i += 1) { + this[i].innerHTML = html; + } + return this; + } + // eslint-disable-next-line + function text(text) { + if (typeof text === 'undefined') { + if (this[0]) { + return this[0].textContent.trim(); + } + return null; + } + + for (var i = 0; i < this.length; i += 1) { + this[i].textContent = text; + } + return this; + } + function is(selector) { + var el = this[0]; + var compareWith; + var i; + if (!el || typeof selector === 'undefined') { return false; } + if (typeof selector === 'string') { + if (el.matches) { return el.matches(selector); } + else if (el.webkitMatchesSelector) { return el.webkitMatchesSelector(selector); } + else if (el.msMatchesSelector) { return el.msMatchesSelector(selector); } + + compareWith = $(selector); + for (i = 0; i < compareWith.length; i += 1) { + if (compareWith[i] === el) { return true; } + } + return false; + } else if (selector === doc) { return el === doc; } + else if (selector === win) { return el === win; } + + if (selector.nodeType || selector instanceof Dom7) { + compareWith = selector.nodeType ? [selector] : selector; + for (i = 0; i < compareWith.length; i += 1) { + if (compareWith[i] === el) { return true; } + } + return false; + } + return false; + } + function index() { + var child = this[0]; + var i; + if (child) { + i = 0; + // eslint-disable-next-line + while ((child = child.previousSibling) !== null) { + if (child.nodeType === 1) { i += 1; } + } + return i; + } + return undefined; + } + // eslint-disable-next-line + function eq(index) { + if (typeof index === 'undefined') { return this; } + var length = this.length; + var returnIndex; + if (index > length - 1) { + return new Dom7([]); + } + if (index < 0) { + returnIndex = length + index; + if (returnIndex < 0) { return new Dom7([]); } + return new Dom7([this[returnIndex]]); + } + return new Dom7([this[index]]); + } + function append() { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + var newChild; + + for (var k = 0; k < args.length; k += 1) { + newChild = args[k]; + for (var i = 0; i < this.length; i += 1) { + if (typeof newChild === 'string') { + var tempDiv = doc.createElement('div'); + tempDiv.innerHTML = newChild; + while (tempDiv.firstChild) { + this[i].appendChild(tempDiv.firstChild); + } + } else if (newChild instanceof Dom7) { + for (var j = 0; j < newChild.length; j += 1) { + this[i].appendChild(newChild[j]); + } + } else { + this[i].appendChild(newChild); + } + } + } + + return this; + } + function prepend(newChild) { + var i; + var j; + for (i = 0; i < this.length; i += 1) { + if (typeof newChild === 'string') { + var tempDiv = doc.createElement('div'); + tempDiv.innerHTML = newChild; + for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) { + this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]); + } + } else if (newChild instanceof Dom7) { + for (j = 0; j < newChild.length; j += 1) { + this[i].insertBefore(newChild[j], this[i].childNodes[0]); + } + } else { + this[i].insertBefore(newChild, this[i].childNodes[0]); + } + } + return this; + } + function next(selector) { + if (this.length > 0) { + if (selector) { + if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) { + return new Dom7([this[0].nextElementSibling]); + } + return new Dom7([]); + } + + if (this[0].nextElementSibling) { return new Dom7([this[0].nextElementSibling]); } + return new Dom7([]); + } + return new Dom7([]); + } + function nextAll(selector) { + var nextEls = []; + var el = this[0]; + if (!el) { return new Dom7([]); } + while (el.nextElementSibling) { + var next = el.nextElementSibling; // eslint-disable-line + if (selector) { + if ($(next).is(selector)) { nextEls.push(next); } + } else { nextEls.push(next); } + el = next; + } + return new Dom7(nextEls); + } + function prev(selector) { + if (this.length > 0) { + var el = this[0]; + if (selector) { + if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) { + return new Dom7([el.previousElementSibling]); + } + return new Dom7([]); + } + + if (el.previousElementSibling) { return new Dom7([el.previousElementSibling]); } + return new Dom7([]); + } + return new Dom7([]); + } + function prevAll(selector) { + var prevEls = []; + var el = this[0]; + if (!el) { return new Dom7([]); } + while (el.previousElementSibling) { + var prev = el.previousElementSibling; // eslint-disable-line + if (selector) { + if ($(prev).is(selector)) { prevEls.push(prev); } + } else { prevEls.push(prev); } + el = prev; + } + return new Dom7(prevEls); + } + function parent(selector) { + var parents = []; // eslint-disable-line + for (var i = 0; i < this.length; i += 1) { + if (this[i].parentNode !== null) { + if (selector) { + if ($(this[i].parentNode).is(selector)) { parents.push(this[i].parentNode); } + } else { + parents.push(this[i].parentNode); + } + } + } + return $(unique(parents)); + } + function parents(selector) { + var parents = []; // eslint-disable-line + for (var i = 0; i < this.length; i += 1) { + var parent = this[i].parentNode; // eslint-disable-line + while (parent) { + if (selector) { + if ($(parent).is(selector)) { parents.push(parent); } + } else { + parents.push(parent); + } + parent = parent.parentNode; + } + } + return $(unique(parents)); + } + function closest(selector) { + var closest = this; // eslint-disable-line + if (typeof selector === 'undefined') { + return new Dom7([]); + } + if (!closest.is(selector)) { + closest = closest.parents(selector).eq(0); + } + return closest; + } + function find(selector) { + var foundElements = []; + for (var i = 0; i < this.length; i += 1) { + var found = this[i].querySelectorAll(selector); + for (var j = 0; j < found.length; j += 1) { + foundElements.push(found[j]); + } + } + return new Dom7(foundElements); + } + function children(selector) { + var children = []; // eslint-disable-line + for (var i = 0; i < this.length; i += 1) { + var childNodes = this[i].childNodes; + + for (var j = 0; j < childNodes.length; j += 1) { + if (!selector) { + if (childNodes[j].nodeType === 1) { children.push(childNodes[j]); } + } else if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) { + children.push(childNodes[j]); + } + } + } + return new Dom7(unique(children)); + } + function remove() { + for (var i = 0; i < this.length; i += 1) { + if (this[i].parentNode) { this[i].parentNode.removeChild(this[i]); } + } + return this; + } + function add() { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + var dom = this; + var i; + var j; + for (i = 0; i < args.length; i += 1) { + var toAdd = $(args[i]); + for (j = 0; j < toAdd.length; j += 1) { + dom[dom.length] = toAdd[j]; + dom.length += 1; + } + } + return dom; + } + + var Methods = { + addClass: addClass, + removeClass: removeClass, + hasClass: hasClass, + toggleClass: toggleClass, + attr: attr, + removeAttr: removeAttr, + data: data, + transform: transform, + transition: transition, + on: on, + off: off, + trigger: trigger, + transitionEnd: transitionEnd, + outerWidth: outerWidth, + outerHeight: outerHeight, + offset: offset, + css: css, + each: each, + html: html, + text: text, + is: is, + index: index, + eq: eq, + append: append, + prepend: prepend, + next: next, + nextAll: nextAll, + prev: prev, + prevAll: prevAll, + parent: parent, + parents: parents, + closest: closest, + find: find, + children: children, + remove: remove, + add: add, + styles: styles, + }; + + Object.keys(Methods).forEach(function (methodName) { + $.fn[methodName] = Methods[methodName]; + }); + + var Utils = { + deleteProps: function deleteProps(obj) { + var object = obj; + Object.keys(object).forEach(function (key) { + try { + object[key] = null; + } catch (e) { + // no getter for object + } + try { + delete object[key]; + } catch (e) { + // something got wrong + } + }); + }, + nextTick: function nextTick(callback, delay) { + if ( delay === void 0 ) delay = 0; + + return setTimeout(callback, delay); + }, + now: function now() { + return Date.now(); + }, + getTranslate: function getTranslate(el, axis) { + if ( axis === void 0 ) axis = 'x'; + + var matrix; + var curTransform; + var transformMatrix; + + var curStyle = win.getComputedStyle(el, null); + + if (win.WebKitCSSMatrix) { + curTransform = curStyle.transform || curStyle.webkitTransform; + if (curTransform.split(',').length > 6) { + curTransform = curTransform.split(', ').map(function (a) { return a.replace(',', '.'); }).join(', '); + } + // Some old versions of Webkit choke when 'none' is passed; pass + // empty string instead in this case + transformMatrix = new win.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform); + } else { + transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,'); + matrix = transformMatrix.toString().split(','); + } + + if (axis === 'x') { + // Latest Chrome and webkits Fix + if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m41; } + // Crazy IE10 Matrix + else if (matrix.length === 16) { curTransform = parseFloat(matrix[12]); } + // Normal Browsers + else { curTransform = parseFloat(matrix[4]); } + } + if (axis === 'y') { + // Latest Chrome and webkits Fix + if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m42; } + // Crazy IE10 Matrix + else if (matrix.length === 16) { curTransform = parseFloat(matrix[13]); } + // Normal Browsers + else { curTransform = parseFloat(matrix[5]); } + } + return curTransform || 0; + }, + parseUrlQuery: function parseUrlQuery(url) { + var query = {}; + var urlToParse = url || win.location.href; + var i; + var params; + var param; + var length; + if (typeof urlToParse === 'string' && urlToParse.length) { + urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\S*\?/, '') : ''; + params = urlToParse.split('&').filter(function (paramsPart) { return paramsPart !== ''; }); + length = params.length; + + for (i = 0; i < length; i += 1) { + param = params[i].replace(/#\S+/g, '').split('='); + query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param[1]) || ''; + } + } + return query; + }, + isObject: function isObject(o) { + return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object; + }, + extend: function extend() { + var args = [], len$1 = arguments.length; + while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ]; + + var to = Object(args[0]); + for (var i = 1; i < args.length; i += 1) { + var nextSource = args[i]; + if (nextSource !== undefined && nextSource !== null) { + var keysArray = Object.keys(Object(nextSource)); + for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) { + var nextKey = keysArray[nextIndex]; + var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); + if (desc !== undefined && desc.enumerable) { + if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) { + Utils.extend(to[nextKey], nextSource[nextKey]); + } else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) { + to[nextKey] = {}; + Utils.extend(to[nextKey], nextSource[nextKey]); + } else { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + } + return to; + }, + }; + + var Support = (function Support() { + var testDiv = doc.createElement('div'); + return { + touch: (win.Modernizr && win.Modernizr.touch === true) || (function checkTouch() { + return !!((win.navigator.maxTouchPoints > 0) || ('ontouchstart' in win) || (win.DocumentTouch && doc instanceof win.DocumentTouch)); + }()), + + pointerEvents: !!(win.navigator.pointerEnabled || win.PointerEvent || ('maxTouchPoints' in win.navigator && win.navigator.maxTouchPoints > 0)), + prefixedPointerEvents: !!win.navigator.msPointerEnabled, + + transition: (function checkTransition() { + var style = testDiv.style; + return ('transition' in style || 'webkitTransition' in style || 'MozTransition' in style); + }()), + transforms3d: (win.Modernizr && win.Modernizr.csstransforms3d === true) || (function checkTransforms3d() { + var style = testDiv.style; + return ('webkitPerspective' in style || 'MozPerspective' in style || 'OPerspective' in style || 'MsPerspective' in style || 'perspective' in style); + }()), + + flexbox: (function checkFlexbox() { + var style = testDiv.style; + var styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' '); + for (var i = 0; i < styles.length; i += 1) { + if (styles[i] in style) { return true; } + } + return false; + }()), + + observer: (function checkObserver() { + return ('MutationObserver' in win || 'WebkitMutationObserver' in win); + }()), + + passiveListener: (function checkPassiveListener() { + var supportsPassive = false; + try { + var opts = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line + get: function get() { + supportsPassive = true; + }, + }); + win.addEventListener('testPassiveListener', null, opts); + } catch (e) { + // No support + } + return supportsPassive; + }()), + + gestures: (function checkGestures() { + return 'ongesturestart' in win; + }()), + }; + }()); + + var Browser = (function Browser() { + function isSafari() { + var ua = win.navigator.userAgent.toLowerCase(); + return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0); + } + return { + isIE: !!win.navigator.userAgent.match(/Trident/g) || !!win.navigator.userAgent.match(/MSIE/g), + isEdge: !!win.navigator.userAgent.match(/Edge/g), + isSafari: isSafari(), + isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(win.navigator.userAgent), + }; + }()); + + var SwiperClass = function SwiperClass(params) { + if ( params === void 0 ) params = {}; + + var self = this; + self.params = params; + + // Events + self.eventsListeners = {}; + + if (self.params && self.params.on) { + Object.keys(self.params.on).forEach(function (eventName) { + self.on(eventName, self.params.on[eventName]); + }); + } + }; + + var staticAccessors = { components: { configurable: true } }; + + SwiperClass.prototype.on = function on (events, handler, priority) { + var self = this; + if (typeof handler !== 'function') { return self; } + var method = priority ? 'unshift' : 'push'; + events.split(' ').forEach(function (event) { + if (!self.eventsListeners[event]) { self.eventsListeners[event] = []; } + self.eventsListeners[event][method](handler); + }); + return self; + }; + + SwiperClass.prototype.once = function once (events, handler, priority) { + var self = this; + if (typeof handler !== 'function') { return self; } + function onceHandler() { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + handler.apply(self, args); + self.off(events, onceHandler); + if (onceHandler.f7proxy) { + delete onceHandler.f7proxy; + } + } + onceHandler.f7proxy = handler; + return self.on(events, onceHandler, priority); + }; + + SwiperClass.prototype.off = function off (events, handler) { + var self = this; + if (!self.eventsListeners) { return self; } + events.split(' ').forEach(function (event) { + if (typeof handler === 'undefined') { + self.eventsListeners[event] = []; + } else if (self.eventsListeners[event] && self.eventsListeners[event].length) { + self.eventsListeners[event].forEach(function (eventHandler, index) { + if (eventHandler === handler || (eventHandler.f7proxy && eventHandler.f7proxy === handler)) { + self.eventsListeners[event].splice(index, 1); + } + }); + } + }); + return self; + }; + + SwiperClass.prototype.emit = function emit () { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + var self = this; + if (!self.eventsListeners) { return self; } + var events; + var data; + var context; + if (typeof args[0] === 'string' || Array.isArray(args[0])) { + events = args[0]; + data = args.slice(1, args.length); + context = self; + } else { + events = args[0].events; + data = args[0].data; + context = args[0].context || self; + } + var eventsArray = Array.isArray(events) ? events : events.split(' '); + eventsArray.forEach(function (event) { + if (self.eventsListeners && self.eventsListeners[event]) { + var handlers = []; + self.eventsListeners[event].forEach(function (eventHandler) { + handlers.push(eventHandler); + }); + handlers.forEach(function (eventHandler) { + eventHandler.apply(context, data); + }); + } + }); + return self; + }; + + SwiperClass.prototype.useModulesParams = function useModulesParams (instanceParams) { + var instance = this; + if (!instance.modules) { return; } + Object.keys(instance.modules).forEach(function (moduleName) { + var module = instance.modules[moduleName]; + // Extend params + if (module.params) { + Utils.extend(instanceParams, module.params); + } + }); + }; + + SwiperClass.prototype.useModules = function useModules (modulesParams) { + if ( modulesParams === void 0 ) modulesParams = {}; + + var instance = this; + if (!instance.modules) { return; } + Object.keys(instance.modules).forEach(function (moduleName) { + var module = instance.modules[moduleName]; + var moduleParams = modulesParams[moduleName] || {}; + // Extend instance methods and props + if (module.instance) { + Object.keys(module.instance).forEach(function (modulePropName) { + var moduleProp = module.instance[modulePropName]; + if (typeof moduleProp === 'function') { + instance[modulePropName] = moduleProp.bind(instance); + } else { + instance[modulePropName] = moduleProp; + } + }); + } + // Add event listeners + if (module.on && instance.on) { + Object.keys(module.on).forEach(function (moduleEventName) { + instance.on(moduleEventName, module.on[moduleEventName]); + }); + } + + // Module create callback + if (module.create) { + module.create.bind(instance)(moduleParams); + } + }); + }; + + staticAccessors.components.set = function (components) { + var Class = this; + if (!Class.use) { return; } + Class.use(components); + }; + + SwiperClass.installModule = function installModule (module) { + var params = [], len = arguments.length - 1; + while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ]; + + var Class = this; + if (!Class.prototype.modules) { Class.prototype.modules = {}; } + var name = module.name || (((Object.keys(Class.prototype.modules).length) + "_" + (Utils.now()))); + Class.prototype.modules[name] = module; + // Prototype + if (module.proto) { + Object.keys(module.proto).forEach(function (key) { + Class.prototype[key] = module.proto[key]; + }); + } + // Class + if (module.static) { + Object.keys(module.static).forEach(function (key) { + Class[key] = module.static[key]; + }); + } + // Callback + if (module.install) { + module.install.apply(Class, params); + } + return Class; + }; + + SwiperClass.use = function use (module) { + var params = [], len = arguments.length - 1; + while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ]; + + var Class = this; + if (Array.isArray(module)) { + module.forEach(function (m) { return Class.installModule(m); }); + return Class; + } + return Class.installModule.apply(Class, [ module ].concat( params )); + }; + + Object.defineProperties( SwiperClass, staticAccessors ); + + function updateSize () { + var swiper = this; + var width; + var height; + var $el = swiper.$el; + if (typeof swiper.params.width !== 'undefined') { + width = swiper.params.width; + } else { + width = $el[0].clientWidth; + } + if (typeof swiper.params.height !== 'undefined') { + height = swiper.params.height; + } else { + height = $el[0].clientHeight; + } + if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) { + return; + } + + // Subtract paddings + width = width - parseInt($el.css('padding-left'), 10) - parseInt($el.css('padding-right'), 10); + height = height - parseInt($el.css('padding-top'), 10) - parseInt($el.css('padding-bottom'), 10); + + Utils.extend(swiper, { + width: width, + height: height, + size: swiper.isHorizontal() ? width : height, + }); + } + + function updateSlides () { + var swiper = this; + var params = swiper.params; + + var $wrapperEl = swiper.$wrapperEl; + var swiperSize = swiper.size; + var rtl = swiper.rtlTranslate; + var wrongRTL = swiper.wrongRTL; + var isVirtual = swiper.virtual && params.virtual.enabled; + var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length; + var slides = $wrapperEl.children(("." + (swiper.params.slideClass))); + var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length; + var snapGrid = []; + var slidesGrid = []; + var slidesSizesGrid = []; + + var offsetBefore = params.slidesOffsetBefore; + if (typeof offsetBefore === 'function') { + offsetBefore = params.slidesOffsetBefore.call(swiper); + } + + var offsetAfter = params.slidesOffsetAfter; + if (typeof offsetAfter === 'function') { + offsetAfter = params.slidesOffsetAfter.call(swiper); + } + + var previousSnapGridLength = swiper.snapGrid.length; + var previousSlidesGridLength = swiper.snapGrid.length; + + var spaceBetween = params.spaceBetween; + var slidePosition = -offsetBefore; + var prevSlideSize = 0; + var index = 0; + if (typeof swiperSize === 'undefined') { + return; + } + if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) { + spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize; + } + + swiper.virtualSize = -spaceBetween; + + // reset margins + if (rtl) { slides.css({ marginLeft: '', marginTop: '' }); } + else { slides.css({ marginRight: '', marginBottom: '' }); } + + var slidesNumberEvenToRows; + if (params.slidesPerColumn > 1) { + if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) { + slidesNumberEvenToRows = slidesLength; + } else { + slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn; + } + if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') { + slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn); + } + } + + // Calc slides + var slideSize; + var slidesPerColumn = params.slidesPerColumn; + var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn; + var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn); + for (var i = 0; i < slidesLength; i += 1) { + slideSize = 0; + var slide = slides.eq(i); + if (params.slidesPerColumn > 1) { + // Set slides order + var newSlideOrderIndex = (void 0); + var column = (void 0); + var row = (void 0); + if (params.slidesPerColumnFill === 'column') { + column = Math.floor(i / slidesPerColumn); + row = i - (column * slidesPerColumn); + if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) { + row += 1; + if (row >= slidesPerColumn) { + row = 0; + column += 1; + } + } + newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn); + slide + .css({ + '-webkit-box-ordinal-group': newSlideOrderIndex, + '-moz-box-ordinal-group': newSlideOrderIndex, + '-ms-flex-order': newSlideOrderIndex, + '-webkit-order': newSlideOrderIndex, + order: newSlideOrderIndex, + }); + } else { + row = Math.floor(i / slidesPerRow); + column = i - (row * slidesPerRow); + } + slide + .css( + ("margin-" + (swiper.isHorizontal() ? 'top' : 'left')), + (row !== 0 && params.spaceBetween) && (((params.spaceBetween) + "px")) + ) + .attr('data-swiper-column', column) + .attr('data-swiper-row', row); + } + if (slide.css('display') === 'none') { continue; } // eslint-disable-line + + if (params.slidesPerView === 'auto') { + var slideStyles = win.getComputedStyle(slide[0], null); + var currentTransform = slide[0].style.transform; + var currentWebKitTransform = slide[0].style.webkitTransform; + if (currentTransform) { + slide[0].style.transform = 'none'; + } + if (currentWebKitTransform) { + slide[0].style.webkitTransform = 'none'; + } + if (params.roundLengths) { + slideSize = swiper.isHorizontal() + ? slide.outerWidth(true) + : slide.outerHeight(true); + } else { + // eslint-disable-next-line + if (swiper.isHorizontal()) { + var width = parseFloat(slideStyles.getPropertyValue('width')); + var paddingLeft = parseFloat(slideStyles.getPropertyValue('padding-left')); + var paddingRight = parseFloat(slideStyles.getPropertyValue('padding-right')); + var marginLeft = parseFloat(slideStyles.getPropertyValue('margin-left')); + var marginRight = parseFloat(slideStyles.getPropertyValue('margin-right')); + var boxSizing = slideStyles.getPropertyValue('box-sizing'); + if (boxSizing && boxSizing === 'border-box') { + slideSize = width + marginLeft + marginRight; + } else { + slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight; + } + } else { + var height = parseFloat(slideStyles.getPropertyValue('height')); + var paddingTop = parseFloat(slideStyles.getPropertyValue('padding-top')); + var paddingBottom = parseFloat(slideStyles.getPropertyValue('padding-bottom')); + var marginTop = parseFloat(slideStyles.getPropertyValue('margin-top')); + var marginBottom = parseFloat(slideStyles.getPropertyValue('margin-bottom')); + var boxSizing$1 = slideStyles.getPropertyValue('box-sizing'); + if (boxSizing$1 && boxSizing$1 === 'border-box') { + slideSize = height + marginTop + marginBottom; + } else { + slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom; + } + } + } + if (currentTransform) { + slide[0].style.transform = currentTransform; + } + if (currentWebKitTransform) { + slide[0].style.webkitTransform = currentWebKitTransform; + } + if (params.roundLengths) { slideSize = Math.floor(slideSize); } + } else { + slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView; + if (params.roundLengths) { slideSize = Math.floor(slideSize); } + + if (slides[i]) { + if (swiper.isHorizontal()) { + slides[i].style.width = slideSize + "px"; + } else { + slides[i].style.height = slideSize + "px"; + } + } + } + if (slides[i]) { + slides[i].swiperSlideSize = slideSize; + } + slidesSizesGrid.push(slideSize); + + + if (params.centeredSlides) { + slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween; + if (prevSlideSize === 0 && i !== 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; } + if (i === 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; } + if (Math.abs(slidePosition) < 1 / 1000) { slidePosition = 0; } + if (params.roundLengths) { slidePosition = Math.floor(slidePosition); } + if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); } + slidesGrid.push(slidePosition); + } else { + if (params.roundLengths) { slidePosition = Math.floor(slidePosition); } + if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); } + slidesGrid.push(slidePosition); + slidePosition = slidePosition + slideSize + spaceBetween; + } + + swiper.virtualSize += slideSize + spaceBetween; + + prevSlideSize = slideSize; + + index += 1; + } + swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter; + var newSlidesGrid; + + if ( + rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) { + $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); + } + if (!Support.flexbox || params.setWrapperSize) { + if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); } + else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); } + } + + if (params.slidesPerColumn > 1) { + swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows; + swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween; + if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); } + else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); } + if (params.centeredSlides) { + newSlidesGrid = []; + for (var i$1 = 0; i$1 < snapGrid.length; i$1 += 1) { + var slidesGridItem = snapGrid[i$1]; + if (params.roundLengths) { slidesGridItem = Math.floor(slidesGridItem); } + if (snapGrid[i$1] < swiper.virtualSize + snapGrid[0]) { newSlidesGrid.push(slidesGridItem); } + } + snapGrid = newSlidesGrid; + } + } + + // Remove last grid elements depending on width + if (!params.centeredSlides) { + newSlidesGrid = []; + for (var i$2 = 0; i$2 < snapGrid.length; i$2 += 1) { + var slidesGridItem$1 = snapGrid[i$2]; + if (params.roundLengths) { slidesGridItem$1 = Math.floor(slidesGridItem$1); } + if (snapGrid[i$2] <= swiper.virtualSize - swiperSize) { + newSlidesGrid.push(slidesGridItem$1); + } + } + snapGrid = newSlidesGrid; + if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) { + snapGrid.push(swiper.virtualSize - swiperSize); + } + } + if (snapGrid.length === 0) { snapGrid = [0]; } + + if (params.spaceBetween !== 0) { + if (swiper.isHorizontal()) { + if (rtl) { slides.css({ marginLeft: (spaceBetween + "px") }); } + else { slides.css({ marginRight: (spaceBetween + "px") }); } + } else { slides.css({ marginBottom: (spaceBetween + "px") }); } + } + + if (params.centerInsufficientSlides) { + var allSlidesSize = 0; + slidesSizesGrid.forEach(function (slideSizeValue) { + allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0); + }); + allSlidesSize -= params.spaceBetween; + if (allSlidesSize < swiperSize) { + var allSlidesOffset = (swiperSize - allSlidesSize) / 2; + snapGrid.forEach(function (snap, snapIndex) { + snapGrid[snapIndex] = snap - allSlidesOffset; + }); + slidesGrid.forEach(function (snap, snapIndex) { + slidesGrid[snapIndex] = snap + allSlidesOffset; + }); + } + } + + Utils.extend(swiper, { + slides: slides, + snapGrid: snapGrid, + slidesGrid: slidesGrid, + slidesSizesGrid: slidesSizesGrid, + }); + + if (slidesLength !== previousSlidesLength) { + swiper.emit('slidesLengthChange'); + } + if (snapGrid.length !== previousSnapGridLength) { + if (swiper.params.watchOverflow) { swiper.checkOverflow(); } + swiper.emit('snapGridLengthChange'); + } + if (slidesGrid.length !== previousSlidesGridLength) { + swiper.emit('slidesGridLengthChange'); + } + + if (params.watchSlidesProgress || params.watchSlidesVisibility) { + swiper.updateSlidesOffset(); + } + } + + function updateAutoHeight (speed) { + var swiper = this; + var activeSlides = []; + var newHeight = 0; + var i; + if (typeof speed === 'number') { + swiper.setTransition(speed); + } else if (speed === true) { + swiper.setTransition(swiper.params.speed); + } + // Find slides currently in view + if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) { + for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) { + var index = swiper.activeIndex + i; + if (index > swiper.slides.length) { break; } + activeSlides.push(swiper.slides.eq(index)[0]); + } + } else { + activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]); + } + + // Find new height from highest slide in view + for (i = 0; i < activeSlides.length; i += 1) { + if (typeof activeSlides[i] !== 'undefined') { + var height = activeSlides[i].offsetHeight; + newHeight = height > newHeight ? height : newHeight; + } + } + + // Update Height + if (newHeight) { swiper.$wrapperEl.css('height', (newHeight + "px")); } + } + + function updateSlidesOffset () { + var swiper = this; + var slides = swiper.slides; + for (var i = 0; i < slides.length; i += 1) { + slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop; + } + } + + function updateSlidesProgress (translate) { + if ( translate === void 0 ) translate = (this && this.translate) || 0; + + var swiper = this; + var params = swiper.params; + + var slides = swiper.slides; + var rtl = swiper.rtlTranslate; + + if (slides.length === 0) { return; } + if (typeof slides[0].swiperSlideOffset === 'undefined') { swiper.updateSlidesOffset(); } + + var offsetCenter = -translate; + if (rtl) { offsetCenter = translate; } + + // Visible Slides + slides.removeClass(params.slideVisibleClass); + + swiper.visibleSlidesIndexes = []; + swiper.visibleSlides = []; + + for (var i = 0; i < slides.length; i += 1) { + var slide = slides[i]; + var slideProgress = ( + (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset + ) / (slide.swiperSlideSize + params.spaceBetween); + if (params.watchSlidesVisibility) { + var slideBefore = -(offsetCenter - slide.swiperSlideOffset); + var slideAfter = slideBefore + swiper.slidesSizesGrid[i]; + var isVisible = (slideBefore >= 0 && slideBefore < swiper.size) + || (slideAfter > 0 && slideAfter <= swiper.size) + || (slideBefore <= 0 && slideAfter >= swiper.size); + if (isVisible) { + swiper.visibleSlides.push(slide); + swiper.visibleSlidesIndexes.push(i); + slides.eq(i).addClass(params.slideVisibleClass); + } + } + slide.progress = rtl ? -slideProgress : slideProgress; + } + swiper.visibleSlides = $(swiper.visibleSlides); + } + + function updateProgress (translate) { + if ( translate === void 0 ) translate = (this && this.translate) || 0; + + var swiper = this; + var params = swiper.params; + + var translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + var progress = swiper.progress; + var isBeginning = swiper.isBeginning; + var isEnd = swiper.isEnd; + var wasBeginning = isBeginning; + var wasEnd = isEnd; + if (translatesDiff === 0) { + progress = 0; + isBeginning = true; + isEnd = true; + } else { + progress = (translate - swiper.minTranslate()) / (translatesDiff); + isBeginning = progress <= 0; + isEnd = progress >= 1; + } + Utils.extend(swiper, { + progress: progress, + isBeginning: isBeginning, + isEnd: isEnd, + }); + + if (params.watchSlidesProgress || params.watchSlidesVisibility) { swiper.updateSlidesProgress(translate); } + + if (isBeginning && !wasBeginning) { + swiper.emit('reachBeginning toEdge'); + } + if (isEnd && !wasEnd) { + swiper.emit('reachEnd toEdge'); + } + if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) { + swiper.emit('fromEdge'); + } + + swiper.emit('progress', progress); + } + + function updateSlidesClasses () { + var swiper = this; + + var slides = swiper.slides; + var params = swiper.params; + var $wrapperEl = swiper.$wrapperEl; + var activeIndex = swiper.activeIndex; + var realIndex = swiper.realIndex; + var isVirtual = swiper.virtual && params.virtual.enabled; + + slides.removeClass(((params.slideActiveClass) + " " + (params.slideNextClass) + " " + (params.slidePrevClass) + " " + (params.slideDuplicateActiveClass) + " " + (params.slideDuplicateNextClass) + " " + (params.slideDuplicatePrevClass))); + + var activeSlide; + if (isVirtual) { + activeSlide = swiper.$wrapperEl.find(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + activeIndex + "\"]")); + } else { + activeSlide = slides.eq(activeIndex); + } + + // Active classes + activeSlide.addClass(params.slideActiveClass); + + if (params.loop) { + // Duplicate to all looped slides + if (activeSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl + .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + realIndex + "\"]")) + .addClass(params.slideDuplicateActiveClass); + } else { + $wrapperEl + .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]")) + .addClass(params.slideDuplicateActiveClass); + } + } + // Next Slide + var nextSlide = activeSlide.nextAll(("." + (params.slideClass))).eq(0).addClass(params.slideNextClass); + if (params.loop && nextSlide.length === 0) { + nextSlide = slides.eq(0); + nextSlide.addClass(params.slideNextClass); + } + // Prev Slide + var prevSlide = activeSlide.prevAll(("." + (params.slideClass))).eq(0).addClass(params.slidePrevClass); + if (params.loop && prevSlide.length === 0) { + prevSlide = slides.eq(-1); + prevSlide.addClass(params.slidePrevClass); + } + if (params.loop) { + // Duplicate to all looped slides + if (nextSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl + .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]")) + .addClass(params.slideDuplicateNextClass); + } else { + $wrapperEl + .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]")) + .addClass(params.slideDuplicateNextClass); + } + if (prevSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl + .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]")) + .addClass(params.slideDuplicatePrevClass); + } else { + $wrapperEl + .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]")) + .addClass(params.slideDuplicatePrevClass); + } + } + } + + function updateActiveIndex (newActiveIndex) { + var swiper = this; + var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; + var slidesGrid = swiper.slidesGrid; + var snapGrid = swiper.snapGrid; + var params = swiper.params; + var previousIndex = swiper.activeIndex; + var previousRealIndex = swiper.realIndex; + var previousSnapIndex = swiper.snapIndex; + var activeIndex = newActiveIndex; + var snapIndex; + if (typeof activeIndex === 'undefined') { + for (var i = 0; i < slidesGrid.length; i += 1) { + if (typeof slidesGrid[i + 1] !== 'undefined') { + if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) { + activeIndex = i; + } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) { + activeIndex = i + 1; + } + } else if (translate >= slidesGrid[i]) { + activeIndex = i; + } + } + // Normalize slideIndex + if (params.normalizeSlideIndex) { + if (activeIndex < 0 || typeof activeIndex === 'undefined') { activeIndex = 0; } + } + } + if (snapGrid.indexOf(translate) >= 0) { + snapIndex = snapGrid.indexOf(translate); + } else { + snapIndex = Math.floor(activeIndex / params.slidesPerGroup); + } + if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; } + if (activeIndex === previousIndex) { + if (snapIndex !== previousSnapIndex) { + swiper.snapIndex = snapIndex; + swiper.emit('snapIndexChange'); + } + return; + } + + // Get real index + var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10); + + Utils.extend(swiper, { + snapIndex: snapIndex, + realIndex: realIndex, + previousIndex: previousIndex, + activeIndex: activeIndex, + }); + swiper.emit('activeIndexChange'); + swiper.emit('snapIndexChange'); + if (previousRealIndex !== realIndex) { + swiper.emit('realIndexChange'); + } + swiper.emit('slideChange'); + } + + function updateClickedSlide (e) { + var swiper = this; + var params = swiper.params; + var slide = $(e.target).closest(("." + (params.slideClass)))[0]; + var slideFound = false; + if (slide) { + for (var i = 0; i < swiper.slides.length; i += 1) { + if (swiper.slides[i] === slide) { slideFound = true; } + } + } + + if (slide && slideFound) { + swiper.clickedSlide = slide; + if (swiper.virtual && swiper.params.virtual.enabled) { + swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10); + } else { + swiper.clickedIndex = $(slide).index(); + } + } else { + swiper.clickedSlide = undefined; + swiper.clickedIndex = undefined; + return; + } + if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) { + swiper.slideToClickedSlide(); + } + } + + var update = { + updateSize: updateSize, + updateSlides: updateSlides, + updateAutoHeight: updateAutoHeight, + updateSlidesOffset: updateSlidesOffset, + updateSlidesProgress: updateSlidesProgress, + updateProgress: updateProgress, + updateSlidesClasses: updateSlidesClasses, + updateActiveIndex: updateActiveIndex, + updateClickedSlide: updateClickedSlide, + }; + + function getTranslate (axis) { + if ( axis === void 0 ) axis = this.isHorizontal() ? 'x' : 'y'; + + var swiper = this; + + var params = swiper.params; + var rtl = swiper.rtlTranslate; + var translate = swiper.translate; + var $wrapperEl = swiper.$wrapperEl; + + if (params.virtualTranslate) { + return rtl ? -translate : translate; + } + + var currentTranslate = Utils.getTranslate($wrapperEl[0], axis); + if (rtl) { currentTranslate = -currentTranslate; } + + return currentTranslate || 0; + } + + function setTranslate (translate, byController) { + var swiper = this; + var rtl = swiper.rtlTranslate; + var params = swiper.params; + var $wrapperEl = swiper.$wrapperEl; + var progress = swiper.progress; + var x = 0; + var y = 0; + var z = 0; + + if (swiper.isHorizontal()) { + x = rtl ? -translate : translate; + } else { + y = translate; + } + + if (params.roundLengths) { + x = Math.floor(x); + y = Math.floor(y); + } + + if (!params.virtualTranslate) { + if (Support.transforms3d) { $wrapperEl.transform(("translate3d(" + x + "px, " + y + "px, " + z + "px)")); } + else { $wrapperEl.transform(("translate(" + x + "px, " + y + "px)")); } + } + swiper.previousTranslate = swiper.translate; + swiper.translate = swiper.isHorizontal() ? x : y; + + // Check if we need to update progress + var newProgress; + var translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + if (translatesDiff === 0) { + newProgress = 0; + } else { + newProgress = (translate - swiper.minTranslate()) / (translatesDiff); + } + if (newProgress !== progress) { + swiper.updateProgress(translate); + } + + swiper.emit('setTranslate', swiper.translate, byController); + } + + function minTranslate () { + return (-this.snapGrid[0]); + } + + function maxTranslate () { + return (-this.snapGrid[this.snapGrid.length - 1]); + } + + var translate = { + getTranslate: getTranslate, + setTranslate: setTranslate, + minTranslate: minTranslate, + maxTranslate: maxTranslate, + }; + + function setTransition (duration, byController) { + var swiper = this; + + swiper.$wrapperEl.transition(duration); + + swiper.emit('setTransition', duration, byController); + } + + function transitionStart (runCallbacks, direction) { + if ( runCallbacks === void 0 ) runCallbacks = true; + + var swiper = this; + var activeIndex = swiper.activeIndex; + var params = swiper.params; + var previousIndex = swiper.previousIndex; + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + + var dir = direction; + if (!dir) { + if (activeIndex > previousIndex) { dir = 'next'; } + else if (activeIndex < previousIndex) { dir = 'prev'; } + else { dir = 'reset'; } + } + + swiper.emit('transitionStart'); + + if (runCallbacks && activeIndex !== previousIndex) { + if (dir === 'reset') { + swiper.emit('slideResetTransitionStart'); + return; + } + swiper.emit('slideChangeTransitionStart'); + if (dir === 'next') { + swiper.emit('slideNextTransitionStart'); + } else { + swiper.emit('slidePrevTransitionStart'); + } + } + } + + function transitionEnd$1 (runCallbacks, direction) { + if ( runCallbacks === void 0 ) runCallbacks = true; + + var swiper = this; + var activeIndex = swiper.activeIndex; + var previousIndex = swiper.previousIndex; + swiper.animating = false; + swiper.setTransition(0); + + var dir = direction; + if (!dir) { + if (activeIndex > previousIndex) { dir = 'next'; } + else if (activeIndex < previousIndex) { dir = 'prev'; } + else { dir = 'reset'; } + } + + swiper.emit('transitionEnd'); + + if (runCallbacks && activeIndex !== previousIndex) { + if (dir === 'reset') { + swiper.emit('slideResetTransitionEnd'); + return; + } + swiper.emit('slideChangeTransitionEnd'); + if (dir === 'next') { + swiper.emit('slideNextTransitionEnd'); + } else { + swiper.emit('slidePrevTransitionEnd'); + } + } + } + + var transition$1 = { + setTransition: setTransition, + transitionStart: transitionStart, + transitionEnd: transitionEnd$1, + }; + + function slideTo (index, speed, runCallbacks, internal) { + if ( index === void 0 ) index = 0; + if ( speed === void 0 ) speed = this.params.speed; + if ( runCallbacks === void 0 ) runCallbacks = true; + + var swiper = this; + var slideIndex = index; + if (slideIndex < 0) { slideIndex = 0; } + + var params = swiper.params; + var snapGrid = swiper.snapGrid; + var slidesGrid = swiper.slidesGrid; + var previousIndex = swiper.previousIndex; + var activeIndex = swiper.activeIndex; + var rtl = swiper.rtlTranslate; + if (swiper.animating && params.preventInteractionOnTransition) { + return false; + } + + var snapIndex = Math.floor(slideIndex / params.slidesPerGroup); + if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; } + + if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) { + swiper.emit('beforeSlideChangeStart'); + } + + var translate = -snapGrid[snapIndex]; + + // Update progress + swiper.updateProgress(translate); + + // Normalize slideIndex + if (params.normalizeSlideIndex) { + for (var i = 0; i < slidesGrid.length; i += 1) { + if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) { + slideIndex = i; + } + } + } + // Directions locks + if (swiper.initialized && slideIndex !== activeIndex) { + if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) { + return false; + } + if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) { + if ((activeIndex || 0) !== slideIndex) { return false; } + } + } + + var direction; + if (slideIndex > activeIndex) { direction = 'next'; } + else if (slideIndex < activeIndex) { direction = 'prev'; } + else { direction = 'reset'; } + + + // Update Index + if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) { + swiper.updateActiveIndex(slideIndex); + // Update Height + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + swiper.updateSlidesClasses(); + if (params.effect !== 'slide') { + swiper.setTranslate(translate); + } + if (direction !== 'reset') { + swiper.transitionStart(runCallbacks, direction); + swiper.transitionEnd(runCallbacks, direction); + } + return false; + } + + if (speed === 0 || !Support.transition) { + swiper.setTransition(0); + swiper.setTranslate(translate); + swiper.updateActiveIndex(slideIndex); + swiper.updateSlidesClasses(); + swiper.emit('beforeTransitionStart', speed, internal); + swiper.transitionStart(runCallbacks, direction); + swiper.transitionEnd(runCallbacks, direction); + } else { + swiper.setTransition(speed); + swiper.setTranslate(translate); + swiper.updateActiveIndex(slideIndex); + swiper.updateSlidesClasses(); + swiper.emit('beforeTransitionStart', speed, internal); + swiper.transitionStart(runCallbacks, direction); + if (!swiper.animating) { + swiper.animating = true; + if (!swiper.onSlideToWrapperTransitionEnd) { + swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) { + if (!swiper || swiper.destroyed) { return; } + if (e.target !== this) { return; } + swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); + swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); + swiper.onSlideToWrapperTransitionEnd = null; + delete swiper.onSlideToWrapperTransitionEnd; + swiper.transitionEnd(runCallbacks, direction); + }; + } + swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); + swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); + } + } + + return true; + } + + function slideToLoop (index, speed, runCallbacks, internal) { + if ( index === void 0 ) index = 0; + if ( speed === void 0 ) speed = this.params.speed; + if ( runCallbacks === void 0 ) runCallbacks = true; + + var swiper = this; + var newIndex = index; + if (swiper.params.loop) { + newIndex += swiper.loopedSlides; + } + + return swiper.slideTo(newIndex, speed, runCallbacks, internal); + } + + /* eslint no-unused-vars: "off" */ + function slideNext (speed, runCallbacks, internal) { + if ( speed === void 0 ) speed = this.params.speed; + if ( runCallbacks === void 0 ) runCallbacks = true; + + var swiper = this; + var params = swiper.params; + var animating = swiper.animating; + if (params.loop) { + if (animating) { return false; } + swiper.loopFix(); + // eslint-disable-next-line + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal); + } + return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal); + } + + /* eslint no-unused-vars: "off" */ + function slidePrev (speed, runCallbacks, internal) { + if ( speed === void 0 ) speed = this.params.speed; + if ( runCallbacks === void 0 ) runCallbacks = true; + + var swiper = this; + var params = swiper.params; + var animating = swiper.animating; + var snapGrid = swiper.snapGrid; + var slidesGrid = swiper.slidesGrid; + var rtlTranslate = swiper.rtlTranslate; + + if (params.loop) { + if (animating) { return false; } + swiper.loopFix(); + // eslint-disable-next-line + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + } + var translate = rtlTranslate ? swiper.translate : -swiper.translate; + function normalize(val) { + if (val < 0) { return -Math.floor(Math.abs(val)); } + return Math.floor(val); + } + var normalizedTranslate = normalize(translate); + var normalizedSnapGrid = snapGrid.map(function (val) { return normalize(val); }); + var normalizedSlidesGrid = slidesGrid.map(function (val) { return normalize(val); }); + + var currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)]; + var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1]; + var prevIndex; + if (typeof prevSnap !== 'undefined') { + prevIndex = slidesGrid.indexOf(prevSnap); + if (prevIndex < 0) { prevIndex = swiper.activeIndex - 1; } + } + return swiper.slideTo(prevIndex, speed, runCallbacks, internal); + } + + /* eslint no-unused-vars: "off" */ + function slideReset (speed, runCallbacks, internal) { + if ( speed === void 0 ) speed = this.params.speed; + if ( runCallbacks === void 0 ) runCallbacks = true; + + var swiper = this; + return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal); + } + + /* eslint no-unused-vars: "off" */ + function slideToClosest (speed, runCallbacks, internal) { + if ( speed === void 0 ) speed = this.params.speed; + if ( runCallbacks === void 0 ) runCallbacks = true; + + var swiper = this; + var index = swiper.activeIndex; + var snapIndex = Math.floor(index / swiper.params.slidesPerGroup); + + if (snapIndex < swiper.snapGrid.length - 1) { + var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; + + var currentSnap = swiper.snapGrid[snapIndex]; + var nextSnap = swiper.snapGrid[snapIndex + 1]; + + if ((translate - currentSnap) > (nextSnap - currentSnap) / 2) { + index = swiper.params.slidesPerGroup; + } + } + + return swiper.slideTo(index, speed, runCallbacks, internal); + } + + function slideToClickedSlide () { + var swiper = this; + var params = swiper.params; + var $wrapperEl = swiper.$wrapperEl; + + var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView; + var slideToIndex = swiper.clickedIndex; + var realIndex; + if (params.loop) { + if (swiper.animating) { return; } + realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10); + if (params.centeredSlides) { + if ( + (slideToIndex < swiper.loopedSlides - (slidesPerView / 2)) + || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2)) + ) { + swiper.loopFix(); + slideToIndex = $wrapperEl + .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")")) + .eq(0) + .index(); + + Utils.nextTick(function () { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else if (slideToIndex > swiper.slides.length - slidesPerView) { + swiper.loopFix(); + slideToIndex = $wrapperEl + .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")")) + .eq(0) + .index(); + + Utils.nextTick(function () { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else { + swiper.slideTo(slideToIndex); + } + } + + var slide = { + slideTo: slideTo, + slideToLoop: slideToLoop, + slideNext: slideNext, + slidePrev: slidePrev, + slideReset: slideReset, + slideToClosest: slideToClosest, + slideToClickedSlide: slideToClickedSlide, + }; + + function loopCreate () { + var swiper = this; + var params = swiper.params; + var $wrapperEl = swiper.$wrapperEl; + // Remove duplicated slides + $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass))).remove(); + + var slides = $wrapperEl.children(("." + (params.slideClass))); + + if (params.loopFillGroupWithBlank) { + var blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup); + if (blankSlidesNum !== params.slidesPerGroup) { + for (var i = 0; i < blankSlidesNum; i += 1) { + var blankNode = $(doc.createElement('div')).addClass(((params.slideClass) + " " + (params.slideBlankClass))); + $wrapperEl.append(blankNode); + } + slides = $wrapperEl.children(("." + (params.slideClass))); + } + } + + if (params.slidesPerView === 'auto' && !params.loopedSlides) { params.loopedSlides = slides.length; } + + swiper.loopedSlides = parseInt(params.loopedSlides || params.slidesPerView, 10); + swiper.loopedSlides += params.loopAdditionalSlides; + if (swiper.loopedSlides > slides.length) { + swiper.loopedSlides = slides.length; + } + + var prependSlides = []; + var appendSlides = []; + slides.each(function (index, el) { + var slide = $(el); + if (index < swiper.loopedSlides) { appendSlides.push(el); } + if (index < slides.length && index >= slides.length - swiper.loopedSlides) { prependSlides.push(el); } + slide.attr('data-swiper-slide-index', index); + }); + for (var i$1 = 0; i$1 < appendSlides.length; i$1 += 1) { + $wrapperEl.append($(appendSlides[i$1].cloneNode(true)).addClass(params.slideDuplicateClass)); + } + for (var i$2 = prependSlides.length - 1; i$2 >= 0; i$2 -= 1) { + $wrapperEl.prepend($(prependSlides[i$2].cloneNode(true)).addClass(params.slideDuplicateClass)); + } + } + + function loopFix () { + var swiper = this; + var params = swiper.params; + var activeIndex = swiper.activeIndex; + var slides = swiper.slides; + var loopedSlides = swiper.loopedSlides; + var allowSlidePrev = swiper.allowSlidePrev; + var allowSlideNext = swiper.allowSlideNext; + var snapGrid = swiper.snapGrid; + var rtl = swiper.rtlTranslate; + var newIndex; + swiper.allowSlidePrev = true; + swiper.allowSlideNext = true; + + var snapTranslate = -snapGrid[activeIndex]; + var diff = snapTranslate - swiper.getTranslate(); + + + // Fix For Negative Oversliding + if (activeIndex < loopedSlides) { + newIndex = (slides.length - (loopedSlides * 3)) + activeIndex; + newIndex += loopedSlides; + var slideChanged = swiper.slideTo(newIndex, 0, false, true); + if (slideChanged && diff !== 0) { + swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); + } + } else if ((params.slidesPerView === 'auto' && activeIndex >= loopedSlides * 2) || (activeIndex >= slides.length - loopedSlides)) { + // Fix For Positive Oversliding + newIndex = -slides.length + activeIndex + loopedSlides; + newIndex += loopedSlides; + var slideChanged$1 = swiper.slideTo(newIndex, 0, false, true); + if (slideChanged$1 && diff !== 0) { + swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); + } + } + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; + } + + function loopDestroy () { + var swiper = this; + var $wrapperEl = swiper.$wrapperEl; + var params = swiper.params; + var slides = swiper.slides; + $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + ",." + (params.slideClass) + "." + (params.slideBlankClass))).remove(); + slides.removeAttr('data-swiper-slide-index'); + } + + var loop = { + loopCreate: loopCreate, + loopFix: loopFix, + loopDestroy: loopDestroy, + }; + + function setGrabCursor (moving) { + var swiper = this; + if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked)) { return; } + var el = swiper.el; + el.style.cursor = 'move'; + el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab'; + el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab'; + el.style.cursor = moving ? 'grabbing' : 'grab'; + } + + function unsetGrabCursor () { + var swiper = this; + if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked)) { return; } + swiper.el.style.cursor = ''; + } + + var grabCursor = { + setGrabCursor: setGrabCursor, + unsetGrabCursor: unsetGrabCursor, + }; + + function appendSlide (slides) { + var swiper = this; + var $wrapperEl = swiper.$wrapperEl; + var params = swiper.params; + if (params.loop) { + swiper.loopDestroy(); + } + if (typeof slides === 'object' && 'length' in slides) { + for (var i = 0; i < slides.length; i += 1) { + if (slides[i]) { $wrapperEl.append(slides[i]); } + } + } else { + $wrapperEl.append(slides); + } + if (params.loop) { + swiper.loopCreate(); + } + if (!(params.observer && Support.observer)) { + swiper.update(); + } + } + + function prependSlide (slides) { + var swiper = this; + var params = swiper.params; + var $wrapperEl = swiper.$wrapperEl; + var activeIndex = swiper.activeIndex; + + if (params.loop) { + swiper.loopDestroy(); + } + var newActiveIndex = activeIndex + 1; + if (typeof slides === 'object' && 'length' in slides) { + for (var i = 0; i < slides.length; i += 1) { + if (slides[i]) { $wrapperEl.prepend(slides[i]); } + } + newActiveIndex = activeIndex + slides.length; + } else { + $wrapperEl.prepend(slides); + } + if (params.loop) { + swiper.loopCreate(); + } + if (!(params.observer && Support.observer)) { + swiper.update(); + } + swiper.slideTo(newActiveIndex, 0, false); + } + + function addSlide (index, slides) { + var swiper = this; + var $wrapperEl = swiper.$wrapperEl; + var params = swiper.params; + var activeIndex = swiper.activeIndex; + var activeIndexBuffer = activeIndex; + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(("." + (params.slideClass))); + } + var baseLength = swiper.slides.length; + if (index <= 0) { + swiper.prependSlide(slides); + return; + } + if (index >= baseLength) { + swiper.appendSlide(slides); + return; + } + var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer; + + var slidesBuffer = []; + for (var i = baseLength - 1; i >= index; i -= 1) { + var currentSlide = swiper.slides.eq(i); + currentSlide.remove(); + slidesBuffer.unshift(currentSlide); + } + + if (typeof slides === 'object' && 'length' in slides) { + for (var i$1 = 0; i$1 < slides.length; i$1 += 1) { + if (slides[i$1]) { $wrapperEl.append(slides[i$1]); } + } + newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer; + } else { + $wrapperEl.append(slides); + } + + for (var i$2 = 0; i$2 < slidesBuffer.length; i$2 += 1) { + $wrapperEl.append(slidesBuffer[i$2]); + } + + if (params.loop) { + swiper.loopCreate(); + } + if (!(params.observer && Support.observer)) { + swiper.update(); + } + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } + } + + function removeSlide (slidesIndexes) { + var swiper = this; + var params = swiper.params; + var $wrapperEl = swiper.$wrapperEl; + var activeIndex = swiper.activeIndex; + + var activeIndexBuffer = activeIndex; + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(("." + (params.slideClass))); + } + var newActiveIndex = activeIndexBuffer; + var indexToRemove; + + if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) { + for (var i = 0; i < slidesIndexes.length; i += 1) { + indexToRemove = slidesIndexes[i]; + if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); } + if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; } + } + newActiveIndex = Math.max(newActiveIndex, 0); + } else { + indexToRemove = slidesIndexes; + if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); } + if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; } + newActiveIndex = Math.max(newActiveIndex, 0); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!(params.observer && Support.observer)) { + swiper.update(); + } + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } + } + + function removeAllSlides () { + var swiper = this; + + var slidesIndexes = []; + for (var i = 0; i < swiper.slides.length; i += 1) { + slidesIndexes.push(i); + } + swiper.removeSlide(slidesIndexes); + } + + var manipulation = { + appendSlide: appendSlide, + prependSlide: prependSlide, + addSlide: addSlide, + removeSlide: removeSlide, + removeAllSlides: removeAllSlides, + }; + + var Device = (function Device() { + var ua = win.navigator.userAgent; + + var device = { + ios: false, + android: false, + androidChrome: false, + desktop: false, + windows: false, + iphone: false, + ipod: false, + ipad: false, + cordova: win.cordova || win.phonegap, + phonegap: win.cordova || win.phonegap, + }; + + var windows = ua.match(/(Windows Phone);?[\s\/]+([\d.]+)?/); // eslint-disable-line + var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line + var ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); + + + // Windows + if (windows) { + device.os = 'windows'; + device.osVersion = windows[2]; + device.windows = true; + } + // Android + if (android && !windows) { + device.os = 'android'; + device.osVersion = android[2]; + device.android = true; + device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0; + } + if (ipad || iphone || ipod) { + device.os = 'ios'; + device.ios = true; + } + // iOS + if (iphone && !ipod) { + device.osVersion = iphone[2].replace(/_/g, '.'); + device.iphone = true; + } + if (ipad) { + device.osVersion = ipad[2].replace(/_/g, '.'); + device.ipad = true; + } + if (ipod) { + device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null; + device.iphone = true; + } + // iOS 8+ changed UA + if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) { + if (device.osVersion.split('.')[0] === '10') { + device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0]; + } + } + + // Desktop + device.desktop = !(device.os || device.android || device.webView); + + // Webview + device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i); + + // Minimal UI + if (device.os && device.os === 'ios') { + var osVersionArr = device.osVersion.split('.'); + var metaViewport = doc.querySelector('meta[name="viewport"]'); + device.minimalUi = !device.webView + && (ipod || iphone) + && (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) + && metaViewport && metaViewport.getAttribute('content').indexOf('minimal-ui') >= 0; + } + + // Pixel Ratio + device.pixelRatio = win.devicePixelRatio || 1; + + // Export object + return device; + }()); + + function onTouchStart (event) { + var swiper = this; + var data = swiper.touchEventsData; + var params = swiper.params; + var touches = swiper.touches; + if (swiper.animating && params.preventInteractionOnTransition) { + return; + } + var e = event; + if (e.originalEvent) { e = e.originalEvent; } + data.isTouchEvent = e.type === 'touchstart'; + if (!data.isTouchEvent && 'which' in e && e.which === 3) { return; } + if (!data.isTouchEvent && 'button' in e && e.button > 0) { return; } + if (data.isTouched && data.isMoved) { return; } + if (params.noSwiping && $(e.target).closest(params.noSwipingSelector ? params.noSwipingSelector : ("." + (params.noSwipingClass)))[0]) { + swiper.allowClick = true; + return; + } + if (params.swipeHandler) { + if (!$(e).closest(params.swipeHandler)[0]) { return; } + } + + touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + var startX = touches.currentX; + var startY = touches.currentY; + + // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore + + var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection; + var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold; + if ( + edgeSwipeDetection + && ((startX <= edgeSwipeThreshold) + || (startX >= win.screen.width - edgeSwipeThreshold)) + ) { + return; + } + + Utils.extend(data, { + isTouched: true, + isMoved: false, + allowTouchCallbacks: true, + isScrolling: undefined, + startMoving: undefined, + }); + + touches.startX = startX; + touches.startY = startY; + data.touchStartTime = Utils.now(); + swiper.allowClick = true; + swiper.updateSize(); + swiper.swipeDirection = undefined; + if (params.threshold > 0) { data.allowThresholdMove = false; } + if (e.type !== 'touchstart') { + var preventDefault = true; + if ($(e.target).is(data.formElements)) { preventDefault = false; } + if ( + doc.activeElement + && $(doc.activeElement).is(data.formElements) + && doc.activeElement !== e.target + ) { + doc.activeElement.blur(); + } + + var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault; + if (params.touchStartForcePreventDefault || shouldPreventDefault) { + e.preventDefault(); + } + } + swiper.emit('touchStart', e); + } + + function onTouchMove (event) { + var swiper = this; + var data = swiper.touchEventsData; + var params = swiper.params; + var touches = swiper.touches; + var rtl = swiper.rtlTranslate; + var e = event; + if (e.originalEvent) { e = e.originalEvent; } + if (!data.isTouched) { + if (data.startMoving && data.isScrolling) { + swiper.emit('touchMoveOpposite', e); + } + return; + } + if (data.isTouchEvent && e.type === 'mousemove') { return; } + var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + if (e.preventedByNestedSwiper) { + touches.startX = pageX; + touches.startY = pageY; + return; + } + if (!swiper.allowTouchMove) { + // isMoved = true; + swiper.allowClick = false; + if (data.isTouched) { + Utils.extend(touches, { + startX: pageX, + startY: pageY, + currentX: pageX, + currentY: pageY, + }); + data.touchStartTime = Utils.now(); + } + return; + } + if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) { + if (swiper.isVertical()) { + // Vertical + if ( + (pageY < touches.startY && swiper.translate <= swiper.maxTranslate()) + || (pageY > touches.startY && swiper.translate >= swiper.minTranslate()) + ) { + data.isTouched = false; + data.isMoved = false; + return; + } + } else if ( + (pageX < touches.startX && swiper.translate <= swiper.maxTranslate()) + || (pageX > touches.startX && swiper.translate >= swiper.minTranslate()) + ) { + return; + } + } + if (data.isTouchEvent && doc.activeElement) { + if (e.target === doc.activeElement && $(e.target).is(data.formElements)) { + data.isMoved = true; + swiper.allowClick = false; + return; + } + } + if (data.allowTouchCallbacks) { + swiper.emit('touchMove', e); + } + if (e.targetTouches && e.targetTouches.length > 1) { return; } + + touches.currentX = pageX; + touches.currentY = pageY; + + var diffX = touches.currentX - touches.startX; + var diffY = touches.currentY - touches.startY; + if (swiper.params.threshold && Math.sqrt((Math.pow( diffX, 2 )) + (Math.pow( diffY, 2 ))) < swiper.params.threshold) { return; } + + if (typeof data.isScrolling === 'undefined') { + var touchAngle; + if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) { + data.isScrolling = false; + } else { + // eslint-disable-next-line + if ((diffX * diffX) + (diffY * diffY) >= 25) { + touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI; + data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle); + } + } + } + if (data.isScrolling) { + swiper.emit('touchMoveOpposite', e); + } + if (typeof data.startMoving === 'undefined') { + if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) { + data.startMoving = true; + } + } + if (data.isScrolling) { + data.isTouched = false; + return; + } + if (!data.startMoving) { + return; + } + swiper.allowClick = false; + e.preventDefault(); + if (params.touchMoveStopPropagation && !params.nested) { + e.stopPropagation(); + } + + if (!data.isMoved) { + if (params.loop) { + swiper.loopFix(); + } + data.startTranslate = swiper.getTranslate(); + swiper.setTransition(0); + if (swiper.animating) { + swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend'); + } + data.allowMomentumBounce = false; + // Grab Cursor + if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { + swiper.setGrabCursor(true); + } + swiper.emit('sliderFirstMove', e); + } + swiper.emit('sliderMove', e); + data.isMoved = true; + + var diff = swiper.isHorizontal() ? diffX : diffY; + touches.diff = diff; + + diff *= params.touchRatio; + if (rtl) { diff = -diff; } + + swiper.swipeDirection = diff > 0 ? 'prev' : 'next'; + data.currentTranslate = diff + data.startTranslate; + + var disableParentSwiper = true; + var resistanceRatio = params.resistanceRatio; + if (params.touchReleaseOnEdges) { + resistanceRatio = 0; + } + if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) { + disableParentSwiper = false; + if (params.resistance) { data.currentTranslate = (swiper.minTranslate() - 1) + (Math.pow( (-swiper.minTranslate() + data.startTranslate + diff), resistanceRatio )); } + } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) { + disableParentSwiper = false; + if (params.resistance) { data.currentTranslate = (swiper.maxTranslate() + 1) - (Math.pow( (swiper.maxTranslate() - data.startTranslate - diff), resistanceRatio )); } + } + + if (disableParentSwiper) { + e.preventedByNestedSwiper = true; + } + + // Directions locks + if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) { + data.currentTranslate = data.startTranslate; + } + if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) { + data.currentTranslate = data.startTranslate; + } + + + // Threshold + if (params.threshold > 0) { + if (Math.abs(diff) > params.threshold || data.allowThresholdMove) { + if (!data.allowThresholdMove) { + data.allowThresholdMove = true; + touches.startX = touches.currentX; + touches.startY = touches.currentY; + data.currentTranslate = data.startTranslate; + touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY; + return; + } + } else { + data.currentTranslate = data.startTranslate; + return; + } + } + + if (!params.followFinger) { return; } + + // Update active index in free mode + if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) { + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + if (params.freeMode) { + // Velocity + if (data.velocities.length === 0) { + data.velocities.push({ + position: touches[swiper.isHorizontal() ? 'startX' : 'startY'], + time: data.touchStartTime, + }); + } + data.velocities.push({ + position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'], + time: Utils.now(), + }); + } + // Update progress + swiper.updateProgress(data.currentTranslate); + // Update translate + swiper.setTranslate(data.currentTranslate); + } + + function onTouchEnd (event) { + var swiper = this; + var data = swiper.touchEventsData; + + var params = swiper.params; + var touches = swiper.touches; + var rtl = swiper.rtlTranslate; + var $wrapperEl = swiper.$wrapperEl; + var slidesGrid = swiper.slidesGrid; + var snapGrid = swiper.snapGrid; + var e = event; + if (e.originalEvent) { e = e.originalEvent; } + if (data.allowTouchCallbacks) { + swiper.emit('touchEnd', e); + } + data.allowTouchCallbacks = false; + if (!data.isTouched) { + if (data.isMoved && params.grabCursor) { + swiper.setGrabCursor(false); + } + data.isMoved = false; + data.startMoving = false; + return; + } + // Return Grab Cursor + if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { + swiper.setGrabCursor(false); + } + + // Time diff + var touchEndTime = Utils.now(); + var timeDiff = touchEndTime - data.touchStartTime; + + // Tap, doubleTap, Click + if (swiper.allowClick) { + swiper.updateClickedSlide(e); + swiper.emit('tap', e); + if (timeDiff < 300 && (touchEndTime - data.lastClickTime) > 300) { + if (data.clickTimeout) { clearTimeout(data.clickTimeout); } + data.clickTimeout = Utils.nextTick(function () { + if (!swiper || swiper.destroyed) { return; } + swiper.emit('click', e); + }, 300); + } + if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) { + if (data.clickTimeout) { clearTimeout(data.clickTimeout); } + swiper.emit('doubleTap', e); + } + } + + data.lastClickTime = Utils.now(); + Utils.nextTick(function () { + if (!swiper.destroyed) { swiper.allowClick = true; } + }); + + if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) { + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + return; + } + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + + var currentPos; + if (params.followFinger) { + currentPos = rtl ? swiper.translate : -swiper.translate; + } else { + currentPos = -data.currentTranslate; + } + + if (params.freeMode) { + if (currentPos < -swiper.minTranslate()) { + swiper.slideTo(swiper.activeIndex); + return; + } + if (currentPos > -swiper.maxTranslate()) { + if (swiper.slides.length < snapGrid.length) { + swiper.slideTo(snapGrid.length - 1); + } else { + swiper.slideTo(swiper.slides.length - 1); + } + return; + } + + if (params.freeModeMomentum) { + if (data.velocities.length > 1) { + var lastMoveEvent = data.velocities.pop(); + var velocityEvent = data.velocities.pop(); + + var distance = lastMoveEvent.position - velocityEvent.position; + var time = lastMoveEvent.time - velocityEvent.time; + swiper.velocity = distance / time; + swiper.velocity /= 2; + if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) { + swiper.velocity = 0; + } + // this implies that the user stopped moving a finger then released. + // There would be no events with distance zero, so the last event is stale. + if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) { + swiper.velocity = 0; + } + } else { + swiper.velocity = 0; + } + swiper.velocity *= params.freeModeMomentumVelocityRatio; + + data.velocities.length = 0; + var momentumDuration = 1000 * params.freeModeMomentumRatio; + var momentumDistance = swiper.velocity * momentumDuration; + + var newPosition = swiper.translate + momentumDistance; + if (rtl) { newPosition = -newPosition; } + + var doBounce = false; + var afterBouncePosition; + var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio; + var needsLoopFix; + if (newPosition < swiper.maxTranslate()) { + if (params.freeModeMomentumBounce) { + if (newPosition + swiper.maxTranslate() < -bounceAmount) { + newPosition = swiper.maxTranslate() - bounceAmount; + } + afterBouncePosition = swiper.maxTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.maxTranslate(); + } + if (params.loop && params.centeredSlides) { needsLoopFix = true; } + } else if (newPosition > swiper.minTranslate()) { + if (params.freeModeMomentumBounce) { + if (newPosition - swiper.minTranslate() > bounceAmount) { + newPosition = swiper.minTranslate() + bounceAmount; + } + afterBouncePosition = swiper.minTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.minTranslate(); + } + if (params.loop && params.centeredSlides) { needsLoopFix = true; } + } else if (params.freeModeSticky) { + var nextSlide; + for (var j = 0; j < snapGrid.length; j += 1) { + if (snapGrid[j] > -newPosition) { + nextSlide = j; + break; + } + } + + if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') { + newPosition = snapGrid[nextSlide]; + } else { + newPosition = snapGrid[nextSlide - 1]; + } + newPosition = -newPosition; + } + if (needsLoopFix) { + swiper.once('transitionEnd', function () { + swiper.loopFix(); + }); + } + // Fix duration + if (swiper.velocity !== 0) { + if (rtl) { + momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity); + } else { + momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity); + } + } else if (params.freeModeSticky) { + swiper.slideToClosest(); + return; + } + + if (params.freeModeMomentumBounce && doBounce) { + swiper.updateProgress(afterBouncePosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + swiper.animating = true; + $wrapperEl.transitionEnd(function () { + if (!swiper || swiper.destroyed || !data.allowMomentumBounce) { return; } + swiper.emit('momentumBounce'); + + swiper.setTransition(params.speed); + swiper.setTranslate(afterBouncePosition); + $wrapperEl.transitionEnd(function () { + if (!swiper || swiper.destroyed) { return; } + swiper.transitionEnd(); + }); + }); + } else if (swiper.velocity) { + swiper.updateProgress(newPosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + if (!swiper.animating) { + swiper.animating = true; + $wrapperEl.transitionEnd(function () { + if (!swiper || swiper.destroyed) { return; } + swiper.transitionEnd(); + }); + } + } else { + swiper.updateProgress(newPosition); + } + + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } else if (params.freeModeSticky) { + swiper.slideToClosest(); + return; + } + + if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) { + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + return; + } + + // Find current slide + var stopIndex = 0; + var groupSize = swiper.slidesSizesGrid[0]; + for (var i = 0; i < slidesGrid.length; i += params.slidesPerGroup) { + if (typeof slidesGrid[i + params.slidesPerGroup] !== 'undefined') { + if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + params.slidesPerGroup]) { + stopIndex = i; + groupSize = slidesGrid[i + params.slidesPerGroup] - slidesGrid[i]; + } + } else if (currentPos >= slidesGrid[i]) { + stopIndex = i; + groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2]; + } + } + + // Find current slide size + var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize; + + if (timeDiff > params.longSwipesMs) { + // Long touches + if (!params.longSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + if (swiper.swipeDirection === 'next') { + if (ratio >= params.longSwipesRatio) { swiper.slideTo(stopIndex + params.slidesPerGroup); } + else { swiper.slideTo(stopIndex); } + } + if (swiper.swipeDirection === 'prev') { + if (ratio > (1 - params.longSwipesRatio)) { swiper.slideTo(stopIndex + params.slidesPerGroup); } + else { swiper.slideTo(stopIndex); } + } + } else { + // Short swipes + if (!params.shortSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + if (swiper.swipeDirection === 'next') { + swiper.slideTo(stopIndex + params.slidesPerGroup); + } + if (swiper.swipeDirection === 'prev') { + swiper.slideTo(stopIndex); + } + } + } + + function onResize () { + var swiper = this; + + var params = swiper.params; + var el = swiper.el; + + if (el && el.offsetWidth === 0) { return; } + + // Breakpoints + if (params.breakpoints) { + swiper.setBreakpoint(); + } + + // Save locks + var allowSlideNext = swiper.allowSlideNext; + var allowSlidePrev = swiper.allowSlidePrev; + var snapGrid = swiper.snapGrid; + + // Disable locks on resize + swiper.allowSlideNext = true; + swiper.allowSlidePrev = true; + + swiper.updateSize(); + swiper.updateSlides(); + + if (params.freeMode) { + var newTranslate = Math.min(Math.max(swiper.translate, swiper.maxTranslate()), swiper.minTranslate()); + swiper.setTranslate(newTranslate); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + } else { + swiper.updateSlidesClasses(); + if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) { + swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + swiper.slideTo(swiper.activeIndex, 0, false, true); + } + } + // Return locks after resize + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; + + if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } + } + + function onClick (e) { + var swiper = this; + if (!swiper.allowClick) { + if (swiper.params.preventClicks) { e.preventDefault(); } + if (swiper.params.preventClicksPropagation && swiper.animating) { + e.stopPropagation(); + e.stopImmediatePropagation(); + } + } + } + + function attachEvents() { + var swiper = this; + var params = swiper.params; + var touchEvents = swiper.touchEvents; + var el = swiper.el; + var wrapperEl = swiper.wrapperEl; + + { + swiper.onTouchStart = onTouchStart.bind(swiper); + swiper.onTouchMove = onTouchMove.bind(swiper); + swiper.onTouchEnd = onTouchEnd.bind(swiper); + } + + swiper.onClick = onClick.bind(swiper); + + var target = params.touchEventsTarget === 'container' ? el : wrapperEl; + var capture = !!params.nested; + + // Touch Events + { + if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) { + target.addEventListener(touchEvents.start, swiper.onTouchStart, false); + doc.addEventListener(touchEvents.move, swiper.onTouchMove, capture); + doc.addEventListener(touchEvents.end, swiper.onTouchEnd, false); + } else { + if (Support.touch) { + var passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false; + target.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener); + target.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture: capture } : capture); + target.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener); + } + if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) { + target.addEventListener('mousedown', swiper.onTouchStart, false); + doc.addEventListener('mousemove', swiper.onTouchMove, capture); + doc.addEventListener('mouseup', swiper.onTouchEnd, false); + } + } + // Prevent Links Clicks + if (params.preventClicks || params.preventClicksPropagation) { + target.addEventListener('click', swiper.onClick, true); + } + } + + // Resize handler + swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize, true); + } + + function detachEvents() { + var swiper = this; + + var params = swiper.params; + var touchEvents = swiper.touchEvents; + var el = swiper.el; + var wrapperEl = swiper.wrapperEl; + + var target = params.touchEventsTarget === 'container' ? el : wrapperEl; + var capture = !!params.nested; + + // Touch Events + { + if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) { + target.removeEventListener(touchEvents.start, swiper.onTouchStart, false); + doc.removeEventListener(touchEvents.move, swiper.onTouchMove, capture); + doc.removeEventListener(touchEvents.end, swiper.onTouchEnd, false); + } else { + if (Support.touch) { + var passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false; + target.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener); + target.removeEventListener(touchEvents.move, swiper.onTouchMove, capture); + target.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener); + } + if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) { + target.removeEventListener('mousedown', swiper.onTouchStart, false); + doc.removeEventListener('mousemove', swiper.onTouchMove, capture); + doc.removeEventListener('mouseup', swiper.onTouchEnd, false); + } + } + // Prevent Links Clicks + if (params.preventClicks || params.preventClicksPropagation) { + target.removeEventListener('click', swiper.onClick, true); + } + } + + // Resize handler + swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize); + } + + var events = { + attachEvents: attachEvents, + detachEvents: detachEvents, + }; + + function setBreakpoint () { + var swiper = this; + var activeIndex = swiper.activeIndex; + var initialized = swiper.initialized; + var loopedSlides = swiper.loopedSlides; if ( loopedSlides === void 0 ) loopedSlides = 0; + var params = swiper.params; + var breakpoints = params.breakpoints; + if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) { return; } + + // Set breakpoint for window width and update parameters + var breakpoint = swiper.getBreakpoint(breakpoints); + + if (breakpoint && swiper.currentBreakpoint !== breakpoint) { + var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined; + if (breakpointOnlyParams) { + ['slidesPerView', 'spaceBetween', 'slidesPerGroup'].forEach(function (param) { + var paramValue = breakpointOnlyParams[param]; + if (typeof paramValue === 'undefined') { return; } + if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) { + breakpointOnlyParams[param] = 'auto'; + } else if (param === 'slidesPerView') { + breakpointOnlyParams[param] = parseFloat(paramValue); + } else { + breakpointOnlyParams[param] = parseInt(paramValue, 10); + } + }); + } + + var breakpointParams = breakpointOnlyParams || swiper.originalParams; + var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction; + var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged); + + if (directionChanged && initialized) { + swiper.changeDirection(); + } + + Utils.extend(swiper.params, breakpointParams); + + Utils.extend(swiper, { + allowTouchMove: swiper.params.allowTouchMove, + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev, + }); + + swiper.currentBreakpoint = breakpoint; + + if (needsReLoop && initialized) { + swiper.loopDestroy(); + swiper.loopCreate(); + swiper.updateSlides(); + swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false); + } + + swiper.emit('breakpoint', breakpointParams); + } + } + + function getBreakpoint (breakpoints) { + var swiper = this; + // Get breakpoint for window width + if (!breakpoints) { return undefined; } + var breakpoint = false; + var points = []; + Object.keys(breakpoints).forEach(function (point) { + points.push(point); + }); + points.sort(function (a, b) { return parseInt(a, 10) - parseInt(b, 10); }); + for (var i = 0; i < points.length; i += 1) { + var point = points[i]; + if (swiper.params.breakpointsInverse) { + if (point <= win.innerWidth) { + breakpoint = point; + } + } else if (point >= win.innerWidth && !breakpoint) { + breakpoint = point; + } + } + return breakpoint || 'max'; + } + + var breakpoints = { setBreakpoint: setBreakpoint, getBreakpoint: getBreakpoint }; + + function addClasses () { + var swiper = this; + var classNames = swiper.classNames; + var params = swiper.params; + var rtl = swiper.rtl; + var $el = swiper.$el; + var suffixes = []; + + suffixes.push('initialized'); + suffixes.push(params.direction); + + if (params.freeMode) { + suffixes.push('free-mode'); + } + if (!Support.flexbox) { + suffixes.push('no-flexbox'); + } + if (params.autoHeight) { + suffixes.push('autoheight'); + } + if (rtl) { + suffixes.push('rtl'); + } + if (params.slidesPerColumn > 1) { + suffixes.push('multirow'); + } + if (Device.android) { + suffixes.push('android'); + } + if (Device.ios) { + suffixes.push('ios'); + } + // WP8 Touch Events Fix + if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) { + suffixes.push(("wp8-" + (params.direction))); + } + + suffixes.forEach(function (suffix) { + classNames.push(params.containerModifierClass + suffix); + }); + + $el.addClass(classNames.join(' ')); + } + + function removeClasses () { + var swiper = this; + var $el = swiper.$el; + var classNames = swiper.classNames; + + $el.removeClass(classNames.join(' ')); + } + + var classes = { addClasses: addClasses, removeClasses: removeClasses }; + + function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) { + var image; + function onReady() { + if (callback) { callback(); } + } + if (!imageEl.complete || !checkForComplete) { + if (src) { + image = new win.Image(); + image.onload = onReady; + image.onerror = onReady; + if (sizes) { + image.sizes = sizes; + } + if (srcset) { + image.srcset = srcset; + } + if (src) { + image.src = src; + } + } else { + onReady(); + } + } else { + // image already loaded... + onReady(); + } + } + + function preloadImages () { + var swiper = this; + swiper.imagesToLoad = swiper.$el.find('img'); + function onReady() { + if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) { return; } + if (swiper.imagesLoaded !== undefined) { swiper.imagesLoaded += 1; } + if (swiper.imagesLoaded === swiper.imagesToLoad.length) { + if (swiper.params.updateOnImagesReady) { swiper.update(); } + swiper.emit('imagesReady'); + } + } + for (var i = 0; i < swiper.imagesToLoad.length; i += 1) { + var imageEl = swiper.imagesToLoad[i]; + swiper.loadImage( + imageEl, + imageEl.currentSrc || imageEl.getAttribute('src'), + imageEl.srcset || imageEl.getAttribute('srcset'), + imageEl.sizes || imageEl.getAttribute('sizes'), + true, + onReady + ); + } + } + + var images = { + loadImage: loadImage, + preloadImages: preloadImages, + }; + + function checkOverflow() { + var swiper = this; + var wasLocked = swiper.isLocked; + + swiper.isLocked = swiper.snapGrid.length === 1; + swiper.allowSlideNext = !swiper.isLocked; + swiper.allowSlidePrev = !swiper.isLocked; + + // events + if (wasLocked !== swiper.isLocked) { swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); } + + if (wasLocked && wasLocked !== swiper.isLocked) { + swiper.isEnd = false; + swiper.navigation.update(); + } + } + + var checkOverflow$1 = { checkOverflow: checkOverflow }; + + var defaults = { + init: true, + direction: 'horizontal', + touchEventsTarget: 'container', + initialSlide: 0, + speed: 300, + // + preventInteractionOnTransition: false, + + // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView). + edgeSwipeDetection: false, + edgeSwipeThreshold: 20, + + // Free mode + freeMode: false, + freeModeMomentum: true, + freeModeMomentumRatio: 1, + freeModeMomentumBounce: true, + freeModeMomentumBounceRatio: 1, + freeModeMomentumVelocityRatio: 1, + freeModeSticky: false, + freeModeMinimumVelocity: 0.02, + + // Autoheight + autoHeight: false, + + // Set wrapper width + setWrapperSize: false, + + // Virtual Translate + virtualTranslate: false, + + // Effects + effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip' + + // Breakpoints + breakpoints: undefined, + breakpointsInverse: false, + + // Slides grid + spaceBetween: 0, + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerColumnFill: 'column', + slidesPerGroup: 1, + centeredSlides: false, + slidesOffsetBefore: 0, // in px + slidesOffsetAfter: 0, // in px + normalizeSlideIndex: true, + centerInsufficientSlides: false, + + // Disable swiper and hide navigation when container not overflow + watchOverflow: false, + + // Round length + roundLengths: false, + + // Touches + touchRatio: 1, + touchAngle: 45, + simulateTouch: true, + shortSwipes: true, + longSwipes: true, + longSwipesRatio: 0.5, + longSwipesMs: 300, + followFinger: true, + allowTouchMove: true, + threshold: 0, + touchMoveStopPropagation: true, + touchStartPreventDefault: true, + touchStartForcePreventDefault: false, + touchReleaseOnEdges: false, + + // Unique Navigation Elements + uniqueNavElements: true, + + // Resistance + resistance: true, + resistanceRatio: 0.85, + + // Progress + watchSlidesProgress: false, + watchSlidesVisibility: false, + + // Cursor + grabCursor: false, + + // Clicks + preventClicks: true, + preventClicksPropagation: true, + slideToClickedSlide: false, + + // Images + preloadImages: true, + updateOnImagesReady: true, + + // loop + loop: false, + loopAdditionalSlides: 0, + loopedSlides: null, + loopFillGroupWithBlank: false, + + // Swiping/no swiping + allowSlidePrev: true, + allowSlideNext: true, + swipeHandler: null, // '.swipe-handler', + noSwiping: true, + noSwipingClass: 'swiper-no-swiping', + noSwipingSelector: null, + + // Passive Listeners + passiveListeners: true, + + // NS + containerModifierClass: 'swiper-container-', // NEW + slideClass: 'swiper-slide', + slideBlankClass: 'swiper-slide-invisible-blank', + slideActiveClass: 'swiper-slide-active', + slideDuplicateActiveClass: 'swiper-slide-duplicate-active', + slideVisibleClass: 'swiper-slide-visible', + slideDuplicateClass: 'swiper-slide-duplicate', + slideNextClass: 'swiper-slide-next', + slideDuplicateNextClass: 'swiper-slide-duplicate-next', + slidePrevClass: 'swiper-slide-prev', + slideDuplicatePrevClass: 'swiper-slide-duplicate-prev', + wrapperClass: 'swiper-wrapper', + + // Callbacks + runCallbacksOnInit: true, + }; + + /* eslint no-param-reassign: "off" */ + + var prototypes = { + update: update, + translate: translate, + transition: transition$1, + slide: slide, + loop: loop, + grabCursor: grabCursor, + manipulation: manipulation, + events: events, + breakpoints: breakpoints, + checkOverflow: checkOverflow$1, + classes: classes, + images: images, + }; + + var extendedDefaults = {}; + + var Swiper = /*@__PURE__*/(function (SwiperClass) { + function Swiper() { + var assign; + + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + var el; + var params; + if (args.length === 1 && args[0].constructor && args[0].constructor === Object) { + params = args[0]; + } else { + (assign = args, el = assign[0], params = assign[1]); + } + if (!params) { params = {}; } + + params = Utils.extend({}, params); + if (el && !params.el) { params.el = el; } + + SwiperClass.call(this, params); + + Object.keys(prototypes).forEach(function (prototypeGroup) { + Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) { + if (!Swiper.prototype[protoMethod]) { + Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod]; + } + }); + }); + + // Swiper Instance + var swiper = this; + if (typeof swiper.modules === 'undefined') { + swiper.modules = {}; + } + Object.keys(swiper.modules).forEach(function (moduleName) { + var module = swiper.modules[moduleName]; + if (module.params) { + var moduleParamName = Object.keys(module.params)[0]; + var moduleParams = module.params[moduleParamName]; + if (typeof moduleParams !== 'object' || moduleParams === null) { return; } + if (!(moduleParamName in params && 'enabled' in moduleParams)) { return; } + if (params[moduleParamName] === true) { + params[moduleParamName] = { enabled: true }; + } + if ( + typeof params[moduleParamName] === 'object' + && !('enabled' in params[moduleParamName]) + ) { + params[moduleParamName].enabled = true; + } + if (!params[moduleParamName]) { params[moduleParamName] = { enabled: false }; } + } + }); + + // Extend defaults with modules params + var swiperParams = Utils.extend({}, defaults); + swiper.useModulesParams(swiperParams); + + // Extend defaults with passed params + swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params); + swiper.originalParams = Utils.extend({}, swiper.params); + swiper.passedParams = Utils.extend({}, params); + + // Save Dom lib + swiper.$ = $; + + // Find el + var $el = $(swiper.params.el); + el = $el[0]; + + if (!el) { + return undefined; + } + + if ($el.length > 1) { + var swipers = []; + $el.each(function (index, containerEl) { + var newParams = Utils.extend({}, params, { el: containerEl }); + swipers.push(new Swiper(newParams)); + }); + return swipers; + } + + el.swiper = swiper; + $el.data('swiper', swiper); + + // Find Wrapper + var $wrapperEl = $el.children(("." + (swiper.params.wrapperClass))); + + // Extend Swiper + Utils.extend(swiper, { + $el: $el, + el: el, + $wrapperEl: $wrapperEl, + wrapperEl: $wrapperEl[0], + + // Classes + classNames: [], + + // Slides + slides: $(), + slidesGrid: [], + snapGrid: [], + slidesSizesGrid: [], + + // isDirection + isHorizontal: function isHorizontal() { + return swiper.params.direction === 'horizontal'; + }, + isVertical: function isVertical() { + return swiper.params.direction === 'vertical'; + }, + // RTL + rtl: (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'), + rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'), + wrongRTL: $wrapperEl.css('display') === '-webkit-box', + + // Indexes + activeIndex: 0, + realIndex: 0, + + // + isBeginning: true, + isEnd: false, + + // Props + translate: 0, + previousTranslate: 0, + progress: 0, + velocity: 0, + animating: false, + + // Locks + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev, + + // Touch Events + touchEvents: (function touchEvents() { + var touch = ['touchstart', 'touchmove', 'touchend']; + var desktop = ['mousedown', 'mousemove', 'mouseup']; + if (Support.pointerEvents) { + desktop = ['pointerdown', 'pointermove', 'pointerup']; + } else if (Support.prefixedPointerEvents) { + desktop = ['MSPointerDown', 'MSPointerMove', 'MSPointerUp']; + } + swiper.touchEventsTouch = { + start: touch[0], + move: touch[1], + end: touch[2], + }; + swiper.touchEventsDesktop = { + start: desktop[0], + move: desktop[1], + end: desktop[2], + }; + return Support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop; + }()), + touchEventsData: { + isTouched: undefined, + isMoved: undefined, + allowTouchCallbacks: undefined, + touchStartTime: undefined, + isScrolling: undefined, + currentTranslate: undefined, + startTranslate: undefined, + allowThresholdMove: undefined, + // Form elements to match + formElements: 'input, select, option, textarea, button, video', + // Last click time + lastClickTime: Utils.now(), + clickTimeout: undefined, + // Velocities + velocities: [], + allowMomentumBounce: undefined, + isTouchEvent: undefined, + startMoving: undefined, + }, + + // Clicks + allowClick: true, + + // Touches + allowTouchMove: swiper.params.allowTouchMove, + + touches: { + startX: 0, + startY: 0, + currentX: 0, + currentY: 0, + diff: 0, + }, + + // Images + imagesToLoad: [], + imagesLoaded: 0, + + }); + + // Install Modules + swiper.useModules(); + + // Init + if (swiper.params.init) { + swiper.init(); + } + + // Return app instance + return swiper; + } + + if ( SwiperClass ) Swiper.__proto__ = SwiperClass; + Swiper.prototype = Object.create( SwiperClass && SwiperClass.prototype ); + Swiper.prototype.constructor = Swiper; + + var staticAccessors = { extendedDefaults: { configurable: true },defaults: { configurable: true },Class: { configurable: true },$: { configurable: true } }; + + Swiper.prototype.slidesPerViewDynamic = function slidesPerViewDynamic () { + var swiper = this; + var params = swiper.params; + var slides = swiper.slides; + var slidesGrid = swiper.slidesGrid; + var swiperSize = swiper.size; + var activeIndex = swiper.activeIndex; + var spv = 1; + if (params.centeredSlides) { + var slideSize = slides[activeIndex].swiperSlideSize; + var breakLoop; + for (var i = activeIndex + 1; i < slides.length; i += 1) { + if (slides[i] && !breakLoop) { + slideSize += slides[i].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) { breakLoop = true; } + } + } + for (var i$1 = activeIndex - 1; i$1 >= 0; i$1 -= 1) { + if (slides[i$1] && !breakLoop) { + slideSize += slides[i$1].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) { breakLoop = true; } + } + } + } else { + for (var i$2 = activeIndex + 1; i$2 < slides.length; i$2 += 1) { + if (slidesGrid[i$2] - slidesGrid[activeIndex] < swiperSize) { + spv += 1; + } + } + } + return spv; + }; + + Swiper.prototype.update = function update () { + var swiper = this; + if (!swiper || swiper.destroyed) { return; } + var snapGrid = swiper.snapGrid; + var params = swiper.params; + // Breakpoints + if (params.breakpoints) { + swiper.setBreakpoint(); + } + swiper.updateSize(); + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + + function setTranslate() { + var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate; + var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate()); + swiper.setTranslate(newTranslate); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + var translated; + if (swiper.params.freeMode) { + setTranslate(); + if (swiper.params.autoHeight) { + swiper.updateAutoHeight(); + } + } else { + if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) { + translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + translated = swiper.slideTo(swiper.activeIndex, 0, false, true); + } + if (!translated) { + setTranslate(); + } + } + if (params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } + swiper.emit('update'); + }; + + Swiper.prototype.changeDirection = function changeDirection (newDirection, needUpdate) { + if ( needUpdate === void 0 ) needUpdate = true; + + var swiper = this; + var currentDirection = swiper.params.direction; + if (!newDirection) { + // eslint-disable-next-line + newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal'; + } + if ((newDirection === currentDirection) || (newDirection !== 'horizontal' && newDirection !== 'vertical')) { + return swiper; + } + + if (currentDirection === 'vertical') { + swiper.$el + .removeClass(((swiper.params.containerModifierClass) + "vertical wp8-vertical")) + .addClass(("" + (swiper.params.containerModifierClass) + newDirection)); + + if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) { + swiper.$el.addClass(((swiper.params.containerModifierClass) + "wp8-" + newDirection)); + } + } + if (currentDirection === 'horizontal') { + swiper.$el + .removeClass(((swiper.params.containerModifierClass) + "horizontal wp8-horizontal")) + .addClass(("" + (swiper.params.containerModifierClass) + newDirection)); + + if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) { + swiper.$el.addClass(((swiper.params.containerModifierClass) + "wp8-" + newDirection)); + } + } + + swiper.params.direction = newDirection; + + swiper.slides.each(function (slideIndex, slideEl) { + if (newDirection === 'vertical') { + slideEl.style.width = ''; + } else { + slideEl.style.height = ''; + } + }); + + swiper.emit('changeDirection'); + if (needUpdate) { swiper.update(); } + + return swiper; + }; + + Swiper.prototype.init = function init () { + var swiper = this; + if (swiper.initialized) { return; } + + swiper.emit('beforeInit'); + + // Set breakpoint + if (swiper.params.breakpoints) { + swiper.setBreakpoint(); + } + + // Add Classes + swiper.addClasses(); + + // Create loop + if (swiper.params.loop) { + swiper.loopCreate(); + } + + // Update size + swiper.updateSize(); + + // Update slides + swiper.updateSlides(); + + if (swiper.params.watchOverflow) { + swiper.checkOverflow(); + } + + // Set Grab Cursor + if (swiper.params.grabCursor) { + swiper.setGrabCursor(); + } + + if (swiper.params.preloadImages) { + swiper.preloadImages(); + } + + // Slide To Initial Slide + if (swiper.params.loop) { + swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit); + } else { + swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit); + } + + // Attach events + swiper.attachEvents(); + + // Init Flag + swiper.initialized = true; + + // Emit + swiper.emit('init'); + }; + + Swiper.prototype.destroy = function destroy (deleteInstance, cleanStyles) { + if ( deleteInstance === void 0 ) deleteInstance = true; + if ( cleanStyles === void 0 ) cleanStyles = true; + + var swiper = this; + var params = swiper.params; + var $el = swiper.$el; + var $wrapperEl = swiper.$wrapperEl; + var slides = swiper.slides; + + if (typeof swiper.params === 'undefined' || swiper.destroyed) { + return null; + } + + swiper.emit('beforeDestroy'); + + // Init Flag + swiper.initialized = false; + + // Detach events + swiper.detachEvents(); + + // Destroy loop + if (params.loop) { + swiper.loopDestroy(); + } + + // Cleanup styles + if (cleanStyles) { + swiper.removeClasses(); + $el.removeAttr('style'); + $wrapperEl.removeAttr('style'); + if (slides && slides.length) { + slides + .removeClass([ + params.slideVisibleClass, + params.slideActiveClass, + params.slideNextClass, + params.slidePrevClass ].join(' ')) + .removeAttr('style') + .removeAttr('data-swiper-slide-index') + .removeAttr('data-swiper-column') + .removeAttr('data-swiper-row'); + } + } + + swiper.emit('destroy'); + + // Detach emitter events + Object.keys(swiper.eventsListeners).forEach(function (eventName) { + swiper.off(eventName); + }); + + if (deleteInstance !== false) { + swiper.$el[0].swiper = null; + swiper.$el.data('swiper', null); + Utils.deleteProps(swiper); + } + swiper.destroyed = true; + + return null; + }; + + Swiper.extendDefaults = function extendDefaults (newDefaults) { + Utils.extend(extendedDefaults, newDefaults); + }; + + staticAccessors.extendedDefaults.get = function () { + return extendedDefaults; + }; + + staticAccessors.defaults.get = function () { + return defaults; + }; + + staticAccessors.Class.get = function () { + return SwiperClass; + }; + + staticAccessors.$.get = function () { + return $; + }; + + Object.defineProperties( Swiper, staticAccessors ); + + return Swiper; + }(SwiperClass)); + + var Device$1 = { + name: 'device', + proto: { + device: Device, + }, + static: { + device: Device, + }, + }; + + var Support$1 = { + name: 'support', + proto: { + support: Support, + }, + static: { + support: Support, + }, + }; + + var Browser$1 = { + name: 'browser', + proto: { + browser: Browser, + }, + static: { + browser: Browser, + }, + }; + + var Resize = { + name: 'resize', + create: function create() { + var swiper = this; + Utils.extend(swiper, { + resize: { + resizeHandler: function resizeHandler() { + if (!swiper || swiper.destroyed || !swiper.initialized) { return; } + swiper.emit('beforeResize'); + swiper.emit('resize'); + }, + orientationChangeHandler: function orientationChangeHandler() { + if (!swiper || swiper.destroyed || !swiper.initialized) { return; } + swiper.emit('orientationchange'); + }, + }, + }); + }, + on: { + init: function init() { + var swiper = this; + // Emit resize + win.addEventListener('resize', swiper.resize.resizeHandler); + + // Emit orientationchange + win.addEventListener('orientationchange', swiper.resize.orientationChangeHandler); + }, + destroy: function destroy() { + var swiper = this; + win.removeEventListener('resize', swiper.resize.resizeHandler); + win.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler); + }, + }, + }; + + var Observer = { + func: win.MutationObserver || win.WebkitMutationObserver, + attach: function attach(target, options) { + if ( options === void 0 ) options = {}; + + var swiper = this; + + var ObserverFunc = Observer.func; + var observer = new ObserverFunc(function (mutations) { + // The observerUpdate event should only be triggered + // once despite the number of mutations. Additional + // triggers are redundant and are very costly + if (mutations.length === 1) { + swiper.emit('observerUpdate', mutations[0]); + return; + } + var observerUpdate = function observerUpdate() { + swiper.emit('observerUpdate', mutations[0]); + }; + + if (win.requestAnimationFrame) { + win.requestAnimationFrame(observerUpdate); + } else { + win.setTimeout(observerUpdate, 0); + } + }); + + observer.observe(target, { + attributes: typeof options.attributes === 'undefined' ? true : options.attributes, + childList: typeof options.childList === 'undefined' ? true : options.childList, + characterData: typeof options.characterData === 'undefined' ? true : options.characterData, + }); + + swiper.observer.observers.push(observer); + }, + init: function init() { + var swiper = this; + if (!Support.observer || !swiper.params.observer) { return; } + if (swiper.params.observeParents) { + var containerParents = swiper.$el.parents(); + for (var i = 0; i < containerParents.length; i += 1) { + swiper.observer.attach(containerParents[i]); + } + } + // Observe container + swiper.observer.attach(swiper.$el[0], { childList: swiper.params.observeSlideChildren }); + + // Observe wrapper + swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false }); + }, + destroy: function destroy() { + var swiper = this; + swiper.observer.observers.forEach(function (observer) { + observer.disconnect(); + }); + swiper.observer.observers = []; + }, + }; + + var Observer$1 = { + name: 'observer', + params: { + observer: false, + observeParents: false, + observeSlideChildren: false, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + observer: { + init: Observer.init.bind(swiper), + attach: Observer.attach.bind(swiper), + destroy: Observer.destroy.bind(swiper), + observers: [], + }, + }); + }, + on: { + init: function init() { + var swiper = this; + swiper.observer.init(); + }, + destroy: function destroy() { + var swiper = this; + swiper.observer.destroy(); + }, + }, + }; + + var Virtual = { + update: function update(force) { + var swiper = this; + var ref = swiper.params; + var slidesPerView = ref.slidesPerView; + var slidesPerGroup = ref.slidesPerGroup; + var centeredSlides = ref.centeredSlides; + var ref$1 = swiper.params.virtual; + var addSlidesBefore = ref$1.addSlidesBefore; + var addSlidesAfter = ref$1.addSlidesAfter; + var ref$2 = swiper.virtual; + var previousFrom = ref$2.from; + var previousTo = ref$2.to; + var slides = ref$2.slides; + var previousSlidesGrid = ref$2.slidesGrid; + var renderSlide = ref$2.renderSlide; + var previousOffset = ref$2.offset; + swiper.updateActiveIndex(); + var activeIndex = swiper.activeIndex || 0; + + var offsetProp; + if (swiper.rtlTranslate) { offsetProp = 'right'; } + else { offsetProp = swiper.isHorizontal() ? 'left' : 'top'; } + + var slidesAfter; + var slidesBefore; + if (centeredSlides) { + slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore; + slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter; + } else { + slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesBefore; + slidesBefore = slidesPerGroup + addSlidesAfter; + } + var from = Math.max((activeIndex || 0) - slidesBefore, 0); + var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1); + var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0); + + Utils.extend(swiper.virtual, { + from: from, + to: to, + offset: offset, + slidesGrid: swiper.slidesGrid, + }); + + function onRendered() { + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + if (swiper.lazy && swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + } + + if (previousFrom === from && previousTo === to && !force) { + if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) { + swiper.slides.css(offsetProp, (offset + "px")); + } + swiper.updateProgress(); + return; + } + if (swiper.params.virtual.renderExternal) { + swiper.params.virtual.renderExternal.call(swiper, { + offset: offset, + from: from, + to: to, + slides: (function getSlides() { + var slidesToRender = []; + for (var i = from; i <= to; i += 1) { + slidesToRender.push(slides[i]); + } + return slidesToRender; + }()), + }); + onRendered(); + return; + } + var prependIndexes = []; + var appendIndexes = []; + if (force) { + swiper.$wrapperEl.find(("." + (swiper.params.slideClass))).remove(); + } else { + for (var i = previousFrom; i <= previousTo; i += 1) { + if (i < from || i > to) { + swiper.$wrapperEl.find(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + i + "\"]")).remove(); + } + } + } + for (var i$1 = 0; i$1 < slides.length; i$1 += 1) { + if (i$1 >= from && i$1 <= to) { + if (typeof previousTo === 'undefined' || force) { + appendIndexes.push(i$1); + } else { + if (i$1 > previousTo) { appendIndexes.push(i$1); } + if (i$1 < previousFrom) { prependIndexes.push(i$1); } + } + } + } + appendIndexes.forEach(function (index) { + swiper.$wrapperEl.append(renderSlide(slides[index], index)); + }); + prependIndexes.sort(function (a, b) { return b - a; }).forEach(function (index) { + swiper.$wrapperEl.prepend(renderSlide(slides[index], index)); + }); + swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, (offset + "px")); + onRendered(); + }, + renderSlide: function renderSlide(slide, index) { + var swiper = this; + var params = swiper.params.virtual; + if (params.cache && swiper.virtual.cache[index]) { + return swiper.virtual.cache[index]; + } + var $slideEl = params.renderSlide + ? $(params.renderSlide.call(swiper, slide, index)) + : $(("
            " + slide + "
            ")); + if (!$slideEl.attr('data-swiper-slide-index')) { $slideEl.attr('data-swiper-slide-index', index); } + if (params.cache) { swiper.virtual.cache[index] = $slideEl; } + return $slideEl; + }, + appendSlide: function appendSlide(slides) { + var swiper = this; + if (typeof slides === 'object' && 'length' in slides) { + for (var i = 0; i < slides.length; i += 1) { + if (slides[i]) { swiper.virtual.slides.push(slides[i]); } + } + } else { + swiper.virtual.slides.push(slides); + } + swiper.virtual.update(true); + }, + prependSlide: function prependSlide(slides) { + var swiper = this; + var activeIndex = swiper.activeIndex; + var newActiveIndex = activeIndex + 1; + var numberOfNewSlides = 1; + + if (Array.isArray(slides)) { + for (var i = 0; i < slides.length; i += 1) { + if (slides[i]) { swiper.virtual.slides.unshift(slides[i]); } + } + newActiveIndex = activeIndex + slides.length; + numberOfNewSlides = slides.length; + } else { + swiper.virtual.slides.unshift(slides); + } + if (swiper.params.virtual.cache) { + var cache = swiper.virtual.cache; + var newCache = {}; + Object.keys(cache).forEach(function (cachedIndex) { + newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cache[cachedIndex]; + }); + swiper.virtual.cache = newCache; + } + swiper.virtual.update(true); + swiper.slideTo(newActiveIndex, 0); + }, + removeSlide: function removeSlide(slidesIndexes) { + var swiper = this; + if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) { return; } + var activeIndex = swiper.activeIndex; + if (Array.isArray(slidesIndexes)) { + for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) { + swiper.virtual.slides.splice(slidesIndexes[i], 1); + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes[i]]; + } + if (slidesIndexes[i] < activeIndex) { activeIndex -= 1; } + activeIndex = Math.max(activeIndex, 0); + } + } else { + swiper.virtual.slides.splice(slidesIndexes, 1); + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes]; + } + if (slidesIndexes < activeIndex) { activeIndex -= 1; } + activeIndex = Math.max(activeIndex, 0); + } + swiper.virtual.update(true); + swiper.slideTo(activeIndex, 0); + }, + removeAllSlides: function removeAllSlides() { + var swiper = this; + swiper.virtual.slides = []; + if (swiper.params.virtual.cache) { + swiper.virtual.cache = {}; + } + swiper.virtual.update(true); + swiper.slideTo(0, 0); + }, + }; + + var Virtual$1 = { + name: 'virtual', + params: { + virtual: { + enabled: false, + slides: [], + cache: true, + renderSlide: null, + renderExternal: null, + addSlidesBefore: 0, + addSlidesAfter: 0, + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + virtual: { + update: Virtual.update.bind(swiper), + appendSlide: Virtual.appendSlide.bind(swiper), + prependSlide: Virtual.prependSlide.bind(swiper), + removeSlide: Virtual.removeSlide.bind(swiper), + removeAllSlides: Virtual.removeAllSlides.bind(swiper), + renderSlide: Virtual.renderSlide.bind(swiper), + slides: swiper.params.virtual.slides, + cache: {}, + }, + }); + }, + on: { + beforeInit: function beforeInit() { + var swiper = this; + if (!swiper.params.virtual.enabled) { return; } + swiper.classNames.push(((swiper.params.containerModifierClass) + "virtual")); + var overwriteParams = { + watchSlidesProgress: true, + }; + Utils.extend(swiper.params, overwriteParams); + Utils.extend(swiper.originalParams, overwriteParams); + + if (!swiper.params.initialSlide) { + swiper.virtual.update(); + } + }, + setTranslate: function setTranslate() { + var swiper = this; + if (!swiper.params.virtual.enabled) { return; } + swiper.virtual.update(); + }, + }, + }; + + var Keyboard = { + handle: function handle(event) { + var swiper = this; + var rtl = swiper.rtlTranslate; + var e = event; + if (e.originalEvent) { e = e.originalEvent; } // jquery fix + var kc = e.keyCode || e.charCode; + // Directions locks + if (!swiper.allowSlideNext && ((swiper.isHorizontal() && kc === 39) || (swiper.isVertical() && kc === 40))) { + return false; + } + if (!swiper.allowSlidePrev && ((swiper.isHorizontal() && kc === 37) || (swiper.isVertical() && kc === 38))) { + return false; + } + if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { + return undefined; + } + if (doc.activeElement && doc.activeElement.nodeName && (doc.activeElement.nodeName.toLowerCase() === 'input' || doc.activeElement.nodeName.toLowerCase() === 'textarea')) { + return undefined; + } + if (swiper.params.keyboard.onlyInViewport && (kc === 37 || kc === 39 || kc === 38 || kc === 40)) { + var inView = false; + // Check that swiper should be inside of visible area of window + if (swiper.$el.parents(("." + (swiper.params.slideClass))).length > 0 && swiper.$el.parents(("." + (swiper.params.slideActiveClass))).length === 0) { + return undefined; + } + var windowWidth = win.innerWidth; + var windowHeight = win.innerHeight; + var swiperOffset = swiper.$el.offset(); + if (rtl) { swiperOffset.left -= swiper.$el[0].scrollLeft; } + var swiperCoord = [ + [swiperOffset.left, swiperOffset.top], + [swiperOffset.left + swiper.width, swiperOffset.top], + [swiperOffset.left, swiperOffset.top + swiper.height], + [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height] ]; + for (var i = 0; i < swiperCoord.length; i += 1) { + var point = swiperCoord[i]; + if ( + point[0] >= 0 && point[0] <= windowWidth + && point[1] >= 0 && point[1] <= windowHeight + ) { + inView = true; + } + } + if (!inView) { return undefined; } + } + if (swiper.isHorizontal()) { + if (kc === 37 || kc === 39) { + if (e.preventDefault) { e.preventDefault(); } + else { e.returnValue = false; } + } + if ((kc === 39 && !rtl) || (kc === 37 && rtl)) { swiper.slideNext(); } + if ((kc === 37 && !rtl) || (kc === 39 && rtl)) { swiper.slidePrev(); } + } else { + if (kc === 38 || kc === 40) { + if (e.preventDefault) { e.preventDefault(); } + else { e.returnValue = false; } + } + if (kc === 40) { swiper.slideNext(); } + if (kc === 38) { swiper.slidePrev(); } + } + swiper.emit('keyPress', kc); + return undefined; + }, + enable: function enable() { + var swiper = this; + if (swiper.keyboard.enabled) { return; } + $(doc).on('keydown', swiper.keyboard.handle); + swiper.keyboard.enabled = true; + }, + disable: function disable() { + var swiper = this; + if (!swiper.keyboard.enabled) { return; } + $(doc).off('keydown', swiper.keyboard.handle); + swiper.keyboard.enabled = false; + }, + }; + + var Keyboard$1 = { + name: 'keyboard', + params: { + keyboard: { + enabled: false, + onlyInViewport: true, + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + keyboard: { + enabled: false, + enable: Keyboard.enable.bind(swiper), + disable: Keyboard.disable.bind(swiper), + handle: Keyboard.handle.bind(swiper), + }, + }); + }, + on: { + init: function init() { + var swiper = this; + if (swiper.params.keyboard.enabled) { + swiper.keyboard.enable(); + } + }, + destroy: function destroy() { + var swiper = this; + if (swiper.keyboard.enabled) { + swiper.keyboard.disable(); + } + }, + }, + }; + + function isEventSupported() { + var eventName = 'onwheel'; + var isSupported = eventName in doc; + + if (!isSupported) { + var element = doc.createElement('div'); + element.setAttribute(eventName, 'return;'); + isSupported = typeof element[eventName] === 'function'; + } + + if (!isSupported + && doc.implementation + && doc.implementation.hasFeature + // always returns true in newer browsers as per the standard. + // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature + && doc.implementation.hasFeature('', '') !== true + ) { + // This is the only way to test support for the `wheel` event in IE9+. + isSupported = doc.implementation.hasFeature('Events.wheel', '3.0'); + } + + return isSupported; + } + var Mousewheel = { + lastScrollTime: Utils.now(), + event: (function getEvent() { + if (win.navigator.userAgent.indexOf('firefox') > -1) { return 'DOMMouseScroll'; } + return isEventSupported() ? 'wheel' : 'mousewheel'; + }()), + normalize: function normalize(e) { + // Reasonable defaults + var PIXEL_STEP = 10; + var LINE_HEIGHT = 40; + var PAGE_HEIGHT = 800; + + var sX = 0; + var sY = 0; // spinX, spinY + var pX = 0; + var pY = 0; // pixelX, pixelY + + // Legacy + if ('detail' in e) { + sY = e.detail; + } + if ('wheelDelta' in e) { + sY = -e.wheelDelta / 120; + } + if ('wheelDeltaY' in e) { + sY = -e.wheelDeltaY / 120; + } + if ('wheelDeltaX' in e) { + sX = -e.wheelDeltaX / 120; + } + + // side scrolling on FF with DOMMouseScroll + if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) { + sX = sY; + sY = 0; + } + + pX = sX * PIXEL_STEP; + pY = sY * PIXEL_STEP; + + if ('deltaY' in e) { + pY = e.deltaY; + } + if ('deltaX' in e) { + pX = e.deltaX; + } + + if ((pX || pY) && e.deltaMode) { + if (e.deltaMode === 1) { // delta in LINE units + pX *= LINE_HEIGHT; + pY *= LINE_HEIGHT; + } else { // delta in PAGE units + pX *= PAGE_HEIGHT; + pY *= PAGE_HEIGHT; + } + } + + // Fall-back if spin cannot be determined + if (pX && !sX) { + sX = (pX < 1) ? -1 : 1; + } + if (pY && !sY) { + sY = (pY < 1) ? -1 : 1; + } + + return { + spinX: sX, + spinY: sY, + pixelX: pX, + pixelY: pY, + }; + }, + handleMouseEnter: function handleMouseEnter() { + var swiper = this; + swiper.mouseEntered = true; + }, + handleMouseLeave: function handleMouseLeave() { + var swiper = this; + swiper.mouseEntered = false; + }, + handle: function handle(event) { + var e = event; + var swiper = this; + var params = swiper.params.mousewheel; + + if (!swiper.mouseEntered && !params.releaseOnEdges) { return true; } + + if (e.originalEvent) { e = e.originalEvent; } // jquery fix + var delta = 0; + var rtlFactor = swiper.rtlTranslate ? -1 : 1; + + var data = Mousewheel.normalize(e); + + if (params.forceToAxis) { + if (swiper.isHorizontal()) { + if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) { delta = data.pixelX * rtlFactor; } + else { return true; } + } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) { delta = data.pixelY; } + else { return true; } + } else { + delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY; + } + + if (delta === 0) { return true; } + + if (params.invert) { delta = -delta; } + + if (!swiper.params.freeMode) { + if (Utils.now() - swiper.mousewheel.lastScrollTime > 60) { + if (delta < 0) { + if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) { + swiper.slideNext(); + swiper.emit('scroll', e); + } else if (params.releaseOnEdges) { return true; } + } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) { + swiper.slidePrev(); + swiper.emit('scroll', e); + } else if (params.releaseOnEdges) { return true; } + } + swiper.mousewheel.lastScrollTime = (new win.Date()).getTime(); + } else { + // Freemode or scrollContainer: + if (swiper.params.loop) { + swiper.loopFix(); + } + var position = swiper.getTranslate() + (delta * params.sensitivity); + var wasBeginning = swiper.isBeginning; + var wasEnd = swiper.isEnd; + + if (position >= swiper.minTranslate()) { position = swiper.minTranslate(); } + if (position <= swiper.maxTranslate()) { position = swiper.maxTranslate(); } + + swiper.setTransition(0); + swiper.setTranslate(position); + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + + if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) { + swiper.updateSlidesClasses(); + } + + if (swiper.params.freeModeSticky) { + clearTimeout(swiper.mousewheel.timeout); + swiper.mousewheel.timeout = Utils.nextTick(function () { + swiper.slideToClosest(); + }, 300); + } + // Emit event + swiper.emit('scroll', e); + + // Stop autoplay + if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) { swiper.autoplay.stop(); } + // Return page scroll on edge positions + if (position === swiper.minTranslate() || position === swiper.maxTranslate()) { return true; } + } + + if (e.preventDefault) { e.preventDefault(); } + else { e.returnValue = false; } + return false; + }, + enable: function enable() { + var swiper = this; + if (!Mousewheel.event) { return false; } + if (swiper.mousewheel.enabled) { return false; } + var target = swiper.$el; + if (swiper.params.mousewheel.eventsTarged !== 'container') { + target = $(swiper.params.mousewheel.eventsTarged); + } + target.on('mouseenter', swiper.mousewheel.handleMouseEnter); + target.on('mouseleave', swiper.mousewheel.handleMouseLeave); + target.on(Mousewheel.event, swiper.mousewheel.handle); + swiper.mousewheel.enabled = true; + return true; + }, + disable: function disable() { + var swiper = this; + if (!Mousewheel.event) { return false; } + if (!swiper.mousewheel.enabled) { return false; } + var target = swiper.$el; + if (swiper.params.mousewheel.eventsTarged !== 'container') { + target = $(swiper.params.mousewheel.eventsTarged); + } + target.off(Mousewheel.event, swiper.mousewheel.handle); + swiper.mousewheel.enabled = false; + return true; + }, + }; + + var Mousewheel$1 = { + name: 'mousewheel', + params: { + mousewheel: { + enabled: false, + releaseOnEdges: false, + invert: false, + forceToAxis: false, + sensitivity: 1, + eventsTarged: 'container', + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + mousewheel: { + enabled: false, + enable: Mousewheel.enable.bind(swiper), + disable: Mousewheel.disable.bind(swiper), + handle: Mousewheel.handle.bind(swiper), + handleMouseEnter: Mousewheel.handleMouseEnter.bind(swiper), + handleMouseLeave: Mousewheel.handleMouseLeave.bind(swiper), + lastScrollTime: Utils.now(), + }, + }); + }, + on: { + init: function init() { + var swiper = this; + if (swiper.params.mousewheel.enabled) { swiper.mousewheel.enable(); } + }, + destroy: function destroy() { + var swiper = this; + if (swiper.mousewheel.enabled) { swiper.mousewheel.disable(); } + }, + }, + }; + + var Navigation = { + update: function update() { + // Update Navigation Buttons + var swiper = this; + var params = swiper.params.navigation; + + if (swiper.params.loop) { return; } + var ref = swiper.navigation; + var $nextEl = ref.$nextEl; + var $prevEl = ref.$prevEl; + + if ($prevEl && $prevEl.length > 0) { + if (swiper.isBeginning) { + $prevEl.addClass(params.disabledClass); + } else { + $prevEl.removeClass(params.disabledClass); + } + $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + } + if ($nextEl && $nextEl.length > 0) { + if (swiper.isEnd) { + $nextEl.addClass(params.disabledClass); + } else { + $nextEl.removeClass(params.disabledClass); + } + $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + } + }, + onPrevClick: function onPrevClick(e) { + var swiper = this; + e.preventDefault(); + if (swiper.isBeginning && !swiper.params.loop) { return; } + swiper.slidePrev(); + }, + onNextClick: function onNextClick(e) { + var swiper = this; + e.preventDefault(); + if (swiper.isEnd && !swiper.params.loop) { return; } + swiper.slideNext(); + }, + init: function init() { + var swiper = this; + var params = swiper.params.navigation; + if (!(params.nextEl || params.prevEl)) { return; } + + var $nextEl; + var $prevEl; + if (params.nextEl) { + $nextEl = $(params.nextEl); + if ( + swiper.params.uniqueNavElements + && typeof params.nextEl === 'string' + && $nextEl.length > 1 + && swiper.$el.find(params.nextEl).length === 1 + ) { + $nextEl = swiper.$el.find(params.nextEl); + } + } + if (params.prevEl) { + $prevEl = $(params.prevEl); + if ( + swiper.params.uniqueNavElements + && typeof params.prevEl === 'string' + && $prevEl.length > 1 + && swiper.$el.find(params.prevEl).length === 1 + ) { + $prevEl = swiper.$el.find(params.prevEl); + } + } + + if ($nextEl && $nextEl.length > 0) { + $nextEl.on('click', swiper.navigation.onNextClick); + } + if ($prevEl && $prevEl.length > 0) { + $prevEl.on('click', swiper.navigation.onPrevClick); + } + + Utils.extend(swiper.navigation, { + $nextEl: $nextEl, + nextEl: $nextEl && $nextEl[0], + $prevEl: $prevEl, + prevEl: $prevEl && $prevEl[0], + }); + }, + destroy: function destroy() { + var swiper = this; + var ref = swiper.navigation; + var $nextEl = ref.$nextEl; + var $prevEl = ref.$prevEl; + if ($nextEl && $nextEl.length) { + $nextEl.off('click', swiper.navigation.onNextClick); + $nextEl.removeClass(swiper.params.navigation.disabledClass); + } + if ($prevEl && $prevEl.length) { + $prevEl.off('click', swiper.navigation.onPrevClick); + $prevEl.removeClass(swiper.params.navigation.disabledClass); + } + }, + }; + + var Navigation$1 = { + name: 'navigation', + params: { + navigation: { + nextEl: null, + prevEl: null, + + hideOnClick: false, + disabledClass: 'swiper-button-disabled', + hiddenClass: 'swiper-button-hidden', + lockClass: 'swiper-button-lock', + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + navigation: { + init: Navigation.init.bind(swiper), + update: Navigation.update.bind(swiper), + destroy: Navigation.destroy.bind(swiper), + onNextClick: Navigation.onNextClick.bind(swiper), + onPrevClick: Navigation.onPrevClick.bind(swiper), + }, + }); + }, + on: { + init: function init() { + var swiper = this; + swiper.navigation.init(); + swiper.navigation.update(); + }, + toEdge: function toEdge() { + var swiper = this; + swiper.navigation.update(); + }, + fromEdge: function fromEdge() { + var swiper = this; + swiper.navigation.update(); + }, + destroy: function destroy() { + var swiper = this; + swiper.navigation.destroy(); + }, + click: function click(e) { + var swiper = this; + var ref = swiper.navigation; + var $nextEl = ref.$nextEl; + var $prevEl = ref.$prevEl; + if ( + swiper.params.navigation.hideOnClick + && !$(e.target).is($prevEl) + && !$(e.target).is($nextEl) + ) { + var isHidden; + if ($nextEl) { + isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass); + } else if ($prevEl) { + isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass); + } + if (isHidden === true) { + swiper.emit('navigationShow', swiper); + } else { + swiper.emit('navigationHide', swiper); + } + if ($nextEl) { + $nextEl.toggleClass(swiper.params.navigation.hiddenClass); + } + if ($prevEl) { + $prevEl.toggleClass(swiper.params.navigation.hiddenClass); + } + } + }, + }, + }; + + var Pagination = { + update: function update() { + // Render || Update Pagination bullets/items + var swiper = this; + var rtl = swiper.rtl; + var params = swiper.params.pagination; + if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; } + var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; + var $el = swiper.pagination.$el; + // Current/Total + var current; + var total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length; + if (swiper.params.loop) { + current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup); + if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) { + current -= (slidesLength - (swiper.loopedSlides * 2)); + } + if (current > total - 1) { current -= total; } + if (current < 0 && swiper.params.paginationType !== 'bullets') { current = total + current; } + } else if (typeof swiper.snapIndex !== 'undefined') { + current = swiper.snapIndex; + } else { + current = swiper.activeIndex || 0; + } + // Types + if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) { + var bullets = swiper.pagination.bullets; + var firstIndex; + var lastIndex; + var midIndex; + if (params.dynamicBullets) { + swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true); + $el.css(swiper.isHorizontal() ? 'width' : 'height', ((swiper.pagination.bulletSize * (params.dynamicMainBullets + 4)) + "px")); + if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) { + swiper.pagination.dynamicBulletIndex += (current - swiper.previousIndex); + if (swiper.pagination.dynamicBulletIndex > (params.dynamicMainBullets - 1)) { + swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1; + } else if (swiper.pagination.dynamicBulletIndex < 0) { + swiper.pagination.dynamicBulletIndex = 0; + } + } + firstIndex = current - swiper.pagination.dynamicBulletIndex; + lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1); + midIndex = (lastIndex + firstIndex) / 2; + } + bullets.removeClass(((params.bulletActiveClass) + " " + (params.bulletActiveClass) + "-next " + (params.bulletActiveClass) + "-next-next " + (params.bulletActiveClass) + "-prev " + (params.bulletActiveClass) + "-prev-prev " + (params.bulletActiveClass) + "-main")); + if ($el.length > 1) { + bullets.each(function (index, bullet) { + var $bullet = $(bullet); + var bulletIndex = $bullet.index(); + if (bulletIndex === current) { + $bullet.addClass(params.bulletActiveClass); + } + if (params.dynamicBullets) { + if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) { + $bullet.addClass(((params.bulletActiveClass) + "-main")); + } + if (bulletIndex === firstIndex) { + $bullet + .prev() + .addClass(((params.bulletActiveClass) + "-prev")) + .prev() + .addClass(((params.bulletActiveClass) + "-prev-prev")); + } + if (bulletIndex === lastIndex) { + $bullet + .next() + .addClass(((params.bulletActiveClass) + "-next")) + .next() + .addClass(((params.bulletActiveClass) + "-next-next")); + } + } + }); + } else { + var $bullet = bullets.eq(current); + $bullet.addClass(params.bulletActiveClass); + if (params.dynamicBullets) { + var $firstDisplayedBullet = bullets.eq(firstIndex); + var $lastDisplayedBullet = bullets.eq(lastIndex); + for (var i = firstIndex; i <= lastIndex; i += 1) { + bullets.eq(i).addClass(((params.bulletActiveClass) + "-main")); + } + $firstDisplayedBullet + .prev() + .addClass(((params.bulletActiveClass) + "-prev")) + .prev() + .addClass(((params.bulletActiveClass) + "-prev-prev")); + $lastDisplayedBullet + .next() + .addClass(((params.bulletActiveClass) + "-next")) + .next() + .addClass(((params.bulletActiveClass) + "-next-next")); + } + } + if (params.dynamicBullets) { + var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4); + var bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (midIndex * swiper.pagination.bulletSize); + var offsetProp = rtl ? 'right' : 'left'; + bullets.css(swiper.isHorizontal() ? offsetProp : 'top', (bulletsOffset + "px")); + } + } + if (params.type === 'fraction') { + $el.find(("." + (params.currentClass))).text(params.formatFractionCurrent(current + 1)); + $el.find(("." + (params.totalClass))).text(params.formatFractionTotal(total)); + } + if (params.type === 'progressbar') { + var progressbarDirection; + if (params.progressbarOpposite) { + progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal'; + } else { + progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical'; + } + var scale = (current + 1) / total; + var scaleX = 1; + var scaleY = 1; + if (progressbarDirection === 'horizontal') { + scaleX = scale; + } else { + scaleY = scale; + } + $el.find(("." + (params.progressbarFillClass))).transform(("translate3d(0,0,0) scaleX(" + scaleX + ") scaleY(" + scaleY + ")")).transition(swiper.params.speed); + } + if (params.type === 'custom' && params.renderCustom) { + $el.html(params.renderCustom(swiper, current + 1, total)); + swiper.emit('paginationRender', swiper, $el[0]); + } else { + swiper.emit('paginationUpdate', swiper, $el[0]); + } + $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); + }, + render: function render() { + // Render Container + var swiper = this; + var params = swiper.params.pagination; + if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; } + var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length; + + var $el = swiper.pagination.$el; + var paginationHTML = ''; + if (params.type === 'bullets') { + var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length; + for (var i = 0; i < numberOfBullets; i += 1) { + if (params.renderBullet) { + paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass); + } else { + paginationHTML += "<" + (params.bulletElement) + " class=\"" + (params.bulletClass) + "\">"; + } + } + $el.html(paginationHTML); + swiper.pagination.bullets = $el.find(("." + (params.bulletClass))); + } + if (params.type === 'fraction') { + if (params.renderFraction) { + paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass); + } else { + paginationHTML = "" + + ' / ' + + ""; + } + $el.html(paginationHTML); + } + if (params.type === 'progressbar') { + if (params.renderProgressbar) { + paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass); + } else { + paginationHTML = ""; + } + $el.html(paginationHTML); + } + if (params.type !== 'custom') { + swiper.emit('paginationRender', swiper.pagination.$el[0]); + } + }, + init: function init() { + var swiper = this; + var params = swiper.params.pagination; + if (!params.el) { return; } + + var $el = $(params.el); + if ($el.length === 0) { return; } + + if ( + swiper.params.uniqueNavElements + && typeof params.el === 'string' + && $el.length > 1 + && swiper.$el.find(params.el).length === 1 + ) { + $el = swiper.$el.find(params.el); + } + + if (params.type === 'bullets' && params.clickable) { + $el.addClass(params.clickableClass); + } + + $el.addClass(params.modifierClass + params.type); + + if (params.type === 'bullets' && params.dynamicBullets) { + $el.addClass(("" + (params.modifierClass) + (params.type) + "-dynamic")); + swiper.pagination.dynamicBulletIndex = 0; + if (params.dynamicMainBullets < 1) { + params.dynamicMainBullets = 1; + } + } + if (params.type === 'progressbar' && params.progressbarOpposite) { + $el.addClass(params.progressbarOppositeClass); + } + + if (params.clickable) { + $el.on('click', ("." + (params.bulletClass)), function onClick(e) { + e.preventDefault(); + var index = $(this).index() * swiper.params.slidesPerGroup; + if (swiper.params.loop) { index += swiper.loopedSlides; } + swiper.slideTo(index); + }); + } + + Utils.extend(swiper.pagination, { + $el: $el, + el: $el[0], + }); + }, + destroy: function destroy() { + var swiper = this; + var params = swiper.params.pagination; + if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; } + var $el = swiper.pagination.$el; + + $el.removeClass(params.hiddenClass); + $el.removeClass(params.modifierClass + params.type); + if (swiper.pagination.bullets) { swiper.pagination.bullets.removeClass(params.bulletActiveClass); } + if (params.clickable) { + $el.off('click', ("." + (params.bulletClass))); + } + }, + }; + + var Pagination$1 = { + name: 'pagination', + params: { + pagination: { + el: null, + bulletElement: 'span', + clickable: false, + hideOnClick: false, + renderBullet: null, + renderProgressbar: null, + renderFraction: null, + renderCustom: null, + progressbarOpposite: false, + type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom' + dynamicBullets: false, + dynamicMainBullets: 1, + formatFractionCurrent: function (number) { return number; }, + formatFractionTotal: function (number) { return number; }, + bulletClass: 'swiper-pagination-bullet', + bulletActiveClass: 'swiper-pagination-bullet-active', + modifierClass: 'swiper-pagination-', // NEW + currentClass: 'swiper-pagination-current', + totalClass: 'swiper-pagination-total', + hiddenClass: 'swiper-pagination-hidden', + progressbarFillClass: 'swiper-pagination-progressbar-fill', + progressbarOppositeClass: 'swiper-pagination-progressbar-opposite', + clickableClass: 'swiper-pagination-clickable', // NEW + lockClass: 'swiper-pagination-lock', + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + pagination: { + init: Pagination.init.bind(swiper), + render: Pagination.render.bind(swiper), + update: Pagination.update.bind(swiper), + destroy: Pagination.destroy.bind(swiper), + dynamicBulletIndex: 0, + }, + }); + }, + on: { + init: function init() { + var swiper = this; + swiper.pagination.init(); + swiper.pagination.render(); + swiper.pagination.update(); + }, + activeIndexChange: function activeIndexChange() { + var swiper = this; + if (swiper.params.loop) { + swiper.pagination.update(); + } else if (typeof swiper.snapIndex === 'undefined') { + swiper.pagination.update(); + } + }, + snapIndexChange: function snapIndexChange() { + var swiper = this; + if (!swiper.params.loop) { + swiper.pagination.update(); + } + }, + slidesLengthChange: function slidesLengthChange() { + var swiper = this; + if (swiper.params.loop) { + swiper.pagination.render(); + swiper.pagination.update(); + } + }, + snapGridLengthChange: function snapGridLengthChange() { + var swiper = this; + if (!swiper.params.loop) { + swiper.pagination.render(); + swiper.pagination.update(); + } + }, + destroy: function destroy() { + var swiper = this; + swiper.pagination.destroy(); + }, + click: function click(e) { + var swiper = this; + if ( + swiper.params.pagination.el + && swiper.params.pagination.hideOnClick + && swiper.pagination.$el.length > 0 + && !$(e.target).hasClass(swiper.params.pagination.bulletClass) + ) { + var isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass); + if (isHidden === true) { + swiper.emit('paginationShow', swiper); + } else { + swiper.emit('paginationHide', swiper); + } + swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass); + } + }, + }, + }; + + var Scrollbar = { + setTranslate: function setTranslate() { + var swiper = this; + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; } + var scrollbar = swiper.scrollbar; + var rtl = swiper.rtlTranslate; + var progress = swiper.progress; + var dragSize = scrollbar.dragSize; + var trackSize = scrollbar.trackSize; + var $dragEl = scrollbar.$dragEl; + var $el = scrollbar.$el; + var params = swiper.params.scrollbar; + + var newSize = dragSize; + var newPos = (trackSize - dragSize) * progress; + if (rtl) { + newPos = -newPos; + if (newPos > 0) { + newSize = dragSize - newPos; + newPos = 0; + } else if (-newPos + dragSize > trackSize) { + newSize = trackSize + newPos; + } + } else if (newPos < 0) { + newSize = dragSize + newPos; + newPos = 0; + } else if (newPos + dragSize > trackSize) { + newSize = trackSize - newPos; + } + if (swiper.isHorizontal()) { + if (Support.transforms3d) { + $dragEl.transform(("translate3d(" + newPos + "px, 0, 0)")); + } else { + $dragEl.transform(("translateX(" + newPos + "px)")); + } + $dragEl[0].style.width = newSize + "px"; + } else { + if (Support.transforms3d) { + $dragEl.transform(("translate3d(0px, " + newPos + "px, 0)")); + } else { + $dragEl.transform(("translateY(" + newPos + "px)")); + } + $dragEl[0].style.height = newSize + "px"; + } + if (params.hide) { + clearTimeout(swiper.scrollbar.timeout); + $el[0].style.opacity = 1; + swiper.scrollbar.timeout = setTimeout(function () { + $el[0].style.opacity = 0; + $el.transition(400); + }, 1000); + } + }, + setTransition: function setTransition(duration) { + var swiper = this; + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; } + swiper.scrollbar.$dragEl.transition(duration); + }, + updateSize: function updateSize() { + var swiper = this; + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; } + + var scrollbar = swiper.scrollbar; + var $dragEl = scrollbar.$dragEl; + var $el = scrollbar.$el; + + $dragEl[0].style.width = ''; + $dragEl[0].style.height = ''; + var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight; + + var divider = swiper.size / swiper.virtualSize; + var moveDivider = divider * (trackSize / swiper.size); + var dragSize; + if (swiper.params.scrollbar.dragSize === 'auto') { + dragSize = trackSize * divider; + } else { + dragSize = parseInt(swiper.params.scrollbar.dragSize, 10); + } + + if (swiper.isHorizontal()) { + $dragEl[0].style.width = dragSize + "px"; + } else { + $dragEl[0].style.height = dragSize + "px"; + } + + if (divider >= 1) { + $el[0].style.display = 'none'; + } else { + $el[0].style.display = ''; + } + if (swiper.params.scrollbar.hide) { + $el[0].style.opacity = 0; + } + Utils.extend(scrollbar, { + trackSize: trackSize, + divider: divider, + moveDivider: moveDivider, + dragSize: dragSize, + }); + scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass); + }, + setDragPosition: function setDragPosition(e) { + var swiper = this; + var scrollbar = swiper.scrollbar; + var rtl = swiper.rtlTranslate; + var $el = scrollbar.$el; + var dragSize = scrollbar.dragSize; + var trackSize = scrollbar.trackSize; + + var pointerPosition; + if (swiper.isHorizontal()) { + pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX); + } else { + pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY); + } + var positionRatio; + positionRatio = ((pointerPosition) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragSize / 2)) / (trackSize - dragSize); + positionRatio = Math.max(Math.min(positionRatio, 1), 0); + if (rtl) { + positionRatio = 1 - positionRatio; + } + + var position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio); + + swiper.updateProgress(position); + swiper.setTranslate(position); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + }, + onDragStart: function onDragStart(e) { + var swiper = this; + var params = swiper.params.scrollbar; + var scrollbar = swiper.scrollbar; + var $wrapperEl = swiper.$wrapperEl; + var $el = scrollbar.$el; + var $dragEl = scrollbar.$dragEl; + swiper.scrollbar.isTouched = true; + e.preventDefault(); + e.stopPropagation(); + + $wrapperEl.transition(100); + $dragEl.transition(100); + scrollbar.setDragPosition(e); + + clearTimeout(swiper.scrollbar.dragTimeout); + + $el.transition(0); + if (params.hide) { + $el.css('opacity', 1); + } + swiper.emit('scrollbarDragStart', e); + }, + onDragMove: function onDragMove(e) { + var swiper = this; + var scrollbar = swiper.scrollbar; + var $wrapperEl = swiper.$wrapperEl; + var $el = scrollbar.$el; + var $dragEl = scrollbar.$dragEl; + + if (!swiper.scrollbar.isTouched) { return; } + if (e.preventDefault) { e.preventDefault(); } + else { e.returnValue = false; } + scrollbar.setDragPosition(e); + $wrapperEl.transition(0); + $el.transition(0); + $dragEl.transition(0); + swiper.emit('scrollbarDragMove', e); + }, + onDragEnd: function onDragEnd(e) { + var swiper = this; + + var params = swiper.params.scrollbar; + var scrollbar = swiper.scrollbar; + var $el = scrollbar.$el; + + if (!swiper.scrollbar.isTouched) { return; } + swiper.scrollbar.isTouched = false; + if (params.hide) { + clearTimeout(swiper.scrollbar.dragTimeout); + swiper.scrollbar.dragTimeout = Utils.nextTick(function () { + $el.css('opacity', 0); + $el.transition(400); + }, 1000); + } + swiper.emit('scrollbarDragEnd', e); + if (params.snapOnRelease) { + swiper.slideToClosest(); + } + }, + enableDraggable: function enableDraggable() { + var swiper = this; + if (!swiper.params.scrollbar.el) { return; } + var scrollbar = swiper.scrollbar; + var touchEventsTouch = swiper.touchEventsTouch; + var touchEventsDesktop = swiper.touchEventsDesktop; + var params = swiper.params; + var $el = scrollbar.$el; + var target = $el[0]; + var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false; + var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false; + if (!Support.touch) { + target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener); + doc.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener); + doc.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener); + } else { + target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener); + target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener); + target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener); + } + }, + disableDraggable: function disableDraggable() { + var swiper = this; + if (!swiper.params.scrollbar.el) { return; } + var scrollbar = swiper.scrollbar; + var touchEventsTouch = swiper.touchEventsTouch; + var touchEventsDesktop = swiper.touchEventsDesktop; + var params = swiper.params; + var $el = scrollbar.$el; + var target = $el[0]; + var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false; + var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false; + if (!Support.touch) { + target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener); + doc.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener); + doc.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener); + } else { + target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener); + target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener); + target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener); + } + }, + init: function init() { + var swiper = this; + if (!swiper.params.scrollbar.el) { return; } + var scrollbar = swiper.scrollbar; + var $swiperEl = swiper.$el; + var params = swiper.params.scrollbar; + + var $el = $(params.el); + if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) { + $el = $swiperEl.find(params.el); + } + + var $dragEl = $el.find(("." + (swiper.params.scrollbar.dragClass))); + if ($dragEl.length === 0) { + $dragEl = $(("
            ")); + $el.append($dragEl); + } + + Utils.extend(scrollbar, { + $el: $el, + el: $el[0], + $dragEl: $dragEl, + dragEl: $dragEl[0], + }); + + if (params.draggable) { + scrollbar.enableDraggable(); + } + }, + destroy: function destroy() { + var swiper = this; + swiper.scrollbar.disableDraggable(); + }, + }; + + var Scrollbar$1 = { + name: 'scrollbar', + params: { + scrollbar: { + el: null, + dragSize: 'auto', + hide: false, + draggable: false, + snapOnRelease: true, + lockClass: 'swiper-scrollbar-lock', + dragClass: 'swiper-scrollbar-drag', + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + scrollbar: { + init: Scrollbar.init.bind(swiper), + destroy: Scrollbar.destroy.bind(swiper), + updateSize: Scrollbar.updateSize.bind(swiper), + setTranslate: Scrollbar.setTranslate.bind(swiper), + setTransition: Scrollbar.setTransition.bind(swiper), + enableDraggable: Scrollbar.enableDraggable.bind(swiper), + disableDraggable: Scrollbar.disableDraggable.bind(swiper), + setDragPosition: Scrollbar.setDragPosition.bind(swiper), + onDragStart: Scrollbar.onDragStart.bind(swiper), + onDragMove: Scrollbar.onDragMove.bind(swiper), + onDragEnd: Scrollbar.onDragEnd.bind(swiper), + isTouched: false, + timeout: null, + dragTimeout: null, + }, + }); + }, + on: { + init: function init() { + var swiper = this; + swiper.scrollbar.init(); + swiper.scrollbar.updateSize(); + swiper.scrollbar.setTranslate(); + }, + update: function update() { + var swiper = this; + swiper.scrollbar.updateSize(); + }, + resize: function resize() { + var swiper = this; + swiper.scrollbar.updateSize(); + }, + observerUpdate: function observerUpdate() { + var swiper = this; + swiper.scrollbar.updateSize(); + }, + setTranslate: function setTranslate() { + var swiper = this; + swiper.scrollbar.setTranslate(); + }, + setTransition: function setTransition(duration) { + var swiper = this; + swiper.scrollbar.setTransition(duration); + }, + destroy: function destroy() { + var swiper = this; + swiper.scrollbar.destroy(); + }, + }, + }; + + var Parallax = { + setTransform: function setTransform(el, progress) { + var swiper = this; + var rtl = swiper.rtl; + + var $el = $(el); + var rtlFactor = rtl ? -1 : 1; + + var p = $el.attr('data-swiper-parallax') || '0'; + var x = $el.attr('data-swiper-parallax-x'); + var y = $el.attr('data-swiper-parallax-y'); + var scale = $el.attr('data-swiper-parallax-scale'); + var opacity = $el.attr('data-swiper-parallax-opacity'); + + if (x || y) { + x = x || '0'; + y = y || '0'; + } else if (swiper.isHorizontal()) { + x = p; + y = '0'; + } else { + y = p; + x = '0'; + } + + if ((x).indexOf('%') >= 0) { + x = (parseInt(x, 10) * progress * rtlFactor) + "%"; + } else { + x = (x * progress * rtlFactor) + "px"; + } + if ((y).indexOf('%') >= 0) { + y = (parseInt(y, 10) * progress) + "%"; + } else { + y = (y * progress) + "px"; + } + + if (typeof opacity !== 'undefined' && opacity !== null) { + var currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress))); + $el[0].style.opacity = currentOpacity; + } + if (typeof scale === 'undefined' || scale === null) { + $el.transform(("translate3d(" + x + ", " + y + ", 0px)")); + } else { + var currentScale = scale - ((scale - 1) * (1 - Math.abs(progress))); + $el.transform(("translate3d(" + x + ", " + y + ", 0px) scale(" + currentScale + ")")); + } + }, + setTranslate: function setTranslate() { + var swiper = this; + var $el = swiper.$el; + var slides = swiper.slides; + var progress = swiper.progress; + var snapGrid = swiper.snapGrid; + $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]') + .each(function (index, el) { + swiper.parallax.setTransform(el, progress); + }); + slides.each(function (slideIndex, slideEl) { + var slideProgress = slideEl.progress; + if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') { + slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1)); + } + slideProgress = Math.min(Math.max(slideProgress, -1), 1); + $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]') + .each(function (index, el) { + swiper.parallax.setTransform(el, slideProgress); + }); + }); + }, + setTransition: function setTransition(duration) { + if ( duration === void 0 ) duration = this.params.speed; + + var swiper = this; + var $el = swiper.$el; + $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]') + .each(function (index, parallaxEl) { + var $parallaxEl = $(parallaxEl); + var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration; + if (duration === 0) { parallaxDuration = 0; } + $parallaxEl.transition(parallaxDuration); + }); + }, + }; + + var Parallax$1 = { + name: 'parallax', + params: { + parallax: { + enabled: false, + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + parallax: { + setTransform: Parallax.setTransform.bind(swiper), + setTranslate: Parallax.setTranslate.bind(swiper), + setTransition: Parallax.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit: function beforeInit() { + var swiper = this; + if (!swiper.params.parallax.enabled) { return; } + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + }, + init: function init() { + var swiper = this; + if (!swiper.params.parallax.enabled) { return; } + swiper.parallax.setTranslate(); + }, + setTranslate: function setTranslate() { + var swiper = this; + if (!swiper.params.parallax.enabled) { return; } + swiper.parallax.setTranslate(); + }, + setTransition: function setTransition(duration) { + var swiper = this; + if (!swiper.params.parallax.enabled) { return; } + swiper.parallax.setTransition(duration); + }, + }, + }; + + var Zoom = { + // Calc Scale From Multi-touches + getDistanceBetweenTouches: function getDistanceBetweenTouches(e) { + if (e.targetTouches.length < 2) { return 1; } + var x1 = e.targetTouches[0].pageX; + var y1 = e.targetTouches[0].pageY; + var x2 = e.targetTouches[1].pageX; + var y2 = e.targetTouches[1].pageY; + var distance = Math.sqrt((Math.pow( (x2 - x1), 2 )) + (Math.pow( (y2 - y1), 2 ))); + return distance; + }, + // Events + onGestureStart: function onGestureStart(e) { + var swiper = this; + var params = swiper.params.zoom; + var zoom = swiper.zoom; + var gesture = zoom.gesture; + zoom.fakeGestureTouched = false; + zoom.fakeGestureMoved = false; + if (!Support.gestures) { + if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) { + return; + } + zoom.fakeGestureTouched = true; + gesture.scaleStart = Zoom.getDistanceBetweenTouches(e); + } + if (!gesture.$slideEl || !gesture.$slideEl.length) { + gesture.$slideEl = $(e.target).closest('.swiper-slide'); + if (gesture.$slideEl.length === 0) { gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); } + gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas'); + gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass))); + gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + if (gesture.$imageWrapEl.length === 0) { + gesture.$imageEl = undefined; + return; + } + } + gesture.$imageEl.transition(0); + swiper.zoom.isScaling = true; + }, + onGestureChange: function onGestureChange(e) { + var swiper = this; + var params = swiper.params.zoom; + var zoom = swiper.zoom; + var gesture = zoom.gesture; + if (!Support.gestures) { + if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) { + return; + } + zoom.fakeGestureMoved = true; + gesture.scaleMove = Zoom.getDistanceBetweenTouches(e); + } + if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; } + if (Support.gestures) { + zoom.scale = e.scale * zoom.currentScale; + } else { + zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale; + } + if (zoom.scale > gesture.maxRatio) { + zoom.scale = (gesture.maxRatio - 1) + (Math.pow( ((zoom.scale - gesture.maxRatio) + 1), 0.5 )); + } + if (zoom.scale < params.minRatio) { + zoom.scale = (params.minRatio + 1) - (Math.pow( ((params.minRatio - zoom.scale) + 1), 0.5 )); + } + gesture.$imageEl.transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")")); + }, + onGestureEnd: function onGestureEnd(e) { + var swiper = this; + var params = swiper.params.zoom; + var zoom = swiper.zoom; + var gesture = zoom.gesture; + if (!Support.gestures) { + if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) { + return; + } + if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) { + return; + } + zoom.fakeGestureTouched = false; + zoom.fakeGestureMoved = false; + } + if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; } + zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio); + gesture.$imageEl.transition(swiper.params.speed).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")")); + zoom.currentScale = zoom.scale; + zoom.isScaling = false; + if (zoom.scale === 1) { gesture.$slideEl = undefined; } + }, + onTouchStart: function onTouchStart(e) { + var swiper = this; + var zoom = swiper.zoom; + var gesture = zoom.gesture; + var image = zoom.image; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; } + if (image.isTouched) { return; } + if (Device.android) { e.preventDefault(); } + image.isTouched = true; + image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + }, + onTouchMove: function onTouchMove(e) { + var swiper = this; + var zoom = swiper.zoom; + var gesture = zoom.gesture; + var image = zoom.image; + var velocity = zoom.velocity; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; } + swiper.allowClick = false; + if (!image.isTouched || !gesture.$slideEl) { return; } + + if (!image.isMoved) { + image.width = gesture.$imageEl[0].offsetWidth; + image.height = gesture.$imageEl[0].offsetHeight; + image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0; + image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0; + gesture.slideWidth = gesture.$slideEl[0].offsetWidth; + gesture.slideHeight = gesture.$slideEl[0].offsetHeight; + gesture.$imageWrapEl.transition(0); + if (swiper.rtl) { + image.startX = -image.startX; + image.startY = -image.startY; + } + } + // Define if we need image drag + var scaledWidth = image.width * zoom.scale; + var scaledHeight = image.height * zoom.scale; + + if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) { return; } + + image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0); + image.maxX = -image.minX; + image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0); + image.maxY = -image.minY; + + image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + + if (!image.isMoved && !zoom.isScaling) { + if ( + swiper.isHorizontal() + && ( + (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x) + || (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x) + ) + ) { + image.isTouched = false; + return; + } if ( + !swiper.isHorizontal() + && ( + (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y) + || (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y) + ) + ) { + image.isTouched = false; + return; + } + } + e.preventDefault(); + e.stopPropagation(); + + image.isMoved = true; + image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX; + image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY; + + if (image.currentX < image.minX) { + image.currentX = (image.minX + 1) - (Math.pow( ((image.minX - image.currentX) + 1), 0.8 )); + } + if (image.currentX > image.maxX) { + image.currentX = (image.maxX - 1) + (Math.pow( ((image.currentX - image.maxX) + 1), 0.8 )); + } + + if (image.currentY < image.minY) { + image.currentY = (image.minY + 1) - (Math.pow( ((image.minY - image.currentY) + 1), 0.8 )); + } + if (image.currentY > image.maxY) { + image.currentY = (image.maxY - 1) + (Math.pow( ((image.currentY - image.maxY) + 1), 0.8 )); + } + + // Velocity + if (!velocity.prevPositionX) { velocity.prevPositionX = image.touchesCurrent.x; } + if (!velocity.prevPositionY) { velocity.prevPositionY = image.touchesCurrent.y; } + if (!velocity.prevTime) { velocity.prevTime = Date.now(); } + velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2; + velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2; + if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) { velocity.x = 0; } + if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) { velocity.y = 0; } + velocity.prevPositionX = image.touchesCurrent.x; + velocity.prevPositionY = image.touchesCurrent.y; + velocity.prevTime = Date.now(); + + gesture.$imageWrapEl.transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)")); + }, + onTouchEnd: function onTouchEnd() { + var swiper = this; + var zoom = swiper.zoom; + var gesture = zoom.gesture; + var image = zoom.image; + var velocity = zoom.velocity; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; } + if (!image.isTouched || !image.isMoved) { + image.isTouched = false; + image.isMoved = false; + return; + } + image.isTouched = false; + image.isMoved = false; + var momentumDurationX = 300; + var momentumDurationY = 300; + var momentumDistanceX = velocity.x * momentumDurationX; + var newPositionX = image.currentX + momentumDistanceX; + var momentumDistanceY = velocity.y * momentumDurationY; + var newPositionY = image.currentY + momentumDistanceY; + + // Fix duration + if (velocity.x !== 0) { momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); } + if (velocity.y !== 0) { momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); } + var momentumDuration = Math.max(momentumDurationX, momentumDurationY); + + image.currentX = newPositionX; + image.currentY = newPositionY; + + // Define if we need image drag + var scaledWidth = image.width * zoom.scale; + var scaledHeight = image.height * zoom.scale; + image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0); + image.maxX = -image.minX; + image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0); + image.maxY = -image.minY; + image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX); + image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY); + + gesture.$imageWrapEl.transition(momentumDuration).transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)")); + }, + onTransitionEnd: function onTransitionEnd() { + var swiper = this; + var zoom = swiper.zoom; + var gesture = zoom.gesture; + if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) { + gesture.$imageEl.transform('translate3d(0,0,0) scale(1)'); + gesture.$imageWrapEl.transform('translate3d(0,0,0)'); + + zoom.scale = 1; + zoom.currentScale = 1; + + gesture.$slideEl = undefined; + gesture.$imageEl = undefined; + gesture.$imageWrapEl = undefined; + } + }, + // Toggle Zoom + toggle: function toggle(e) { + var swiper = this; + var zoom = swiper.zoom; + + if (zoom.scale && zoom.scale !== 1) { + // Zoom Out + zoom.out(); + } else { + // Zoom In + zoom.in(e); + } + }, + in: function in$1(e) { + var swiper = this; + + var zoom = swiper.zoom; + var params = swiper.params.zoom; + var gesture = zoom.gesture; + var image = zoom.image; + + if (!gesture.$slideEl) { + gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex); + gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas'); + gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass))); + } + if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; } + + gesture.$slideEl.addClass(("" + (params.zoomedSlideClass))); + + var touchX; + var touchY; + var offsetX; + var offsetY; + var diffX; + var diffY; + var translateX; + var translateY; + var imageWidth; + var imageHeight; + var scaledWidth; + var scaledHeight; + var translateMinX; + var translateMinY; + var translateMaxX; + var translateMaxY; + var slideWidth; + var slideHeight; + + if (typeof image.touchesStart.x === 'undefined' && e) { + touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX; + touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY; + } else { + touchX = image.touchesStart.x; + touchY = image.touchesStart.y; + } + + zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio; + if (e) { + slideWidth = gesture.$slideEl[0].offsetWidth; + slideHeight = gesture.$slideEl[0].offsetHeight; + offsetX = gesture.$slideEl.offset().left; + offsetY = gesture.$slideEl.offset().top; + diffX = (offsetX + (slideWidth / 2)) - touchX; + diffY = (offsetY + (slideHeight / 2)) - touchY; + + imageWidth = gesture.$imageEl[0].offsetWidth; + imageHeight = gesture.$imageEl[0].offsetHeight; + scaledWidth = imageWidth * zoom.scale; + scaledHeight = imageHeight * zoom.scale; + + translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0); + translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0); + translateMaxX = -translateMinX; + translateMaxY = -translateMinY; + + translateX = diffX * zoom.scale; + translateY = diffY * zoom.scale; + + if (translateX < translateMinX) { + translateX = translateMinX; + } + if (translateX > translateMaxX) { + translateX = translateMaxX; + } + + if (translateY < translateMinY) { + translateY = translateMinY; + } + if (translateY > translateMaxY) { + translateY = translateMaxY; + } + } else { + translateX = 0; + translateY = 0; + } + gesture.$imageWrapEl.transition(300).transform(("translate3d(" + translateX + "px, " + translateY + "px,0)")); + gesture.$imageEl.transition(300).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")")); + }, + out: function out() { + var swiper = this; + + var zoom = swiper.zoom; + var params = swiper.params.zoom; + var gesture = zoom.gesture; + + if (!gesture.$slideEl) { + gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex); + gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas'); + gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass))); + } + if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; } + + zoom.scale = 1; + zoom.currentScale = 1; + gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)'); + gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)'); + gesture.$slideEl.removeClass(("" + (params.zoomedSlideClass))); + gesture.$slideEl = undefined; + }, + // Attach/Detach Events + enable: function enable() { + var swiper = this; + var zoom = swiper.zoom; + if (zoom.enabled) { return; } + zoom.enabled = true; + + var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false; + + // Scale image + if (Support.gestures) { + swiper.$wrapperEl.on('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener); + swiper.$wrapperEl.on('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener); + swiper.$wrapperEl.on('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener); + } else if (swiper.touchEvents.start === 'touchstart') { + swiper.$wrapperEl.on(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener); + swiper.$wrapperEl.on(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener); + swiper.$wrapperEl.on(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener); + } + + // Move image + swiper.$wrapperEl.on(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove); + }, + disable: function disable() { + var swiper = this; + var zoom = swiper.zoom; + if (!zoom.enabled) { return; } + + swiper.zoom.enabled = false; + + var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false; + + // Scale image + if (Support.gestures) { + swiper.$wrapperEl.off('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener); + swiper.$wrapperEl.off('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener); + swiper.$wrapperEl.off('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener); + } else if (swiper.touchEvents.start === 'touchstart') { + swiper.$wrapperEl.off(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener); + swiper.$wrapperEl.off(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener); + swiper.$wrapperEl.off(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener); + } + + // Move image + swiper.$wrapperEl.off(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove); + }, + }; + + var Zoom$1 = { + name: 'zoom', + params: { + zoom: { + enabled: false, + maxRatio: 3, + minRatio: 1, + toggle: true, + containerClass: 'swiper-zoom-container', + zoomedSlideClass: 'swiper-slide-zoomed', + }, + }, + create: function create() { + var swiper = this; + var zoom = { + enabled: false, + scale: 1, + currentScale: 1, + isScaling: false, + gesture: { + $slideEl: undefined, + slideWidth: undefined, + slideHeight: undefined, + $imageEl: undefined, + $imageWrapEl: undefined, + maxRatio: 3, + }, + image: { + isTouched: undefined, + isMoved: undefined, + currentX: undefined, + currentY: undefined, + minX: undefined, + minY: undefined, + maxX: undefined, + maxY: undefined, + width: undefined, + height: undefined, + startX: undefined, + startY: undefined, + touchesStart: {}, + touchesCurrent: {}, + }, + velocity: { + x: undefined, + y: undefined, + prevPositionX: undefined, + prevPositionY: undefined, + prevTime: undefined, + }, + }; + + ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach(function (methodName) { + zoom[methodName] = Zoom[methodName].bind(swiper); + }); + Utils.extend(swiper, { + zoom: zoom, + }); + + var scale = 1; + Object.defineProperty(swiper.zoom, 'scale', { + get: function get() { + return scale; + }, + set: function set(value) { + if (scale !== value) { + var imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined; + var slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined; + swiper.emit('zoomChange', value, imageEl, slideEl); + } + scale = value; + }, + }); + }, + on: { + init: function init() { + var swiper = this; + if (swiper.params.zoom.enabled) { + swiper.zoom.enable(); + } + }, + destroy: function destroy() { + var swiper = this; + swiper.zoom.disable(); + }, + touchStart: function touchStart(e) { + var swiper = this; + if (!swiper.zoom.enabled) { return; } + swiper.zoom.onTouchStart(e); + }, + touchEnd: function touchEnd(e) { + var swiper = this; + if (!swiper.zoom.enabled) { return; } + swiper.zoom.onTouchEnd(e); + }, + doubleTap: function doubleTap(e) { + var swiper = this; + if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) { + swiper.zoom.toggle(e); + } + }, + transitionEnd: function transitionEnd() { + var swiper = this; + if (swiper.zoom.enabled && swiper.params.zoom.enabled) { + swiper.zoom.onTransitionEnd(); + } + }, + }, + }; + + var Lazy = { + loadInSlide: function loadInSlide(index, loadInDuplicate) { + if ( loadInDuplicate === void 0 ) loadInDuplicate = true; + + var swiper = this; + var params = swiper.params.lazy; + if (typeof index === 'undefined') { return; } + if (swiper.slides.length === 0) { return; } + var isVirtual = swiper.virtual && swiper.params.virtual.enabled; + + var $slideEl = isVirtual + ? swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]")) + : swiper.slides.eq(index); + + var $images = $slideEl.find(("." + (params.elementClass) + ":not(." + (params.loadedClass) + "):not(." + (params.loadingClass) + ")")); + if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) { + $images = $images.add($slideEl[0]); + } + if ($images.length === 0) { return; } + + $images.each(function (imageIndex, imageEl) { + var $imageEl = $(imageEl); + $imageEl.addClass(params.loadingClass); + + var background = $imageEl.attr('data-background'); + var src = $imageEl.attr('data-src'); + var srcset = $imageEl.attr('data-srcset'); + var sizes = $imageEl.attr('data-sizes'); + + swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, function () { + if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) { return; } + if (background) { + $imageEl.css('background-image', ("url(\"" + background + "\")")); + $imageEl.removeAttr('data-background'); + } else { + if (srcset) { + $imageEl.attr('srcset', srcset); + $imageEl.removeAttr('data-srcset'); + } + if (sizes) { + $imageEl.attr('sizes', sizes); + $imageEl.removeAttr('data-sizes'); + } + if (src) { + $imageEl.attr('src', src); + $imageEl.removeAttr('data-src'); + } + } + + $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass); + $slideEl.find(("." + (params.preloaderClass))).remove(); + if (swiper.params.loop && loadInDuplicate) { + var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index'); + if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) { + var originalSlide = swiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]:not(." + (swiper.params.slideDuplicateClass) + ")")); + swiper.lazy.loadInSlide(originalSlide.index(), false); + } else { + var duplicatedSlide = swiper.$wrapperEl.children(("." + (swiper.params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]")); + swiper.lazy.loadInSlide(duplicatedSlide.index(), false); + } + } + swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]); + }); + + swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]); + }); + }, + load: function load() { + var swiper = this; + var $wrapperEl = swiper.$wrapperEl; + var swiperParams = swiper.params; + var slides = swiper.slides; + var activeIndex = swiper.activeIndex; + var isVirtual = swiper.virtual && swiperParams.virtual.enabled; + var params = swiperParams.lazy; + + var slidesPerView = swiperParams.slidesPerView; + if (slidesPerView === 'auto') { + slidesPerView = 0; + } + + function slideExist(index) { + if (isVirtual) { + if ($wrapperEl.children(("." + (swiperParams.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]")).length) { + return true; + } + } else if (slides[index]) { return true; } + return false; + } + function slideIndex(slideEl) { + if (isVirtual) { + return $(slideEl).attr('data-swiper-slide-index'); + } + return $(slideEl).index(); + } + + if (!swiper.lazy.initialImageLoaded) { swiper.lazy.initialImageLoaded = true; } + if (swiper.params.watchSlidesVisibility) { + $wrapperEl.children(("." + (swiperParams.slideVisibleClass))).each(function (elIndex, slideEl) { + var index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index(); + swiper.lazy.loadInSlide(index); + }); + } else if (slidesPerView > 1) { + for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) { + if (slideExist(i)) { swiper.lazy.loadInSlide(i); } + } + } else { + swiper.lazy.loadInSlide(activeIndex); + } + if (params.loadPrevNext) { + if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) { + var amount = params.loadPrevNextAmount; + var spv = slidesPerView; + var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length); + var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0); + // Next Slides + for (var i$1 = activeIndex + slidesPerView; i$1 < maxIndex; i$1 += 1) { + if (slideExist(i$1)) { swiper.lazy.loadInSlide(i$1); } + } + // Prev Slides + for (var i$2 = minIndex; i$2 < activeIndex; i$2 += 1) { + if (slideExist(i$2)) { swiper.lazy.loadInSlide(i$2); } + } + } else { + var nextSlide = $wrapperEl.children(("." + (swiperParams.slideNextClass))); + if (nextSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(nextSlide)); } + + var prevSlide = $wrapperEl.children(("." + (swiperParams.slidePrevClass))); + if (prevSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(prevSlide)); } + } + } + }, + }; + + var Lazy$1 = { + name: 'lazy', + params: { + lazy: { + enabled: false, + loadPrevNext: false, + loadPrevNextAmount: 1, + loadOnTransitionStart: false, + + elementClass: 'swiper-lazy', + loadingClass: 'swiper-lazy-loading', + loadedClass: 'swiper-lazy-loaded', + preloaderClass: 'swiper-lazy-preloader', + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + lazy: { + initialImageLoaded: false, + load: Lazy.load.bind(swiper), + loadInSlide: Lazy.loadInSlide.bind(swiper), + }, + }); + }, + on: { + beforeInit: function beforeInit() { + var swiper = this; + if (swiper.params.lazy.enabled && swiper.params.preloadImages) { + swiper.params.preloadImages = false; + } + }, + init: function init() { + var swiper = this; + if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) { + swiper.lazy.load(); + } + }, + scroll: function scroll() { + var swiper = this; + if (swiper.params.freeMode && !swiper.params.freeModeSticky) { + swiper.lazy.load(); + } + }, + resize: function resize() { + var swiper = this; + if (swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + }, + scrollbarDragMove: function scrollbarDragMove() { + var swiper = this; + if (swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + }, + transitionStart: function transitionStart() { + var swiper = this; + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) { + swiper.lazy.load(); + } + } + }, + transitionEnd: function transitionEnd() { + var swiper = this; + if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) { + swiper.lazy.load(); + } + }, + }, + }; + + /* eslint no-bitwise: ["error", { "allow": [">>"] }] */ + + var Controller = { + LinearSpline: function LinearSpline(x, y) { + var binarySearch = (function search() { + var maxIndex; + var minIndex; + var guess; + return function (array, val) { + minIndex = -1; + maxIndex = array.length; + while (maxIndex - minIndex > 1) { + guess = maxIndex + minIndex >> 1; + if (array[guess] <= val) { + minIndex = guess; + } else { + maxIndex = guess; + } + } + return maxIndex; + }; + }()); + this.x = x; + this.y = y; + this.lastIndex = x.length - 1; + // Given an x value (x2), return the expected y2 value: + // (x1,y1) is the known point before given value, + // (x3,y3) is the known point after given value. + var i1; + var i3; + + this.interpolate = function interpolate(x2) { + if (!x2) { return 0; } + + // Get the indexes of x1 and x3 (the array indexes before and after given x2): + i3 = binarySearch(this.x, x2); + i1 = i3 - 1; + + // We have our indexes i1 & i3, so we can calculate already: + // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1 + return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1]; + }; + return this; + }, + // xxx: for now i will just save one spline function to to + getInterpolateFunction: function getInterpolateFunction(c) { + var swiper = this; + if (!swiper.controller.spline) { + swiper.controller.spline = swiper.params.loop + ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid) + : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid); + } + }, + setTranslate: function setTranslate(setTranslate$1, byController) { + var swiper = this; + var controlled = swiper.controller.control; + var multiplier; + var controlledTranslate; + function setControlledTranslate(c) { + // this will create an Interpolate function based on the snapGrids + // x is the Grid of the scrolled scroller and y will be the controlled scroller + // it makes sense to create this only once and recall it for the interpolation + // the function does a lot of value caching for performance + var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate; + if (swiper.params.controller.by === 'slide') { + swiper.controller.getInterpolateFunction(c); + // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid + // but it did not work out + controlledTranslate = -swiper.controller.spline.interpolate(-translate); + } + + if (!controlledTranslate || swiper.params.controller.by === 'container') { + multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate()); + controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate(); + } + + if (swiper.params.controller.inverse) { + controlledTranslate = c.maxTranslate() - controlledTranslate; + } + c.updateProgress(controlledTranslate); + c.setTranslate(controlledTranslate, swiper); + c.updateActiveIndex(); + c.updateSlidesClasses(); + } + if (Array.isArray(controlled)) { + for (var i = 0; i < controlled.length; i += 1) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTranslate(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTranslate(controlled); + } + }, + setTransition: function setTransition(duration, byController) { + var swiper = this; + var controlled = swiper.controller.control; + var i; + function setControlledTransition(c) { + c.setTransition(duration, swiper); + if (duration !== 0) { + c.transitionStart(); + if (c.params.autoHeight) { + Utils.nextTick(function () { + c.updateAutoHeight(); + }); + } + c.$wrapperEl.transitionEnd(function () { + if (!controlled) { return; } + if (c.params.loop && swiper.params.controller.by === 'slide') { + c.loopFix(); + } + c.transitionEnd(); + }); + } + } + if (Array.isArray(controlled)) { + for (i = 0; i < controlled.length; i += 1) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTransition(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTransition(controlled); + } + }, + }; + var Controller$1 = { + name: 'controller', + params: { + controller: { + control: undefined, + inverse: false, + by: 'slide', // or 'container' + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + controller: { + control: swiper.params.controller.control, + getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper), + setTranslate: Controller.setTranslate.bind(swiper), + setTransition: Controller.setTransition.bind(swiper), + }, + }); + }, + on: { + update: function update() { + var swiper = this; + if (!swiper.controller.control) { return; } + if (swiper.controller.spline) { + swiper.controller.spline = undefined; + delete swiper.controller.spline; + } + }, + resize: function resize() { + var swiper = this; + if (!swiper.controller.control) { return; } + if (swiper.controller.spline) { + swiper.controller.spline = undefined; + delete swiper.controller.spline; + } + }, + observerUpdate: function observerUpdate() { + var swiper = this; + if (!swiper.controller.control) { return; } + if (swiper.controller.spline) { + swiper.controller.spline = undefined; + delete swiper.controller.spline; + } + }, + setTranslate: function setTranslate(translate, byController) { + var swiper = this; + if (!swiper.controller.control) { return; } + swiper.controller.setTranslate(translate, byController); + }, + setTransition: function setTransition(duration, byController) { + var swiper = this; + if (!swiper.controller.control) { return; } + swiper.controller.setTransition(duration, byController); + }, + }, + }; + + var a11y = { + makeElFocusable: function makeElFocusable($el) { + $el.attr('tabIndex', '0'); + return $el; + }, + addElRole: function addElRole($el, role) { + $el.attr('role', role); + return $el; + }, + addElLabel: function addElLabel($el, label) { + $el.attr('aria-label', label); + return $el; + }, + disableEl: function disableEl($el) { + $el.attr('aria-disabled', true); + return $el; + }, + enableEl: function enableEl($el) { + $el.attr('aria-disabled', false); + return $el; + }, + onEnterKey: function onEnterKey(e) { + var swiper = this; + var params = swiper.params.a11y; + if (e.keyCode !== 13) { return; } + var $targetEl = $(e.target); + if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) { + if (!(swiper.isEnd && !swiper.params.loop)) { + swiper.slideNext(); + } + if (swiper.isEnd) { + swiper.a11y.notify(params.lastSlideMessage); + } else { + swiper.a11y.notify(params.nextSlideMessage); + } + } + if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) { + if (!(swiper.isBeginning && !swiper.params.loop)) { + swiper.slidePrev(); + } + if (swiper.isBeginning) { + swiper.a11y.notify(params.firstSlideMessage); + } else { + swiper.a11y.notify(params.prevSlideMessage); + } + } + if (swiper.pagination && $targetEl.is(("." + (swiper.params.pagination.bulletClass)))) { + $targetEl[0].click(); + } + }, + notify: function notify(message) { + var swiper = this; + var notification = swiper.a11y.liveRegion; + if (notification.length === 0) { return; } + notification.html(''); + notification.html(message); + }, + updateNavigation: function updateNavigation() { + var swiper = this; + + if (swiper.params.loop) { return; } + var ref = swiper.navigation; + var $nextEl = ref.$nextEl; + var $prevEl = ref.$prevEl; + + if ($prevEl && $prevEl.length > 0) { + if (swiper.isBeginning) { + swiper.a11y.disableEl($prevEl); + } else { + swiper.a11y.enableEl($prevEl); + } + } + if ($nextEl && $nextEl.length > 0) { + if (swiper.isEnd) { + swiper.a11y.disableEl($nextEl); + } else { + swiper.a11y.enableEl($nextEl); + } + } + }, + updatePagination: function updatePagination() { + var swiper = this; + var params = swiper.params.a11y; + if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) { + swiper.pagination.bullets.each(function (bulletIndex, bulletEl) { + var $bulletEl = $(bulletEl); + swiper.a11y.makeElFocusable($bulletEl); + swiper.a11y.addElRole($bulletEl, 'button'); + swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/{{index}}/, $bulletEl.index() + 1)); + }); + } + }, + init: function init() { + var swiper = this; + + swiper.$el.append(swiper.a11y.liveRegion); + + // Navigation + var params = swiper.params.a11y; + var $nextEl; + var $prevEl; + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + if ($nextEl) { + swiper.a11y.makeElFocusable($nextEl); + swiper.a11y.addElRole($nextEl, 'button'); + swiper.a11y.addElLabel($nextEl, params.nextSlideMessage); + $nextEl.on('keydown', swiper.a11y.onEnterKey); + } + if ($prevEl) { + swiper.a11y.makeElFocusable($prevEl); + swiper.a11y.addElRole($prevEl, 'button'); + swiper.a11y.addElLabel($prevEl, params.prevSlideMessage); + $prevEl.on('keydown', swiper.a11y.onEnterKey); + } + + // Pagination + if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) { + swiper.pagination.$el.on('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey); + } + }, + destroy: function destroy() { + var swiper = this; + if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) { swiper.a11y.liveRegion.remove(); } + + var $nextEl; + var $prevEl; + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + if ($nextEl) { + $nextEl.off('keydown', swiper.a11y.onEnterKey); + } + if ($prevEl) { + $prevEl.off('keydown', swiper.a11y.onEnterKey); + } + + // Pagination + if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) { + swiper.pagination.$el.off('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey); + } + }, + }; + var A11y = { + name: 'a11y', + params: { + a11y: { + enabled: true, + notificationClass: 'swiper-notification', + prevSlideMessage: 'Previous slide', + nextSlideMessage: 'Next slide', + firstSlideMessage: 'This is the first slide', + lastSlideMessage: 'This is the last slide', + paginationBulletMessage: 'Go to slide {{index}}', + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + a11y: { + liveRegion: $(("")), + }, + }); + Object.keys(a11y).forEach(function (methodName) { + swiper.a11y[methodName] = a11y[methodName].bind(swiper); + }); + }, + on: { + init: function init() { + var swiper = this; + if (!swiper.params.a11y.enabled) { return; } + swiper.a11y.init(); + swiper.a11y.updateNavigation(); + }, + toEdge: function toEdge() { + var swiper = this; + if (!swiper.params.a11y.enabled) { return; } + swiper.a11y.updateNavigation(); + }, + fromEdge: function fromEdge() { + var swiper = this; + if (!swiper.params.a11y.enabled) { return; } + swiper.a11y.updateNavigation(); + }, + paginationUpdate: function paginationUpdate() { + var swiper = this; + if (!swiper.params.a11y.enabled) { return; } + swiper.a11y.updatePagination(); + }, + destroy: function destroy() { + var swiper = this; + if (!swiper.params.a11y.enabled) { return; } + swiper.a11y.destroy(); + }, + }, + }; + + var History = { + init: function init() { + var swiper = this; + if (!swiper.params.history) { return; } + if (!win.history || !win.history.pushState) { + swiper.params.history.enabled = false; + swiper.params.hashNavigation.enabled = true; + return; + } + var history = swiper.history; + history.initialized = true; + history.paths = History.getPathValues(); + if (!history.paths.key && !history.paths.value) { return; } + history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit); + if (!swiper.params.history.replaceState) { + win.addEventListener('popstate', swiper.history.setHistoryPopState); + } + }, + destroy: function destroy() { + var swiper = this; + if (!swiper.params.history.replaceState) { + win.removeEventListener('popstate', swiper.history.setHistoryPopState); + } + }, + setHistoryPopState: function setHistoryPopState() { + var swiper = this; + swiper.history.paths = History.getPathValues(); + swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false); + }, + getPathValues: function getPathValues() { + var pathArray = win.location.pathname.slice(1).split('/').filter(function (part) { return part !== ''; }); + var total = pathArray.length; + var key = pathArray[total - 2]; + var value = pathArray[total - 1]; + return { key: key, value: value }; + }, + setHistory: function setHistory(key, index) { + var swiper = this; + if (!swiper.history.initialized || !swiper.params.history.enabled) { return; } + var slide = swiper.slides.eq(index); + var value = History.slugify(slide.attr('data-history')); + if (!win.location.pathname.includes(key)) { + value = key + "/" + value; + } + var currentState = win.history.state; + if (currentState && currentState.value === value) { + return; + } + if (swiper.params.history.replaceState) { + win.history.replaceState({ value: value }, null, value); + } else { + win.history.pushState({ value: value }, null, value); + } + }, + slugify: function slugify(text) { + return text.toString() + .replace(/\s+/g, '-') + .replace(/[^\w-]+/g, '') + .replace(/--+/g, '-') + .replace(/^-+/, '') + .replace(/-+$/, ''); + }, + scrollToSlide: function scrollToSlide(speed, value, runCallbacks) { + var swiper = this; + if (value) { + for (var i = 0, length = swiper.slides.length; i < length; i += 1) { + var slide = swiper.slides.eq(i); + var slideHistory = History.slugify(slide.attr('data-history')); + if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) { + var index = slide.index(); + swiper.slideTo(index, speed, runCallbacks); + } + } + } else { + swiper.slideTo(0, speed, runCallbacks); + } + }, + }; + + var History$1 = { + name: 'history', + params: { + history: { + enabled: false, + replaceState: false, + key: 'slides', + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + history: { + init: History.init.bind(swiper), + setHistory: History.setHistory.bind(swiper), + setHistoryPopState: History.setHistoryPopState.bind(swiper), + scrollToSlide: History.scrollToSlide.bind(swiper), + destroy: History.destroy.bind(swiper), + }, + }); + }, + on: { + init: function init() { + var swiper = this; + if (swiper.params.history.enabled) { + swiper.history.init(); + } + }, + destroy: function destroy() { + var swiper = this; + if (swiper.params.history.enabled) { + swiper.history.destroy(); + } + }, + transitionEnd: function transitionEnd() { + var swiper = this; + if (swiper.history.initialized) { + swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex); + } + }, + }, + }; + + var HashNavigation = { + onHashCange: function onHashCange() { + var swiper = this; + var newHash = doc.location.hash.replace('#', ''); + var activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash'); + if (newHash !== activeSlideHash) { + var newIndex = swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-hash=\"" + newHash + "\"]")).index(); + if (typeof newIndex === 'undefined') { return; } + swiper.slideTo(newIndex); + } + }, + setHash: function setHash() { + var swiper = this; + if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) { return; } + if (swiper.params.hashNavigation.replaceState && win.history && win.history.replaceState) { + win.history.replaceState(null, null, (("#" + (swiper.slides.eq(swiper.activeIndex).attr('data-hash'))) || '')); + } else { + var slide = swiper.slides.eq(swiper.activeIndex); + var hash = slide.attr('data-hash') || slide.attr('data-history'); + doc.location.hash = hash || ''; + } + }, + init: function init() { + var swiper = this; + if (!swiper.params.hashNavigation.enabled || (swiper.params.history && swiper.params.history.enabled)) { return; } + swiper.hashNavigation.initialized = true; + var hash = doc.location.hash.replace('#', ''); + if (hash) { + var speed = 0; + for (var i = 0, length = swiper.slides.length; i < length; i += 1) { + var slide = swiper.slides.eq(i); + var slideHash = slide.attr('data-hash') || slide.attr('data-history'); + if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) { + var index = slide.index(); + swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true); + } + } + } + if (swiper.params.hashNavigation.watchState) { + $(win).on('hashchange', swiper.hashNavigation.onHashCange); + } + }, + destroy: function destroy() { + var swiper = this; + if (swiper.params.hashNavigation.watchState) { + $(win).off('hashchange', swiper.hashNavigation.onHashCange); + } + }, + }; + var HashNavigation$1 = { + name: 'hash-navigation', + params: { + hashNavigation: { + enabled: false, + replaceState: false, + watchState: false, + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + hashNavigation: { + initialized: false, + init: HashNavigation.init.bind(swiper), + destroy: HashNavigation.destroy.bind(swiper), + setHash: HashNavigation.setHash.bind(swiper), + onHashCange: HashNavigation.onHashCange.bind(swiper), + }, + }); + }, + on: { + init: function init() { + var swiper = this; + if (swiper.params.hashNavigation.enabled) { + swiper.hashNavigation.init(); + } + }, + destroy: function destroy() { + var swiper = this; + if (swiper.params.hashNavigation.enabled) { + swiper.hashNavigation.destroy(); + } + }, + transitionEnd: function transitionEnd() { + var swiper = this; + if (swiper.hashNavigation.initialized) { + swiper.hashNavigation.setHash(); + } + }, + }, + }; + + /* eslint no-underscore-dangle: "off" */ + + var Autoplay = { + run: function run() { + var swiper = this; + var $activeSlideEl = swiper.slides.eq(swiper.activeIndex); + var delay = swiper.params.autoplay.delay; + if ($activeSlideEl.attr('data-swiper-autoplay')) { + delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay; + } + swiper.autoplay.timeout = Utils.nextTick(function () { + if (swiper.params.autoplay.reverseDirection) { + if (swiper.params.loop) { + swiper.loopFix(); + swiper.slidePrev(swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else if (!swiper.isBeginning) { + swiper.slidePrev(swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else { + swiper.autoplay.stop(); + } + } else if (swiper.params.loop) { + swiper.loopFix(); + swiper.slideNext(swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else if (!swiper.isEnd) { + swiper.slideNext(swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + swiper.slideTo(0, swiper.params.speed, true, true); + swiper.emit('autoplay'); + } else { + swiper.autoplay.stop(); + } + }, delay); + }, + start: function start() { + var swiper = this; + if (typeof swiper.autoplay.timeout !== 'undefined') { return false; } + if (swiper.autoplay.running) { return false; } + swiper.autoplay.running = true; + swiper.emit('autoplayStart'); + swiper.autoplay.run(); + return true; + }, + stop: function stop() { + var swiper = this; + if (!swiper.autoplay.running) { return false; } + if (typeof swiper.autoplay.timeout === 'undefined') { return false; } + + if (swiper.autoplay.timeout) { + clearTimeout(swiper.autoplay.timeout); + swiper.autoplay.timeout = undefined; + } + swiper.autoplay.running = false; + swiper.emit('autoplayStop'); + return true; + }, + pause: function pause(speed) { + var swiper = this; + if (!swiper.autoplay.running) { return; } + if (swiper.autoplay.paused) { return; } + if (swiper.autoplay.timeout) { clearTimeout(swiper.autoplay.timeout); } + swiper.autoplay.paused = true; + if (speed === 0 || !swiper.params.autoplay.waitForTransition) { + swiper.autoplay.paused = false; + swiper.autoplay.run(); + } else { + swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd); + swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd); + } + }, + }; + + var Autoplay$1 = { + name: 'autoplay', + params: { + autoplay: { + enabled: false, + delay: 3000, + waitForTransition: true, + disableOnInteraction: true, + stopOnLastSlide: false, + reverseDirection: false, + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + autoplay: { + running: false, + paused: false, + run: Autoplay.run.bind(swiper), + start: Autoplay.start.bind(swiper), + stop: Autoplay.stop.bind(swiper), + pause: Autoplay.pause.bind(swiper), + onTransitionEnd: function onTransitionEnd(e) { + if (!swiper || swiper.destroyed || !swiper.$wrapperEl) { return; } + if (e.target !== this) { return; } + swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd); + swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd); + swiper.autoplay.paused = false; + if (!swiper.autoplay.running) { + swiper.autoplay.stop(); + } else { + swiper.autoplay.run(); + } + }, + }, + }); + }, + on: { + init: function init() { + var swiper = this; + if (swiper.params.autoplay.enabled) { + swiper.autoplay.start(); + } + }, + beforeTransitionStart: function beforeTransitionStart(speed, internal) { + var swiper = this; + if (swiper.autoplay.running) { + if (internal || !swiper.params.autoplay.disableOnInteraction) { + swiper.autoplay.pause(speed); + } else { + swiper.autoplay.stop(); + } + } + }, + sliderFirstMove: function sliderFirstMove() { + var swiper = this; + if (swiper.autoplay.running) { + if (swiper.params.autoplay.disableOnInteraction) { + swiper.autoplay.stop(); + } else { + swiper.autoplay.pause(); + } + } + }, + destroy: function destroy() { + var swiper = this; + if (swiper.autoplay.running) { + swiper.autoplay.stop(); + } + }, + }, + }; + + var Fade = { + setTranslate: function setTranslate() { + var swiper = this; + var slides = swiper.slides; + for (var i = 0; i < slides.length; i += 1) { + var $slideEl = swiper.slides.eq(i); + var offset = $slideEl[0].swiperSlideOffset; + var tx = -offset; + if (!swiper.params.virtualTranslate) { tx -= swiper.translate; } + var ty = 0; + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + } + var slideOpacity = swiper.params.fadeEffect.crossFade + ? Math.max(1 - Math.abs($slideEl[0].progress), 0) + : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0); + $slideEl + .css({ + opacity: slideOpacity, + }) + .transform(("translate3d(" + tx + "px, " + ty + "px, 0px)")); + } + }, + setTransition: function setTransition(duration) { + var swiper = this; + var slides = swiper.slides; + var $wrapperEl = swiper.$wrapperEl; + slides.transition(duration); + if (swiper.params.virtualTranslate && duration !== 0) { + var eventTriggered = false; + slides.transitionEnd(function () { + if (eventTriggered) { return; } + if (!swiper || swiper.destroyed) { return; } + eventTriggered = true; + swiper.animating = false; + var triggerEvents = ['webkitTransitionEnd', 'transitionend']; + for (var i = 0; i < triggerEvents.length; i += 1) { + $wrapperEl.trigger(triggerEvents[i]); + } + }); + } + }, + }; + + var EffectFade = { + name: 'effect-fade', + params: { + fadeEffect: { + crossFade: false, + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + fadeEffect: { + setTranslate: Fade.setTranslate.bind(swiper), + setTransition: Fade.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit: function beforeInit() { + var swiper = this; + if (swiper.params.effect !== 'fade') { return; } + swiper.classNames.push(((swiper.params.containerModifierClass) + "fade")); + var overwriteParams = { + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: true, + }; + Utils.extend(swiper.params, overwriteParams); + Utils.extend(swiper.originalParams, overwriteParams); + }, + setTranslate: function setTranslate() { + var swiper = this; + if (swiper.params.effect !== 'fade') { return; } + swiper.fadeEffect.setTranslate(); + }, + setTransition: function setTransition(duration) { + var swiper = this; + if (swiper.params.effect !== 'fade') { return; } + swiper.fadeEffect.setTransition(duration); + }, + }, + }; + + var Cube = { + setTranslate: function setTranslate() { + var swiper = this; + var $el = swiper.$el; + var $wrapperEl = swiper.$wrapperEl; + var slides = swiper.slides; + var swiperWidth = swiper.width; + var swiperHeight = swiper.height; + var rtl = swiper.rtlTranslate; + var swiperSize = swiper.size; + var params = swiper.params.cubeEffect; + var isHorizontal = swiper.isHorizontal(); + var isVirtual = swiper.virtual && swiper.params.virtual.enabled; + var wrapperRotate = 0; + var $cubeShadowEl; + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow'); + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
            '); + $wrapperEl.append($cubeShadowEl); + } + $cubeShadowEl.css({ height: (swiperWidth + "px") }); + } else { + $cubeShadowEl = $el.find('.swiper-cube-shadow'); + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
            '); + $el.append($cubeShadowEl); + } + } + } + for (var i = 0; i < slides.length; i += 1) { + var $slideEl = slides.eq(i); + var slideIndex = i; + if (isVirtual) { + slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10); + } + var slideAngle = slideIndex * 90; + var round = Math.floor(slideAngle / 360); + if (rtl) { + slideAngle = -slideAngle; + round = Math.floor(-slideAngle / 360); + } + var progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + var tx = 0; + var ty = 0; + var tz = 0; + if (slideIndex % 4 === 0) { + tx = -round * 4 * swiperSize; + tz = 0; + } else if ((slideIndex - 1) % 4 === 0) { + tx = 0; + tz = -round * 4 * swiperSize; + } else if ((slideIndex - 2) % 4 === 0) { + tx = swiperSize + (round * 4 * swiperSize); + tz = swiperSize; + } else if ((slideIndex - 3) % 4 === 0) { + tx = -swiperSize; + tz = (3 * swiperSize) + (swiperSize * 4 * round); + } + if (rtl) { + tx = -tx; + } + + if (!isHorizontal) { + ty = tx; + tx = 0; + } + + var transform = "rotateX(" + (isHorizontal ? 0 : -slideAngle) + "deg) rotateY(" + (isHorizontal ? slideAngle : 0) + "deg) translate3d(" + tx + "px, " + ty + "px, " + tz + "px)"; + if (progress <= 1 && progress > -1) { + wrapperRotate = (slideIndex * 90) + (progress * 90); + if (rtl) { wrapperRotate = (-slideIndex * 90) - (progress * 90); } + } + $slideEl.transform(transform); + if (params.slideShadows) { + // Set shadows + var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + if (shadowBefore.length === 0) { + shadowBefore = $(("
            ")); + $slideEl.append(shadowBefore); + } + if (shadowAfter.length === 0) { + shadowAfter = $(("
            ")); + $slideEl.append(shadowAfter); + } + if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); } + if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); } + } + } + $wrapperEl.css({ + '-webkit-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"), + '-moz-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"), + '-ms-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"), + 'transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"), + }); + + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl.transform(("translate3d(0px, " + ((swiperWidth / 2) + params.shadowOffset) + "px, " + (-swiperWidth / 2) + "px) rotateX(90deg) rotateZ(0deg) scale(" + (params.shadowScale) + ")")); + } else { + var shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90); + var multiplier = 1.5 - ( + (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2) + + (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2) + ); + var scale1 = params.shadowScale; + var scale2 = params.shadowScale / multiplier; + var offset = params.shadowOffset; + $cubeShadowEl.transform(("scale3d(" + scale1 + ", 1, " + scale2 + ") translate3d(0px, " + ((swiperHeight / 2) + offset) + "px, " + (-swiperHeight / 2 / scale2) + "px) rotateX(-90deg)")); + } + } + var zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0; + $wrapperEl + .transform(("translate3d(0px,0," + zFactor + "px) rotateX(" + (swiper.isHorizontal() ? 0 : wrapperRotate) + "deg) rotateY(" + (swiper.isHorizontal() ? -wrapperRotate : 0) + "deg)")); + }, + setTransition: function setTransition(duration) { + var swiper = this; + var $el = swiper.$el; + var slides = swiper.slides; + slides + .transition(duration) + .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left') + .transition(duration); + if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) { + $el.find('.swiper-cube-shadow').transition(duration); + } + }, + }; + + var EffectCube = { + name: 'effect-cube', + params: { + cubeEffect: { + slideShadows: true, + shadow: true, + shadowOffset: 20, + shadowScale: 0.94, + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + cubeEffect: { + setTranslate: Cube.setTranslate.bind(swiper), + setTransition: Cube.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit: function beforeInit() { + var swiper = this; + if (swiper.params.effect !== 'cube') { return; } + swiper.classNames.push(((swiper.params.containerModifierClass) + "cube")); + swiper.classNames.push(((swiper.params.containerModifierClass) + "3d")); + var overwriteParams = { + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + resistanceRatio: 0, + spaceBetween: 0, + centeredSlides: false, + virtualTranslate: true, + }; + Utils.extend(swiper.params, overwriteParams); + Utils.extend(swiper.originalParams, overwriteParams); + }, + setTranslate: function setTranslate() { + var swiper = this; + if (swiper.params.effect !== 'cube') { return; } + swiper.cubeEffect.setTranslate(); + }, + setTransition: function setTransition(duration) { + var swiper = this; + if (swiper.params.effect !== 'cube') { return; } + swiper.cubeEffect.setTransition(duration); + }, + }, + }; + + var Flip = { + setTranslate: function setTranslate() { + var swiper = this; + var slides = swiper.slides; + var rtl = swiper.rtlTranslate; + for (var i = 0; i < slides.length; i += 1) { + var $slideEl = slides.eq(i); + var progress = $slideEl[0].progress; + if (swiper.params.flipEffect.limitRotation) { + progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + } + var offset = $slideEl[0].swiperSlideOffset; + var rotate = -180 * progress; + var rotateY = rotate; + var rotateX = 0; + var tx = -offset; + var ty = 0; + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + rotateX = -rotateY; + rotateY = 0; + } else if (rtl) { + rotateY = -rotateY; + } + + $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length; + + if (swiper.params.flipEffect.slideShadows) { + // Set shadows + var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + if (shadowBefore.length === 0) { + shadowBefore = $(("
            ")); + $slideEl.append(shadowBefore); + } + if (shadowAfter.length === 0) { + shadowAfter = $(("
            ")); + $slideEl.append(shadowAfter); + } + if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); } + if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); } + } + $slideEl + .transform(("translate3d(" + tx + "px, " + ty + "px, 0px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)")); + } + }, + setTransition: function setTransition(duration) { + var swiper = this; + var slides = swiper.slides; + var activeIndex = swiper.activeIndex; + var $wrapperEl = swiper.$wrapperEl; + slides + .transition(duration) + .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left') + .transition(duration); + if (swiper.params.virtualTranslate && duration !== 0) { + var eventTriggered = false; + // eslint-disable-next-line + slides.eq(activeIndex).transitionEnd(function onTransitionEnd() { + if (eventTriggered) { return; } + if (!swiper || swiper.destroyed) { return; } + // if (!$(this).hasClass(swiper.params.slideActiveClass)) return; + eventTriggered = true; + swiper.animating = false; + var triggerEvents = ['webkitTransitionEnd', 'transitionend']; + for (var i = 0; i < triggerEvents.length; i += 1) { + $wrapperEl.trigger(triggerEvents[i]); + } + }); + } + }, + }; + + var EffectFlip = { + name: 'effect-flip', + params: { + flipEffect: { + slideShadows: true, + limitRotation: true, + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + flipEffect: { + setTranslate: Flip.setTranslate.bind(swiper), + setTransition: Flip.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit: function beforeInit() { + var swiper = this; + if (swiper.params.effect !== 'flip') { return; } + swiper.classNames.push(((swiper.params.containerModifierClass) + "flip")); + swiper.classNames.push(((swiper.params.containerModifierClass) + "3d")); + var overwriteParams = { + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: true, + }; + Utils.extend(swiper.params, overwriteParams); + Utils.extend(swiper.originalParams, overwriteParams); + }, + setTranslate: function setTranslate() { + var swiper = this; + if (swiper.params.effect !== 'flip') { return; } + swiper.flipEffect.setTranslate(); + }, + setTransition: function setTransition(duration) { + var swiper = this; + if (swiper.params.effect !== 'flip') { return; } + swiper.flipEffect.setTransition(duration); + }, + }, + }; + + var Coverflow = { + setTranslate: function setTranslate() { + var swiper = this; + var swiperWidth = swiper.width; + var swiperHeight = swiper.height; + var slides = swiper.slides; + var $wrapperEl = swiper.$wrapperEl; + var slidesSizesGrid = swiper.slidesSizesGrid; + var params = swiper.params.coverflowEffect; + var isHorizontal = swiper.isHorizontal(); + var transform = swiper.translate; + var center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2); + var rotate = isHorizontal ? params.rotate : -params.rotate; + var translate = params.depth; + // Each slide offset from center + for (var i = 0, length = slides.length; i < length; i += 1) { + var $slideEl = slides.eq(i); + var slideSize = slidesSizesGrid[i]; + var slideOffset = $slideEl[0].swiperSlideOffset; + var offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier; + + var rotateY = isHorizontal ? rotate * offsetMultiplier : 0; + var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier; + // var rotateZ = 0 + var translateZ = -translate * Math.abs(offsetMultiplier); + + var translateY = isHorizontal ? 0 : params.stretch * (offsetMultiplier); + var translateX = isHorizontal ? params.stretch * (offsetMultiplier) : 0; + + // Fix for ultra small values + if (Math.abs(translateX) < 0.001) { translateX = 0; } + if (Math.abs(translateY) < 0.001) { translateY = 0; } + if (Math.abs(translateZ) < 0.001) { translateZ = 0; } + if (Math.abs(rotateY) < 0.001) { rotateY = 0; } + if (Math.abs(rotateX) < 0.001) { rotateX = 0; } + + var slideTransform = "translate3d(" + translateX + "px," + translateY + "px," + translateZ + "px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)"; + + $slideEl.transform(slideTransform); + $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1; + if (params.slideShadows) { + // Set shadows + var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top'); + var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom'); + if ($shadowBeforeEl.length === 0) { + $shadowBeforeEl = $(("
            ")); + $slideEl.append($shadowBeforeEl); + } + if ($shadowAfterEl.length === 0) { + $shadowAfterEl = $(("
            ")); + $slideEl.append($shadowAfterEl); + } + if ($shadowBeforeEl.length) { $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; } + if ($shadowAfterEl.length) { $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; } + } + } + + // Set correct perspective for IE10 + if (Support.pointerEvents || Support.prefixedPointerEvents) { + var ws = $wrapperEl[0].style; + ws.perspectiveOrigin = center + "px 50%"; + } + }, + setTransition: function setTransition(duration) { + var swiper = this; + swiper.slides + .transition(duration) + .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left') + .transition(duration); + }, + }; + + var EffectCoverflow = { + name: 'effect-coverflow', + params: { + coverflowEffect: { + rotate: 50, + stretch: 0, + depth: 100, + modifier: 1, + slideShadows: true, + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + coverflowEffect: { + setTranslate: Coverflow.setTranslate.bind(swiper), + setTransition: Coverflow.setTransition.bind(swiper), + }, + }); + }, + on: { + beforeInit: function beforeInit() { + var swiper = this; + if (swiper.params.effect !== 'coverflow') { return; } + + swiper.classNames.push(((swiper.params.containerModifierClass) + "coverflow")); + swiper.classNames.push(((swiper.params.containerModifierClass) + "3d")); + + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + }, + setTranslate: function setTranslate() { + var swiper = this; + if (swiper.params.effect !== 'coverflow') { return; } + swiper.coverflowEffect.setTranslate(); + }, + setTransition: function setTransition(duration) { + var swiper = this; + if (swiper.params.effect !== 'coverflow') { return; } + swiper.coverflowEffect.setTransition(duration); + }, + }, + }; + + var Thumbs = { + init: function init() { + var swiper = this; + var ref = swiper.params; + var thumbsParams = ref.thumbs; + var SwiperClass = swiper.constructor; + if (thumbsParams.swiper instanceof SwiperClass) { + swiper.thumbs.swiper = thumbsParams.swiper; + Utils.extend(swiper.thumbs.swiper.originalParams, { + watchSlidesProgress: true, + slideToClickedSlide: false, + }); + Utils.extend(swiper.thumbs.swiper.params, { + watchSlidesProgress: true, + slideToClickedSlide: false, + }); + } else if (Utils.isObject(thumbsParams.swiper)) { + swiper.thumbs.swiper = new SwiperClass(Utils.extend({}, thumbsParams.swiper, { + watchSlidesVisibility: true, + watchSlidesProgress: true, + slideToClickedSlide: false, + })); + swiper.thumbs.swiperCreated = true; + } + swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass); + swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick); + }, + onThumbClick: function onThumbClick() { + var swiper = this; + var thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) { return; } + var clickedIndex = thumbsSwiper.clickedIndex; + var clickedSlide = thumbsSwiper.clickedSlide; + if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) { return; } + if (typeof clickedIndex === 'undefined' || clickedIndex === null) { return; } + var slideToIndex; + if (thumbsSwiper.params.loop) { + slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10); + } else { + slideToIndex = clickedIndex; + } + if (swiper.params.loop) { + var currentIndex = swiper.activeIndex; + if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) { + swiper.loopFix(); + // eslint-disable-next-line + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + currentIndex = swiper.activeIndex; + } + var prevIndex = swiper.slides.eq(currentIndex).prevAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index(); + var nextIndex = swiper.slides.eq(currentIndex).nextAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index(); + if (typeof prevIndex === 'undefined') { slideToIndex = nextIndex; } + else if (typeof nextIndex === 'undefined') { slideToIndex = prevIndex; } + else if (nextIndex - currentIndex < currentIndex - prevIndex) { slideToIndex = nextIndex; } + else { slideToIndex = prevIndex; } + } + swiper.slideTo(slideToIndex); + }, + update: function update(initial) { + var swiper = this; + var thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) { return; } + + var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' + ? thumbsSwiper.slidesPerViewDynamic() + : thumbsSwiper.params.slidesPerView; + + if (swiper.realIndex !== thumbsSwiper.realIndex) { + var currentThumbsIndex = thumbsSwiper.activeIndex; + var newThumbsIndex; + if (thumbsSwiper.params.loop) { + if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) { + thumbsSwiper.loopFix(); + // eslint-disable-next-line + thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft; + currentThumbsIndex = thumbsSwiper.activeIndex; + } + // Find actual thumbs index to slide to + var prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0).index(); + var nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0).index(); + if (typeof prevThumbsIndex === 'undefined') { newThumbsIndex = nextThumbsIndex; } + else if (typeof nextThumbsIndex === 'undefined') { newThumbsIndex = prevThumbsIndex; } + else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = currentThumbsIndex; } + else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = nextThumbsIndex; } + else { newThumbsIndex = prevThumbsIndex; } + } else { + newThumbsIndex = swiper.realIndex; + } + if (thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) { + if (thumbsSwiper.params.centeredSlides) { + if (newThumbsIndex > currentThumbsIndex) { + newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1; + } else { + newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1; + } + } else if (newThumbsIndex > currentThumbsIndex) { + newThumbsIndex = newThumbsIndex - slidesPerView + 1; + } + thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined); + } + } + + // Activate thumbs + var thumbsToActivate = 1; + var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass; + + if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) { + thumbsToActivate = swiper.params.slidesPerView; + } + + thumbsSwiper.slides.removeClass(thumbActiveClass); + if (thumbsSwiper.params.loop) { + for (var i = 0; i < thumbsToActivate; i += 1) { + thumbsSwiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + (swiper.realIndex + i) + "\"]")).addClass(thumbActiveClass); + } + } else { + for (var i$1 = 0; i$1 < thumbsToActivate; i$1 += 1) { + thumbsSwiper.slides.eq(swiper.realIndex + i$1).addClass(thumbActiveClass); + } + } + }, + }; + var Thumbs$1 = { + name: 'thumbs', + params: { + thumbs: { + swiper: null, + slideThumbActiveClass: 'swiper-slide-thumb-active', + thumbsContainerClass: 'swiper-container-thumbs', + }, + }, + create: function create() { + var swiper = this; + Utils.extend(swiper, { + thumbs: { + swiper: null, + init: Thumbs.init.bind(swiper), + update: Thumbs.update.bind(swiper), + onThumbClick: Thumbs.onThumbClick.bind(swiper), + }, + }); + }, + on: { + beforeInit: function beforeInit() { + var swiper = this; + var ref = swiper.params; + var thumbs = ref.thumbs; + if (!thumbs || !thumbs.swiper) { return; } + swiper.thumbs.init(); + swiper.thumbs.update(true); + }, + slideChange: function slideChange() { + var swiper = this; + if (!swiper.thumbs.swiper) { return; } + swiper.thumbs.update(); + }, + update: function update() { + var swiper = this; + if (!swiper.thumbs.swiper) { return; } + swiper.thumbs.update(); + }, + resize: function resize() { + var swiper = this; + if (!swiper.thumbs.swiper) { return; } + swiper.thumbs.update(); + }, + observerUpdate: function observerUpdate() { + var swiper = this; + if (!swiper.thumbs.swiper) { return; } + swiper.thumbs.update(); + }, + setTransition: function setTransition(duration) { + var swiper = this; + var thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) { return; } + thumbsSwiper.setTransition(duration); + }, + beforeDestroy: function beforeDestroy() { + var swiper = this; + var thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) { return; } + if (swiper.thumbs.swiperCreated && thumbsSwiper) { + thumbsSwiper.destroy(); + } + }, + }, + }; + + // Swiper Class + + var components = [ + Device$1, + Support$1, + Browser$1, + Resize, + Observer$1, + Virtual$1, + Keyboard$1, + Mousewheel$1, + Navigation$1, + Pagination$1, + Scrollbar$1, + Parallax$1, + Zoom$1, + Lazy$1, + Controller$1, + A11y, + History$1, + HashNavigation$1, + Autoplay$1, + EffectFade, + EffectCube, + EffectFlip, + EffectCoverflow, + Thumbs$1 + ]; + + if (typeof Swiper.use === 'undefined') { + Swiper.use = Swiper.Class.use; + Swiper.installModule = Swiper.Class.installModule; + } + + Swiper.use(components); + + return Swiper; + +})); diff --git a/assets/3rd/swiper/js/swiper.min.js b/assets/3rd/swiper/js/swiper.min.js new file mode 100755 index 00000000..e2b7d5e1 --- /dev/null +++ b/assets/3rd/swiper/js/swiper.min.js @@ -0,0 +1,13 @@ +/** + * Swiper 4.5.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * http://www.idangero.us/swiper/ + * + * Copyright 2014-2019 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: February 22, 2019 + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Swiper=t()}(this,function(){"use strict";var f="undefined"==typeof document?{body:{},addEventListener:function(){},removeEventListener:function(){},activeElement:{blur:function(){},nodeName:""},querySelector:function(){return null},querySelectorAll:function(){return[]},getElementById:function(){return null},createEvent:function(){return{initEvent:function(){}}},createElement:function(){return{children:[],childNodes:[],style:{},setAttribute:function(){},getElementsByTagName:function(){return[]}}},location:{hash:""}}:document,J="undefined"==typeof window?{document:f,navigator:{userAgent:""},location:{},history:{},CustomEvent:function(){return this},addEventListener:function(){},removeEventListener:function(){},getComputedStyle:function(){return{getPropertyValue:function(){return""}}},Image:function(){},Date:function(){},screen:{},setTimeout:function(){},clearTimeout:function(){}}:window,l=function(e){for(var t=0;t")){var o="div";for(0===n.indexOf(":~]/)?(t||f).querySelectorAll(e.trim()):[f.getElementById(e.trim().split("#")[1])],i=0;ia.slides.length)break;i.push(a.slides.eq(r)[0])}else i.push(a.slides.eq(a.activeIndex)[0]);for(t=0;t=t.size)&&(t.visibleSlides.push(o),t.visibleSlidesIndexes.push(n),i.eq(n).addClass(a.slideVisibleClass))}o.progress=s?-l:l}t.visibleSlides=L(t.visibleSlides)}},updateProgress:function(e){void 0===e&&(e=this&&this.translate||0);var t=this,a=t.params,i=t.maxTranslate()-t.minTranslate(),s=t.progress,r=t.isBeginning,n=t.isEnd,o=r,l=n;0===i?n=r=!(s=0):(r=(s=(e-t.minTranslate())/i)<=0,n=1<=s),ee.extend(t,{progress:s,isBeginning:r,isEnd:n}),(a.watchSlidesProgress||a.watchSlidesVisibility)&&t.updateSlidesProgress(e),r&&!o&&t.emit("reachBeginning toEdge"),n&&!l&&t.emit("reachEnd toEdge"),(o&&!r||l&&!n)&&t.emit("fromEdge"),t.emit("progress",s)},updateSlidesClasses:function(){var e,t=this,a=t.slides,i=t.params,s=t.$wrapperEl,r=t.activeIndex,n=t.realIndex,o=t.virtual&&i.virtual.enabled;a.removeClass(i.slideActiveClass+" "+i.slideNextClass+" "+i.slidePrevClass+" "+i.slideDuplicateActiveClass+" "+i.slideDuplicateNextClass+" "+i.slideDuplicatePrevClass),(e=o?t.$wrapperEl.find("."+i.slideClass+'[data-swiper-slide-index="'+r+'"]'):a.eq(r)).addClass(i.slideActiveClass),i.loop&&(e.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+n+'"]').addClass(i.slideDuplicateActiveClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+n+'"]').addClass(i.slideDuplicateActiveClass));var l=e.nextAll("."+i.slideClass).eq(0).addClass(i.slideNextClass);i.loop&&0===l.length&&(l=a.eq(0)).addClass(i.slideNextClass);var d=e.prevAll("."+i.slideClass).eq(0).addClass(i.slidePrevClass);i.loop&&0===d.length&&(d=a.eq(-1)).addClass(i.slidePrevClass),i.loop&&(l.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+l.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicateNextClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+l.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicateNextClass),d.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+d.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicatePrevClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+d.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicatePrevClass))},updateActiveIndex:function(e){var t,a=this,i=a.rtlTranslate?a.translate:-a.translate,s=a.slidesGrid,r=a.snapGrid,n=a.params,o=a.activeIndex,l=a.realIndex,d=a.snapIndex,p=e;if(void 0===p){for(var c=0;c=s[c]&&i=s[c]&&i=s[c]&&(p=c);n.normalizeSlideIndex&&(p<0||void 0===p)&&(p=0)}if((t=0<=r.indexOf(i)?r.indexOf(i):Math.floor(p/n.slidesPerGroup))>=r.length&&(t=r.length-1),p!==o){var u=parseInt(a.slides.eq(p).attr("data-swiper-slide-index")||p,10);ee.extend(a,{snapIndex:t,realIndex:u,previousIndex:o,activeIndex:p}),a.emit("activeIndexChange"),a.emit("snapIndexChange"),l!==u&&a.emit("realIndexChange"),a.emit("slideChange")}else t!==d&&(a.snapIndex=t,a.emit("snapIndexChange"))},updateClickedSlide:function(e){var t=this,a=t.params,i=L(e.target).closest("."+a.slideClass)[0],s=!1;if(i)for(var r=0;r=o.length&&(u=o.length-1),(p||n.initialSlide||0)===(d||0)&&a&&s.emit("beforeSlideChangeStart");var h,v=-o[u];if(s.updateProgress(v),n.normalizeSlideIndex)for(var f=0;f=Math.floor(100*l[f])&&(r=f);if(s.initialized&&r!==p){if(!s.allowSlideNext&&vs.translate&&v>s.maxTranslate()&&(p||0)!==r)return!1}return h=pt.slides.length-t.loopedSlides+s/2?(t.loopFix(),r=i.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]:not(.'+a.slideDuplicateClass+")").eq(0).index(),ee.nextTick(function(){t.slideTo(r)})):t.slideTo(r):r>t.slides.length-s?(t.loopFix(),r=i.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]:not(.'+a.slideDuplicateClass+")").eq(0).index(),ee.nextTick(function(){t.slideTo(r)})):t.slideTo(r)}else t.slideTo(r)}};var h={loopCreate:function(){var i=this,e=i.params,t=i.$wrapperEl;t.children("."+e.slideClass+"."+e.slideDuplicateClass).remove();var s=t.children("."+e.slideClass);if(e.loopFillGroupWithBlank){var a=e.slidesPerGroup-s.length%e.slidesPerGroup;if(a!==e.slidesPerGroup){for(var r=0;rs.length&&(i.loopedSlides=s.length);var o=[],l=[];s.each(function(e,t){var a=L(t);e=s.length-i.loopedSlides&&o.push(t),a.attr("data-swiper-slide-index",e)});for(var d=0;d=s.length-r)&&(e=-s.length+i+r,e+=r,t.slideTo(e,0,!1,!0)&&0!==p&&t.setTranslate((d?-t.translate:t.translate)-p));t.allowSlidePrev=n,t.allowSlideNext=o},loopDestroy:function(){var e=this.$wrapperEl,t=this.params,a=this.slides;e.children("."+t.slideClass+"."+t.slideDuplicateClass+",."+t.slideClass+"."+t.slideBlankClass).remove(),a.removeAttr("data-swiper-slide-index")}};var v={setGrabCursor:function(e){if(!(te.touch||!this.params.simulateTouch||this.params.watchOverflow&&this.isLocked)){var t=this.el;t.style.cursor="move",t.style.cursor=e?"-webkit-grabbing":"-webkit-grab",t.style.cursor=e?"-moz-grabbin":"-moz-grab",t.style.cursor=e?"grabbing":"grab"}},unsetGrabCursor:function(){te.touch||this.params.watchOverflow&&this.isLocked||(this.el.style.cursor="")}};var m={appendSlide:function(e){var t=this,a=t.$wrapperEl,i=t.params;if(i.loop&&t.loopDestroy(),"object"==typeof e&&"length"in e)for(var s=0;s=J.screen.width-d)){if(ee.extend(a,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),s.startX=n,s.startY=o,a.touchStartTime=ee.now(),t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,0s.startY&&t.translate>=t.minTranslate())return a.isTouched=!1,void(a.isMoved=!1)}else if(os.startX&&t.translate>=t.minTranslate())return;if(a.isTouchEvent&&f.activeElement&&n.target===f.activeElement&&L(n.target).is(a.formElements))return a.isMoved=!0,void(t.allowClick=!1);if(a.allowTouchCallbacks&&t.emit("touchMove",n),!(n.targetTouches&&1i.touchAngle:90-d>i.touchAngle)),a.isScrolling&&t.emit("touchMoveOpposite",n),void 0===a.startMoving&&(s.currentX===s.startX&&s.currentY===s.startY||(a.startMoving=!0)),a.isScrolling)a.isTouched=!1;else if(a.startMoving){t.allowClick=!1,n.preventDefault(),i.touchMoveStopPropagation&&!i.nested&&n.stopPropagation(),a.isMoved||(i.loop&&t.loopFix(),a.startTranslate=t.getTranslate(),t.setTransition(0),t.animating&&t.$wrapperEl.trigger("webkitTransitionEnd transitionend"),a.allowMomentumBounce=!1,!i.grabCursor||!0!==t.allowSlideNext&&!0!==t.allowSlidePrev||t.setGrabCursor(!0),t.emit("sliderFirstMove",n)),t.emit("sliderMove",n),a.isMoved=!0;var u=t.isHorizontal()?p:c;s.diff=u,u*=i.touchRatio,r&&(u=-u),t.swipeDirection=0t.minTranslate()?(h=!1,i.resistance&&(a.currentTranslate=t.minTranslate()-1+Math.pow(-t.minTranslate()+a.startTranslate+u,v))):u<0&&a.currentTranslatea.startTranslate&&(a.currentTranslate=a.startTranslate),0i.threshold||a.allowThresholdMove))return void(a.currentTranslate=a.startTranslate);if(!a.allowThresholdMove)return a.allowThresholdMove=!0,s.startX=s.currentX,s.startY=s.currentY,a.currentTranslate=a.startTranslate,void(s.diff=t.isHorizontal()?s.currentX-s.startX:s.currentY-s.startY)}i.followFinger&&((i.freeMode||i.watchSlidesProgress||i.watchSlidesVisibility)&&(t.updateActiveIndex(),t.updateSlidesClasses()),i.freeMode&&(0===a.velocities.length&&a.velocities.push({position:s[t.isHorizontal()?"startX":"startY"],time:a.touchStartTime}),a.velocities.push({position:s[t.isHorizontal()?"currentX":"currentY"],time:ee.now()})),t.updateProgress(a.currentTranslate),t.setTranslate(a.currentTranslate))}}}}else a.startMoving&&a.isScrolling&&t.emit("touchMoveOpposite",n)}.bind(e),e.onTouchEnd=function(e){var t=this,a=t.touchEventsData,i=t.params,s=t.touches,r=t.rtlTranslate,n=t.$wrapperEl,o=t.slidesGrid,l=t.snapGrid,d=e;if(d.originalEvent&&(d=d.originalEvent),a.allowTouchCallbacks&&t.emit("touchEnd",d),a.allowTouchCallbacks=!1,!a.isTouched)return a.isMoved&&i.grabCursor&&t.setGrabCursor(!1),a.isMoved=!1,void(a.startMoving=!1);i.grabCursor&&a.isMoved&&a.isTouched&&(!0===t.allowSlideNext||!0===t.allowSlidePrev)&&t.setGrabCursor(!1);var p,c=ee.now(),u=c-a.touchStartTime;if(t.allowClick&&(t.updateClickedSlide(d),t.emit("tap",d),u<300&&300-t.maxTranslate())return void(t.slides.lengtht.minTranslate())i.freeModeMomentumBounce?(w-t.minTranslate()>E&&(w=t.minTranslate()+E),y=t.minTranslate(),T=!0,a.allowMomentumBounce=!0):w=t.minTranslate(),i.loop&&i.centeredSlides&&(x=!0);else if(i.freeModeSticky){for(var S,C=0;C-w){S=C;break}w=-(w=Math.abs(l[S]-w)=i.longSwipesMs)&&(t.updateProgress(),t.updateActiveIndex(),t.updateSlidesClasses())}else{for(var M=0,z=t.slidesSizesGrid[0],P=0;P=o[P]&&p=o[P]&&(M=P,z=o[o.length-1]-o[o.length-2]);var k=(p-o[M])/z;if(u>i.longSwipesMs){if(!i.longSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&(k>=i.longSwipesRatio?t.slideTo(M+i.slidesPerGroup):t.slideTo(M)),"prev"===t.swipeDirection&&(k>1-i.longSwipesRatio?t.slideTo(M+i.slidesPerGroup):t.slideTo(M))}else{if(!i.shortSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&t.slideTo(M+i.slidesPerGroup),"prev"===t.swipeDirection&&t.slideTo(M)}}}.bind(e),e.onClick=function(e){this.allowClick||(this.params.preventClicks&&e.preventDefault(),this.params.preventClicksPropagation&&this.animating&&(e.stopPropagation(),e.stopImmediatePropagation()))}.bind(e);var r="container"===t.touchEventsTarget?i:s,n=!!t.nested;if(te.touch||!te.pointerEvents&&!te.prefixedPointerEvents){if(te.touch){var o=!("touchstart"!==a.start||!te.passiveListener||!t.passiveListeners)&&{passive:!0,capture:!1};r.addEventListener(a.start,e.onTouchStart,o),r.addEventListener(a.move,e.onTouchMove,te.passiveListener?{passive:!1,capture:n}:n),r.addEventListener(a.end,e.onTouchEnd,o)}(t.simulateTouch&&!g.ios&&!g.android||t.simulateTouch&&!te.touch&&g.ios)&&(r.addEventListener("mousedown",e.onTouchStart,!1),f.addEventListener("mousemove",e.onTouchMove,n),f.addEventListener("mouseup",e.onTouchEnd,!1))}else r.addEventListener(a.start,e.onTouchStart,!1),f.addEventListener(a.move,e.onTouchMove,n),f.addEventListener(a.end,e.onTouchEnd,!1);(t.preventClicks||t.preventClicksPropagation)&&r.addEventListener("click",e.onClick,!0),e.on(g.ios||g.android?"resize orientationchange observerUpdate":"resize observerUpdate",b,!0)},detachEvents:function(){var e=this,t=e.params,a=e.touchEvents,i=e.el,s=e.wrapperEl,r="container"===t.touchEventsTarget?i:s,n=!!t.nested;if(te.touch||!te.pointerEvents&&!te.prefixedPointerEvents){if(te.touch){var o=!("onTouchStart"!==a.start||!te.passiveListener||!t.passiveListeners)&&{passive:!0,capture:!1};r.removeEventListener(a.start,e.onTouchStart,o),r.removeEventListener(a.move,e.onTouchMove,n),r.removeEventListener(a.end,e.onTouchEnd,o)}(t.simulateTouch&&!g.ios&&!g.android||t.simulateTouch&&!te.touch&&g.ios)&&(r.removeEventListener("mousedown",e.onTouchStart,!1),f.removeEventListener("mousemove",e.onTouchMove,n),f.removeEventListener("mouseup",e.onTouchEnd,!1))}else r.removeEventListener(a.start,e.onTouchStart,!1),f.removeEventListener(a.move,e.onTouchMove,n),f.removeEventListener(a.end,e.onTouchEnd,!1);(t.preventClicks||t.preventClicksPropagation)&&r.removeEventListener("click",e.onClick,!0),e.off(g.ios||g.android?"resize orientationchange observerUpdate":"resize observerUpdate",b)}},breakpoints:{setBreakpoint:function(){var e=this,t=e.activeIndex,a=e.initialized,i=e.loopedSlides;void 0===i&&(i=0);var s=e.params,r=s.breakpoints;if(r&&(!r||0!==Object.keys(r).length)){var n=e.getBreakpoint(r);if(n&&e.currentBreakpoint!==n){var o=n in r?r[n]:void 0;o&&["slidesPerView","spaceBetween","slidesPerGroup"].forEach(function(e){var t=o[e];void 0!==t&&(o[e]="slidesPerView"!==e||"AUTO"!==t&&"auto"!==t?"slidesPerView"===e?parseFloat(t):parseInt(t,10):"auto")});var l=o||e.originalParams,d=l.direction&&l.direction!==s.direction,p=s.loop&&(l.slidesPerView!==s.slidesPerView||d);d&&a&&e.changeDirection(),ee.extend(e.params,l),ee.extend(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),e.currentBreakpoint=n,p&&a&&(e.loopDestroy(),e.loopCreate(),e.updateSlides(),e.slideTo(t-i+e.loopedSlides,0,!1)),e.emit("breakpoint",l)}}},getBreakpoint:function(e){if(e){var t=!1,a=[];Object.keys(e).forEach(function(e){a.push(e)}),a.sort(function(e,t){return parseInt(e,10)-parseInt(t,10)});for(var i=0;i=J.innerWidth&&!t&&(t=s)}return t||"max"}}},checkOverflow:{checkOverflow:function(){var e=this,t=e.isLocked;e.isLocked=1===e.snapGrid.length,e.allowSlideNext=!e.isLocked,e.allowSlidePrev=!e.isLocked,t!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock"),t&&t!==e.isLocked&&(e.isEnd=!1,e.navigation.update())}},classes:{addClasses:function(){var t=this.classNames,a=this.params,e=this.rtl,i=this.$el,s=[];s.push("initialized"),s.push(a.direction),a.freeMode&&s.push("free-mode"),te.flexbox||s.push("no-flexbox"),a.autoHeight&&s.push("autoheight"),e&&s.push("rtl"),1'+e+"
            ");return s.attr("data-swiper-slide-index")||s.attr("data-swiper-slide-index",t),i.cache&&(a.virtual.cache[t]=s),s},appendSlide:function(e){if("object"==typeof e&&"length"in e)for(var t=0;tMath.abs(n.pixelY)))return!0;s=n.pixelX*r}else{if(!(Math.abs(n.pixelY)>Math.abs(n.pixelX)))return!0;s=n.pixelY}else s=Math.abs(n.pixelX)>Math.abs(n.pixelY)?-n.pixelX*r:-n.pixelY;if(0===s)return!0;if(i.invert&&(s=-s),a.params.freeMode){a.params.loop&&a.loopFix();var o=a.getTranslate()+s*i.sensitivity,l=a.isBeginning,d=a.isEnd;if(o>=a.minTranslate()&&(o=a.minTranslate()),o<=a.maxTranslate()&&(o=a.maxTranslate()),a.setTransition(0),a.setTranslate(o),a.updateProgress(),a.updateActiveIndex(),a.updateSlidesClasses(),(!l&&a.isBeginning||!d&&a.isEnd)&&a.updateSlidesClasses(),a.params.freeModeSticky&&(clearTimeout(a.mousewheel.timeout),a.mousewheel.timeout=ee.nextTick(function(){a.slideToClosest()},300)),a.emit("scroll",t),a.params.autoplay&&a.params.autoplayDisableOnInteraction&&a.autoplay.stop(),o===a.minTranslate()||o===a.maxTranslate())return!0}else{if(60a-1-2*e.loopedSlides&&(r-=a-2*e.loopedSlides),n-1s.dynamicMainBullets-1?e.pagination.dynamicBulletIndex=s.dynamicMainBullets-1:e.pagination.dynamicBulletIndex<0&&(e.pagination.dynamicBulletIndex=0)),o=r-e.pagination.dynamicBulletIndex,d=((l=o+(Math.min(p.length,s.dynamicMainBullets)-1))+o)/2),p.removeClass(s.bulletActiveClass+" "+s.bulletActiveClass+"-next "+s.bulletActiveClass+"-next-next "+s.bulletActiveClass+"-prev "+s.bulletActiveClass+"-prev-prev "+s.bulletActiveClass+"-main"),1";i.html(s),e.pagination.bullets=i.find("."+t.bulletClass)}"fraction"===t.type&&(s=t.renderFraction?t.renderFraction.call(e,t.currentClass,t.totalClass):' / ',i.html(s)),"progressbar"===t.type&&(s=t.renderProgressbar?t.renderProgressbar.call(e,t.progressbarFillClass):'',i.html(s)),"custom"!==t.type&&e.emit("paginationRender",e.pagination.$el[0])}},init:function(){var a=this,e=a.params.pagination;if(e.el){var t=L(e.el);0!==t.length&&(a.params.uniqueNavElements&&"string"==typeof e.el&&1'),s.append(r)),ee.extend(t,{$el:s,el:s[0],$dragEl:r,dragEl:r[0]}),i.draggable&&t.enableDraggable()}},destroy:function(){this.scrollbar.disableDraggable()}},B={setTransform:function(e,t){var a=this.rtl,i=L(e),s=a?-1:1,r=i.attr("data-swiper-parallax")||"0",n=i.attr("data-swiper-parallax-x"),o=i.attr("data-swiper-parallax-y"),l=i.attr("data-swiper-parallax-scale"),d=i.attr("data-swiper-parallax-opacity");if(n||o?(n=n||"0",o=o||"0"):this.isHorizontal()?(n=r,o="0"):(o=r,n="0"),n=0<=n.indexOf("%")?parseInt(n,10)*t*s+"%":n*t*s+"px",o=0<=o.indexOf("%")?parseInt(o,10)*t+"%":o*t+"px",null!=d){var p=d-(d-1)*(1-Math.abs(t));i[0].style.opacity=p}if(null==l)i.transform("translate3d("+n+", "+o+", 0px)");else{var c=l-(l-1)*(1-Math.abs(t));i.transform("translate3d("+n+", "+o+", 0px) scale("+c+")")}},setTranslate:function(){var i=this,e=i.$el,t=i.slides,s=i.progress,r=i.snapGrid;e.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]").each(function(e,t){i.parallax.setTransform(t,s)}),t.each(function(e,t){var a=t.progress;1i.maxRatio&&(a.scale=i.maxRatio-1+Math.pow(a.scale-i.maxRatio+1,.5)),a.scales.touchesStart.x))return void(s.isTouched=!1);if(!t.isHorizontal()&&(Math.floor(s.minY)===Math.floor(s.startY)&&s.touchesCurrent.ys.touchesStart.y))return void(s.isTouched=!1)}e.preventDefault(),e.stopPropagation(),s.isMoved=!0,s.currentX=s.touchesCurrent.x-s.touchesStart.x+s.startX,s.currentY=s.touchesCurrent.y-s.touchesStart.y+s.startY,s.currentXs.maxX&&(s.currentX=s.maxX-1+Math.pow(s.currentX-s.maxX+1,.8)),s.currentYs.maxY&&(s.currentY=s.maxY-1+Math.pow(s.currentY-s.maxY+1,.8)),r.prevPositionX||(r.prevPositionX=s.touchesCurrent.x),r.prevPositionY||(r.prevPositionY=s.touchesCurrent.y),r.prevTime||(r.prevTime=Date.now()),r.x=(s.touchesCurrent.x-r.prevPositionX)/(Date.now()-r.prevTime)/2,r.y=(s.touchesCurrent.y-r.prevPositionY)/(Date.now()-r.prevTime)/2,Math.abs(s.touchesCurrent.x-r.prevPositionX)<2&&(r.x=0),Math.abs(s.touchesCurrent.y-r.prevPositionY)<2&&(r.y=0),r.prevPositionX=s.touchesCurrent.x,r.prevPositionY=s.touchesCurrent.y,r.prevTime=Date.now(),i.$imageWrapEl.transform("translate3d("+s.currentX+"px, "+s.currentY+"px,0)")}}},onTouchEnd:function(){var e=this.zoom,t=e.gesture,a=e.image,i=e.velocity;if(t.$imageEl&&0!==t.$imageEl.length){if(!a.isTouched||!a.isMoved)return a.isTouched=!1,void(a.isMoved=!1);a.isTouched=!1,a.isMoved=!1;var s=300,r=300,n=i.x*s,o=a.currentX+n,l=i.y*r,d=a.currentY+l;0!==i.x&&(s=Math.abs((o-a.currentX)/i.x)),0!==i.y&&(r=Math.abs((d-a.currentY)/i.y));var p=Math.max(s,r);a.currentX=o,a.currentY=d;var c=a.width*e.scale,u=a.height*e.scale;a.minX=Math.min(t.slideWidth/2-c/2,0),a.maxX=-a.minX,a.minY=Math.min(t.slideHeight/2-u/2,0),a.maxY=-a.minY,a.currentX=Math.max(Math.min(a.currentX,a.maxX),a.minX),a.currentY=Math.max(Math.min(a.currentY,a.maxY),a.minY),t.$imageWrapEl.transition(p).transform("translate3d("+a.currentX+"px, "+a.currentY+"px,0)")}},onTransitionEnd:function(){var e=this.zoom,t=e.gesture;t.$slideEl&&this.previousIndex!==this.activeIndex&&(t.$imageEl.transform("translate3d(0,0,0) scale(1)"),t.$imageWrapEl.transform("translate3d(0,0,0)"),e.scale=1,e.currentScale=1,t.$slideEl=void 0,t.$imageEl=void 0,t.$imageWrapEl=void 0)},toggle:function(e){var t=this.zoom;t.scale&&1!==t.scale?t.out():t.in(e)},in:function(e){var t,a,i,s,r,n,o,l,d,p,c,u,h,v,f,m,g=this,b=g.zoom,w=g.params.zoom,y=b.gesture,x=b.image;(y.$slideEl||(y.$slideEl=g.clickedSlide?L(g.clickedSlide):g.slides.eq(g.activeIndex),y.$imageEl=y.$slideEl.find("img, svg, canvas"),y.$imageWrapEl=y.$imageEl.parent("."+w.containerClass)),y.$imageEl&&0!==y.$imageEl.length)&&(y.$slideEl.addClass(""+w.zoomedSlideClass),void 0===x.touchesStart.x&&e?(t="touchend"===e.type?e.changedTouches[0].pageX:e.pageX,a="touchend"===e.type?e.changedTouches[0].pageY:e.pageY):(t=x.touchesStart.x,a=x.touchesStart.y),b.scale=y.$imageWrapEl.attr("data-swiper-zoom")||w.maxRatio,b.currentScale=y.$imageWrapEl.attr("data-swiper-zoom")||w.maxRatio,e?(f=y.$slideEl[0].offsetWidth,m=y.$slideEl[0].offsetHeight,i=y.$slideEl.offset().left+f/2-t,s=y.$slideEl.offset().top+m/2-a,o=y.$imageEl[0].offsetWidth,l=y.$imageEl[0].offsetHeight,d=o*b.scale,p=l*b.scale,h=-(c=Math.min(f/2-d/2,0)),v=-(u=Math.min(m/2-p/2,0)),(r=i*b.scale)>1]<=t?i=s:a=s;return a};return this.x=e,this.y=t,this.lastIndex=e.length-1,this.interpolate=function(e){return e?(n=o(this.x,e),r=n-1,(e-this.x[r])*(this.y[n]-this.y[r])/(this.x[n]-this.x[r])+this.y[r]):0},this},getInterpolateFunction:function(e){var t=this;t.controller.spline||(t.controller.spline=t.params.loop?new V.LinearSpline(t.slidesGrid,e.slidesGrid):new V.LinearSpline(t.snapGrid,e.snapGrid))},setTranslate:function(e,t){var a,i,s=this,r=s.controller.control;function n(e){var t=s.rtlTranslate?-s.translate:s.translate;"slide"===s.params.controller.by&&(s.controller.getInterpolateFunction(e),i=-s.controller.spline.interpolate(-t)),i&&"container"!==s.params.controller.by||(a=(e.maxTranslate()-e.minTranslate())/(s.maxTranslate()-s.minTranslate()),i=(t-s.minTranslate())*a+e.minTranslate()),s.params.controller.inverse&&(i=e.maxTranslate()-i),e.updateProgress(i),e.setTranslate(i,s),e.updateActiveIndex(),e.updateSlidesClasses()}if(Array.isArray(r))for(var o=0;o'),i.append(e)),e.css({height:r+"px"})):0===(e=a.find(".swiper-cube-shadow")).length&&(e=L('
            '),a.append(e)));for(var h=0;h'),v.append(E)),0===S.length&&(S=L('
            '),v.append(S)),E.length&&(E[0].style.opacity=Math.max(-b,0)),S.length&&(S[0].style.opacity=Math.max(b,0))}}if(i.css({"-webkit-transform-origin":"50% 50% -"+l/2+"px","-moz-transform-origin":"50% 50% -"+l/2+"px","-ms-transform-origin":"50% 50% -"+l/2+"px","transform-origin":"50% 50% -"+l/2+"px"}),d.shadow)if(p)e.transform("translate3d(0px, "+(r/2+d.shadowOffset)+"px, "+-r/2+"px) rotateX(90deg) rotateZ(0deg) scale("+d.shadowScale+")");else{var C=Math.abs(u)-90*Math.floor(Math.abs(u)/90),M=1.5-(Math.sin(2*C*Math.PI/360)/2+Math.cos(2*C*Math.PI/360)/2),z=d.shadowScale,P=d.shadowScale/M,k=d.shadowOffset;e.transform("scale3d("+z+", 1, "+P+") translate3d(0px, "+(n/2+k)+"px, "+-n/2/P+"px) rotateX(-90deg)")}var $=I.isSafari||I.isUiWebView?-l/2:0;i.transform("translate3d(0px,0,"+$+"px) rotateX("+(t.isHorizontal()?0:u)+"deg) rotateY("+(t.isHorizontal()?-u:0)+"deg)")},setTransition:function(e){var t=this.$el;this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),this.params.cubeEffect.shadow&&!this.isHorizontal()&&t.find(".swiper-cube-shadow").transition(e)}},K={setTranslate:function(){for(var e=this,t=e.slides,a=e.rtlTranslate,i=0;i'),s.append(p)),0===c.length&&(c=L('
            '),s.append(c)),p.length&&(p[0].style.opacity=Math.max(-r,0)),c.length&&(c[0].style.opacity=Math.max(r,0))}s.transform("translate3d("+l+"px, "+d+"px, 0px) rotateX("+o+"deg) rotateY("+n+"deg)")}},setTransition:function(e){var a=this,t=a.slides,i=a.activeIndex,s=a.$wrapperEl;if(t.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),a.params.virtualTranslate&&0!==e){var r=!1;t.eq(i).transitionEnd(function(){if(!r&&a&&!a.destroyed){r=!0,a.animating=!1;for(var e=["webkitTransitionEnd","transitionend"],t=0;t'),v.append(E)),0===S.length&&(S=L('
            '),v.append(S)),E.length&&(E[0].style.opacity=0')}}),Object.keys(F).forEach(function(e){t.a11y[e]=F[e].bind(t)})},on:{init:function(){this.params.a11y.enabled&&(this.a11y.init(),this.a11y.updateNavigation())},toEdge:function(){this.params.a11y.enabled&&this.a11y.updateNavigation()},fromEdge:function(){this.params.a11y.enabled&&this.a11y.updateNavigation()},paginationUpdate:function(){this.params.a11y.enabled&&this.a11y.updatePagination()},destroy:function(){this.params.a11y.enabled&&this.a11y.destroy()}}},{name:"history",params:{history:{enabled:!1,replaceState:!1,key:"slides"}},create:function(){var e=this;ee.extend(e,{history:{init:R.init.bind(e),setHistory:R.setHistory.bind(e),setHistoryPopState:R.setHistoryPopState.bind(e),scrollToSlide:R.scrollToSlide.bind(e),destroy:R.destroy.bind(e)}})},on:{init:function(){this.params.history.enabled&&this.history.init()},destroy:function(){this.params.history.enabled&&this.history.destroy()},transitionEnd:function(){this.history.initialized&&this.history.setHistory(this.params.history.key,this.activeIndex)}}},{name:"hash-navigation",params:{hashNavigation:{enabled:!1,replaceState:!1,watchState:!1}},create:function(){var e=this;ee.extend(e,{hashNavigation:{initialized:!1,init:q.init.bind(e),destroy:q.destroy.bind(e),setHash:q.setHash.bind(e),onHashCange:q.onHashCange.bind(e)}})},on:{init:function(){this.params.hashNavigation.enabled&&this.hashNavigation.init()},destroy:function(){this.params.hashNavigation.enabled&&this.hashNavigation.destroy()},transitionEnd:function(){this.hashNavigation.initialized&&this.hashNavigation.setHash()}}},{name:"autoplay",params:{autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!0,stopOnLastSlide:!1,reverseDirection:!1}},create:function(){var t=this;ee.extend(t,{autoplay:{running:!1,paused:!1,run:W.run.bind(t),start:W.start.bind(t),stop:W.stop.bind(t),pause:W.pause.bind(t),onTransitionEnd:function(e){t&&!t.destroyed&&t.$wrapperEl&&e.target===this&&(t.$wrapperEl[0].removeEventListener("transitionend",t.autoplay.onTransitionEnd),t.$wrapperEl[0].removeEventListener("webkitTransitionEnd",t.autoplay.onTransitionEnd),t.autoplay.paused=!1,t.autoplay.running?t.autoplay.run():t.autoplay.stop())}}})},on:{init:function(){this.params.autoplay.enabled&&this.autoplay.start()},beforeTransitionStart:function(e,t){this.autoplay.running&&(t||!this.params.autoplay.disableOnInteraction?this.autoplay.pause(e):this.autoplay.stop())},sliderFirstMove:function(){this.autoplay.running&&(this.params.autoplay.disableOnInteraction?this.autoplay.stop():this.autoplay.pause())},destroy:function(){this.autoplay.running&&this.autoplay.stop()}}},{name:"effect-fade",params:{fadeEffect:{crossFade:!1}},create:function(){ee.extend(this,{fadeEffect:{setTranslate:j.setTranslate.bind(this),setTransition:j.setTransition.bind(this)}})},on:{beforeInit:function(){var e=this;if("fade"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"fade");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!0};ee.extend(e.params,t),ee.extend(e.originalParams,t)}},setTranslate:function(){"fade"===this.params.effect&&this.fadeEffect.setTranslate()},setTransition:function(e){"fade"===this.params.effect&&this.fadeEffect.setTransition(e)}}},{name:"effect-cube",params:{cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}},create:function(){ee.extend(this,{cubeEffect:{setTranslate:U.setTranslate.bind(this),setTransition:U.setTransition.bind(this)}})},on:{beforeInit:function(){var e=this;if("cube"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"cube"),e.classNames.push(e.params.containerModifierClass+"3d");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0};ee.extend(e.params,t),ee.extend(e.originalParams,t)}},setTranslate:function(){"cube"===this.params.effect&&this.cubeEffect.setTranslate()},setTransition:function(e){"cube"===this.params.effect&&this.cubeEffect.setTransition(e)}}},{name:"effect-flip",params:{flipEffect:{slideShadows:!0,limitRotation:!0}},create:function(){ee.extend(this,{flipEffect:{setTranslate:K.setTranslate.bind(this),setTransition:K.setTransition.bind(this)}})},on:{beforeInit:function(){var e=this;if("flip"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"flip"),e.classNames.push(e.params.containerModifierClass+"3d");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!0};ee.extend(e.params,t),ee.extend(e.originalParams,t)}},setTranslate:function(){"flip"===this.params.effect&&this.flipEffect.setTranslate()},setTransition:function(e){"flip"===this.params.effect&&this.flipEffect.setTransition(e)}}},{name:"effect-coverflow",params:{coverflowEffect:{rotate:50,stretch:0,depth:100,modifier:1,slideShadows:!0}},create:function(){ee.extend(this,{coverflowEffect:{setTranslate:_.setTranslate.bind(this),setTransition:_.setTransition.bind(this)}})},on:{beforeInit:function(){var e=this;"coverflow"===e.params.effect&&(e.classNames.push(e.params.containerModifierClass+"coverflow"),e.classNames.push(e.params.containerModifierClass+"3d"),e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)},setTranslate:function(){"coverflow"===this.params.effect&&this.coverflowEffect.setTranslate()},setTransition:function(e){"coverflow"===this.params.effect&&this.coverflowEffect.setTransition(e)}}},{name:"thumbs",params:{thumbs:{swiper:null,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-container-thumbs"}},create:function(){ee.extend(this,{thumbs:{swiper:null,init:Z.init.bind(this),update:Z.update.bind(this),onThumbClick:Z.onThumbClick.bind(this)}})},on:{beforeInit:function(){var e=this.params.thumbs;e&&e.swiper&&(this.thumbs.init(),this.thumbs.update(!0))},slideChange:function(){this.thumbs.swiper&&this.thumbs.update()},update:function(){this.thumbs.swiper&&this.thumbs.update()},resize:function(){this.thumbs.swiper&&this.thumbs.update()},observerUpdate:function(){this.thumbs.swiper&&this.thumbs.update()},setTransition:function(e){var t=this.thumbs.swiper;t&&t.setTransition(e)},beforeDestroy:function(){var e=this.thumbs.swiper;e&&this.thumbs.swiperCreated&&e&&e.destroy()}}}];return void 0===T.use&&(T.use=T.Class.use,T.installModule=T.Class.installModule),T.use(Q),T}); +//# sourceMappingURL=swiper.min.js.map diff --git a/assets/3rd/swiper/js/swiper.min.js.map b/assets/3rd/swiper/js/swiper.min.js.map new file mode 100755 index 00000000..479ae95c --- /dev/null +++ b/assets/3rd/swiper/js/swiper.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["swiper.js"],"names":["global","factory","exports","module","define","amd","self","Swiper","this","doc","document","body","addEventListener","removeEventListener","activeElement","blur","nodeName","querySelector","querySelectorAll","getElementById","createEvent","initEvent","createElement","children","childNodes","style","setAttribute","getElementsByTagName","location","hash","win","window","navigator","userAgent","history","CustomEvent","getComputedStyle","getPropertyValue","Image","Date","screen","setTimeout","clearTimeout","Dom7","arr","i","length","$","selector","context","els","tempParent","html","trim","indexOf","toCreate","innerHTML","push","match","split","nodeType","unique","uniqueArray","fn","prototype","Class","Methods","addClass","className","classes","j","classList","add","removeClass","remove","hasClass","contains","toggleClass","toggle","attr","attrs","value","arguments$1","arguments","getAttribute","attrName","removeAttr","removeAttribute","data","key","el","dom7ElementDataStorage","dataKey","transform","elStyle","webkitTransform","transition","duration","webkitTransitionDuration","transitionDuration","on","assign","args","len","eventType","targetSelector","listener","capture","handleLiveEvent","e","target","eventData","dom7EventData","unshift","is","apply","parents","k","handleEvent","undefined","events","event$1","dom7LiveListeners","proxyListener","event","dom7Listeners","off","handlers","handler","splice","dom7proxy","trigger","evt","detail","bubbles","cancelable","filter","dataIndex","dispatchEvent","transitionEnd","callback","dom","fireCallBack","call","outerWidth","includeMargins","styles","offsetWidth","parseFloat","outerHeight","offsetHeight","offset","box","getBoundingClientRect","clientTop","clientLeft","scrollTop","scrollY","scrollLeft","scrollX","top","left","css","props","prop","each","text","textContent","compareWith","matches","webkitMatchesSelector","msMatchesSelector","index","child","previousSibling","eq","returnIndex","append","newChild","tempDiv","firstChild","appendChild","prepend","insertBefore","next","nextElementSibling","nextAll","nextEls","prev","previousElementSibling","prevAll","prevEls","parent","parentNode","closest","find","foundElements","found","removeChild","toAdd","Object","keys","forEach","methodName","testDiv","ua","Utils","deleteProps","obj","object","nextTick","delay","now","getTranslate","axis","matrix","curTransform","transformMatrix","curStyle","WebKitCSSMatrix","map","a","replace","join","MozTransform","OTransform","MsTransform","msTransform","toString","m41","m42","parseUrlQuery","url","params","param","query","urlToParse","href","paramsPart","decodeURIComponent","isObject","o","constructor","extend","len$1","to","nextSource","keysArray","nextIndex","nextKey","desc","getOwnPropertyDescriptor","enumerable","Support","touch","Modernizr","maxTouchPoints","DocumentTouch","pointerEvents","pointerEnabled","PointerEvent","prefixedPointerEvents","msPointerEnabled","transforms3d","csstransforms3d","flexbox","observer","passiveListener","supportsPassive","opts","defineProperty","get","gestures","Browser","isIE","isEdge","isSafari","toLowerCase","isUiWebView","test","SwiperClass","eventsListeners","eventName","staticAccessors","components","configurable","priority","method","once","onceHandler","f7proxy","eventHandler","emit","Array","isArray","slice","useModulesParams","instanceParams","instance","modules","moduleName","useModules","modulesParams","moduleParams","modulePropName","moduleProp","bind","moduleEventName","create","set","use","installModule","name","proto","static","install","m","concat","defineProperties","update","updateSize","width","height","swiper","$el","clientWidth","clientHeight","isHorizontal","isVertical","parseInt","size","updateSlides","$wrapperEl","swiperSize","rtl","rtlTranslate","wrongRTL","isVirtual","virtual","enabled","previousSlidesLength","slides","slidesLength","snapGrid","slidesGrid","slidesSizesGrid","offsetBefore","slidesOffsetBefore","offsetAfter","slidesOffsetAfter","previousSnapGridLength","previousSlidesGridLength","spaceBetween","slidePosition","prevSlideSize","slidesNumberEvenToRows","slideSize","virtualSize","marginLeft","marginTop","marginRight","marginBottom","slidesPerColumn","Math","floor","ceil","slidesPerView","slidesPerColumnFill","max","newSlidesGrid","slidesPerRow","numFullColumns","slide","newSlideOrderIndex","column","row","-webkit-box-ordinal-group","-moz-box-ordinal-group","-ms-flex-order","-webkit-order","order","slideStyles","currentTransform","currentWebKitTransform","roundLengths","paddingLeft","paddingRight","boxSizing","paddingTop","paddingBottom","boxSizing$1","swiperSlideSize","centeredSlides","abs","slidesPerGroup","effect","setWrapperSize","i$1","slidesGridItem","i$2","slidesGridItem$1","centerInsufficientSlides","allSlidesSize","slideSizeValue","allSlidesOffset","snap","snapIndex","watchOverflow","checkOverflow","watchSlidesProgress","watchSlidesVisibility","updateSlidesOffset","updateAutoHeight","speed","activeSlides","newHeight","setTransition","activeIndex","swiperSlideOffset","offsetLeft","offsetTop","updateSlidesProgress","translate","offsetCenter","slideVisibleClass","visibleSlidesIndexes","visibleSlides","slideProgress","minTranslate","slideBefore","slideAfter","progress","updateProgress","translatesDiff","maxTranslate","isBeginning","isEnd","wasBeginning","wasEnd","updateSlidesClasses","activeSlide","realIndex","slideActiveClass","loop","slideDuplicateClass","slideDuplicateActiveClass","nextSlide","slideNextClass","prevSlide","slidePrevClass","slideDuplicateNextClass","slideDuplicatePrevClass","updateActiveIndex","newActiveIndex","previousIndex","previousRealIndex","previousSnapIndex","normalizeSlideIndex","updateClickedSlide","slideFound","clickedSlide","clickedIndex","slideToClickedSlide","virtualTranslate","currentTranslate","setTranslate","byController","x","y","previousTranslate","transition$1","transitionStart","runCallbacks","direction","autoHeight","dir","animating","slideTo","internal","slideIndex","preventInteractionOnTransition","initialSlide","initialized","allowSlideNext","allowSlidePrev","onSlideToWrapperTransitionEnd","destroyed","slideToLoop","newIndex","loopedSlides","slideNext","loopFix","_clientLeft","slidePrev","normalize","val","prevIndex","normalizedTranslate","normalizedSnapGrid","prevSnap","slideReset","slideToClosest","currentSnap","slidesPerViewDynamic","slideToIndex","loopCreate","loopFillGroupWithBlank","blankSlidesNum","blankNode","loopAdditionalSlides","prependSlides","appendSlides","cloneNode","diff","loopDestroy","grabCursor","setGrabCursor","moving","simulateTouch","isLocked","cursor","unsetGrabCursor","manipulation","appendSlide","prependSlide","addSlide","activeIndexBuffer","baseLength","slidesBuffer","currentSlide","removeSlide","slidesIndexes","indexToRemove","removeAllSlides","Device","device","ios","android","androidChrome","desktop","windows","iphone","ipod","ipad","cordova","phonegap","os","osVersion","webView","osVersionArr","metaViewport","minimalUi","pixelRatio","devicePixelRatio","onResize","breakpoints","setBreakpoint","freeMode","newTranslate","min","defaults","init","touchEventsTarget","edgeSwipeDetection","edgeSwipeThreshold","freeModeMomentum","freeModeMomentumRatio","freeModeMomentumBounce","freeModeMomentumBounceRatio","freeModeMomentumVelocityRatio","freeModeSticky","freeModeMinimumVelocity","breakpointsInverse","touchRatio","touchAngle","shortSwipes","longSwipes","longSwipesRatio","longSwipesMs","followFinger","allowTouchMove","threshold","touchMoveStopPropagation","touchStartPreventDefault","touchStartForcePreventDefault","touchReleaseOnEdges","uniqueNavElements","resistance","resistanceRatio","preventClicks","preventClicksPropagation","preloadImages","updateOnImagesReady","swipeHandler","noSwiping","noSwipingClass","noSwipingSelector","passiveListeners","containerModifierClass","slideClass","slideBlankClass","wrapperClass","runCallbacksOnInit","prototypes","attachEvents","touchEvents","wrapperEl","onTouchStart","touchEventsData","touches","originalEvent","isTouchEvent","type","which","button","isTouched","isMoved","allowClick","currentX","targetTouches","pageX","currentY","pageY","startX","startY","iOSEdgeSwipeDetection","iOSEdgeSwipeThreshold","allowTouchCallbacks","isScrolling","startMoving","touchStartTime","swipeDirection","allowThresholdMove","preventDefault","formElements","shouldPreventDefault","onTouchMove","preventedByNestedSwiper","diffX","diffY","sqrt","pow","atan2","PI","nested","stopPropagation","startTranslate","allowMomentumBounce","disableParentSwiper","velocities","position","time","onTouchEnd","currentPos","touchEndTime","timeDiff","lastClickTime","clickTimeout","lastMoveEvent","pop","velocityEvent","distance","velocity","momentumDuration","momentumDistance","newPosition","afterBouncePosition","needsLoopFix","doBounce","bounceAmount","stopIndex","groupSize","ratio","onClick","stopImmediatePropagation","start","passive","move","end","detachEvents","breakpoint","getBreakpoint","currentBreakpoint","breakpointOnlyParams","paramValue","breakpointParams","originalParams","directionChanged","needsReLoop","changeDirection","points","point","sort","b","innerWidth","wasLocked","navigation","addClasses","classNames","suffixes","suffix","removeClasses","images","loadImage","imageEl","src","srcset","sizes","checkForComplete","image","onReady","complete","onload","onerror","imagesLoaded","imagesToLoad","currentSrc","extendedDefaults","prototypeGroup","protoMethod","moduleParamName","swiperParams","passedParams","swipers","containerEl","newParams","touchEventsTouch","touchEventsDesktop","__proto__","spv","breakLoop","translateValue","newDirection","needUpdate","currentDirection","slideEl","destroy","deleteInstance","cleanStyles","extendDefaults","newDefaults","Device$1","Support$1","support","Browser$1","browser","Resize","resize","resizeHandler","orientationChangeHandler","Observer","func","MutationObserver","WebkitMutationObserver","attach","options","mutations","observerUpdate","requestAnimationFrame","observe","attributes","childList","characterData","observers","observeParents","containerParents","observeSlideChildren","disconnect","Observer$1","Virtual","force","ref","ref$1","addSlidesBefore","addSlidesAfter","ref$2","previousFrom","from","previousTo","previousSlidesGrid","renderSlide","previousOffset","offsetProp","slidesAfter","slidesBefore","onRendered","lazy","load","renderExternal","slidesToRender","prependIndexes","appendIndexes","cache","$slideEl","numberOfNewSlides","newCache","cachedIndex","Virtual$1","beforeInit","overwriteParams","Keyboard","handle","kc","keyCode","charCode","shiftKey","altKey","ctrlKey","metaKey","keyboard","onlyInViewport","inView","windowWidth","windowHeight","innerHeight","swiperOffset","swiperCoord","returnValue","enable","disable","Keyboard$1","Mousewheel","lastScrollTime","isSupported","element","implementation","hasFeature","isEventSupported","sX","sY","pX","pY","wheelDelta","wheelDeltaY","wheelDeltaX","HORIZONTAL_AXIS","deltaY","deltaX","deltaMode","spinX","spinY","pixelX","pixelY","handleMouseEnter","mouseEntered","handleMouseLeave","mousewheel","releaseOnEdges","delta","rtlFactor","forceToAxis","invert","sensitivity","timeout","autoplay","autoplayDisableOnInteraction","stop","getTime","eventsTarged","Navigation","$nextEl","$prevEl","disabledClass","lockClass","onPrevClick","onNextClick","nextEl","prevEl","Pagination","pagination","current","total","paginationType","bullets","firstIndex","lastIndex","midIndex","dynamicBullets","bulletSize","dynamicMainBullets","dynamicBulletIndex","bullet","$bullet","bulletIndex","bulletActiveClass","$firstDisplayedBullet","$lastDisplayedBullet","dynamicBulletsLength","bulletsOffset","formatFractionCurrent","formatFractionTotal","progressbarDirection","progressbarOpposite","scale","scaleX","scaleY","renderCustom","render","paginationHTML","numberOfBullets","renderBullet","bulletClass","renderFraction","currentClass","totalClass","renderProgressbar","progressbarFillClass","clickable","clickableClass","modifierClass","progressbarOppositeClass","hiddenClass","Scrollbar","scrollbar","dragSize","trackSize","$dragEl","newSize","newPos","hide","opacity","divider","moveDivider","display","setDragPosition","positionRatio","clientX","clientY","onDragStart","dragTimeout","onDragMove","onDragEnd","snapOnRelease","enableDraggable","activeListener","disableDraggable","$swiperEl","dragEl","draggable","Parallax","setTransform","p","currentOpacity","currentScale","parallax","parallaxEl","$parallaxEl","parallaxDuration","Zoom","getDistanceBetweenTouches","x1","y1","x2","y2","onGestureStart","zoom","gesture","fakeGestureTouched","fakeGestureMoved","scaleStart","$imageEl","$imageWrapEl","maxRatio","isScaling","onGestureChange","scaleMove","minRatio","onGestureEnd","changedTouches","touchesStart","slideWidth","slideHeight","scaledWidth","scaledHeight","minX","maxX","minY","maxY","touchesCurrent","prevPositionX","prevPositionY","prevTime","momentumDurationX","momentumDurationY","momentumDistanceX","newPositionX","momentumDistanceY","newPositionY","onTransitionEnd","out","in","touchX","touchY","translateX","translateY","imageWidth","imageHeight","translateMinX","translateMinY","translateMaxX","translateMaxY","Lazy","loadInSlide","loadInDuplicate","$images","elementClass","loadedClass","loadingClass","imageIndex","background","slideOriginalIndex","originalSlide","duplicatedSlide","slideExist","initialImageLoaded","elIndex","loadPrevNext","loadPrevNextAmount","amount","maxIndex","minIndex","Controller","LinearSpline","guess","i1","i3","binarySearch","array","interpolate","getInterpolateFunction","c","controller","spline","setTranslate$1","multiplier","controlledTranslate","controlled","control","setControlledTranslate","by","inverse","setControlledTransition","a11y","makeElFocusable","addElRole","role","addElLabel","label","disableEl","enableEl","onEnterKey","$targetEl","notify","lastSlideMessage","nextSlideMessage","firstSlideMessage","prevSlideMessage","click","message","notification","liveRegion","updateNavigation","updatePagination","bulletEl","$bulletEl","paginationBulletMessage","History","pushState","hashNavigation","paths","getPathValues","scrollToSlide","replaceState","setHistoryPopState","pathArray","pathname","part","setHistory","slugify","includes","currentState","state","HashNavigation","onHashCange","newHash","setHash","watchState","Autoplay","run","$activeSlideEl","reverseDirection","stopOnLastSlide","running","pause","paused","waitForTransition","Fade","tx","ty","slideOpacity","fadeEffect","crossFade","eventTriggered","triggerEvents","Cube","$cubeShadowEl","swiperWidth","swiperHeight","cubeEffect","wrapperRotate","shadow","slideAngle","round","tz","slideShadows","shadowBefore","shadowAfter","-webkit-transform-origin","-moz-transform-origin","-ms-transform-origin","transform-origin","shadowOffset","shadowAngle","sin","cos","scale1","shadowScale","scale2","zFactor","Flip","flipEffect","limitRotation","rotateY","rotateX","zIndex","Coverflow","coverflowEffect","center","rotate","depth","offsetMultiplier","modifier","translateZ","stretch","slideTransform","$shadowBeforeEl","$shadowAfterEl","perspectiveOrigin","Thumbs","thumbsParams","thumbs","swiperCreated","thumbsContainerClass","onThumbClick","thumbsSwiper","slideThumbActiveClass","currentIndex","initial","newThumbsIndex","currentThumbsIndex","prevThumbsIndex","nextThumbsIndex","thumbsToActivate","thumbActiveClass","hideOnClick","toEdge","fromEdge","isHidden","bulletElement","number","activeIndexChange","snapIndexChange","slidesLengthChange","snapGridLengthChange","dragClass","containerClass","zoomedSlideClass","touchStart","touchEnd","doubleTap","loadOnTransitionStart","preloaderClass","scroll","scrollbarDragMove","notificationClass","paginationUpdate","disableOnInteraction","beforeTransitionStart","sliderFirstMove","slideChange","beforeDestroy"],"mappings":"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","file":"swiper.min.js","sourcesContent":["/**\n * Swiper 4.5.0\n * Most modern mobile touch slider and framework with hardware accelerated transitions\n * http://www.idangero.us/swiper/\n *\n * Copyright 2014-2019 Vladimir Kharlampidi\n *\n * Released under the MIT License\n *\n * Released on: February 22, 2019\n */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = global || self, global.Swiper = factory());\n}(this, function () { 'use strict';\n\n /**\n * SSR Window 1.0.1\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2018, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: July 18, 2018\n */\n var doc = (typeof document === 'undefined') ? {\n body: {},\n addEventListener: function addEventListener() {},\n removeEventListener: function removeEventListener() {},\n activeElement: {\n blur: function blur() {},\n nodeName: '',\n },\n querySelector: function querySelector() {\n return null;\n },\n querySelectorAll: function querySelectorAll() {\n return [];\n },\n getElementById: function getElementById() {\n return null;\n },\n createEvent: function createEvent() {\n return {\n initEvent: function initEvent() {},\n };\n },\n createElement: function createElement() {\n return {\n children: [],\n childNodes: [],\n style: {},\n setAttribute: function setAttribute() {},\n getElementsByTagName: function getElementsByTagName() {\n return [];\n },\n };\n },\n location: { hash: '' },\n } : document; // eslint-disable-line\n\n var win = (typeof window === 'undefined') ? {\n document: doc,\n navigator: {\n userAgent: '',\n },\n location: {},\n history: {},\n CustomEvent: function CustomEvent() {\n return this;\n },\n addEventListener: function addEventListener() {},\n removeEventListener: function removeEventListener() {},\n getComputedStyle: function getComputedStyle() {\n return {\n getPropertyValue: function getPropertyValue() {\n return '';\n },\n };\n },\n Image: function Image() {},\n Date: function Date() {},\n screen: {},\n setTimeout: function setTimeout() {},\n clearTimeout: function clearTimeout() {},\n } : window; // eslint-disable-line\n\n /**\n * Dom7 2.1.3\n * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n * http://framework7.io/docs/dom.html\n *\n * Copyright 2019, Vladimir Kharlampidi\n * The iDangero.us\n * http://www.idangero.us/\n *\n * Licensed under MIT\n *\n * Released on: February 11, 2019\n */\n\n var Dom7 = function Dom7(arr) {\n var self = this;\n // Create array-like object\n for (var i = 0; i < arr.length; i += 1) {\n self[i] = arr[i];\n }\n self.length = arr.length;\n // Return collection with methods\n return this;\n };\n\n function $(selector, context) {\n var arr = [];\n var i = 0;\n if (selector && !context) {\n if (selector instanceof Dom7) {\n return selector;\n }\n }\n if (selector) {\n // String\n if (typeof selector === 'string') {\n var els;\n var tempParent;\n var html = selector.trim();\n if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n var toCreate = 'div';\n if (html.indexOf(':~]/)) {\n // Pure ID selector\n els = [doc.getElementById(selector.trim().split('#')[1])];\n } else {\n // Other selectors\n els = (context || doc).querySelectorAll(selector.trim());\n }\n for (i = 0; i < els.length; i += 1) {\n if (els[i]) { arr.push(els[i]); }\n }\n }\n } else if (selector.nodeType || selector === win || selector === doc) {\n // Node/element\n arr.push(selector);\n } else if (selector.length > 0 && selector[0].nodeType) {\n // Array of elements or instance of Dom\n for (i = 0; i < selector.length; i += 1) {\n arr.push(selector[i]);\n }\n }\n }\n return new Dom7(arr);\n }\n\n $.fn = Dom7.prototype;\n $.Class = Dom7;\n $.Dom7 = Dom7;\n\n function unique(arr) {\n var uniqueArray = [];\n for (var i = 0; i < arr.length; i += 1) {\n if (uniqueArray.indexOf(arr[i]) === -1) { uniqueArray.push(arr[i]); }\n }\n return uniqueArray;\n }\n\n // Classes and attributes\n function addClass(className) {\n if (typeof className === 'undefined') {\n return this;\n }\n var classes = className.split(' ');\n for (var i = 0; i < classes.length; i += 1) {\n for (var j = 0; j < this.length; j += 1) {\n if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.add(classes[i]); }\n }\n }\n return this;\n }\n function removeClass(className) {\n var classes = className.split(' ');\n for (var i = 0; i < classes.length; i += 1) {\n for (var j = 0; j < this.length; j += 1) {\n if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.remove(classes[i]); }\n }\n }\n return this;\n }\n function hasClass(className) {\n if (!this[0]) { return false; }\n return this[0].classList.contains(className);\n }\n function toggleClass(className) {\n var classes = className.split(' ');\n for (var i = 0; i < classes.length; i += 1) {\n for (var j = 0; j < this.length; j += 1) {\n if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.toggle(classes[i]); }\n }\n }\n return this;\n }\n function attr(attrs, value) {\n var arguments$1 = arguments;\n\n if (arguments.length === 1 && typeof attrs === 'string') {\n // Get attr\n if (this[0]) { return this[0].getAttribute(attrs); }\n return undefined;\n }\n\n // Set attrs\n for (var i = 0; i < this.length; i += 1) {\n if (arguments$1.length === 2) {\n // String\n this[i].setAttribute(attrs, value);\n } else {\n // Object\n // eslint-disable-next-line\n for (var attrName in attrs) {\n this[i][attrName] = attrs[attrName];\n this[i].setAttribute(attrName, attrs[attrName]);\n }\n }\n }\n return this;\n }\n // eslint-disable-next-line\n function removeAttr(attr) {\n for (var i = 0; i < this.length; i += 1) {\n this[i].removeAttribute(attr);\n }\n return this;\n }\n function data(key, value) {\n var el;\n if (typeof value === 'undefined') {\n el = this[0];\n // Get value\n if (el) {\n if (el.dom7ElementDataStorage && (key in el.dom7ElementDataStorage)) {\n return el.dom7ElementDataStorage[key];\n }\n\n var dataKey = el.getAttribute((\"data-\" + key));\n if (dataKey) {\n return dataKey;\n }\n return undefined;\n }\n return undefined;\n }\n\n // Set value\n for (var i = 0; i < this.length; i += 1) {\n el = this[i];\n if (!el.dom7ElementDataStorage) { el.dom7ElementDataStorage = {}; }\n el.dom7ElementDataStorage[key] = value;\n }\n return this;\n }\n // Transforms\n // eslint-disable-next-line\n function transform(transform) {\n for (var i = 0; i < this.length; i += 1) {\n var elStyle = this[i].style;\n elStyle.webkitTransform = transform;\n elStyle.transform = transform;\n }\n return this;\n }\n function transition(duration) {\n if (typeof duration !== 'string') {\n duration = duration + \"ms\"; // eslint-disable-line\n }\n for (var i = 0; i < this.length; i += 1) {\n var elStyle = this[i].style;\n elStyle.webkitTransitionDuration = duration;\n elStyle.transitionDuration = duration;\n }\n return this;\n }\n // Events\n function on() {\n var assign;\n\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n var eventType = args[0];\n var targetSelector = args[1];\n var listener = args[2];\n var capture = args[3];\n if (typeof args[1] === 'function') {\n (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);\n targetSelector = undefined;\n }\n if (!capture) { capture = false; }\n\n function handleLiveEvent(e) {\n var target = e.target;\n if (!target) { return; }\n var eventData = e.target.dom7EventData || [];\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n if ($(target).is(targetSelector)) { listener.apply(target, eventData); }\n else {\n var parents = $(target).parents(); // eslint-disable-line\n for (var k = 0; k < parents.length; k += 1) {\n if ($(parents[k]).is(targetSelector)) { listener.apply(parents[k], eventData); }\n }\n }\n }\n function handleEvent(e) {\n var eventData = e && e.target ? e.target.dom7EventData || [] : [];\n if (eventData.indexOf(e) < 0) {\n eventData.unshift(e);\n }\n listener.apply(this, eventData);\n }\n var events = eventType.split(' ');\n var j;\n for (var i = 0; i < this.length; i += 1) {\n var el = this[i];\n if (!targetSelector) {\n for (j = 0; j < events.length; j += 1) {\n var event = events[j];\n if (!el.dom7Listeners) { el.dom7Listeners = {}; }\n if (!el.dom7Listeners[event]) { el.dom7Listeners[event] = []; }\n el.dom7Listeners[event].push({\n listener: listener,\n proxyListener: handleEvent,\n });\n el.addEventListener(event, handleEvent, capture);\n }\n } else {\n // Live events\n for (j = 0; j < events.length; j += 1) {\n var event$1 = events[j];\n if (!el.dom7LiveListeners) { el.dom7LiveListeners = {}; }\n if (!el.dom7LiveListeners[event$1]) { el.dom7LiveListeners[event$1] = []; }\n el.dom7LiveListeners[event$1].push({\n listener: listener,\n proxyListener: handleLiveEvent,\n });\n el.addEventListener(event$1, handleLiveEvent, capture);\n }\n }\n }\n return this;\n }\n function off() {\n var assign;\n\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n var eventType = args[0];\n var targetSelector = args[1];\n var listener = args[2];\n var capture = args[3];\n if (typeof args[1] === 'function') {\n (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);\n targetSelector = undefined;\n }\n if (!capture) { capture = false; }\n\n var events = eventType.split(' ');\n for (var i = 0; i < events.length; i += 1) {\n var event = events[i];\n for (var j = 0; j < this.length; j += 1) {\n var el = this[j];\n var handlers = (void 0);\n if (!targetSelector && el.dom7Listeners) {\n handlers = el.dom7Listeners[event];\n } else if (targetSelector && el.dom7LiveListeners) {\n handlers = el.dom7LiveListeners[event];\n }\n if (handlers && handlers.length) {\n for (var k = handlers.length - 1; k >= 0; k -= 1) {\n var handler = handlers[k];\n if (listener && handler.listener === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n } else if (!listener) {\n el.removeEventListener(event, handler.proxyListener, capture);\n handlers.splice(k, 1);\n }\n }\n }\n }\n }\n return this;\n }\n function trigger() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var events = args[0].split(' ');\n var eventData = args[1];\n for (var i = 0; i < events.length; i += 1) {\n var event = events[i];\n for (var j = 0; j < this.length; j += 1) {\n var el = this[j];\n var evt = (void 0);\n try {\n evt = new win.CustomEvent(event, {\n detail: eventData,\n bubbles: true,\n cancelable: true,\n });\n } catch (e) {\n evt = doc.createEvent('Event');\n evt.initEvent(event, true, true);\n evt.detail = eventData;\n }\n // eslint-disable-next-line\n el.dom7EventData = args.filter(function (data, dataIndex) { return dataIndex > 0; });\n el.dispatchEvent(evt);\n el.dom7EventData = [];\n delete el.dom7EventData;\n }\n }\n return this;\n }\n function transitionEnd(callback) {\n var events = ['webkitTransitionEnd', 'transitionend'];\n var dom = this;\n var i;\n function fireCallBack(e) {\n /* jshint validthis:true */\n if (e.target !== this) { return; }\n callback.call(this, e);\n for (i = 0; i < events.length; i += 1) {\n dom.off(events[i], fireCallBack);\n }\n }\n if (callback) {\n for (i = 0; i < events.length; i += 1) {\n dom.on(events[i], fireCallBack);\n }\n }\n return this;\n }\n function outerWidth(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n // eslint-disable-next-line\n var styles = this.styles();\n return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n }\n return this[0].offsetWidth;\n }\n return null;\n }\n function outerHeight(includeMargins) {\n if (this.length > 0) {\n if (includeMargins) {\n // eslint-disable-next-line\n var styles = this.styles();\n return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n }\n return this[0].offsetHeight;\n }\n return null;\n }\n function offset() {\n if (this.length > 0) {\n var el = this[0];\n var box = el.getBoundingClientRect();\n var body = doc.body;\n var clientTop = el.clientTop || body.clientTop || 0;\n var clientLeft = el.clientLeft || body.clientLeft || 0;\n var scrollTop = el === win ? win.scrollY : el.scrollTop;\n var scrollLeft = el === win ? win.scrollX : el.scrollLeft;\n return {\n top: (box.top + scrollTop) - clientTop,\n left: (box.left + scrollLeft) - clientLeft,\n };\n }\n\n return null;\n }\n function styles() {\n if (this[0]) { return win.getComputedStyle(this[0], null); }\n return {};\n }\n function css(props, value) {\n var i;\n if (arguments.length === 1) {\n if (typeof props === 'string') {\n if (this[0]) { return win.getComputedStyle(this[0], null).getPropertyValue(props); }\n } else {\n for (i = 0; i < this.length; i += 1) {\n // eslint-disable-next-line\n for (var prop in props) {\n this[i].style[prop] = props[prop];\n }\n }\n return this;\n }\n }\n if (arguments.length === 2 && typeof props === 'string') {\n for (i = 0; i < this.length; i += 1) {\n this[i].style[props] = value;\n }\n return this;\n }\n return this;\n }\n // Iterate over the collection passing elements to `callback`\n function each(callback) {\n // Don't bother continuing without a callback\n if (!callback) { return this; }\n // Iterate over the current collection\n for (var i = 0; i < this.length; i += 1) {\n // If the callback returns false\n if (callback.call(this[i], i, this[i]) === false) {\n // End the loop early\n return this;\n }\n }\n // Return `this` to allow chained DOM operations\n return this;\n }\n // eslint-disable-next-line\n function html(html) {\n if (typeof html === 'undefined') {\n return this[0] ? this[0].innerHTML : undefined;\n }\n\n for (var i = 0; i < this.length; i += 1) {\n this[i].innerHTML = html;\n }\n return this;\n }\n // eslint-disable-next-line\n function text(text) {\n if (typeof text === 'undefined') {\n if (this[0]) {\n return this[0].textContent.trim();\n }\n return null;\n }\n\n for (var i = 0; i < this.length; i += 1) {\n this[i].textContent = text;\n }\n return this;\n }\n function is(selector) {\n var el = this[0];\n var compareWith;\n var i;\n if (!el || typeof selector === 'undefined') { return false; }\n if (typeof selector === 'string') {\n if (el.matches) { return el.matches(selector); }\n else if (el.webkitMatchesSelector) { return el.webkitMatchesSelector(selector); }\n else if (el.msMatchesSelector) { return el.msMatchesSelector(selector); }\n\n compareWith = $(selector);\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) { return true; }\n }\n return false;\n } else if (selector === doc) { return el === doc; }\n else if (selector === win) { return el === win; }\n\n if (selector.nodeType || selector instanceof Dom7) {\n compareWith = selector.nodeType ? [selector] : selector;\n for (i = 0; i < compareWith.length; i += 1) {\n if (compareWith[i] === el) { return true; }\n }\n return false;\n }\n return false;\n }\n function index() {\n var child = this[0];\n var i;\n if (child) {\n i = 0;\n // eslint-disable-next-line\n while ((child = child.previousSibling) !== null) {\n if (child.nodeType === 1) { i += 1; }\n }\n return i;\n }\n return undefined;\n }\n // eslint-disable-next-line\n function eq(index) {\n if (typeof index === 'undefined') { return this; }\n var length = this.length;\n var returnIndex;\n if (index > length - 1) {\n return new Dom7([]);\n }\n if (index < 0) {\n returnIndex = length + index;\n if (returnIndex < 0) { return new Dom7([]); }\n return new Dom7([this[returnIndex]]);\n }\n return new Dom7([this[index]]);\n }\n function append() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var newChild;\n\n for (var k = 0; k < args.length; k += 1) {\n newChild = args[k];\n for (var i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n var tempDiv = doc.createElement('div');\n tempDiv.innerHTML = newChild;\n while (tempDiv.firstChild) {\n this[i].appendChild(tempDiv.firstChild);\n }\n } else if (newChild instanceof Dom7) {\n for (var j = 0; j < newChild.length; j += 1) {\n this[i].appendChild(newChild[j]);\n }\n } else {\n this[i].appendChild(newChild);\n }\n }\n }\n\n return this;\n }\n function prepend(newChild) {\n var i;\n var j;\n for (i = 0; i < this.length; i += 1) {\n if (typeof newChild === 'string') {\n var tempDiv = doc.createElement('div');\n tempDiv.innerHTML = newChild;\n for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n }\n } else if (newChild instanceof Dom7) {\n for (j = 0; j < newChild.length; j += 1) {\n this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n }\n } else {\n this[i].insertBefore(newChild, this[i].childNodes[0]);\n }\n }\n return this;\n }\n function next(selector) {\n if (this.length > 0) {\n if (selector) {\n if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n return new Dom7([this[0].nextElementSibling]);\n }\n return new Dom7([]);\n }\n\n if (this[0].nextElementSibling) { return new Dom7([this[0].nextElementSibling]); }\n return new Dom7([]);\n }\n return new Dom7([]);\n }\n function nextAll(selector) {\n var nextEls = [];\n var el = this[0];\n if (!el) { return new Dom7([]); }\n while (el.nextElementSibling) {\n var next = el.nextElementSibling; // eslint-disable-line\n if (selector) {\n if ($(next).is(selector)) { nextEls.push(next); }\n } else { nextEls.push(next); }\n el = next;\n }\n return new Dom7(nextEls);\n }\n function prev(selector) {\n if (this.length > 0) {\n var el = this[0];\n if (selector) {\n if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n return new Dom7([el.previousElementSibling]);\n }\n return new Dom7([]);\n }\n\n if (el.previousElementSibling) { return new Dom7([el.previousElementSibling]); }\n return new Dom7([]);\n }\n return new Dom7([]);\n }\n function prevAll(selector) {\n var prevEls = [];\n var el = this[0];\n if (!el) { return new Dom7([]); }\n while (el.previousElementSibling) {\n var prev = el.previousElementSibling; // eslint-disable-line\n if (selector) {\n if ($(prev).is(selector)) { prevEls.push(prev); }\n } else { prevEls.push(prev); }\n el = prev;\n }\n return new Dom7(prevEls);\n }\n function parent(selector) {\n var parents = []; // eslint-disable-line\n for (var i = 0; i < this.length; i += 1) {\n if (this[i].parentNode !== null) {\n if (selector) {\n if ($(this[i].parentNode).is(selector)) { parents.push(this[i].parentNode); }\n } else {\n parents.push(this[i].parentNode);\n }\n }\n }\n return $(unique(parents));\n }\n function parents(selector) {\n var parents = []; // eslint-disable-line\n for (var i = 0; i < this.length; i += 1) {\n var parent = this[i].parentNode; // eslint-disable-line\n while (parent) {\n if (selector) {\n if ($(parent).is(selector)) { parents.push(parent); }\n } else {\n parents.push(parent);\n }\n parent = parent.parentNode;\n }\n }\n return $(unique(parents));\n }\n function closest(selector) {\n var closest = this; // eslint-disable-line\n if (typeof selector === 'undefined') {\n return new Dom7([]);\n }\n if (!closest.is(selector)) {\n closest = closest.parents(selector).eq(0);\n }\n return closest;\n }\n function find(selector) {\n var foundElements = [];\n for (var i = 0; i < this.length; i += 1) {\n var found = this[i].querySelectorAll(selector);\n for (var j = 0; j < found.length; j += 1) {\n foundElements.push(found[j]);\n }\n }\n return new Dom7(foundElements);\n }\n function children(selector) {\n var children = []; // eslint-disable-line\n for (var i = 0; i < this.length; i += 1) {\n var childNodes = this[i].childNodes;\n\n for (var j = 0; j < childNodes.length; j += 1) {\n if (!selector) {\n if (childNodes[j].nodeType === 1) { children.push(childNodes[j]); }\n } else if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) {\n children.push(childNodes[j]);\n }\n }\n }\n return new Dom7(unique(children));\n }\n function remove() {\n for (var i = 0; i < this.length; i += 1) {\n if (this[i].parentNode) { this[i].parentNode.removeChild(this[i]); }\n }\n return this;\n }\n function add() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var dom = this;\n var i;\n var j;\n for (i = 0; i < args.length; i += 1) {\n var toAdd = $(args[i]);\n for (j = 0; j < toAdd.length; j += 1) {\n dom[dom.length] = toAdd[j];\n dom.length += 1;\n }\n }\n return dom;\n }\n\n var Methods = {\n addClass: addClass,\n removeClass: removeClass,\n hasClass: hasClass,\n toggleClass: toggleClass,\n attr: attr,\n removeAttr: removeAttr,\n data: data,\n transform: transform,\n transition: transition,\n on: on,\n off: off,\n trigger: trigger,\n transitionEnd: transitionEnd,\n outerWidth: outerWidth,\n outerHeight: outerHeight,\n offset: offset,\n css: css,\n each: each,\n html: html,\n text: text,\n is: is,\n index: index,\n eq: eq,\n append: append,\n prepend: prepend,\n next: next,\n nextAll: nextAll,\n prev: prev,\n prevAll: prevAll,\n parent: parent,\n parents: parents,\n closest: closest,\n find: find,\n children: children,\n remove: remove,\n add: add,\n styles: styles,\n };\n\n Object.keys(Methods).forEach(function (methodName) {\n $.fn[methodName] = Methods[methodName];\n });\n\n var Utils = {\n deleteProps: function deleteProps(obj) {\n var object = obj;\n Object.keys(object).forEach(function (key) {\n try {\n object[key] = null;\n } catch (e) {\n // no getter for object\n }\n try {\n delete object[key];\n } catch (e) {\n // something got wrong\n }\n });\n },\n nextTick: function nextTick(callback, delay) {\n if ( delay === void 0 ) delay = 0;\n\n return setTimeout(callback, delay);\n },\n now: function now() {\n return Date.now();\n },\n getTranslate: function getTranslate(el, axis) {\n if ( axis === void 0 ) axis = 'x';\n\n var matrix;\n var curTransform;\n var transformMatrix;\n\n var curStyle = win.getComputedStyle(el, null);\n\n if (win.WebKitCSSMatrix) {\n curTransform = curStyle.transform || curStyle.webkitTransform;\n if (curTransform.split(',').length > 6) {\n curTransform = curTransform.split(', ').map(function (a) { return a.replace(',', '.'); }).join(', ');\n }\n // Some old versions of Webkit choke when 'none' is passed; pass\n // empty string instead in this case\n transformMatrix = new win.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n } else {\n transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n matrix = transformMatrix.toString().split(',');\n }\n\n if (axis === 'x') {\n // Latest Chrome and webkits Fix\n if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m41; }\n // Crazy IE10 Matrix\n else if (matrix.length === 16) { curTransform = parseFloat(matrix[12]); }\n // Normal Browsers\n else { curTransform = parseFloat(matrix[4]); }\n }\n if (axis === 'y') {\n // Latest Chrome and webkits Fix\n if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m42; }\n // Crazy IE10 Matrix\n else if (matrix.length === 16) { curTransform = parseFloat(matrix[13]); }\n // Normal Browsers\n else { curTransform = parseFloat(matrix[5]); }\n }\n return curTransform || 0;\n },\n parseUrlQuery: function parseUrlQuery(url) {\n var query = {};\n var urlToParse = url || win.location.href;\n var i;\n var params;\n var param;\n var length;\n if (typeof urlToParse === 'string' && urlToParse.length) {\n urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\\S*\\?/, '') : '';\n params = urlToParse.split('&').filter(function (paramsPart) { return paramsPart !== ''; });\n length = params.length;\n\n for (i = 0; i < length; i += 1) {\n param = params[i].replace(/#\\S+/g, '').split('=');\n query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param[1]) || '';\n }\n }\n return query;\n },\n isObject: function isObject(o) {\n return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;\n },\n extend: function extend() {\n var args = [], len$1 = arguments.length;\n while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];\n\n var to = Object(args[0]);\n for (var i = 1; i < args.length; i += 1) {\n var nextSource = args[i];\n if (nextSource !== undefined && nextSource !== null) {\n var keysArray = Object.keys(Object(nextSource));\n for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n var nextKey = keysArray[nextIndex];\n var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n if (desc !== undefined && desc.enumerable) {\n if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {\n Utils.extend(to[nextKey], nextSource[nextKey]);\n } else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {\n to[nextKey] = {};\n Utils.extend(to[nextKey], nextSource[nextKey]);\n } else {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n }\n return to;\n },\n };\n\n var Support = (function Support() {\n var testDiv = doc.createElement('div');\n return {\n touch: (win.Modernizr && win.Modernizr.touch === true) || (function checkTouch() {\n return !!((win.navigator.maxTouchPoints > 0) || ('ontouchstart' in win) || (win.DocumentTouch && doc instanceof win.DocumentTouch));\n }()),\n\n pointerEvents: !!(win.navigator.pointerEnabled || win.PointerEvent || ('maxTouchPoints' in win.navigator && win.navigator.maxTouchPoints > 0)),\n prefixedPointerEvents: !!win.navigator.msPointerEnabled,\n\n transition: (function checkTransition() {\n var style = testDiv.style;\n return ('transition' in style || 'webkitTransition' in style || 'MozTransition' in style);\n }()),\n transforms3d: (win.Modernizr && win.Modernizr.csstransforms3d === true) || (function checkTransforms3d() {\n var style = testDiv.style;\n return ('webkitPerspective' in style || 'MozPerspective' in style || 'OPerspective' in style || 'MsPerspective' in style || 'perspective' in style);\n }()),\n\n flexbox: (function checkFlexbox() {\n var style = testDiv.style;\n var styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' ');\n for (var i = 0; i < styles.length; i += 1) {\n if (styles[i] in style) { return true; }\n }\n return false;\n }()),\n\n observer: (function checkObserver() {\n return ('MutationObserver' in win || 'WebkitMutationObserver' in win);\n }()),\n\n passiveListener: (function checkPassiveListener() {\n var supportsPassive = false;\n try {\n var opts = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line\n get: function get() {\n supportsPassive = true;\n },\n });\n win.addEventListener('testPassiveListener', null, opts);\n } catch (e) {\n // No support\n }\n return supportsPassive;\n }()),\n\n gestures: (function checkGestures() {\n return 'ongesturestart' in win;\n }()),\n };\n }());\n\n var Browser = (function Browser() {\n function isSafari() {\n var ua = win.navigator.userAgent.toLowerCase();\n return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0);\n }\n return {\n isIE: !!win.navigator.userAgent.match(/Trident/g) || !!win.navigator.userAgent.match(/MSIE/g),\n isEdge: !!win.navigator.userAgent.match(/Edge/g),\n isSafari: isSafari(),\n isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(win.navigator.userAgent),\n };\n }());\n\n var SwiperClass = function SwiperClass(params) {\n if ( params === void 0 ) params = {};\n\n var self = this;\n self.params = params;\n\n // Events\n self.eventsListeners = {};\n\n if (self.params && self.params.on) {\n Object.keys(self.params.on).forEach(function (eventName) {\n self.on(eventName, self.params.on[eventName]);\n });\n }\n };\n\n var staticAccessors = { components: { configurable: true } };\n\n SwiperClass.prototype.on = function on (events, handler, priority) {\n var self = this;\n if (typeof handler !== 'function') { return self; }\n var method = priority ? 'unshift' : 'push';\n events.split(' ').forEach(function (event) {\n if (!self.eventsListeners[event]) { self.eventsListeners[event] = []; }\n self.eventsListeners[event][method](handler);\n });\n return self;\n };\n\n SwiperClass.prototype.once = function once (events, handler, priority) {\n var self = this;\n if (typeof handler !== 'function') { return self; }\n function onceHandler() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n handler.apply(self, args);\n self.off(events, onceHandler);\n if (onceHandler.f7proxy) {\n delete onceHandler.f7proxy;\n }\n }\n onceHandler.f7proxy = handler;\n return self.on(events, onceHandler, priority);\n };\n\n SwiperClass.prototype.off = function off (events, handler) {\n var self = this;\n if (!self.eventsListeners) { return self; }\n events.split(' ').forEach(function (event) {\n if (typeof handler === 'undefined') {\n self.eventsListeners[event] = [];\n } else if (self.eventsListeners[event] && self.eventsListeners[event].length) {\n self.eventsListeners[event].forEach(function (eventHandler, index) {\n if (eventHandler === handler || (eventHandler.f7proxy && eventHandler.f7proxy === handler)) {\n self.eventsListeners[event].splice(index, 1);\n }\n });\n }\n });\n return self;\n };\n\n SwiperClass.prototype.emit = function emit () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var self = this;\n if (!self.eventsListeners) { return self; }\n var events;\n var data;\n var context;\n if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n events = args[0];\n data = args.slice(1, args.length);\n context = self;\n } else {\n events = args[0].events;\n data = args[0].data;\n context = args[0].context || self;\n }\n var eventsArray = Array.isArray(events) ? events : events.split(' ');\n eventsArray.forEach(function (event) {\n if (self.eventsListeners && self.eventsListeners[event]) {\n var handlers = [];\n self.eventsListeners[event].forEach(function (eventHandler) {\n handlers.push(eventHandler);\n });\n handlers.forEach(function (eventHandler) {\n eventHandler.apply(context, data);\n });\n }\n });\n return self;\n };\n\n SwiperClass.prototype.useModulesParams = function useModulesParams (instanceParams) {\n var instance = this;\n if (!instance.modules) { return; }\n Object.keys(instance.modules).forEach(function (moduleName) {\n var module = instance.modules[moduleName];\n // Extend params\n if (module.params) {\n Utils.extend(instanceParams, module.params);\n }\n });\n };\n\n SwiperClass.prototype.useModules = function useModules (modulesParams) {\n if ( modulesParams === void 0 ) modulesParams = {};\n\n var instance = this;\n if (!instance.modules) { return; }\n Object.keys(instance.modules).forEach(function (moduleName) {\n var module = instance.modules[moduleName];\n var moduleParams = modulesParams[moduleName] || {};\n // Extend instance methods and props\n if (module.instance) {\n Object.keys(module.instance).forEach(function (modulePropName) {\n var moduleProp = module.instance[modulePropName];\n if (typeof moduleProp === 'function') {\n instance[modulePropName] = moduleProp.bind(instance);\n } else {\n instance[modulePropName] = moduleProp;\n }\n });\n }\n // Add event listeners\n if (module.on && instance.on) {\n Object.keys(module.on).forEach(function (moduleEventName) {\n instance.on(moduleEventName, module.on[moduleEventName]);\n });\n }\n\n // Module create callback\n if (module.create) {\n module.create.bind(instance)(moduleParams);\n }\n });\n };\n\n staticAccessors.components.set = function (components) {\n var Class = this;\n if (!Class.use) { return; }\n Class.use(components);\n };\n\n SwiperClass.installModule = function installModule (module) {\n var params = [], len = arguments.length - 1;\n while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];\n\n var Class = this;\n if (!Class.prototype.modules) { Class.prototype.modules = {}; }\n var name = module.name || (((Object.keys(Class.prototype.modules).length) + \"_\" + (Utils.now())));\n Class.prototype.modules[name] = module;\n // Prototype\n if (module.proto) {\n Object.keys(module.proto).forEach(function (key) {\n Class.prototype[key] = module.proto[key];\n });\n }\n // Class\n if (module.static) {\n Object.keys(module.static).forEach(function (key) {\n Class[key] = module.static[key];\n });\n }\n // Callback\n if (module.install) {\n module.install.apply(Class, params);\n }\n return Class;\n };\n\n SwiperClass.use = function use (module) {\n var params = [], len = arguments.length - 1;\n while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];\n\n var Class = this;\n if (Array.isArray(module)) {\n module.forEach(function (m) { return Class.installModule(m); });\n return Class;\n }\n return Class.installModule.apply(Class, [ module ].concat( params ));\n };\n\n Object.defineProperties( SwiperClass, staticAccessors );\n\n function updateSize () {\n var swiper = this;\n var width;\n var height;\n var $el = swiper.$el;\n if (typeof swiper.params.width !== 'undefined') {\n width = swiper.params.width;\n } else {\n width = $el[0].clientWidth;\n }\n if (typeof swiper.params.height !== 'undefined') {\n height = swiper.params.height;\n } else {\n height = $el[0].clientHeight;\n }\n if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {\n return;\n }\n\n // Subtract paddings\n width = width - parseInt($el.css('padding-left'), 10) - parseInt($el.css('padding-right'), 10);\n height = height - parseInt($el.css('padding-top'), 10) - parseInt($el.css('padding-bottom'), 10);\n\n Utils.extend(swiper, {\n width: width,\n height: height,\n size: swiper.isHorizontal() ? width : height,\n });\n }\n\n function updateSlides () {\n var swiper = this;\n var params = swiper.params;\n\n var $wrapperEl = swiper.$wrapperEl;\n var swiperSize = swiper.size;\n var rtl = swiper.rtlTranslate;\n var wrongRTL = swiper.wrongRTL;\n var isVirtual = swiper.virtual && params.virtual.enabled;\n var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n var slides = $wrapperEl.children((\".\" + (swiper.params.slideClass)));\n var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n var snapGrid = [];\n var slidesGrid = [];\n var slidesSizesGrid = [];\n\n var offsetBefore = params.slidesOffsetBefore;\n if (typeof offsetBefore === 'function') {\n offsetBefore = params.slidesOffsetBefore.call(swiper);\n }\n\n var offsetAfter = params.slidesOffsetAfter;\n if (typeof offsetAfter === 'function') {\n offsetAfter = params.slidesOffsetAfter.call(swiper);\n }\n\n var previousSnapGridLength = swiper.snapGrid.length;\n var previousSlidesGridLength = swiper.snapGrid.length;\n\n var spaceBetween = params.spaceBetween;\n var slidePosition = -offsetBefore;\n var prevSlideSize = 0;\n var index = 0;\n if (typeof swiperSize === 'undefined') {\n return;\n }\n if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;\n }\n\n swiper.virtualSize = -spaceBetween;\n\n // reset margins\n if (rtl) { slides.css({ marginLeft: '', marginTop: '' }); }\n else { slides.css({ marginRight: '', marginBottom: '' }); }\n\n var slidesNumberEvenToRows;\n if (params.slidesPerColumn > 1) {\n if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) {\n slidesNumberEvenToRows = slidesLength;\n } else {\n slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn;\n }\n if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') {\n slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn);\n }\n }\n\n // Calc slides\n var slideSize;\n var slidesPerColumn = params.slidesPerColumn;\n var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;\n var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn);\n for (var i = 0; i < slidesLength; i += 1) {\n slideSize = 0;\n var slide = slides.eq(i);\n if (params.slidesPerColumn > 1) {\n // Set slides order\n var newSlideOrderIndex = (void 0);\n var column = (void 0);\n var row = (void 0);\n if (params.slidesPerColumnFill === 'column') {\n column = Math.floor(i / slidesPerColumn);\n row = i - (column * slidesPerColumn);\n if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) {\n row += 1;\n if (row >= slidesPerColumn) {\n row = 0;\n column += 1;\n }\n }\n newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn);\n slide\n .css({\n '-webkit-box-ordinal-group': newSlideOrderIndex,\n '-moz-box-ordinal-group': newSlideOrderIndex,\n '-ms-flex-order': newSlideOrderIndex,\n '-webkit-order': newSlideOrderIndex,\n order: newSlideOrderIndex,\n });\n } else {\n row = Math.floor(i / slidesPerRow);\n column = i - (row * slidesPerRow);\n }\n slide\n .css(\n (\"margin-\" + (swiper.isHorizontal() ? 'top' : 'left')),\n (row !== 0 && params.spaceBetween) && (((params.spaceBetween) + \"px\"))\n )\n .attr('data-swiper-column', column)\n .attr('data-swiper-row', row);\n }\n if (slide.css('display') === 'none') { continue; } // eslint-disable-line\n\n if (params.slidesPerView === 'auto') {\n var slideStyles = win.getComputedStyle(slide[0], null);\n var currentTransform = slide[0].style.transform;\n var currentWebKitTransform = slide[0].style.webkitTransform;\n if (currentTransform) {\n slide[0].style.transform = 'none';\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = 'none';\n }\n if (params.roundLengths) {\n slideSize = swiper.isHorizontal()\n ? slide.outerWidth(true)\n : slide.outerHeight(true);\n } else {\n // eslint-disable-next-line\n if (swiper.isHorizontal()) {\n var width = parseFloat(slideStyles.getPropertyValue('width'));\n var paddingLeft = parseFloat(slideStyles.getPropertyValue('padding-left'));\n var paddingRight = parseFloat(slideStyles.getPropertyValue('padding-right'));\n var marginLeft = parseFloat(slideStyles.getPropertyValue('margin-left'));\n var marginRight = parseFloat(slideStyles.getPropertyValue('margin-right'));\n var boxSizing = slideStyles.getPropertyValue('box-sizing');\n if (boxSizing && boxSizing === 'border-box') {\n slideSize = width + marginLeft + marginRight;\n } else {\n slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight;\n }\n } else {\n var height = parseFloat(slideStyles.getPropertyValue('height'));\n var paddingTop = parseFloat(slideStyles.getPropertyValue('padding-top'));\n var paddingBottom = parseFloat(slideStyles.getPropertyValue('padding-bottom'));\n var marginTop = parseFloat(slideStyles.getPropertyValue('margin-top'));\n var marginBottom = parseFloat(slideStyles.getPropertyValue('margin-bottom'));\n var boxSizing$1 = slideStyles.getPropertyValue('box-sizing');\n if (boxSizing$1 && boxSizing$1 === 'border-box') {\n slideSize = height + marginTop + marginBottom;\n } else {\n slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom;\n }\n }\n }\n if (currentTransform) {\n slide[0].style.transform = currentTransform;\n }\n if (currentWebKitTransform) {\n slide[0].style.webkitTransform = currentWebKitTransform;\n }\n if (params.roundLengths) { slideSize = Math.floor(slideSize); }\n } else {\n slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView;\n if (params.roundLengths) { slideSize = Math.floor(slideSize); }\n\n if (slides[i]) {\n if (swiper.isHorizontal()) {\n slides[i].style.width = slideSize + \"px\";\n } else {\n slides[i].style.height = slideSize + \"px\";\n }\n }\n }\n if (slides[i]) {\n slides[i].swiperSlideSize = slideSize;\n }\n slidesSizesGrid.push(slideSize);\n\n\n if (params.centeredSlides) {\n slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween;\n if (prevSlideSize === 0 && i !== 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }\n if (i === 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }\n if (Math.abs(slidePosition) < 1 / 1000) { slidePosition = 0; }\n if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }\n if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }\n slidesGrid.push(slidePosition);\n } else {\n if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }\n if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }\n slidesGrid.push(slidePosition);\n slidePosition = slidePosition + slideSize + spaceBetween;\n }\n\n swiper.virtualSize += slideSize + spaceBetween;\n\n prevSlideSize = slideSize;\n\n index += 1;\n }\n swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n var newSlidesGrid;\n\n if (\n rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + \"px\") });\n }\n if (!Support.flexbox || params.setWrapperSize) {\n if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + \"px\") }); }\n else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + \"px\") }); }\n }\n\n if (params.slidesPerColumn > 1) {\n swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows;\n swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween;\n if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + \"px\") }); }\n else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + \"px\") }); }\n if (params.centeredSlides) {\n newSlidesGrid = [];\n for (var i$1 = 0; i$1 < snapGrid.length; i$1 += 1) {\n var slidesGridItem = snapGrid[i$1];\n if (params.roundLengths) { slidesGridItem = Math.floor(slidesGridItem); }\n if (snapGrid[i$1] < swiper.virtualSize + snapGrid[0]) { newSlidesGrid.push(slidesGridItem); }\n }\n snapGrid = newSlidesGrid;\n }\n }\n\n // Remove last grid elements depending on width\n if (!params.centeredSlides) {\n newSlidesGrid = [];\n for (var i$2 = 0; i$2 < snapGrid.length; i$2 += 1) {\n var slidesGridItem$1 = snapGrid[i$2];\n if (params.roundLengths) { slidesGridItem$1 = Math.floor(slidesGridItem$1); }\n if (snapGrid[i$2] <= swiper.virtualSize - swiperSize) {\n newSlidesGrid.push(slidesGridItem$1);\n }\n }\n snapGrid = newSlidesGrid;\n if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {\n snapGrid.push(swiper.virtualSize - swiperSize);\n }\n }\n if (snapGrid.length === 0) { snapGrid = [0]; }\n\n if (params.spaceBetween !== 0) {\n if (swiper.isHorizontal()) {\n if (rtl) { slides.css({ marginLeft: (spaceBetween + \"px\") }); }\n else { slides.css({ marginRight: (spaceBetween + \"px\") }); }\n } else { slides.css({ marginBottom: (spaceBetween + \"px\") }); }\n }\n\n if (params.centerInsufficientSlides) {\n var allSlidesSize = 0;\n slidesSizesGrid.forEach(function (slideSizeValue) {\n allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n });\n allSlidesSize -= params.spaceBetween;\n if (allSlidesSize < swiperSize) {\n var allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n snapGrid.forEach(function (snap, snapIndex) {\n snapGrid[snapIndex] = snap - allSlidesOffset;\n });\n slidesGrid.forEach(function (snap, snapIndex) {\n slidesGrid[snapIndex] = snap + allSlidesOffset;\n });\n }\n }\n\n Utils.extend(swiper, {\n slides: slides,\n snapGrid: snapGrid,\n slidesGrid: slidesGrid,\n slidesSizesGrid: slidesSizesGrid,\n });\n\n if (slidesLength !== previousSlidesLength) {\n swiper.emit('slidesLengthChange');\n }\n if (snapGrid.length !== previousSnapGridLength) {\n if (swiper.params.watchOverflow) { swiper.checkOverflow(); }\n swiper.emit('snapGridLengthChange');\n }\n if (slidesGrid.length !== previousSlidesGridLength) {\n swiper.emit('slidesGridLengthChange');\n }\n\n if (params.watchSlidesProgress || params.watchSlidesVisibility) {\n swiper.updateSlidesOffset();\n }\n }\n\n function updateAutoHeight (speed) {\n var swiper = this;\n var activeSlides = [];\n var newHeight = 0;\n var i;\n if (typeof speed === 'number') {\n swiper.setTransition(speed);\n } else if (speed === true) {\n swiper.setTransition(swiper.params.speed);\n }\n // Find slides currently in view\n if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n var index = swiper.activeIndex + i;\n if (index > swiper.slides.length) { break; }\n activeSlides.push(swiper.slides.eq(index)[0]);\n }\n } else {\n activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]);\n }\n\n // Find new height from highest slide in view\n for (i = 0; i < activeSlides.length; i += 1) {\n if (typeof activeSlides[i] !== 'undefined') {\n var height = activeSlides[i].offsetHeight;\n newHeight = height > newHeight ? height : newHeight;\n }\n }\n\n // Update Height\n if (newHeight) { swiper.$wrapperEl.css('height', (newHeight + \"px\")); }\n }\n\n function updateSlidesOffset () {\n var swiper = this;\n var slides = swiper.slides;\n for (var i = 0; i < slides.length; i += 1) {\n slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;\n }\n }\n\n function updateSlidesProgress (translate) {\n if ( translate === void 0 ) translate = (this && this.translate) || 0;\n\n var swiper = this;\n var params = swiper.params;\n\n var slides = swiper.slides;\n var rtl = swiper.rtlTranslate;\n\n if (slides.length === 0) { return; }\n if (typeof slides[0].swiperSlideOffset === 'undefined') { swiper.updateSlidesOffset(); }\n\n var offsetCenter = -translate;\n if (rtl) { offsetCenter = translate; }\n\n // Visible Slides\n slides.removeClass(params.slideVisibleClass);\n\n swiper.visibleSlidesIndexes = [];\n swiper.visibleSlides = [];\n\n for (var i = 0; i < slides.length; i += 1) {\n var slide = slides[i];\n var slideProgress = (\n (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset\n ) / (slide.swiperSlideSize + params.spaceBetween);\n if (params.watchSlidesVisibility) {\n var slideBefore = -(offsetCenter - slide.swiperSlideOffset);\n var slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n var isVisible = (slideBefore >= 0 && slideBefore < swiper.size)\n || (slideAfter > 0 && slideAfter <= swiper.size)\n || (slideBefore <= 0 && slideAfter >= swiper.size);\n if (isVisible) {\n swiper.visibleSlides.push(slide);\n swiper.visibleSlidesIndexes.push(i);\n slides.eq(i).addClass(params.slideVisibleClass);\n }\n }\n slide.progress = rtl ? -slideProgress : slideProgress;\n }\n swiper.visibleSlides = $(swiper.visibleSlides);\n }\n\n function updateProgress (translate) {\n if ( translate === void 0 ) translate = (this && this.translate) || 0;\n\n var swiper = this;\n var params = swiper.params;\n\n var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n var progress = swiper.progress;\n var isBeginning = swiper.isBeginning;\n var isEnd = swiper.isEnd;\n var wasBeginning = isBeginning;\n var wasEnd = isEnd;\n if (translatesDiff === 0) {\n progress = 0;\n isBeginning = true;\n isEnd = true;\n } else {\n progress = (translate - swiper.minTranslate()) / (translatesDiff);\n isBeginning = progress <= 0;\n isEnd = progress >= 1;\n }\n Utils.extend(swiper, {\n progress: progress,\n isBeginning: isBeginning,\n isEnd: isEnd,\n });\n\n if (params.watchSlidesProgress || params.watchSlidesVisibility) { swiper.updateSlidesProgress(translate); }\n\n if (isBeginning && !wasBeginning) {\n swiper.emit('reachBeginning toEdge');\n }\n if (isEnd && !wasEnd) {\n swiper.emit('reachEnd toEdge');\n }\n if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {\n swiper.emit('fromEdge');\n }\n\n swiper.emit('progress', progress);\n }\n\n function updateSlidesClasses () {\n var swiper = this;\n\n var slides = swiper.slides;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n var activeIndex = swiper.activeIndex;\n var realIndex = swiper.realIndex;\n var isVirtual = swiper.virtual && params.virtual.enabled;\n\n slides.removeClass(((params.slideActiveClass) + \" \" + (params.slideNextClass) + \" \" + (params.slidePrevClass) + \" \" + (params.slideDuplicateActiveClass) + \" \" + (params.slideDuplicateNextClass) + \" \" + (params.slideDuplicatePrevClass)));\n\n var activeSlide;\n if (isVirtual) {\n activeSlide = swiper.$wrapperEl.find((\".\" + (params.slideClass) + \"[data-swiper-slide-index=\\\"\" + activeIndex + \"\\\"]\"));\n } else {\n activeSlide = slides.eq(activeIndex);\n }\n\n // Active classes\n activeSlide.addClass(params.slideActiveClass);\n\n if (params.loop) {\n // Duplicate to all looped slides\n if (activeSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children((\".\" + (params.slideClass) + \":not(.\" + (params.slideDuplicateClass) + \")[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]\"))\n .addClass(params.slideDuplicateActiveClass);\n } else {\n $wrapperEl\n .children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass) + \"[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]\"))\n .addClass(params.slideDuplicateActiveClass);\n }\n }\n // Next Slide\n var nextSlide = activeSlide.nextAll((\".\" + (params.slideClass))).eq(0).addClass(params.slideNextClass);\n if (params.loop && nextSlide.length === 0) {\n nextSlide = slides.eq(0);\n nextSlide.addClass(params.slideNextClass);\n }\n // Prev Slide\n var prevSlide = activeSlide.prevAll((\".\" + (params.slideClass))).eq(0).addClass(params.slidePrevClass);\n if (params.loop && prevSlide.length === 0) {\n prevSlide = slides.eq(-1);\n prevSlide.addClass(params.slidePrevClass);\n }\n if (params.loop) {\n // Duplicate to all looped slides\n if (nextSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children((\".\" + (params.slideClass) + \":not(.\" + (params.slideDuplicateClass) + \")[data-swiper-slide-index=\\\"\" + (nextSlide.attr('data-swiper-slide-index')) + \"\\\"]\"))\n .addClass(params.slideDuplicateNextClass);\n } else {\n $wrapperEl\n .children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass) + \"[data-swiper-slide-index=\\\"\" + (nextSlide.attr('data-swiper-slide-index')) + \"\\\"]\"))\n .addClass(params.slideDuplicateNextClass);\n }\n if (prevSlide.hasClass(params.slideDuplicateClass)) {\n $wrapperEl\n .children((\".\" + (params.slideClass) + \":not(.\" + (params.slideDuplicateClass) + \")[data-swiper-slide-index=\\\"\" + (prevSlide.attr('data-swiper-slide-index')) + \"\\\"]\"))\n .addClass(params.slideDuplicatePrevClass);\n } else {\n $wrapperEl\n .children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass) + \"[data-swiper-slide-index=\\\"\" + (prevSlide.attr('data-swiper-slide-index')) + \"\\\"]\"))\n .addClass(params.slideDuplicatePrevClass);\n }\n }\n }\n\n function updateActiveIndex (newActiveIndex) {\n var swiper = this;\n var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n var slidesGrid = swiper.slidesGrid;\n var snapGrid = swiper.snapGrid;\n var params = swiper.params;\n var previousIndex = swiper.activeIndex;\n var previousRealIndex = swiper.realIndex;\n var previousSnapIndex = swiper.snapIndex;\n var activeIndex = newActiveIndex;\n var snapIndex;\n if (typeof activeIndex === 'undefined') {\n for (var i = 0; i < slidesGrid.length; i += 1) {\n if (typeof slidesGrid[i + 1] !== 'undefined') {\n if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) {\n activeIndex = i;\n } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n activeIndex = i + 1;\n }\n } else if (translate >= slidesGrid[i]) {\n activeIndex = i;\n }\n }\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n if (activeIndex < 0 || typeof activeIndex === 'undefined') { activeIndex = 0; }\n }\n }\n if (snapGrid.indexOf(translate) >= 0) {\n snapIndex = snapGrid.indexOf(translate);\n } else {\n snapIndex = Math.floor(activeIndex / params.slidesPerGroup);\n }\n if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }\n if (activeIndex === previousIndex) {\n if (snapIndex !== previousSnapIndex) {\n swiper.snapIndex = snapIndex;\n swiper.emit('snapIndexChange');\n }\n return;\n }\n\n // Get real index\n var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);\n\n Utils.extend(swiper, {\n snapIndex: snapIndex,\n realIndex: realIndex,\n previousIndex: previousIndex,\n activeIndex: activeIndex,\n });\n swiper.emit('activeIndexChange');\n swiper.emit('snapIndexChange');\n if (previousRealIndex !== realIndex) {\n swiper.emit('realIndexChange');\n }\n swiper.emit('slideChange');\n }\n\n function updateClickedSlide (e) {\n var swiper = this;\n var params = swiper.params;\n var slide = $(e.target).closest((\".\" + (params.slideClass)))[0];\n var slideFound = false;\n if (slide) {\n for (var i = 0; i < swiper.slides.length; i += 1) {\n if (swiper.slides[i] === slide) { slideFound = true; }\n }\n }\n\n if (slide && slideFound) {\n swiper.clickedSlide = slide;\n if (swiper.virtual && swiper.params.virtual.enabled) {\n swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);\n } else {\n swiper.clickedIndex = $(slide).index();\n }\n } else {\n swiper.clickedSlide = undefined;\n swiper.clickedIndex = undefined;\n return;\n }\n if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {\n swiper.slideToClickedSlide();\n }\n }\n\n var update = {\n updateSize: updateSize,\n updateSlides: updateSlides,\n updateAutoHeight: updateAutoHeight,\n updateSlidesOffset: updateSlidesOffset,\n updateSlidesProgress: updateSlidesProgress,\n updateProgress: updateProgress,\n updateSlidesClasses: updateSlidesClasses,\n updateActiveIndex: updateActiveIndex,\n updateClickedSlide: updateClickedSlide,\n };\n\n function getTranslate (axis) {\n if ( axis === void 0 ) axis = this.isHorizontal() ? 'x' : 'y';\n\n var swiper = this;\n\n var params = swiper.params;\n var rtl = swiper.rtlTranslate;\n var translate = swiper.translate;\n var $wrapperEl = swiper.$wrapperEl;\n\n if (params.virtualTranslate) {\n return rtl ? -translate : translate;\n }\n\n var currentTranslate = Utils.getTranslate($wrapperEl[0], axis);\n if (rtl) { currentTranslate = -currentTranslate; }\n\n return currentTranslate || 0;\n }\n\n function setTranslate (translate, byController) {\n var swiper = this;\n var rtl = swiper.rtlTranslate;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n var progress = swiper.progress;\n var x = 0;\n var y = 0;\n var z = 0;\n\n if (swiper.isHorizontal()) {\n x = rtl ? -translate : translate;\n } else {\n y = translate;\n }\n\n if (params.roundLengths) {\n x = Math.floor(x);\n y = Math.floor(y);\n }\n\n if (!params.virtualTranslate) {\n if (Support.transforms3d) { $wrapperEl.transform((\"translate3d(\" + x + \"px, \" + y + \"px, \" + z + \"px)\")); }\n else { $wrapperEl.transform((\"translate(\" + x + \"px, \" + y + \"px)\")); }\n }\n swiper.previousTranslate = swiper.translate;\n swiper.translate = swiper.isHorizontal() ? x : y;\n\n // Check if we need to update progress\n var newProgress;\n var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n if (translatesDiff === 0) {\n newProgress = 0;\n } else {\n newProgress = (translate - swiper.minTranslate()) / (translatesDiff);\n }\n if (newProgress !== progress) {\n swiper.updateProgress(translate);\n }\n\n swiper.emit('setTranslate', swiper.translate, byController);\n }\n\n function minTranslate () {\n return (-this.snapGrid[0]);\n }\n\n function maxTranslate () {\n return (-this.snapGrid[this.snapGrid.length - 1]);\n }\n\n var translate = {\n getTranslate: getTranslate,\n setTranslate: setTranslate,\n minTranslate: minTranslate,\n maxTranslate: maxTranslate,\n };\n\n function setTransition (duration, byController) {\n var swiper = this;\n\n swiper.$wrapperEl.transition(duration);\n\n swiper.emit('setTransition', duration, byController);\n }\n\n function transitionStart (runCallbacks, direction) {\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var activeIndex = swiper.activeIndex;\n var params = swiper.params;\n var previousIndex = swiper.previousIndex;\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n\n var dir = direction;\n if (!dir) {\n if (activeIndex > previousIndex) { dir = 'next'; }\n else if (activeIndex < previousIndex) { dir = 'prev'; }\n else { dir = 'reset'; }\n }\n\n swiper.emit('transitionStart');\n\n if (runCallbacks && activeIndex !== previousIndex) {\n if (dir === 'reset') {\n swiper.emit('slideResetTransitionStart');\n return;\n }\n swiper.emit('slideChangeTransitionStart');\n if (dir === 'next') {\n swiper.emit('slideNextTransitionStart');\n } else {\n swiper.emit('slidePrevTransitionStart');\n }\n }\n }\n\n function transitionEnd$1 (runCallbacks, direction) {\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var activeIndex = swiper.activeIndex;\n var previousIndex = swiper.previousIndex;\n swiper.animating = false;\n swiper.setTransition(0);\n\n var dir = direction;\n if (!dir) {\n if (activeIndex > previousIndex) { dir = 'next'; }\n else if (activeIndex < previousIndex) { dir = 'prev'; }\n else { dir = 'reset'; }\n }\n\n swiper.emit('transitionEnd');\n\n if (runCallbacks && activeIndex !== previousIndex) {\n if (dir === 'reset') {\n swiper.emit('slideResetTransitionEnd');\n return;\n }\n swiper.emit('slideChangeTransitionEnd');\n if (dir === 'next') {\n swiper.emit('slideNextTransitionEnd');\n } else {\n swiper.emit('slidePrevTransitionEnd');\n }\n }\n }\n\n var transition$1 = {\n setTransition: setTransition,\n transitionStart: transitionStart,\n transitionEnd: transitionEnd$1,\n };\n\n function slideTo (index, speed, runCallbacks, internal) {\n if ( index === void 0 ) index = 0;\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var slideIndex = index;\n if (slideIndex < 0) { slideIndex = 0; }\n\n var params = swiper.params;\n var snapGrid = swiper.snapGrid;\n var slidesGrid = swiper.slidesGrid;\n var previousIndex = swiper.previousIndex;\n var activeIndex = swiper.activeIndex;\n var rtl = swiper.rtlTranslate;\n if (swiper.animating && params.preventInteractionOnTransition) {\n return false;\n }\n\n var snapIndex = Math.floor(slideIndex / params.slidesPerGroup);\n if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }\n\n if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n swiper.emit('beforeSlideChangeStart');\n }\n\n var translate = -snapGrid[snapIndex];\n\n // Update progress\n swiper.updateProgress(translate);\n\n // Normalize slideIndex\n if (params.normalizeSlideIndex) {\n for (var i = 0; i < slidesGrid.length; i += 1) {\n if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) {\n slideIndex = i;\n }\n }\n }\n // Directions locks\n if (swiper.initialized && slideIndex !== activeIndex) {\n if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {\n return false;\n }\n if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {\n if ((activeIndex || 0) !== slideIndex) { return false; }\n }\n }\n\n var direction;\n if (slideIndex > activeIndex) { direction = 'next'; }\n else if (slideIndex < activeIndex) { direction = 'prev'; }\n else { direction = 'reset'; }\n\n\n // Update Index\n if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {\n swiper.updateActiveIndex(slideIndex);\n // Update Height\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n swiper.updateSlidesClasses();\n if (params.effect !== 'slide') {\n swiper.setTranslate(translate);\n }\n if (direction !== 'reset') {\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n }\n return false;\n }\n\n if (speed === 0 || !Support.transition) {\n swiper.setTransition(0);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n swiper.transitionEnd(runCallbacks, direction);\n } else {\n swiper.setTransition(speed);\n swiper.setTranslate(translate);\n swiper.updateActiveIndex(slideIndex);\n swiper.updateSlidesClasses();\n swiper.emit('beforeTransitionStart', speed, internal);\n swiper.transitionStart(runCallbacks, direction);\n if (!swiper.animating) {\n swiper.animating = true;\n if (!swiper.onSlideToWrapperTransitionEnd) {\n swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n if (!swiper || swiper.destroyed) { return; }\n if (e.target !== this) { return; }\n swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n swiper.onSlideToWrapperTransitionEnd = null;\n delete swiper.onSlideToWrapperTransitionEnd;\n swiper.transitionEnd(runCallbacks, direction);\n };\n }\n swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n }\n }\n\n return true;\n }\n\n function slideToLoop (index, speed, runCallbacks, internal) {\n if ( index === void 0 ) index = 0;\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var newIndex = index;\n if (swiper.params.loop) {\n newIndex += swiper.loopedSlides;\n }\n\n return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n }\n\n /* eslint no-unused-vars: \"off\" */\n function slideNext (speed, runCallbacks, internal) {\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var params = swiper.params;\n var animating = swiper.animating;\n if (params.loop) {\n if (animating) { return false; }\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);\n }\n return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);\n }\n\n /* eslint no-unused-vars: \"off\" */\n function slidePrev (speed, runCallbacks, internal) {\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var params = swiper.params;\n var animating = swiper.animating;\n var snapGrid = swiper.snapGrid;\n var slidesGrid = swiper.slidesGrid;\n var rtlTranslate = swiper.rtlTranslate;\n\n if (params.loop) {\n if (animating) { return false; }\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n }\n var translate = rtlTranslate ? swiper.translate : -swiper.translate;\n function normalize(val) {\n if (val < 0) { return -Math.floor(Math.abs(val)); }\n return Math.floor(val);\n }\n var normalizedTranslate = normalize(translate);\n var normalizedSnapGrid = snapGrid.map(function (val) { return normalize(val); });\n var normalizedSlidesGrid = slidesGrid.map(function (val) { return normalize(val); });\n\n var currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)];\n var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n var prevIndex;\n if (typeof prevSnap !== 'undefined') {\n prevIndex = slidesGrid.indexOf(prevSnap);\n if (prevIndex < 0) { prevIndex = swiper.activeIndex - 1; }\n }\n return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n }\n\n /* eslint no-unused-vars: \"off\" */\n function slideReset (speed, runCallbacks, internal) {\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n }\n\n /* eslint no-unused-vars: \"off\" */\n function slideToClosest (speed, runCallbacks, internal) {\n if ( speed === void 0 ) speed = this.params.speed;\n if ( runCallbacks === void 0 ) runCallbacks = true;\n\n var swiper = this;\n var index = swiper.activeIndex;\n var snapIndex = Math.floor(index / swiper.params.slidesPerGroup);\n\n if (snapIndex < swiper.snapGrid.length - 1) {\n var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n var currentSnap = swiper.snapGrid[snapIndex];\n var nextSnap = swiper.snapGrid[snapIndex + 1];\n\n if ((translate - currentSnap) > (nextSnap - currentSnap) / 2) {\n index = swiper.params.slidesPerGroup;\n }\n }\n\n return swiper.slideTo(index, speed, runCallbacks, internal);\n }\n\n function slideToClickedSlide () {\n var swiper = this;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n\n var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n var slideToIndex = swiper.clickedIndex;\n var realIndex;\n if (params.loop) {\n if (swiper.animating) { return; }\n realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n if (params.centeredSlides) {\n if (\n (slideToIndex < swiper.loopedSlides - (slidesPerView / 2))\n || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2))\n ) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children((\".\" + (params.slideClass) + \"[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]:not(.\" + (params.slideDuplicateClass) + \")\"))\n .eq(0)\n .index();\n\n Utils.nextTick(function () {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n swiper.loopFix();\n slideToIndex = $wrapperEl\n .children((\".\" + (params.slideClass) + \"[data-swiper-slide-index=\\\"\" + realIndex + \"\\\"]:not(.\" + (params.slideDuplicateClass) + \")\"))\n .eq(0)\n .index();\n\n Utils.nextTick(function () {\n swiper.slideTo(slideToIndex);\n });\n } else {\n swiper.slideTo(slideToIndex);\n }\n } else {\n swiper.slideTo(slideToIndex);\n }\n }\n\n var slide = {\n slideTo: slideTo,\n slideToLoop: slideToLoop,\n slideNext: slideNext,\n slidePrev: slidePrev,\n slideReset: slideReset,\n slideToClosest: slideToClosest,\n slideToClickedSlide: slideToClickedSlide,\n };\n\n function loopCreate () {\n var swiper = this;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n // Remove duplicated slides\n $wrapperEl.children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass))).remove();\n\n var slides = $wrapperEl.children((\".\" + (params.slideClass)));\n\n if (params.loopFillGroupWithBlank) {\n var blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);\n if (blankSlidesNum !== params.slidesPerGroup) {\n for (var i = 0; i < blankSlidesNum; i += 1) {\n var blankNode = $(doc.createElement('div')).addClass(((params.slideClass) + \" \" + (params.slideBlankClass)));\n $wrapperEl.append(blankNode);\n }\n slides = $wrapperEl.children((\".\" + (params.slideClass)));\n }\n }\n\n if (params.slidesPerView === 'auto' && !params.loopedSlides) { params.loopedSlides = slides.length; }\n\n swiper.loopedSlides = parseInt(params.loopedSlides || params.slidesPerView, 10);\n swiper.loopedSlides += params.loopAdditionalSlides;\n if (swiper.loopedSlides > slides.length) {\n swiper.loopedSlides = slides.length;\n }\n\n var prependSlides = [];\n var appendSlides = [];\n slides.each(function (index, el) {\n var slide = $(el);\n if (index < swiper.loopedSlides) { appendSlides.push(el); }\n if (index < slides.length && index >= slides.length - swiper.loopedSlides) { prependSlides.push(el); }\n slide.attr('data-swiper-slide-index', index);\n });\n for (var i$1 = 0; i$1 < appendSlides.length; i$1 += 1) {\n $wrapperEl.append($(appendSlides[i$1].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n for (var i$2 = prependSlides.length - 1; i$2 >= 0; i$2 -= 1) {\n $wrapperEl.prepend($(prependSlides[i$2].cloneNode(true)).addClass(params.slideDuplicateClass));\n }\n }\n\n function loopFix () {\n var swiper = this;\n var params = swiper.params;\n var activeIndex = swiper.activeIndex;\n var slides = swiper.slides;\n var loopedSlides = swiper.loopedSlides;\n var allowSlidePrev = swiper.allowSlidePrev;\n var allowSlideNext = swiper.allowSlideNext;\n var snapGrid = swiper.snapGrid;\n var rtl = swiper.rtlTranslate;\n var newIndex;\n swiper.allowSlidePrev = true;\n swiper.allowSlideNext = true;\n\n var snapTranslate = -snapGrid[activeIndex];\n var diff = snapTranslate - swiper.getTranslate();\n\n\n // Fix For Negative Oversliding\n if (activeIndex < loopedSlides) {\n newIndex = (slides.length - (loopedSlides * 3)) + activeIndex;\n newIndex += loopedSlides;\n var slideChanged = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n } else if ((params.slidesPerView === 'auto' && activeIndex >= loopedSlides * 2) || (activeIndex >= slides.length - loopedSlides)) {\n // Fix For Positive Oversliding\n newIndex = -slides.length + activeIndex + loopedSlides;\n newIndex += loopedSlides;\n var slideChanged$1 = swiper.slideTo(newIndex, 0, false, true);\n if (slideChanged$1 && diff !== 0) {\n swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n }\n }\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n }\n\n function loopDestroy () {\n var swiper = this;\n var $wrapperEl = swiper.$wrapperEl;\n var params = swiper.params;\n var slides = swiper.slides;\n $wrapperEl.children((\".\" + (params.slideClass) + \".\" + (params.slideDuplicateClass) + \",.\" + (params.slideClass) + \".\" + (params.slideBlankClass))).remove();\n slides.removeAttr('data-swiper-slide-index');\n }\n\n var loop = {\n loopCreate: loopCreate,\n loopFix: loopFix,\n loopDestroy: loopDestroy,\n };\n\n function setGrabCursor (moving) {\n var swiper = this;\n if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }\n var el = swiper.el;\n el.style.cursor = 'move';\n el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n el.style.cursor = moving ? 'grabbing' : 'grab';\n }\n\n function unsetGrabCursor () {\n var swiper = this;\n if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }\n swiper.el.style.cursor = '';\n }\n\n var grabCursor = {\n setGrabCursor: setGrabCursor,\n unsetGrabCursor: unsetGrabCursor,\n };\n\n function appendSlide (slides) {\n var swiper = this;\n var $wrapperEl = swiper.$wrapperEl;\n var params = swiper.params;\n if (params.loop) {\n swiper.loopDestroy();\n }\n if (typeof slides === 'object' && 'length' in slides) {\n for (var i = 0; i < slides.length; i += 1) {\n if (slides[i]) { $wrapperEl.append(slides[i]); }\n }\n } else {\n $wrapperEl.append(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!(params.observer && Support.observer)) {\n swiper.update();\n }\n }\n\n function prependSlide (slides) {\n var swiper = this;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n var activeIndex = swiper.activeIndex;\n\n if (params.loop) {\n swiper.loopDestroy();\n }\n var newActiveIndex = activeIndex + 1;\n if (typeof slides === 'object' && 'length' in slides) {\n for (var i = 0; i < slides.length; i += 1) {\n if (slides[i]) { $wrapperEl.prepend(slides[i]); }\n }\n newActiveIndex = activeIndex + slides.length;\n } else {\n $wrapperEl.prepend(slides);\n }\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!(params.observer && Support.observer)) {\n swiper.update();\n }\n swiper.slideTo(newActiveIndex, 0, false);\n }\n\n function addSlide (index, slides) {\n var swiper = this;\n var $wrapperEl = swiper.$wrapperEl;\n var params = swiper.params;\n var activeIndex = swiper.activeIndex;\n var activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children((\".\" + (params.slideClass)));\n }\n var baseLength = swiper.slides.length;\n if (index <= 0) {\n swiper.prependSlide(slides);\n return;\n }\n if (index >= baseLength) {\n swiper.appendSlide(slides);\n return;\n }\n var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n\n var slidesBuffer = [];\n for (var i = baseLength - 1; i >= index; i -= 1) {\n var currentSlide = swiper.slides.eq(i);\n currentSlide.remove();\n slidesBuffer.unshift(currentSlide);\n }\n\n if (typeof slides === 'object' && 'length' in slides) {\n for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {\n if (slides[i$1]) { $wrapperEl.append(slides[i$1]); }\n }\n newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n } else {\n $wrapperEl.append(slides);\n }\n\n for (var i$2 = 0; i$2 < slidesBuffer.length; i$2 += 1) {\n $wrapperEl.append(slidesBuffer[i$2]);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n if (!(params.observer && Support.observer)) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n }\n\n function removeSlide (slidesIndexes) {\n var swiper = this;\n var params = swiper.params;\n var $wrapperEl = swiper.$wrapperEl;\n var activeIndex = swiper.activeIndex;\n\n var activeIndexBuffer = activeIndex;\n if (params.loop) {\n activeIndexBuffer -= swiper.loopedSlides;\n swiper.loopDestroy();\n swiper.slides = $wrapperEl.children((\".\" + (params.slideClass)));\n }\n var newActiveIndex = activeIndexBuffer;\n var indexToRemove;\n\n if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n for (var i = 0; i < slidesIndexes.length; i += 1) {\n indexToRemove = slidesIndexes[i];\n if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }\n if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }\n }\n newActiveIndex = Math.max(newActiveIndex, 0);\n } else {\n indexToRemove = slidesIndexes;\n if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }\n if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }\n newActiveIndex = Math.max(newActiveIndex, 0);\n }\n\n if (params.loop) {\n swiper.loopCreate();\n }\n\n if (!(params.observer && Support.observer)) {\n swiper.update();\n }\n if (params.loop) {\n swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n } else {\n swiper.slideTo(newActiveIndex, 0, false);\n }\n }\n\n function removeAllSlides () {\n var swiper = this;\n\n var slidesIndexes = [];\n for (var i = 0; i < swiper.slides.length; i += 1) {\n slidesIndexes.push(i);\n }\n swiper.removeSlide(slidesIndexes);\n }\n\n var manipulation = {\n appendSlide: appendSlide,\n prependSlide: prependSlide,\n addSlide: addSlide,\n removeSlide: removeSlide,\n removeAllSlides: removeAllSlides,\n };\n\n var Device = (function Device() {\n var ua = win.navigator.userAgent;\n\n var device = {\n ios: false,\n android: false,\n androidChrome: false,\n desktop: false,\n windows: false,\n iphone: false,\n ipod: false,\n ipad: false,\n cordova: win.cordova || win.phonegap,\n phonegap: win.cordova || win.phonegap,\n };\n\n var windows = ua.match(/(Windows Phone);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n var iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n\n\n // Windows\n if (windows) {\n device.os = 'windows';\n device.osVersion = windows[2];\n device.windows = true;\n }\n // Android\n if (android && !windows) {\n device.os = 'android';\n device.osVersion = android[2];\n device.android = true;\n device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\n }\n if (ipad || iphone || ipod) {\n device.os = 'ios';\n device.ios = true;\n }\n // iOS\n if (iphone && !ipod) {\n device.osVersion = iphone[2].replace(/_/g, '.');\n device.iphone = true;\n }\n if (ipad) {\n device.osVersion = ipad[2].replace(/_/g, '.');\n device.ipad = true;\n }\n if (ipod) {\n device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\n device.iphone = true;\n }\n // iOS 8+ changed UA\n if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\n if (device.osVersion.split('.')[0] === '10') {\n device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\n }\n }\n\n // Desktop\n device.desktop = !(device.os || device.android || device.webView);\n\n // Webview\n device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\n\n // Minimal UI\n if (device.os && device.os === 'ios') {\n var osVersionArr = device.osVersion.split('.');\n var metaViewport = doc.querySelector('meta[name=\"viewport\"]');\n device.minimalUi = !device.webView\n && (ipod || iphone)\n && (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7)\n && metaViewport && metaViewport.getAttribute('content').indexOf('minimal-ui') >= 0;\n }\n\n // Pixel Ratio\n device.pixelRatio = win.devicePixelRatio || 1;\n\n // Export object\n return device;\n }());\n\n function onTouchStart (event) {\n var swiper = this;\n var data = swiper.touchEventsData;\n var params = swiper.params;\n var touches = swiper.touches;\n if (swiper.animating && params.preventInteractionOnTransition) {\n return;\n }\n var e = event;\n if (e.originalEvent) { e = e.originalEvent; }\n data.isTouchEvent = e.type === 'touchstart';\n if (!data.isTouchEvent && 'which' in e && e.which === 3) { return; }\n if (!data.isTouchEvent && 'button' in e && e.button > 0) { return; }\n if (data.isTouched && data.isMoved) { return; }\n if (params.noSwiping && $(e.target).closest(params.noSwipingSelector ? params.noSwipingSelector : (\".\" + (params.noSwipingClass)))[0]) {\n swiper.allowClick = true;\n return;\n }\n if (params.swipeHandler) {\n if (!$(e).closest(params.swipeHandler)[0]) { return; }\n }\n\n touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n var startX = touches.currentX;\n var startY = touches.currentY;\n\n // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore\n\n var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n if (\n edgeSwipeDetection\n && ((startX <= edgeSwipeThreshold)\n || (startX >= win.screen.width - edgeSwipeThreshold))\n ) {\n return;\n }\n\n Utils.extend(data, {\n isTouched: true,\n isMoved: false,\n allowTouchCallbacks: true,\n isScrolling: undefined,\n startMoving: undefined,\n });\n\n touches.startX = startX;\n touches.startY = startY;\n data.touchStartTime = Utils.now();\n swiper.allowClick = true;\n swiper.updateSize();\n swiper.swipeDirection = undefined;\n if (params.threshold > 0) { data.allowThresholdMove = false; }\n if (e.type !== 'touchstart') {\n var preventDefault = true;\n if ($(e.target).is(data.formElements)) { preventDefault = false; }\n if (\n doc.activeElement\n && $(doc.activeElement).is(data.formElements)\n && doc.activeElement !== e.target\n ) {\n doc.activeElement.blur();\n }\n\n var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n if (params.touchStartForcePreventDefault || shouldPreventDefault) {\n e.preventDefault();\n }\n }\n swiper.emit('touchStart', e);\n }\n\n function onTouchMove (event) {\n var swiper = this;\n var data = swiper.touchEventsData;\n var params = swiper.params;\n var touches = swiper.touches;\n var rtl = swiper.rtlTranslate;\n var e = event;\n if (e.originalEvent) { e = e.originalEvent; }\n if (!data.isTouched) {\n if (data.startMoving && data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n return;\n }\n if (data.isTouchEvent && e.type === 'mousemove') { return; }\n var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n if (e.preventedByNestedSwiper) {\n touches.startX = pageX;\n touches.startY = pageY;\n return;\n }\n if (!swiper.allowTouchMove) {\n // isMoved = true;\n swiper.allowClick = false;\n if (data.isTouched) {\n Utils.extend(touches, {\n startX: pageX,\n startY: pageY,\n currentX: pageX,\n currentY: pageY,\n });\n data.touchStartTime = Utils.now();\n }\n return;\n }\n if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n if (swiper.isVertical()) {\n // Vertical\n if (\n (pageY < touches.startY && swiper.translate <= swiper.maxTranslate())\n || (pageY > touches.startY && swiper.translate >= swiper.minTranslate())\n ) {\n data.isTouched = false;\n data.isMoved = false;\n return;\n }\n } else if (\n (pageX < touches.startX && swiper.translate <= swiper.maxTranslate())\n || (pageX > touches.startX && swiper.translate >= swiper.minTranslate())\n ) {\n return;\n }\n }\n if (data.isTouchEvent && doc.activeElement) {\n if (e.target === doc.activeElement && $(e.target).is(data.formElements)) {\n data.isMoved = true;\n swiper.allowClick = false;\n return;\n }\n }\n if (data.allowTouchCallbacks) {\n swiper.emit('touchMove', e);\n }\n if (e.targetTouches && e.targetTouches.length > 1) { return; }\n\n touches.currentX = pageX;\n touches.currentY = pageY;\n\n var diffX = touches.currentX - touches.startX;\n var diffY = touches.currentY - touches.startY;\n if (swiper.params.threshold && Math.sqrt((Math.pow( diffX, 2 )) + (Math.pow( diffY, 2 ))) < swiper.params.threshold) { return; }\n\n if (typeof data.isScrolling === 'undefined') {\n var touchAngle;\n if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) {\n data.isScrolling = false;\n } else {\n // eslint-disable-next-line\n if ((diffX * diffX) + (diffY * diffY) >= 25) {\n touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;\n data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle);\n }\n }\n }\n if (data.isScrolling) {\n swiper.emit('touchMoveOpposite', e);\n }\n if (typeof data.startMoving === 'undefined') {\n if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n data.startMoving = true;\n }\n }\n if (data.isScrolling) {\n data.isTouched = false;\n return;\n }\n if (!data.startMoving) {\n return;\n }\n swiper.allowClick = false;\n e.preventDefault();\n if (params.touchMoveStopPropagation && !params.nested) {\n e.stopPropagation();\n }\n\n if (!data.isMoved) {\n if (params.loop) {\n swiper.loopFix();\n }\n data.startTranslate = swiper.getTranslate();\n swiper.setTransition(0);\n if (swiper.animating) {\n swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n }\n data.allowMomentumBounce = false;\n // Grab Cursor\n if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(true);\n }\n swiper.emit('sliderFirstMove', e);\n }\n swiper.emit('sliderMove', e);\n data.isMoved = true;\n\n var diff = swiper.isHorizontal() ? diffX : diffY;\n touches.diff = diff;\n\n diff *= params.touchRatio;\n if (rtl) { diff = -diff; }\n\n swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n data.currentTranslate = diff + data.startTranslate;\n\n var disableParentSwiper = true;\n var resistanceRatio = params.resistanceRatio;\n if (params.touchReleaseOnEdges) {\n resistanceRatio = 0;\n }\n if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) {\n disableParentSwiper = false;\n if (params.resistance) { data.currentTranslate = (swiper.minTranslate() - 1) + (Math.pow( (-swiper.minTranslate() + data.startTranslate + diff), resistanceRatio )); }\n } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n disableParentSwiper = false;\n if (params.resistance) { data.currentTranslate = (swiper.maxTranslate() + 1) - (Math.pow( (swiper.maxTranslate() - data.startTranslate - diff), resistanceRatio )); }\n }\n\n if (disableParentSwiper) {\n e.preventedByNestedSwiper = true;\n }\n\n // Directions locks\n if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {\n data.currentTranslate = data.startTranslate;\n }\n if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {\n data.currentTranslate = data.startTranslate;\n }\n\n\n // Threshold\n if (params.threshold > 0) {\n if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n if (!data.allowThresholdMove) {\n data.allowThresholdMove = true;\n touches.startX = touches.currentX;\n touches.startY = touches.currentY;\n data.currentTranslate = data.startTranslate;\n touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;\n return;\n }\n } else {\n data.currentTranslate = data.startTranslate;\n return;\n }\n }\n\n if (!params.followFinger) { return; }\n\n // Update active index in free mode\n if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n if (params.freeMode) {\n // Velocity\n if (data.velocities.length === 0) {\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n time: data.touchStartTime,\n });\n }\n data.velocities.push({\n position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n time: Utils.now(),\n });\n }\n // Update progress\n swiper.updateProgress(data.currentTranslate);\n // Update translate\n swiper.setTranslate(data.currentTranslate);\n }\n\n function onTouchEnd (event) {\n var swiper = this;\n var data = swiper.touchEventsData;\n\n var params = swiper.params;\n var touches = swiper.touches;\n var rtl = swiper.rtlTranslate;\n var $wrapperEl = swiper.$wrapperEl;\n var slidesGrid = swiper.slidesGrid;\n var snapGrid = swiper.snapGrid;\n var e = event;\n if (e.originalEvent) { e = e.originalEvent; }\n if (data.allowTouchCallbacks) {\n swiper.emit('touchEnd', e);\n }\n data.allowTouchCallbacks = false;\n if (!data.isTouched) {\n if (data.isMoved && params.grabCursor) {\n swiper.setGrabCursor(false);\n }\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n // Return Grab Cursor\n if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n swiper.setGrabCursor(false);\n }\n\n // Time diff\n var touchEndTime = Utils.now();\n var timeDiff = touchEndTime - data.touchStartTime;\n\n // Tap, doubleTap, Click\n if (swiper.allowClick) {\n swiper.updateClickedSlide(e);\n swiper.emit('tap', e);\n if (timeDiff < 300 && (touchEndTime - data.lastClickTime) > 300) {\n if (data.clickTimeout) { clearTimeout(data.clickTimeout); }\n data.clickTimeout = Utils.nextTick(function () {\n if (!swiper || swiper.destroyed) { return; }\n swiper.emit('click', e);\n }, 300);\n }\n if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) {\n if (data.clickTimeout) { clearTimeout(data.clickTimeout); }\n swiper.emit('doubleTap', e);\n }\n }\n\n data.lastClickTime = Utils.now();\n Utils.nextTick(function () {\n if (!swiper.destroyed) { swiper.allowClick = true; }\n });\n\n if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n return;\n }\n data.isTouched = false;\n data.isMoved = false;\n data.startMoving = false;\n\n var currentPos;\n if (params.followFinger) {\n currentPos = rtl ? swiper.translate : -swiper.translate;\n } else {\n currentPos = -data.currentTranslate;\n }\n\n if (params.freeMode) {\n if (currentPos < -swiper.minTranslate()) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (currentPos > -swiper.maxTranslate()) {\n if (swiper.slides.length < snapGrid.length) {\n swiper.slideTo(snapGrid.length - 1);\n } else {\n swiper.slideTo(swiper.slides.length - 1);\n }\n return;\n }\n\n if (params.freeModeMomentum) {\n if (data.velocities.length > 1) {\n var lastMoveEvent = data.velocities.pop();\n var velocityEvent = data.velocities.pop();\n\n var distance = lastMoveEvent.position - velocityEvent.position;\n var time = lastMoveEvent.time - velocityEvent.time;\n swiper.velocity = distance / time;\n swiper.velocity /= 2;\n if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {\n swiper.velocity = 0;\n }\n // this implies that the user stopped moving a finger then released.\n // There would be no events with distance zero, so the last event is stale.\n if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) {\n swiper.velocity = 0;\n }\n } else {\n swiper.velocity = 0;\n }\n swiper.velocity *= params.freeModeMomentumVelocityRatio;\n\n data.velocities.length = 0;\n var momentumDuration = 1000 * params.freeModeMomentumRatio;\n var momentumDistance = swiper.velocity * momentumDuration;\n\n var newPosition = swiper.translate + momentumDistance;\n if (rtl) { newPosition = -newPosition; }\n\n var doBounce = false;\n var afterBouncePosition;\n var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;\n var needsLoopFix;\n if (newPosition < swiper.maxTranslate()) {\n if (params.freeModeMomentumBounce) {\n if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n newPosition = swiper.maxTranslate() - bounceAmount;\n }\n afterBouncePosition = swiper.maxTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.maxTranslate();\n }\n if (params.loop && params.centeredSlides) { needsLoopFix = true; }\n } else if (newPosition > swiper.minTranslate()) {\n if (params.freeModeMomentumBounce) {\n if (newPosition - swiper.minTranslate() > bounceAmount) {\n newPosition = swiper.minTranslate() + bounceAmount;\n }\n afterBouncePosition = swiper.minTranslate();\n doBounce = true;\n data.allowMomentumBounce = true;\n } else {\n newPosition = swiper.minTranslate();\n }\n if (params.loop && params.centeredSlides) { needsLoopFix = true; }\n } else if (params.freeModeSticky) {\n var nextSlide;\n for (var j = 0; j < snapGrid.length; j += 1) {\n if (snapGrid[j] > -newPosition) {\n nextSlide = j;\n break;\n }\n }\n\n if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {\n newPosition = snapGrid[nextSlide];\n } else {\n newPosition = snapGrid[nextSlide - 1];\n }\n newPosition = -newPosition;\n }\n if (needsLoopFix) {\n swiper.once('transitionEnd', function () {\n swiper.loopFix();\n });\n }\n // Fix duration\n if (swiper.velocity !== 0) {\n if (rtl) {\n momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n } else {\n momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n }\n } else if (params.freeModeSticky) {\n swiper.slideToClosest();\n return;\n }\n\n if (params.freeModeMomentumBounce && doBounce) {\n swiper.updateProgress(afterBouncePosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n swiper.animating = true;\n $wrapperEl.transitionEnd(function () {\n if (!swiper || swiper.destroyed || !data.allowMomentumBounce) { return; }\n swiper.emit('momentumBounce');\n\n swiper.setTransition(params.speed);\n swiper.setTranslate(afterBouncePosition);\n $wrapperEl.transitionEnd(function () {\n if (!swiper || swiper.destroyed) { return; }\n swiper.transitionEnd();\n });\n });\n } else if (swiper.velocity) {\n swiper.updateProgress(newPosition);\n swiper.setTransition(momentumDuration);\n swiper.setTranslate(newPosition);\n swiper.transitionStart(true, swiper.swipeDirection);\n if (!swiper.animating) {\n swiper.animating = true;\n $wrapperEl.transitionEnd(function () {\n if (!swiper || swiper.destroyed) { return; }\n swiper.transitionEnd();\n });\n }\n } else {\n swiper.updateProgress(newPosition);\n }\n\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n } else if (params.freeModeSticky) {\n swiper.slideToClosest();\n return;\n }\n\n if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n return;\n }\n\n // Find current slide\n var stopIndex = 0;\n var groupSize = swiper.slidesSizesGrid[0];\n for (var i = 0; i < slidesGrid.length; i += params.slidesPerGroup) {\n if (typeof slidesGrid[i + params.slidesPerGroup] !== 'undefined') {\n if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + params.slidesPerGroup]) {\n stopIndex = i;\n groupSize = slidesGrid[i + params.slidesPerGroup] - slidesGrid[i];\n }\n } else if (currentPos >= slidesGrid[i]) {\n stopIndex = i;\n groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n }\n }\n\n // Find current slide size\n var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n\n if (timeDiff > params.longSwipesMs) {\n // Long touches\n if (!params.longSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (swiper.swipeDirection === 'next') {\n if (ratio >= params.longSwipesRatio) { swiper.slideTo(stopIndex + params.slidesPerGroup); }\n else { swiper.slideTo(stopIndex); }\n }\n if (swiper.swipeDirection === 'prev') {\n if (ratio > (1 - params.longSwipesRatio)) { swiper.slideTo(stopIndex + params.slidesPerGroup); }\n else { swiper.slideTo(stopIndex); }\n }\n } else {\n // Short swipes\n if (!params.shortSwipes) {\n swiper.slideTo(swiper.activeIndex);\n return;\n }\n if (swiper.swipeDirection === 'next') {\n swiper.slideTo(stopIndex + params.slidesPerGroup);\n }\n if (swiper.swipeDirection === 'prev') {\n swiper.slideTo(stopIndex);\n }\n }\n }\n\n function onResize () {\n var swiper = this;\n\n var params = swiper.params;\n var el = swiper.el;\n\n if (el && el.offsetWidth === 0) { return; }\n\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Save locks\n var allowSlideNext = swiper.allowSlideNext;\n var allowSlidePrev = swiper.allowSlidePrev;\n var snapGrid = swiper.snapGrid;\n\n // Disable locks on resize\n swiper.allowSlideNext = true;\n swiper.allowSlidePrev = true;\n\n swiper.updateSize();\n swiper.updateSlides();\n\n if (params.freeMode) {\n var newTranslate = Math.min(Math.max(swiper.translate, swiper.maxTranslate()), swiper.minTranslate());\n swiper.setTranslate(newTranslate);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n if (params.autoHeight) {\n swiper.updateAutoHeight();\n }\n } else {\n swiper.updateSlidesClasses();\n if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {\n swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n }\n // Return locks after resize\n swiper.allowSlidePrev = allowSlidePrev;\n swiper.allowSlideNext = allowSlideNext;\n\n if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n }\n\n function onClick (e) {\n var swiper = this;\n if (!swiper.allowClick) {\n if (swiper.params.preventClicks) { e.preventDefault(); }\n if (swiper.params.preventClicksPropagation && swiper.animating) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n }\n }\n\n function attachEvents() {\n var swiper = this;\n var params = swiper.params;\n var touchEvents = swiper.touchEvents;\n var el = swiper.el;\n var wrapperEl = swiper.wrapperEl;\n\n {\n swiper.onTouchStart = onTouchStart.bind(swiper);\n swiper.onTouchMove = onTouchMove.bind(swiper);\n swiper.onTouchEnd = onTouchEnd.bind(swiper);\n }\n\n swiper.onClick = onClick.bind(swiper);\n\n var target = params.touchEventsTarget === 'container' ? el : wrapperEl;\n var capture = !!params.nested;\n\n // Touch Events\n {\n if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {\n target.addEventListener(touchEvents.start, swiper.onTouchStart, false);\n doc.addEventListener(touchEvents.move, swiper.onTouchMove, capture);\n doc.addEventListener(touchEvents.end, swiper.onTouchEnd, false);\n } else {\n if (Support.touch) {\n var passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n target.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);\n target.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture: capture } : capture);\n target.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);\n }\n if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {\n target.addEventListener('mousedown', swiper.onTouchStart, false);\n doc.addEventListener('mousemove', swiper.onTouchMove, capture);\n doc.addEventListener('mouseup', swiper.onTouchEnd, false);\n }\n }\n // Prevent Links Clicks\n if (params.preventClicks || params.preventClicksPropagation) {\n target.addEventListener('click', swiper.onClick, true);\n }\n }\n\n // Resize handler\n swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize, true);\n }\n\n function detachEvents() {\n var swiper = this;\n\n var params = swiper.params;\n var touchEvents = swiper.touchEvents;\n var el = swiper.el;\n var wrapperEl = swiper.wrapperEl;\n\n var target = params.touchEventsTarget === 'container' ? el : wrapperEl;\n var capture = !!params.nested;\n\n // Touch Events\n {\n if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {\n target.removeEventListener(touchEvents.start, swiper.onTouchStart, false);\n doc.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);\n doc.removeEventListener(touchEvents.end, swiper.onTouchEnd, false);\n } else {\n if (Support.touch) {\n var passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n target.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);\n target.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);\n target.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);\n }\n if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {\n target.removeEventListener('mousedown', swiper.onTouchStart, false);\n doc.removeEventListener('mousemove', swiper.onTouchMove, capture);\n doc.removeEventListener('mouseup', swiper.onTouchEnd, false);\n }\n }\n // Prevent Links Clicks\n if (params.preventClicks || params.preventClicksPropagation) {\n target.removeEventListener('click', swiper.onClick, true);\n }\n }\n\n // Resize handler\n swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize);\n }\n\n var events = {\n attachEvents: attachEvents,\n detachEvents: detachEvents,\n };\n\n function setBreakpoint () {\n var swiper = this;\n var activeIndex = swiper.activeIndex;\n var initialized = swiper.initialized;\n var loopedSlides = swiper.loopedSlides; if ( loopedSlides === void 0 ) loopedSlides = 0;\n var params = swiper.params;\n var breakpoints = params.breakpoints;\n if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) { return; }\n\n // Set breakpoint for window width and update parameters\n var breakpoint = swiper.getBreakpoint(breakpoints);\n\n if (breakpoint && swiper.currentBreakpoint !== breakpoint) {\n var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n if (breakpointOnlyParams) {\n ['slidesPerView', 'spaceBetween', 'slidesPerGroup'].forEach(function (param) {\n var paramValue = breakpointOnlyParams[param];\n if (typeof paramValue === 'undefined') { return; }\n if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) {\n breakpointOnlyParams[param] = 'auto';\n } else if (param === 'slidesPerView') {\n breakpointOnlyParams[param] = parseFloat(paramValue);\n } else {\n breakpointOnlyParams[param] = parseInt(paramValue, 10);\n }\n });\n }\n\n var breakpointParams = breakpointOnlyParams || swiper.originalParams;\n var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;\n var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n if (directionChanged && initialized) {\n swiper.changeDirection();\n }\n\n Utils.extend(swiper.params, breakpointParams);\n\n Utils.extend(swiper, {\n allowTouchMove: swiper.params.allowTouchMove,\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n });\n\n swiper.currentBreakpoint = breakpoint;\n\n if (needsReLoop && initialized) {\n swiper.loopDestroy();\n swiper.loopCreate();\n swiper.updateSlides();\n swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false);\n }\n\n swiper.emit('breakpoint', breakpointParams);\n }\n }\n\n function getBreakpoint (breakpoints) {\n var swiper = this;\n // Get breakpoint for window width\n if (!breakpoints) { return undefined; }\n var breakpoint = false;\n var points = [];\n Object.keys(breakpoints).forEach(function (point) {\n points.push(point);\n });\n points.sort(function (a, b) { return parseInt(a, 10) - parseInt(b, 10); });\n for (var i = 0; i < points.length; i += 1) {\n var point = points[i];\n if (swiper.params.breakpointsInverse) {\n if (point <= win.innerWidth) {\n breakpoint = point;\n }\n } else if (point >= win.innerWidth && !breakpoint) {\n breakpoint = point;\n }\n }\n return breakpoint || 'max';\n }\n\n var breakpoints = { setBreakpoint: setBreakpoint, getBreakpoint: getBreakpoint };\n\n function addClasses () {\n var swiper = this;\n var classNames = swiper.classNames;\n var params = swiper.params;\n var rtl = swiper.rtl;\n var $el = swiper.$el;\n var suffixes = [];\n\n suffixes.push('initialized');\n suffixes.push(params.direction);\n\n if (params.freeMode) {\n suffixes.push('free-mode');\n }\n if (!Support.flexbox) {\n suffixes.push('no-flexbox');\n }\n if (params.autoHeight) {\n suffixes.push('autoheight');\n }\n if (rtl) {\n suffixes.push('rtl');\n }\n if (params.slidesPerColumn > 1) {\n suffixes.push('multirow');\n }\n if (Device.android) {\n suffixes.push('android');\n }\n if (Device.ios) {\n suffixes.push('ios');\n }\n // WP8 Touch Events Fix\n if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {\n suffixes.push((\"wp8-\" + (params.direction)));\n }\n\n suffixes.forEach(function (suffix) {\n classNames.push(params.containerModifierClass + suffix);\n });\n\n $el.addClass(classNames.join(' '));\n }\n\n function removeClasses () {\n var swiper = this;\n var $el = swiper.$el;\n var classNames = swiper.classNames;\n\n $el.removeClass(classNames.join(' '));\n }\n\n var classes = { addClasses: addClasses, removeClasses: removeClasses };\n\n function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) {\n var image;\n function onReady() {\n if (callback) { callback(); }\n }\n if (!imageEl.complete || !checkForComplete) {\n if (src) {\n image = new win.Image();\n image.onload = onReady;\n image.onerror = onReady;\n if (sizes) {\n image.sizes = sizes;\n }\n if (srcset) {\n image.srcset = srcset;\n }\n if (src) {\n image.src = src;\n }\n } else {\n onReady();\n }\n } else {\n // image already loaded...\n onReady();\n }\n }\n\n function preloadImages () {\n var swiper = this;\n swiper.imagesToLoad = swiper.$el.find('img');\n function onReady() {\n if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) { return; }\n if (swiper.imagesLoaded !== undefined) { swiper.imagesLoaded += 1; }\n if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n if (swiper.params.updateOnImagesReady) { swiper.update(); }\n swiper.emit('imagesReady');\n }\n }\n for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {\n var imageEl = swiper.imagesToLoad[i];\n swiper.loadImage(\n imageEl,\n imageEl.currentSrc || imageEl.getAttribute('src'),\n imageEl.srcset || imageEl.getAttribute('srcset'),\n imageEl.sizes || imageEl.getAttribute('sizes'),\n true,\n onReady\n );\n }\n }\n\n var images = {\n loadImage: loadImage,\n preloadImages: preloadImages,\n };\n\n function checkOverflow() {\n var swiper = this;\n var wasLocked = swiper.isLocked;\n\n swiper.isLocked = swiper.snapGrid.length === 1;\n swiper.allowSlideNext = !swiper.isLocked;\n swiper.allowSlidePrev = !swiper.isLocked;\n\n // events\n if (wasLocked !== swiper.isLocked) { swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); }\n\n if (wasLocked && wasLocked !== swiper.isLocked) {\n swiper.isEnd = false;\n swiper.navigation.update();\n }\n }\n\n var checkOverflow$1 = { checkOverflow: checkOverflow };\n\n var defaults = {\n init: true,\n direction: 'horizontal',\n touchEventsTarget: 'container',\n initialSlide: 0,\n speed: 300,\n //\n preventInteractionOnTransition: false,\n\n // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView).\n edgeSwipeDetection: false,\n edgeSwipeThreshold: 20,\n\n // Free mode\n freeMode: false,\n freeModeMomentum: true,\n freeModeMomentumRatio: 1,\n freeModeMomentumBounce: true,\n freeModeMomentumBounceRatio: 1,\n freeModeMomentumVelocityRatio: 1,\n freeModeSticky: false,\n freeModeMinimumVelocity: 0.02,\n\n // Autoheight\n autoHeight: false,\n\n // Set wrapper width\n setWrapperSize: false,\n\n // Virtual Translate\n virtualTranslate: false,\n\n // Effects\n effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n // Breakpoints\n breakpoints: undefined,\n breakpointsInverse: false,\n\n // Slides grid\n spaceBetween: 0,\n slidesPerView: 1,\n slidesPerColumn: 1,\n slidesPerColumnFill: 'column',\n slidesPerGroup: 1,\n centeredSlides: false,\n slidesOffsetBefore: 0, // in px\n slidesOffsetAfter: 0, // in px\n normalizeSlideIndex: true,\n centerInsufficientSlides: false,\n\n // Disable swiper and hide navigation when container not overflow\n watchOverflow: false,\n\n // Round length\n roundLengths: false,\n\n // Touches\n touchRatio: 1,\n touchAngle: 45,\n simulateTouch: true,\n shortSwipes: true,\n longSwipes: true,\n longSwipesRatio: 0.5,\n longSwipesMs: 300,\n followFinger: true,\n allowTouchMove: true,\n threshold: 0,\n touchMoveStopPropagation: true,\n touchStartPreventDefault: true,\n touchStartForcePreventDefault: false,\n touchReleaseOnEdges: false,\n\n // Unique Navigation Elements\n uniqueNavElements: true,\n\n // Resistance\n resistance: true,\n resistanceRatio: 0.85,\n\n // Progress\n watchSlidesProgress: false,\n watchSlidesVisibility: false,\n\n // Cursor\n grabCursor: false,\n\n // Clicks\n preventClicks: true,\n preventClicksPropagation: true,\n slideToClickedSlide: false,\n\n // Images\n preloadImages: true,\n updateOnImagesReady: true,\n\n // loop\n loop: false,\n loopAdditionalSlides: 0,\n loopedSlides: null,\n loopFillGroupWithBlank: false,\n\n // Swiping/no swiping\n allowSlidePrev: true,\n allowSlideNext: true,\n swipeHandler: null, // '.swipe-handler',\n noSwiping: true,\n noSwipingClass: 'swiper-no-swiping',\n noSwipingSelector: null,\n\n // Passive Listeners\n passiveListeners: true,\n\n // NS\n containerModifierClass: 'swiper-container-', // NEW\n slideClass: 'swiper-slide',\n slideBlankClass: 'swiper-slide-invisible-blank',\n slideActiveClass: 'swiper-slide-active',\n slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n slideVisibleClass: 'swiper-slide-visible',\n slideDuplicateClass: 'swiper-slide-duplicate',\n slideNextClass: 'swiper-slide-next',\n slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n slidePrevClass: 'swiper-slide-prev',\n slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n wrapperClass: 'swiper-wrapper',\n\n // Callbacks\n runCallbacksOnInit: true,\n };\n\n /* eslint no-param-reassign: \"off\" */\n\n var prototypes = {\n update: update,\n translate: translate,\n transition: transition$1,\n slide: slide,\n loop: loop,\n grabCursor: grabCursor,\n manipulation: manipulation,\n events: events,\n breakpoints: breakpoints,\n checkOverflow: checkOverflow$1,\n classes: classes,\n images: images,\n };\n\n var extendedDefaults = {};\n\n var Swiper = /*@__PURE__*/(function (SwiperClass) {\n function Swiper() {\n var assign;\n\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n var el;\n var params;\n if (args.length === 1 && args[0].constructor && args[0].constructor === Object) {\n params = args[0];\n } else {\n (assign = args, el = assign[0], params = assign[1]);\n }\n if (!params) { params = {}; }\n\n params = Utils.extend({}, params);\n if (el && !params.el) { params.el = el; }\n\n SwiperClass.call(this, params);\n\n Object.keys(prototypes).forEach(function (prototypeGroup) {\n Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {\n if (!Swiper.prototype[protoMethod]) {\n Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n }\n });\n });\n\n // Swiper Instance\n var swiper = this;\n if (typeof swiper.modules === 'undefined') {\n swiper.modules = {};\n }\n Object.keys(swiper.modules).forEach(function (moduleName) {\n var module = swiper.modules[moduleName];\n if (module.params) {\n var moduleParamName = Object.keys(module.params)[0];\n var moduleParams = module.params[moduleParamName];\n if (typeof moduleParams !== 'object' || moduleParams === null) { return; }\n if (!(moduleParamName in params && 'enabled' in moduleParams)) { return; }\n if (params[moduleParamName] === true) {\n params[moduleParamName] = { enabled: true };\n }\n if (\n typeof params[moduleParamName] === 'object'\n && !('enabled' in params[moduleParamName])\n ) {\n params[moduleParamName].enabled = true;\n }\n if (!params[moduleParamName]) { params[moduleParamName] = { enabled: false }; }\n }\n });\n\n // Extend defaults with modules params\n var swiperParams = Utils.extend({}, defaults);\n swiper.useModulesParams(swiperParams);\n\n // Extend defaults with passed params\n swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params);\n swiper.originalParams = Utils.extend({}, swiper.params);\n swiper.passedParams = Utils.extend({}, params);\n\n // Save Dom lib\n swiper.$ = $;\n\n // Find el\n var $el = $(swiper.params.el);\n el = $el[0];\n\n if (!el) {\n return undefined;\n }\n\n if ($el.length > 1) {\n var swipers = [];\n $el.each(function (index, containerEl) {\n var newParams = Utils.extend({}, params, { el: containerEl });\n swipers.push(new Swiper(newParams));\n });\n return swipers;\n }\n\n el.swiper = swiper;\n $el.data('swiper', swiper);\n\n // Find Wrapper\n var $wrapperEl = $el.children((\".\" + (swiper.params.wrapperClass)));\n\n // Extend Swiper\n Utils.extend(swiper, {\n $el: $el,\n el: el,\n $wrapperEl: $wrapperEl,\n wrapperEl: $wrapperEl[0],\n\n // Classes\n classNames: [],\n\n // Slides\n slides: $(),\n slidesGrid: [],\n snapGrid: [],\n slidesSizesGrid: [],\n\n // isDirection\n isHorizontal: function isHorizontal() {\n return swiper.params.direction === 'horizontal';\n },\n isVertical: function isVertical() {\n return swiper.params.direction === 'vertical';\n },\n // RTL\n rtl: (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n wrongRTL: $wrapperEl.css('display') === '-webkit-box',\n\n // Indexes\n activeIndex: 0,\n realIndex: 0,\n\n //\n isBeginning: true,\n isEnd: false,\n\n // Props\n translate: 0,\n previousTranslate: 0,\n progress: 0,\n velocity: 0,\n animating: false,\n\n // Locks\n allowSlideNext: swiper.params.allowSlideNext,\n allowSlidePrev: swiper.params.allowSlidePrev,\n\n // Touch Events\n touchEvents: (function touchEvents() {\n var touch = ['touchstart', 'touchmove', 'touchend'];\n var desktop = ['mousedown', 'mousemove', 'mouseup'];\n if (Support.pointerEvents) {\n desktop = ['pointerdown', 'pointermove', 'pointerup'];\n } else if (Support.prefixedPointerEvents) {\n desktop = ['MSPointerDown', 'MSPointerMove', 'MSPointerUp'];\n }\n swiper.touchEventsTouch = {\n start: touch[0],\n move: touch[1],\n end: touch[2],\n };\n swiper.touchEventsDesktop = {\n start: desktop[0],\n move: desktop[1],\n end: desktop[2],\n };\n return Support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;\n }()),\n touchEventsData: {\n isTouched: undefined,\n isMoved: undefined,\n allowTouchCallbacks: undefined,\n touchStartTime: undefined,\n isScrolling: undefined,\n currentTranslate: undefined,\n startTranslate: undefined,\n allowThresholdMove: undefined,\n // Form elements to match\n formElements: 'input, select, option, textarea, button, video',\n // Last click time\n lastClickTime: Utils.now(),\n clickTimeout: undefined,\n // Velocities\n velocities: [],\n allowMomentumBounce: undefined,\n isTouchEvent: undefined,\n startMoving: undefined,\n },\n\n // Clicks\n allowClick: true,\n\n // Touches\n allowTouchMove: swiper.params.allowTouchMove,\n\n touches: {\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n diff: 0,\n },\n\n // Images\n imagesToLoad: [],\n imagesLoaded: 0,\n\n });\n\n // Install Modules\n swiper.useModules();\n\n // Init\n if (swiper.params.init) {\n swiper.init();\n }\n\n // Return app instance\n return swiper;\n }\n\n if ( SwiperClass ) Swiper.__proto__ = SwiperClass;\n Swiper.prototype = Object.create( SwiperClass && SwiperClass.prototype );\n Swiper.prototype.constructor = Swiper;\n\n var staticAccessors = { extendedDefaults: { configurable: true },defaults: { configurable: true },Class: { configurable: true },$: { configurable: true } };\n\n Swiper.prototype.slidesPerViewDynamic = function slidesPerViewDynamic () {\n var swiper = this;\n var params = swiper.params;\n var slides = swiper.slides;\n var slidesGrid = swiper.slidesGrid;\n var swiperSize = swiper.size;\n var activeIndex = swiper.activeIndex;\n var spv = 1;\n if (params.centeredSlides) {\n var slideSize = slides[activeIndex].swiperSlideSize;\n var breakLoop;\n for (var i = activeIndex + 1; i < slides.length; i += 1) {\n if (slides[i] && !breakLoop) {\n slideSize += slides[i].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) { breakLoop = true; }\n }\n }\n for (var i$1 = activeIndex - 1; i$1 >= 0; i$1 -= 1) {\n if (slides[i$1] && !breakLoop) {\n slideSize += slides[i$1].swiperSlideSize;\n spv += 1;\n if (slideSize > swiperSize) { breakLoop = true; }\n }\n }\n } else {\n for (var i$2 = activeIndex + 1; i$2 < slides.length; i$2 += 1) {\n if (slidesGrid[i$2] - slidesGrid[activeIndex] < swiperSize) {\n spv += 1;\n }\n }\n }\n return spv;\n };\n\n Swiper.prototype.update = function update () {\n var swiper = this;\n if (!swiper || swiper.destroyed) { return; }\n var snapGrid = swiper.snapGrid;\n var params = swiper.params;\n // Breakpoints\n if (params.breakpoints) {\n swiper.setBreakpoint();\n }\n swiper.updateSize();\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n\n function setTranslate() {\n var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());\n swiper.setTranslate(newTranslate);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n }\n var translated;\n if (swiper.params.freeMode) {\n setTranslate();\n if (swiper.params.autoHeight) {\n swiper.updateAutoHeight();\n }\n } else {\n if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {\n translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n } else {\n translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n }\n if (!translated) {\n setTranslate();\n }\n }\n if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n swiper.checkOverflow();\n }\n swiper.emit('update');\n };\n\n Swiper.prototype.changeDirection = function changeDirection (newDirection, needUpdate) {\n if ( needUpdate === void 0 ) needUpdate = true;\n\n var swiper = this;\n var currentDirection = swiper.params.direction;\n if (!newDirection) {\n // eslint-disable-next-line\n newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n }\n if ((newDirection === currentDirection) || (newDirection !== 'horizontal' && newDirection !== 'vertical')) {\n return swiper;\n }\n\n if (currentDirection === 'vertical') {\n swiper.$el\n .removeClass(((swiper.params.containerModifierClass) + \"vertical wp8-vertical\"))\n .addClass((\"\" + (swiper.params.containerModifierClass) + newDirection));\n\n if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {\n swiper.$el.addClass(((swiper.params.containerModifierClass) + \"wp8-\" + newDirection));\n }\n }\n if (currentDirection === 'horizontal') {\n swiper.$el\n .removeClass(((swiper.params.containerModifierClass) + \"horizontal wp8-horizontal\"))\n .addClass((\"\" + (swiper.params.containerModifierClass) + newDirection));\n\n if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {\n swiper.$el.addClass(((swiper.params.containerModifierClass) + \"wp8-\" + newDirection));\n }\n }\n\n swiper.params.direction = newDirection;\n\n swiper.slides.each(function (slideIndex, slideEl) {\n if (newDirection === 'vertical') {\n slideEl.style.width = '';\n } else {\n slideEl.style.height = '';\n }\n });\n\n swiper.emit('changeDirection');\n if (needUpdate) { swiper.update(); }\n\n return swiper;\n };\n\n Swiper.prototype.init = function init () {\n var swiper = this;\n if (swiper.initialized) { return; }\n\n swiper.emit('beforeInit');\n\n // Set breakpoint\n if (swiper.params.breakpoints) {\n swiper.setBreakpoint();\n }\n\n // Add Classes\n swiper.addClasses();\n\n // Create loop\n if (swiper.params.loop) {\n swiper.loopCreate();\n }\n\n // Update size\n swiper.updateSize();\n\n // Update slides\n swiper.updateSlides();\n\n if (swiper.params.watchOverflow) {\n swiper.checkOverflow();\n }\n\n // Set Grab Cursor\n if (swiper.params.grabCursor) {\n swiper.setGrabCursor();\n }\n\n if (swiper.params.preloadImages) {\n swiper.preloadImages();\n }\n\n // Slide To Initial Slide\n if (swiper.params.loop) {\n swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit);\n } else {\n swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit);\n }\n\n // Attach events\n swiper.attachEvents();\n\n // Init Flag\n swiper.initialized = true;\n\n // Emit\n swiper.emit('init');\n };\n\n Swiper.prototype.destroy = function destroy (deleteInstance, cleanStyles) {\n if ( deleteInstance === void 0 ) deleteInstance = true;\n if ( cleanStyles === void 0 ) cleanStyles = true;\n\n var swiper = this;\n var params = swiper.params;\n var $el = swiper.$el;\n var $wrapperEl = swiper.$wrapperEl;\n var slides = swiper.slides;\n\n if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n return null;\n }\n\n swiper.emit('beforeDestroy');\n\n // Init Flag\n swiper.initialized = false;\n\n // Detach events\n swiper.detachEvents();\n\n // Destroy loop\n if (params.loop) {\n swiper.loopDestroy();\n }\n\n // Cleanup styles\n if (cleanStyles) {\n swiper.removeClasses();\n $el.removeAttr('style');\n $wrapperEl.removeAttr('style');\n if (slides && slides.length) {\n slides\n .removeClass([\n params.slideVisibleClass,\n params.slideActiveClass,\n params.slideNextClass,\n params.slidePrevClass ].join(' '))\n .removeAttr('style')\n .removeAttr('data-swiper-slide-index')\n .removeAttr('data-swiper-column')\n .removeAttr('data-swiper-row');\n }\n }\n\n swiper.emit('destroy');\n\n // Detach emitter events\n Object.keys(swiper.eventsListeners).forEach(function (eventName) {\n swiper.off(eventName);\n });\n\n if (deleteInstance !== false) {\n swiper.$el[0].swiper = null;\n swiper.$el.data('swiper', null);\n Utils.deleteProps(swiper);\n }\n swiper.destroyed = true;\n\n return null;\n };\n\n Swiper.extendDefaults = function extendDefaults (newDefaults) {\n Utils.extend(extendedDefaults, newDefaults);\n };\n\n staticAccessors.extendedDefaults.get = function () {\n return extendedDefaults;\n };\n\n staticAccessors.defaults.get = function () {\n return defaults;\n };\n\n staticAccessors.Class.get = function () {\n return SwiperClass;\n };\n\n staticAccessors.$.get = function () {\n return $;\n };\n\n Object.defineProperties( Swiper, staticAccessors );\n\n return Swiper;\n }(SwiperClass));\n\n var Device$1 = {\n name: 'device',\n proto: {\n device: Device,\n },\n static: {\n device: Device,\n },\n };\n\n var Support$1 = {\n name: 'support',\n proto: {\n support: Support,\n },\n static: {\n support: Support,\n },\n };\n\n var Browser$1 = {\n name: 'browser',\n proto: {\n browser: Browser,\n },\n static: {\n browser: Browser,\n },\n };\n\n var Resize = {\n name: 'resize',\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n resize: {\n resizeHandler: function resizeHandler() {\n if (!swiper || swiper.destroyed || !swiper.initialized) { return; }\n swiper.emit('beforeResize');\n swiper.emit('resize');\n },\n orientationChangeHandler: function orientationChangeHandler() {\n if (!swiper || swiper.destroyed || !swiper.initialized) { return; }\n swiper.emit('orientationchange');\n },\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n // Emit resize\n win.addEventListener('resize', swiper.resize.resizeHandler);\n\n // Emit orientationchange\n win.addEventListener('orientationchange', swiper.resize.orientationChangeHandler);\n },\n destroy: function destroy() {\n var swiper = this;\n win.removeEventListener('resize', swiper.resize.resizeHandler);\n win.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler);\n },\n },\n };\n\n var Observer = {\n func: win.MutationObserver || win.WebkitMutationObserver,\n attach: function attach(target, options) {\n if ( options === void 0 ) options = {};\n\n var swiper = this;\n\n var ObserverFunc = Observer.func;\n var observer = new ObserverFunc(function (mutations) {\n // The observerUpdate event should only be triggered\n // once despite the number of mutations. Additional\n // triggers are redundant and are very costly\n if (mutations.length === 1) {\n swiper.emit('observerUpdate', mutations[0]);\n return;\n }\n var observerUpdate = function observerUpdate() {\n swiper.emit('observerUpdate', mutations[0]);\n };\n\n if (win.requestAnimationFrame) {\n win.requestAnimationFrame(observerUpdate);\n } else {\n win.setTimeout(observerUpdate, 0);\n }\n });\n\n observer.observe(target, {\n attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n childList: typeof options.childList === 'undefined' ? true : options.childList,\n characterData: typeof options.characterData === 'undefined' ? true : options.characterData,\n });\n\n swiper.observer.observers.push(observer);\n },\n init: function init() {\n var swiper = this;\n if (!Support.observer || !swiper.params.observer) { return; }\n if (swiper.params.observeParents) {\n var containerParents = swiper.$el.parents();\n for (var i = 0; i < containerParents.length; i += 1) {\n swiper.observer.attach(containerParents[i]);\n }\n }\n // Observe container\n swiper.observer.attach(swiper.$el[0], { childList: swiper.params.observeSlideChildren });\n\n // Observe wrapper\n swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false });\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.observer.observers.forEach(function (observer) {\n observer.disconnect();\n });\n swiper.observer.observers = [];\n },\n };\n\n var Observer$1 = {\n name: 'observer',\n params: {\n observer: false,\n observeParents: false,\n observeSlideChildren: false,\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n observer: {\n init: Observer.init.bind(swiper),\n attach: Observer.attach.bind(swiper),\n destroy: Observer.destroy.bind(swiper),\n observers: [],\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n swiper.observer.init();\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.observer.destroy();\n },\n },\n };\n\n var Virtual = {\n update: function update(force) {\n var swiper = this;\n var ref = swiper.params;\n var slidesPerView = ref.slidesPerView;\n var slidesPerGroup = ref.slidesPerGroup;\n var centeredSlides = ref.centeredSlides;\n var ref$1 = swiper.params.virtual;\n var addSlidesBefore = ref$1.addSlidesBefore;\n var addSlidesAfter = ref$1.addSlidesAfter;\n var ref$2 = swiper.virtual;\n var previousFrom = ref$2.from;\n var previousTo = ref$2.to;\n var slides = ref$2.slides;\n var previousSlidesGrid = ref$2.slidesGrid;\n var renderSlide = ref$2.renderSlide;\n var previousOffset = ref$2.offset;\n swiper.updateActiveIndex();\n var activeIndex = swiper.activeIndex || 0;\n\n var offsetProp;\n if (swiper.rtlTranslate) { offsetProp = 'right'; }\n else { offsetProp = swiper.isHorizontal() ? 'left' : 'top'; }\n\n var slidesAfter;\n var slidesBefore;\n if (centeredSlides) {\n slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;\n slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;\n } else {\n slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesBefore;\n slidesBefore = slidesPerGroup + addSlidesAfter;\n }\n var from = Math.max((activeIndex || 0) - slidesBefore, 0);\n var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);\n var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n\n Utils.extend(swiper.virtual, {\n from: from,\n to: to,\n offset: offset,\n slidesGrid: swiper.slidesGrid,\n });\n\n function onRendered() {\n swiper.updateSlides();\n swiper.updateProgress();\n swiper.updateSlidesClasses();\n if (swiper.lazy && swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n }\n\n if (previousFrom === from && previousTo === to && !force) {\n if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n swiper.slides.css(offsetProp, (offset + \"px\"));\n }\n swiper.updateProgress();\n return;\n }\n if (swiper.params.virtual.renderExternal) {\n swiper.params.virtual.renderExternal.call(swiper, {\n offset: offset,\n from: from,\n to: to,\n slides: (function getSlides() {\n var slidesToRender = [];\n for (var i = from; i <= to; i += 1) {\n slidesToRender.push(slides[i]);\n }\n return slidesToRender;\n }()),\n });\n onRendered();\n return;\n }\n var prependIndexes = [];\n var appendIndexes = [];\n if (force) {\n swiper.$wrapperEl.find((\".\" + (swiper.params.slideClass))).remove();\n } else {\n for (var i = previousFrom; i <= previousTo; i += 1) {\n if (i < from || i > to) {\n swiper.$wrapperEl.find((\".\" + (swiper.params.slideClass) + \"[data-swiper-slide-index=\\\"\" + i + \"\\\"]\")).remove();\n }\n }\n }\n for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {\n if (i$1 >= from && i$1 <= to) {\n if (typeof previousTo === 'undefined' || force) {\n appendIndexes.push(i$1);\n } else {\n if (i$1 > previousTo) { appendIndexes.push(i$1); }\n if (i$1 < previousFrom) { prependIndexes.push(i$1); }\n }\n }\n }\n appendIndexes.forEach(function (index) {\n swiper.$wrapperEl.append(renderSlide(slides[index], index));\n });\n prependIndexes.sort(function (a, b) { return b - a; }).forEach(function (index) {\n swiper.$wrapperEl.prepend(renderSlide(slides[index], index));\n });\n swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, (offset + \"px\"));\n onRendered();\n },\n renderSlide: function renderSlide(slide, index) {\n var swiper = this;\n var params = swiper.params.virtual;\n if (params.cache && swiper.virtual.cache[index]) {\n return swiper.virtual.cache[index];\n }\n var $slideEl = params.renderSlide\n ? $(params.renderSlide.call(swiper, slide, index))\n : $((\"
            \" + slide + \"
            \"));\n if (!$slideEl.attr('data-swiper-slide-index')) { $slideEl.attr('data-swiper-slide-index', index); }\n if (params.cache) { swiper.virtual.cache[index] = $slideEl; }\n return $slideEl;\n },\n appendSlide: function appendSlide(slides) {\n var swiper = this;\n if (typeof slides === 'object' && 'length' in slides) {\n for (var i = 0; i < slides.length; i += 1) {\n if (slides[i]) { swiper.virtual.slides.push(slides[i]); }\n }\n } else {\n swiper.virtual.slides.push(slides);\n }\n swiper.virtual.update(true);\n },\n prependSlide: function prependSlide(slides) {\n var swiper = this;\n var activeIndex = swiper.activeIndex;\n var newActiveIndex = activeIndex + 1;\n var numberOfNewSlides = 1;\n\n if (Array.isArray(slides)) {\n for (var i = 0; i < slides.length; i += 1) {\n if (slides[i]) { swiper.virtual.slides.unshift(slides[i]); }\n }\n newActiveIndex = activeIndex + slides.length;\n numberOfNewSlides = slides.length;\n } else {\n swiper.virtual.slides.unshift(slides);\n }\n if (swiper.params.virtual.cache) {\n var cache = swiper.virtual.cache;\n var newCache = {};\n Object.keys(cache).forEach(function (cachedIndex) {\n newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cache[cachedIndex];\n });\n swiper.virtual.cache = newCache;\n }\n swiper.virtual.update(true);\n swiper.slideTo(newActiveIndex, 0);\n },\n removeSlide: function removeSlide(slidesIndexes) {\n var swiper = this;\n if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) { return; }\n var activeIndex = swiper.activeIndex;\n if (Array.isArray(slidesIndexes)) {\n for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n swiper.virtual.slides.splice(slidesIndexes[i], 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes[i]];\n }\n if (slidesIndexes[i] < activeIndex) { activeIndex -= 1; }\n activeIndex = Math.max(activeIndex, 0);\n }\n } else {\n swiper.virtual.slides.splice(slidesIndexes, 1);\n if (swiper.params.virtual.cache) {\n delete swiper.virtual.cache[slidesIndexes];\n }\n if (slidesIndexes < activeIndex) { activeIndex -= 1; }\n activeIndex = Math.max(activeIndex, 0);\n }\n swiper.virtual.update(true);\n swiper.slideTo(activeIndex, 0);\n },\n removeAllSlides: function removeAllSlides() {\n var swiper = this;\n swiper.virtual.slides = [];\n if (swiper.params.virtual.cache) {\n swiper.virtual.cache = {};\n }\n swiper.virtual.update(true);\n swiper.slideTo(0, 0);\n },\n };\n\n var Virtual$1 = {\n name: 'virtual',\n params: {\n virtual: {\n enabled: false,\n slides: [],\n cache: true,\n renderSlide: null,\n renderExternal: null,\n addSlidesBefore: 0,\n addSlidesAfter: 0,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n virtual: {\n update: Virtual.update.bind(swiper),\n appendSlide: Virtual.appendSlide.bind(swiper),\n prependSlide: Virtual.prependSlide.bind(swiper),\n removeSlide: Virtual.removeSlide.bind(swiper),\n removeAllSlides: Virtual.removeAllSlides.bind(swiper),\n renderSlide: Virtual.renderSlide.bind(swiper),\n slides: swiper.params.virtual.slides,\n cache: {},\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (!swiper.params.virtual.enabled) { return; }\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"virtual\"));\n var overwriteParams = {\n watchSlidesProgress: true,\n };\n Utils.extend(swiper.params, overwriteParams);\n Utils.extend(swiper.originalParams, overwriteParams);\n\n if (!swiper.params.initialSlide) {\n swiper.virtual.update();\n }\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (!swiper.params.virtual.enabled) { return; }\n swiper.virtual.update();\n },\n },\n };\n\n var Keyboard = {\n handle: function handle(event) {\n var swiper = this;\n var rtl = swiper.rtlTranslate;\n var e = event;\n if (e.originalEvent) { e = e.originalEvent; } // jquery fix\n var kc = e.keyCode || e.charCode;\n // Directions locks\n if (!swiper.allowSlideNext && ((swiper.isHorizontal() && kc === 39) || (swiper.isVertical() && kc === 40))) {\n return false;\n }\n if (!swiper.allowSlidePrev && ((swiper.isHorizontal() && kc === 37) || (swiper.isVertical() && kc === 38))) {\n return false;\n }\n if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n return undefined;\n }\n if (doc.activeElement && doc.activeElement.nodeName && (doc.activeElement.nodeName.toLowerCase() === 'input' || doc.activeElement.nodeName.toLowerCase() === 'textarea')) {\n return undefined;\n }\n if (swiper.params.keyboard.onlyInViewport && (kc === 37 || kc === 39 || kc === 38 || kc === 40)) {\n var inView = false;\n // Check that swiper should be inside of visible area of window\n if (swiper.$el.parents((\".\" + (swiper.params.slideClass))).length > 0 && swiper.$el.parents((\".\" + (swiper.params.slideActiveClass))).length === 0) {\n return undefined;\n }\n var windowWidth = win.innerWidth;\n var windowHeight = win.innerHeight;\n var swiperOffset = swiper.$el.offset();\n if (rtl) { swiperOffset.left -= swiper.$el[0].scrollLeft; }\n var swiperCoord = [\n [swiperOffset.left, swiperOffset.top],\n [swiperOffset.left + swiper.width, swiperOffset.top],\n [swiperOffset.left, swiperOffset.top + swiper.height],\n [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height] ];\n for (var i = 0; i < swiperCoord.length; i += 1) {\n var point = swiperCoord[i];\n if (\n point[0] >= 0 && point[0] <= windowWidth\n && point[1] >= 0 && point[1] <= windowHeight\n ) {\n inView = true;\n }\n }\n if (!inView) { return undefined; }\n }\n if (swiper.isHorizontal()) {\n if (kc === 37 || kc === 39) {\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n }\n if ((kc === 39 && !rtl) || (kc === 37 && rtl)) { swiper.slideNext(); }\n if ((kc === 37 && !rtl) || (kc === 39 && rtl)) { swiper.slidePrev(); }\n } else {\n if (kc === 38 || kc === 40) {\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n }\n if (kc === 40) { swiper.slideNext(); }\n if (kc === 38) { swiper.slidePrev(); }\n }\n swiper.emit('keyPress', kc);\n return undefined;\n },\n enable: function enable() {\n var swiper = this;\n if (swiper.keyboard.enabled) { return; }\n $(doc).on('keydown', swiper.keyboard.handle);\n swiper.keyboard.enabled = true;\n },\n disable: function disable() {\n var swiper = this;\n if (!swiper.keyboard.enabled) { return; }\n $(doc).off('keydown', swiper.keyboard.handle);\n swiper.keyboard.enabled = false;\n },\n };\n\n var Keyboard$1 = {\n name: 'keyboard',\n params: {\n keyboard: {\n enabled: false,\n onlyInViewport: true,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n keyboard: {\n enabled: false,\n enable: Keyboard.enable.bind(swiper),\n disable: Keyboard.disable.bind(swiper),\n handle: Keyboard.handle.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.keyboard.enabled) {\n swiper.keyboard.enable();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.keyboard.enabled) {\n swiper.keyboard.disable();\n }\n },\n },\n };\n\n function isEventSupported() {\n var eventName = 'onwheel';\n var isSupported = eventName in doc;\n\n if (!isSupported) {\n var element = doc.createElement('div');\n element.setAttribute(eventName, 'return;');\n isSupported = typeof element[eventName] === 'function';\n }\n\n if (!isSupported\n && doc.implementation\n && doc.implementation.hasFeature\n // always returns true in newer browsers as per the standard.\n // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature\n && doc.implementation.hasFeature('', '') !== true\n ) {\n // This is the only way to test support for the `wheel` event in IE9+.\n isSupported = doc.implementation.hasFeature('Events.wheel', '3.0');\n }\n\n return isSupported;\n }\n var Mousewheel = {\n lastScrollTime: Utils.now(),\n event: (function getEvent() {\n if (win.navigator.userAgent.indexOf('firefox') > -1) { return 'DOMMouseScroll'; }\n return isEventSupported() ? 'wheel' : 'mousewheel';\n }()),\n normalize: function normalize(e) {\n // Reasonable defaults\n var PIXEL_STEP = 10;\n var LINE_HEIGHT = 40;\n var PAGE_HEIGHT = 800;\n\n var sX = 0;\n var sY = 0; // spinX, spinY\n var pX = 0;\n var pY = 0; // pixelX, pixelY\n\n // Legacy\n if ('detail' in e) {\n sY = e.detail;\n }\n if ('wheelDelta' in e) {\n sY = -e.wheelDelta / 120;\n }\n if ('wheelDeltaY' in e) {\n sY = -e.wheelDeltaY / 120;\n }\n if ('wheelDeltaX' in e) {\n sX = -e.wheelDeltaX / 120;\n }\n\n // side scrolling on FF with DOMMouseScroll\n if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in e) {\n pY = e.deltaY;\n }\n if ('deltaX' in e) {\n pX = e.deltaX;\n }\n\n if ((pX || pY) && e.deltaMode) {\n if (e.deltaMode === 1) { // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else { // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n\n // Fall-back if spin cannot be determined\n if (pX && !sX) {\n sX = (pX < 1) ? -1 : 1;\n }\n if (pY && !sY) {\n sY = (pY < 1) ? -1 : 1;\n }\n\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY,\n };\n },\n handleMouseEnter: function handleMouseEnter() {\n var swiper = this;\n swiper.mouseEntered = true;\n },\n handleMouseLeave: function handleMouseLeave() {\n var swiper = this;\n swiper.mouseEntered = false;\n },\n handle: function handle(event) {\n var e = event;\n var swiper = this;\n var params = swiper.params.mousewheel;\n\n if (!swiper.mouseEntered && !params.releaseOnEdges) { return true; }\n\n if (e.originalEvent) { e = e.originalEvent; } // jquery fix\n var delta = 0;\n var rtlFactor = swiper.rtlTranslate ? -1 : 1;\n\n var data = Mousewheel.normalize(e);\n\n if (params.forceToAxis) {\n if (swiper.isHorizontal()) {\n if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) { delta = data.pixelX * rtlFactor; }\n else { return true; }\n } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) { delta = data.pixelY; }\n else { return true; }\n } else {\n delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n }\n\n if (delta === 0) { return true; }\n\n if (params.invert) { delta = -delta; }\n\n if (!swiper.params.freeMode) {\n if (Utils.now() - swiper.mousewheel.lastScrollTime > 60) {\n if (delta < 0) {\n if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n swiper.slideNext();\n swiper.emit('scroll', e);\n } else if (params.releaseOnEdges) { return true; }\n } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n swiper.slidePrev();\n swiper.emit('scroll', e);\n } else if (params.releaseOnEdges) { return true; }\n }\n swiper.mousewheel.lastScrollTime = (new win.Date()).getTime();\n } else {\n // Freemode or scrollContainer:\n if (swiper.params.loop) {\n swiper.loopFix();\n }\n var position = swiper.getTranslate() + (delta * params.sensitivity);\n var wasBeginning = swiper.isBeginning;\n var wasEnd = swiper.isEnd;\n\n if (position >= swiper.minTranslate()) { position = swiper.minTranslate(); }\n if (position <= swiper.maxTranslate()) { position = swiper.maxTranslate(); }\n\n swiper.setTransition(0);\n swiper.setTranslate(position);\n swiper.updateProgress();\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n\n if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {\n swiper.updateSlidesClasses();\n }\n\n if (swiper.params.freeModeSticky) {\n clearTimeout(swiper.mousewheel.timeout);\n swiper.mousewheel.timeout = Utils.nextTick(function () {\n swiper.slideToClosest();\n }, 300);\n }\n // Emit event\n swiper.emit('scroll', e);\n\n // Stop autoplay\n if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) { swiper.autoplay.stop(); }\n // Return page scroll on edge positions\n if (position === swiper.minTranslate() || position === swiper.maxTranslate()) { return true; }\n }\n\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n return false;\n },\n enable: function enable() {\n var swiper = this;\n if (!Mousewheel.event) { return false; }\n if (swiper.mousewheel.enabled) { return false; }\n var target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarged !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarged);\n }\n target.on('mouseenter', swiper.mousewheel.handleMouseEnter);\n target.on('mouseleave', swiper.mousewheel.handleMouseLeave);\n target.on(Mousewheel.event, swiper.mousewheel.handle);\n swiper.mousewheel.enabled = true;\n return true;\n },\n disable: function disable() {\n var swiper = this;\n if (!Mousewheel.event) { return false; }\n if (!swiper.mousewheel.enabled) { return false; }\n var target = swiper.$el;\n if (swiper.params.mousewheel.eventsTarged !== 'container') {\n target = $(swiper.params.mousewheel.eventsTarged);\n }\n target.off(Mousewheel.event, swiper.mousewheel.handle);\n swiper.mousewheel.enabled = false;\n return true;\n },\n };\n\n var Mousewheel$1 = {\n name: 'mousewheel',\n params: {\n mousewheel: {\n enabled: false,\n releaseOnEdges: false,\n invert: false,\n forceToAxis: false,\n sensitivity: 1,\n eventsTarged: 'container',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n mousewheel: {\n enabled: false,\n enable: Mousewheel.enable.bind(swiper),\n disable: Mousewheel.disable.bind(swiper),\n handle: Mousewheel.handle.bind(swiper),\n handleMouseEnter: Mousewheel.handleMouseEnter.bind(swiper),\n handleMouseLeave: Mousewheel.handleMouseLeave.bind(swiper),\n lastScrollTime: Utils.now(),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.mousewheel.enabled) { swiper.mousewheel.enable(); }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.mousewheel.enabled) { swiper.mousewheel.disable(); }\n },\n },\n };\n\n var Navigation = {\n update: function update() {\n // Update Navigation Buttons\n var swiper = this;\n var params = swiper.params.navigation;\n\n if (swiper.params.loop) { return; }\n var ref = swiper.navigation;\n var $nextEl = ref.$nextEl;\n var $prevEl = ref.$prevEl;\n\n if ($prevEl && $prevEl.length > 0) {\n if (swiper.isBeginning) {\n $prevEl.addClass(params.disabledClass);\n } else {\n $prevEl.removeClass(params.disabledClass);\n }\n $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n if ($nextEl && $nextEl.length > 0) {\n if (swiper.isEnd) {\n $nextEl.addClass(params.disabledClass);\n } else {\n $nextEl.removeClass(params.disabledClass);\n }\n $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n }\n },\n onPrevClick: function onPrevClick(e) {\n var swiper = this;\n e.preventDefault();\n if (swiper.isBeginning && !swiper.params.loop) { return; }\n swiper.slidePrev();\n },\n onNextClick: function onNextClick(e) {\n var swiper = this;\n e.preventDefault();\n if (swiper.isEnd && !swiper.params.loop) { return; }\n swiper.slideNext();\n },\n init: function init() {\n var swiper = this;\n var params = swiper.params.navigation;\n if (!(params.nextEl || params.prevEl)) { return; }\n\n var $nextEl;\n var $prevEl;\n if (params.nextEl) {\n $nextEl = $(params.nextEl);\n if (\n swiper.params.uniqueNavElements\n && typeof params.nextEl === 'string'\n && $nextEl.length > 1\n && swiper.$el.find(params.nextEl).length === 1\n ) {\n $nextEl = swiper.$el.find(params.nextEl);\n }\n }\n if (params.prevEl) {\n $prevEl = $(params.prevEl);\n if (\n swiper.params.uniqueNavElements\n && typeof params.prevEl === 'string'\n && $prevEl.length > 1\n && swiper.$el.find(params.prevEl).length === 1\n ) {\n $prevEl = swiper.$el.find(params.prevEl);\n }\n }\n\n if ($nextEl && $nextEl.length > 0) {\n $nextEl.on('click', swiper.navigation.onNextClick);\n }\n if ($prevEl && $prevEl.length > 0) {\n $prevEl.on('click', swiper.navigation.onPrevClick);\n }\n\n Utils.extend(swiper.navigation, {\n $nextEl: $nextEl,\n nextEl: $nextEl && $nextEl[0],\n $prevEl: $prevEl,\n prevEl: $prevEl && $prevEl[0],\n });\n },\n destroy: function destroy() {\n var swiper = this;\n var ref = swiper.navigation;\n var $nextEl = ref.$nextEl;\n var $prevEl = ref.$prevEl;\n if ($nextEl && $nextEl.length) {\n $nextEl.off('click', swiper.navigation.onNextClick);\n $nextEl.removeClass(swiper.params.navigation.disabledClass);\n }\n if ($prevEl && $prevEl.length) {\n $prevEl.off('click', swiper.navigation.onPrevClick);\n $prevEl.removeClass(swiper.params.navigation.disabledClass);\n }\n },\n };\n\n var Navigation$1 = {\n name: 'navigation',\n params: {\n navigation: {\n nextEl: null,\n prevEl: null,\n\n hideOnClick: false,\n disabledClass: 'swiper-button-disabled',\n hiddenClass: 'swiper-button-hidden',\n lockClass: 'swiper-button-lock',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n navigation: {\n init: Navigation.init.bind(swiper),\n update: Navigation.update.bind(swiper),\n destroy: Navigation.destroy.bind(swiper),\n onNextClick: Navigation.onNextClick.bind(swiper),\n onPrevClick: Navigation.onPrevClick.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n swiper.navigation.init();\n swiper.navigation.update();\n },\n toEdge: function toEdge() {\n var swiper = this;\n swiper.navigation.update();\n },\n fromEdge: function fromEdge() {\n var swiper = this;\n swiper.navigation.update();\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.navigation.destroy();\n },\n click: function click(e) {\n var swiper = this;\n var ref = swiper.navigation;\n var $nextEl = ref.$nextEl;\n var $prevEl = ref.$prevEl;\n if (\n swiper.params.navigation.hideOnClick\n && !$(e.target).is($prevEl)\n && !$(e.target).is($nextEl)\n ) {\n var isHidden;\n if ($nextEl) {\n isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);\n } else if ($prevEl) {\n isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);\n }\n if (isHidden === true) {\n swiper.emit('navigationShow', swiper);\n } else {\n swiper.emit('navigationHide', swiper);\n }\n if ($nextEl) {\n $nextEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n if ($prevEl) {\n $prevEl.toggleClass(swiper.params.navigation.hiddenClass);\n }\n }\n },\n },\n };\n\n var Pagination = {\n update: function update() {\n // Render || Update Pagination bullets/items\n var swiper = this;\n var rtl = swiper.rtl;\n var params = swiper.params.pagination;\n if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }\n var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n var $el = swiper.pagination.$el;\n // Current/Total\n var current;\n var total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n if (swiper.params.loop) {\n current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);\n if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) {\n current -= (slidesLength - (swiper.loopedSlides * 2));\n }\n if (current > total - 1) { current -= total; }\n if (current < 0 && swiper.params.paginationType !== 'bullets') { current = total + current; }\n } else if (typeof swiper.snapIndex !== 'undefined') {\n current = swiper.snapIndex;\n } else {\n current = swiper.activeIndex || 0;\n }\n // Types\n if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {\n var bullets = swiper.pagination.bullets;\n var firstIndex;\n var lastIndex;\n var midIndex;\n if (params.dynamicBullets) {\n swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n $el.css(swiper.isHorizontal() ? 'width' : 'height', ((swiper.pagination.bulletSize * (params.dynamicMainBullets + 4)) + \"px\"));\n if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n swiper.pagination.dynamicBulletIndex += (current - swiper.previousIndex);\n if (swiper.pagination.dynamicBulletIndex > (params.dynamicMainBullets - 1)) {\n swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1;\n } else if (swiper.pagination.dynamicBulletIndex < 0) {\n swiper.pagination.dynamicBulletIndex = 0;\n }\n }\n firstIndex = current - swiper.pagination.dynamicBulletIndex;\n lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n midIndex = (lastIndex + firstIndex) / 2;\n }\n bullets.removeClass(((params.bulletActiveClass) + \" \" + (params.bulletActiveClass) + \"-next \" + (params.bulletActiveClass) + \"-next-next \" + (params.bulletActiveClass) + \"-prev \" + (params.bulletActiveClass) + \"-prev-prev \" + (params.bulletActiveClass) + \"-main\"));\n if ($el.length > 1) {\n bullets.each(function (index, bullet) {\n var $bullet = $(bullet);\n var bulletIndex = $bullet.index();\n if (bulletIndex === current) {\n $bullet.addClass(params.bulletActiveClass);\n }\n if (params.dynamicBullets) {\n if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n $bullet.addClass(((params.bulletActiveClass) + \"-main\"));\n }\n if (bulletIndex === firstIndex) {\n $bullet\n .prev()\n .addClass(((params.bulletActiveClass) + \"-prev\"))\n .prev()\n .addClass(((params.bulletActiveClass) + \"-prev-prev\"));\n }\n if (bulletIndex === lastIndex) {\n $bullet\n .next()\n .addClass(((params.bulletActiveClass) + \"-next\"))\n .next()\n .addClass(((params.bulletActiveClass) + \"-next-next\"));\n }\n }\n });\n } else {\n var $bullet = bullets.eq(current);\n $bullet.addClass(params.bulletActiveClass);\n if (params.dynamicBullets) {\n var $firstDisplayedBullet = bullets.eq(firstIndex);\n var $lastDisplayedBullet = bullets.eq(lastIndex);\n for (var i = firstIndex; i <= lastIndex; i += 1) {\n bullets.eq(i).addClass(((params.bulletActiveClass) + \"-main\"));\n }\n $firstDisplayedBullet\n .prev()\n .addClass(((params.bulletActiveClass) + \"-prev\"))\n .prev()\n .addClass(((params.bulletActiveClass) + \"-prev-prev\"));\n $lastDisplayedBullet\n .next()\n .addClass(((params.bulletActiveClass) + \"-next\"))\n .next()\n .addClass(((params.bulletActiveClass) + \"-next-next\"));\n }\n }\n if (params.dynamicBullets) {\n var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n var bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (midIndex * swiper.pagination.bulletSize);\n var offsetProp = rtl ? 'right' : 'left';\n bullets.css(swiper.isHorizontal() ? offsetProp : 'top', (bulletsOffset + \"px\"));\n }\n }\n if (params.type === 'fraction') {\n $el.find((\".\" + (params.currentClass))).text(params.formatFractionCurrent(current + 1));\n $el.find((\".\" + (params.totalClass))).text(params.formatFractionTotal(total));\n }\n if (params.type === 'progressbar') {\n var progressbarDirection;\n if (params.progressbarOpposite) {\n progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n } else {\n progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n }\n var scale = (current + 1) / total;\n var scaleX = 1;\n var scaleY = 1;\n if (progressbarDirection === 'horizontal') {\n scaleX = scale;\n } else {\n scaleY = scale;\n }\n $el.find((\".\" + (params.progressbarFillClass))).transform((\"translate3d(0,0,0) scaleX(\" + scaleX + \") scaleY(\" + scaleY + \")\")).transition(swiper.params.speed);\n }\n if (params.type === 'custom' && params.renderCustom) {\n $el.html(params.renderCustom(swiper, current + 1, total));\n swiper.emit('paginationRender', swiper, $el[0]);\n } else {\n swiper.emit('paginationUpdate', swiper, $el[0]);\n }\n $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n },\n render: function render() {\n // Render Container\n var swiper = this;\n var params = swiper.params.pagination;\n if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }\n var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n\n var $el = swiper.pagination.$el;\n var paginationHTML = '';\n if (params.type === 'bullets') {\n var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n for (var i = 0; i < numberOfBullets; i += 1) {\n if (params.renderBullet) {\n paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n } else {\n paginationHTML += \"<\" + (params.bulletElement) + \" class=\\\"\" + (params.bulletClass) + \"\\\">\";\n }\n }\n $el.html(paginationHTML);\n swiper.pagination.bullets = $el.find((\".\" + (params.bulletClass)));\n }\n if (params.type === 'fraction') {\n if (params.renderFraction) {\n paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n } else {\n paginationHTML = \"\"\n + ' / '\n + \"\";\n }\n $el.html(paginationHTML);\n }\n if (params.type === 'progressbar') {\n if (params.renderProgressbar) {\n paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n } else {\n paginationHTML = \"\";\n }\n $el.html(paginationHTML);\n }\n if (params.type !== 'custom') {\n swiper.emit('paginationRender', swiper.pagination.$el[0]);\n }\n },\n init: function init() {\n var swiper = this;\n var params = swiper.params.pagination;\n if (!params.el) { return; }\n\n var $el = $(params.el);\n if ($el.length === 0) { return; }\n\n if (\n swiper.params.uniqueNavElements\n && typeof params.el === 'string'\n && $el.length > 1\n && swiper.$el.find(params.el).length === 1\n ) {\n $el = swiper.$el.find(params.el);\n }\n\n if (params.type === 'bullets' && params.clickable) {\n $el.addClass(params.clickableClass);\n }\n\n $el.addClass(params.modifierClass + params.type);\n\n if (params.type === 'bullets' && params.dynamicBullets) {\n $el.addClass((\"\" + (params.modifierClass) + (params.type) + \"-dynamic\"));\n swiper.pagination.dynamicBulletIndex = 0;\n if (params.dynamicMainBullets < 1) {\n params.dynamicMainBullets = 1;\n }\n }\n if (params.type === 'progressbar' && params.progressbarOpposite) {\n $el.addClass(params.progressbarOppositeClass);\n }\n\n if (params.clickable) {\n $el.on('click', (\".\" + (params.bulletClass)), function onClick(e) {\n e.preventDefault();\n var index = $(this).index() * swiper.params.slidesPerGroup;\n if (swiper.params.loop) { index += swiper.loopedSlides; }\n swiper.slideTo(index);\n });\n }\n\n Utils.extend(swiper.pagination, {\n $el: $el,\n el: $el[0],\n });\n },\n destroy: function destroy() {\n var swiper = this;\n var params = swiper.params.pagination;\n if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }\n var $el = swiper.pagination.$el;\n\n $el.removeClass(params.hiddenClass);\n $el.removeClass(params.modifierClass + params.type);\n if (swiper.pagination.bullets) { swiper.pagination.bullets.removeClass(params.bulletActiveClass); }\n if (params.clickable) {\n $el.off('click', (\".\" + (params.bulletClass)));\n }\n },\n };\n\n var Pagination$1 = {\n name: 'pagination',\n params: {\n pagination: {\n el: null,\n bulletElement: 'span',\n clickable: false,\n hideOnClick: false,\n renderBullet: null,\n renderProgressbar: null,\n renderFraction: null,\n renderCustom: null,\n progressbarOpposite: false,\n type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n dynamicBullets: false,\n dynamicMainBullets: 1,\n formatFractionCurrent: function (number) { return number; },\n formatFractionTotal: function (number) { return number; },\n bulletClass: 'swiper-pagination-bullet',\n bulletActiveClass: 'swiper-pagination-bullet-active',\n modifierClass: 'swiper-pagination-', // NEW\n currentClass: 'swiper-pagination-current',\n totalClass: 'swiper-pagination-total',\n hiddenClass: 'swiper-pagination-hidden',\n progressbarFillClass: 'swiper-pagination-progressbar-fill',\n progressbarOppositeClass: 'swiper-pagination-progressbar-opposite',\n clickableClass: 'swiper-pagination-clickable', // NEW\n lockClass: 'swiper-pagination-lock',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n pagination: {\n init: Pagination.init.bind(swiper),\n render: Pagination.render.bind(swiper),\n update: Pagination.update.bind(swiper),\n destroy: Pagination.destroy.bind(swiper),\n dynamicBulletIndex: 0,\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n swiper.pagination.init();\n swiper.pagination.render();\n swiper.pagination.update();\n },\n activeIndexChange: function activeIndexChange() {\n var swiper = this;\n if (swiper.params.loop) {\n swiper.pagination.update();\n } else if (typeof swiper.snapIndex === 'undefined') {\n swiper.pagination.update();\n }\n },\n snapIndexChange: function snapIndexChange() {\n var swiper = this;\n if (!swiper.params.loop) {\n swiper.pagination.update();\n }\n },\n slidesLengthChange: function slidesLengthChange() {\n var swiper = this;\n if (swiper.params.loop) {\n swiper.pagination.render();\n swiper.pagination.update();\n }\n },\n snapGridLengthChange: function snapGridLengthChange() {\n var swiper = this;\n if (!swiper.params.loop) {\n swiper.pagination.render();\n swiper.pagination.update();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.pagination.destroy();\n },\n click: function click(e) {\n var swiper = this;\n if (\n swiper.params.pagination.el\n && swiper.params.pagination.hideOnClick\n && swiper.pagination.$el.length > 0\n && !$(e.target).hasClass(swiper.params.pagination.bulletClass)\n ) {\n var isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass);\n if (isHidden === true) {\n swiper.emit('paginationShow', swiper);\n } else {\n swiper.emit('paginationHide', swiper);\n }\n swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass);\n }\n },\n },\n };\n\n var Scrollbar = {\n setTranslate: function setTranslate() {\n var swiper = this;\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }\n var scrollbar = swiper.scrollbar;\n var rtl = swiper.rtlTranslate;\n var progress = swiper.progress;\n var dragSize = scrollbar.dragSize;\n var trackSize = scrollbar.trackSize;\n var $dragEl = scrollbar.$dragEl;\n var $el = scrollbar.$el;\n var params = swiper.params.scrollbar;\n\n var newSize = dragSize;\n var newPos = (trackSize - dragSize) * progress;\n if (rtl) {\n newPos = -newPos;\n if (newPos > 0) {\n newSize = dragSize - newPos;\n newPos = 0;\n } else if (-newPos + dragSize > trackSize) {\n newSize = trackSize + newPos;\n }\n } else if (newPos < 0) {\n newSize = dragSize + newPos;\n newPos = 0;\n } else if (newPos + dragSize > trackSize) {\n newSize = trackSize - newPos;\n }\n if (swiper.isHorizontal()) {\n if (Support.transforms3d) {\n $dragEl.transform((\"translate3d(\" + newPos + \"px, 0, 0)\"));\n } else {\n $dragEl.transform((\"translateX(\" + newPos + \"px)\"));\n }\n $dragEl[0].style.width = newSize + \"px\";\n } else {\n if (Support.transforms3d) {\n $dragEl.transform((\"translate3d(0px, \" + newPos + \"px, 0)\"));\n } else {\n $dragEl.transform((\"translateY(\" + newPos + \"px)\"));\n }\n $dragEl[0].style.height = newSize + \"px\";\n }\n if (params.hide) {\n clearTimeout(swiper.scrollbar.timeout);\n $el[0].style.opacity = 1;\n swiper.scrollbar.timeout = setTimeout(function () {\n $el[0].style.opacity = 0;\n $el.transition(400);\n }, 1000);\n }\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }\n swiper.scrollbar.$dragEl.transition(duration);\n },\n updateSize: function updateSize() {\n var swiper = this;\n if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }\n\n var scrollbar = swiper.scrollbar;\n var $dragEl = scrollbar.$dragEl;\n var $el = scrollbar.$el;\n\n $dragEl[0].style.width = '';\n $dragEl[0].style.height = '';\n var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n\n var divider = swiper.size / swiper.virtualSize;\n var moveDivider = divider * (trackSize / swiper.size);\n var dragSize;\n if (swiper.params.scrollbar.dragSize === 'auto') {\n dragSize = trackSize * divider;\n } else {\n dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n }\n\n if (swiper.isHorizontal()) {\n $dragEl[0].style.width = dragSize + \"px\";\n } else {\n $dragEl[0].style.height = dragSize + \"px\";\n }\n\n if (divider >= 1) {\n $el[0].style.display = 'none';\n } else {\n $el[0].style.display = '';\n }\n if (swiper.params.scrollbar.hide) {\n $el[0].style.opacity = 0;\n }\n Utils.extend(scrollbar, {\n trackSize: trackSize,\n divider: divider,\n moveDivider: moveDivider,\n dragSize: dragSize,\n });\n scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);\n },\n setDragPosition: function setDragPosition(e) {\n var swiper = this;\n var scrollbar = swiper.scrollbar;\n var rtl = swiper.rtlTranslate;\n var $el = scrollbar.$el;\n var dragSize = scrollbar.dragSize;\n var trackSize = scrollbar.trackSize;\n\n var pointerPosition;\n if (swiper.isHorizontal()) {\n pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX);\n } else {\n pointerPosition = ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY);\n }\n var positionRatio;\n positionRatio = ((pointerPosition) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragSize / 2)) / (trackSize - dragSize);\n positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n if (rtl) {\n positionRatio = 1 - positionRatio;\n }\n\n var position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio);\n\n swiper.updateProgress(position);\n swiper.setTranslate(position);\n swiper.updateActiveIndex();\n swiper.updateSlidesClasses();\n },\n onDragStart: function onDragStart(e) {\n var swiper = this;\n var params = swiper.params.scrollbar;\n var scrollbar = swiper.scrollbar;\n var $wrapperEl = swiper.$wrapperEl;\n var $el = scrollbar.$el;\n var $dragEl = scrollbar.$dragEl;\n swiper.scrollbar.isTouched = true;\n e.preventDefault();\n e.stopPropagation();\n\n $wrapperEl.transition(100);\n $dragEl.transition(100);\n scrollbar.setDragPosition(e);\n\n clearTimeout(swiper.scrollbar.dragTimeout);\n\n $el.transition(0);\n if (params.hide) {\n $el.css('opacity', 1);\n }\n swiper.emit('scrollbarDragStart', e);\n },\n onDragMove: function onDragMove(e) {\n var swiper = this;\n var scrollbar = swiper.scrollbar;\n var $wrapperEl = swiper.$wrapperEl;\n var $el = scrollbar.$el;\n var $dragEl = scrollbar.$dragEl;\n\n if (!swiper.scrollbar.isTouched) { return; }\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n scrollbar.setDragPosition(e);\n $wrapperEl.transition(0);\n $el.transition(0);\n $dragEl.transition(0);\n swiper.emit('scrollbarDragMove', e);\n },\n onDragEnd: function onDragEnd(e) {\n var swiper = this;\n\n var params = swiper.params.scrollbar;\n var scrollbar = swiper.scrollbar;\n var $el = scrollbar.$el;\n\n if (!swiper.scrollbar.isTouched) { return; }\n swiper.scrollbar.isTouched = false;\n if (params.hide) {\n clearTimeout(swiper.scrollbar.dragTimeout);\n swiper.scrollbar.dragTimeout = Utils.nextTick(function () {\n $el.css('opacity', 0);\n $el.transition(400);\n }, 1000);\n }\n swiper.emit('scrollbarDragEnd', e);\n if (params.snapOnRelease) {\n swiper.slideToClosest();\n }\n },\n enableDraggable: function enableDraggable() {\n var swiper = this;\n if (!swiper.params.scrollbar.el) { return; }\n var scrollbar = swiper.scrollbar;\n var touchEventsTouch = swiper.touchEventsTouch;\n var touchEventsDesktop = swiper.touchEventsDesktop;\n var params = swiper.params;\n var $el = scrollbar.$el;\n var target = $el[0];\n var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;\n var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n if (!Support.touch) {\n target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);\n doc.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);\n doc.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);\n } else {\n target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);\n target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);\n target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);\n }\n },\n disableDraggable: function disableDraggable() {\n var swiper = this;\n if (!swiper.params.scrollbar.el) { return; }\n var scrollbar = swiper.scrollbar;\n var touchEventsTouch = swiper.touchEventsTouch;\n var touchEventsDesktop = swiper.touchEventsDesktop;\n var params = swiper.params;\n var $el = scrollbar.$el;\n var target = $el[0];\n var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;\n var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;\n if (!Support.touch) {\n target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);\n doc.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);\n doc.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);\n } else {\n target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);\n target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);\n target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);\n }\n },\n init: function init() {\n var swiper = this;\n if (!swiper.params.scrollbar.el) { return; }\n var scrollbar = swiper.scrollbar;\n var $swiperEl = swiper.$el;\n var params = swiper.params.scrollbar;\n\n var $el = $(params.el);\n if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {\n $el = $swiperEl.find(params.el);\n }\n\n var $dragEl = $el.find((\".\" + (swiper.params.scrollbar.dragClass)));\n if ($dragEl.length === 0) {\n $dragEl = $((\"
            \"));\n $el.append($dragEl);\n }\n\n Utils.extend(scrollbar, {\n $el: $el,\n el: $el[0],\n $dragEl: $dragEl,\n dragEl: $dragEl[0],\n });\n\n if (params.draggable) {\n scrollbar.enableDraggable();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.scrollbar.disableDraggable();\n },\n };\n\n var Scrollbar$1 = {\n name: 'scrollbar',\n params: {\n scrollbar: {\n el: null,\n dragSize: 'auto',\n hide: false,\n draggable: false,\n snapOnRelease: true,\n lockClass: 'swiper-scrollbar-lock',\n dragClass: 'swiper-scrollbar-drag',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n scrollbar: {\n init: Scrollbar.init.bind(swiper),\n destroy: Scrollbar.destroy.bind(swiper),\n updateSize: Scrollbar.updateSize.bind(swiper),\n setTranslate: Scrollbar.setTranslate.bind(swiper),\n setTransition: Scrollbar.setTransition.bind(swiper),\n enableDraggable: Scrollbar.enableDraggable.bind(swiper),\n disableDraggable: Scrollbar.disableDraggable.bind(swiper),\n setDragPosition: Scrollbar.setDragPosition.bind(swiper),\n onDragStart: Scrollbar.onDragStart.bind(swiper),\n onDragMove: Scrollbar.onDragMove.bind(swiper),\n onDragEnd: Scrollbar.onDragEnd.bind(swiper),\n isTouched: false,\n timeout: null,\n dragTimeout: null,\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n swiper.scrollbar.init();\n swiper.scrollbar.updateSize();\n swiper.scrollbar.setTranslate();\n },\n update: function update() {\n var swiper = this;\n swiper.scrollbar.updateSize();\n },\n resize: function resize() {\n var swiper = this;\n swiper.scrollbar.updateSize();\n },\n observerUpdate: function observerUpdate() {\n var swiper = this;\n swiper.scrollbar.updateSize();\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n swiper.scrollbar.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n swiper.scrollbar.setTransition(duration);\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.scrollbar.destroy();\n },\n },\n };\n\n var Parallax = {\n setTransform: function setTransform(el, progress) {\n var swiper = this;\n var rtl = swiper.rtl;\n\n var $el = $(el);\n var rtlFactor = rtl ? -1 : 1;\n\n var p = $el.attr('data-swiper-parallax') || '0';\n var x = $el.attr('data-swiper-parallax-x');\n var y = $el.attr('data-swiper-parallax-y');\n var scale = $el.attr('data-swiper-parallax-scale');\n var opacity = $el.attr('data-swiper-parallax-opacity');\n\n if (x || y) {\n x = x || '0';\n y = y || '0';\n } else if (swiper.isHorizontal()) {\n x = p;\n y = '0';\n } else {\n y = p;\n x = '0';\n }\n\n if ((x).indexOf('%') >= 0) {\n x = (parseInt(x, 10) * progress * rtlFactor) + \"%\";\n } else {\n x = (x * progress * rtlFactor) + \"px\";\n }\n if ((y).indexOf('%') >= 0) {\n y = (parseInt(y, 10) * progress) + \"%\";\n } else {\n y = (y * progress) + \"px\";\n }\n\n if (typeof opacity !== 'undefined' && opacity !== null) {\n var currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress)));\n $el[0].style.opacity = currentOpacity;\n }\n if (typeof scale === 'undefined' || scale === null) {\n $el.transform((\"translate3d(\" + x + \", \" + y + \", 0px)\"));\n } else {\n var currentScale = scale - ((scale - 1) * (1 - Math.abs(progress)));\n $el.transform((\"translate3d(\" + x + \", \" + y + \", 0px) scale(\" + currentScale + \")\"));\n }\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n var $el = swiper.$el;\n var slides = swiper.slides;\n var progress = swiper.progress;\n var snapGrid = swiper.snapGrid;\n $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')\n .each(function (index, el) {\n swiper.parallax.setTransform(el, progress);\n });\n slides.each(function (slideIndex, slideEl) {\n var slideProgress = slideEl.progress;\n if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1));\n }\n slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')\n .each(function (index, el) {\n swiper.parallax.setTransform(el, slideProgress);\n });\n });\n },\n setTransition: function setTransition(duration) {\n if ( duration === void 0 ) duration = this.params.speed;\n\n var swiper = this;\n var $el = swiper.$el;\n $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')\n .each(function (index, parallaxEl) {\n var $parallaxEl = $(parallaxEl);\n var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;\n if (duration === 0) { parallaxDuration = 0; }\n $parallaxEl.transition(parallaxDuration);\n });\n },\n };\n\n var Parallax$1 = {\n name: 'parallax',\n params: {\n parallax: {\n enabled: false,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n parallax: {\n setTransform: Parallax.setTransform.bind(swiper),\n setTranslate: Parallax.setTranslate.bind(swiper),\n setTransition: Parallax.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (!swiper.params.parallax.enabled) { return; }\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n },\n init: function init() {\n var swiper = this;\n if (!swiper.params.parallax.enabled) { return; }\n swiper.parallax.setTranslate();\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (!swiper.params.parallax.enabled) { return; }\n swiper.parallax.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (!swiper.params.parallax.enabled) { return; }\n swiper.parallax.setTransition(duration);\n },\n },\n };\n\n var Zoom = {\n // Calc Scale From Multi-touches\n getDistanceBetweenTouches: function getDistanceBetweenTouches(e) {\n if (e.targetTouches.length < 2) { return 1; }\n var x1 = e.targetTouches[0].pageX;\n var y1 = e.targetTouches[0].pageY;\n var x2 = e.targetTouches[1].pageX;\n var y2 = e.targetTouches[1].pageY;\n var distance = Math.sqrt((Math.pow( (x2 - x1), 2 )) + (Math.pow( (y2 - y1), 2 )));\n return distance;\n },\n // Events\n onGestureStart: function onGestureStart(e) {\n var swiper = this;\n var params = swiper.params.zoom;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n zoom.fakeGestureTouched = false;\n zoom.fakeGestureMoved = false;\n if (!Support.gestures) {\n if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {\n return;\n }\n zoom.fakeGestureTouched = true;\n gesture.scaleStart = Zoom.getDistanceBetweenTouches(e);\n }\n if (!gesture.$slideEl || !gesture.$slideEl.length) {\n gesture.$slideEl = $(e.target).closest('.swiper-slide');\n if (gesture.$slideEl.length === 0) { gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); }\n gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');\n gesture.$imageWrapEl = gesture.$imageEl.parent((\".\" + (params.containerClass)));\n gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (gesture.$imageWrapEl.length === 0) {\n gesture.$imageEl = undefined;\n return;\n }\n }\n gesture.$imageEl.transition(0);\n swiper.zoom.isScaling = true;\n },\n onGestureChange: function onGestureChange(e) {\n var swiper = this;\n var params = swiper.params.zoom;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n if (!Support.gestures) {\n if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {\n return;\n }\n zoom.fakeGestureMoved = true;\n gesture.scaleMove = Zoom.getDistanceBetweenTouches(e);\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n if (Support.gestures) {\n zoom.scale = e.scale * zoom.currentScale;\n } else {\n zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale;\n }\n if (zoom.scale > gesture.maxRatio) {\n zoom.scale = (gesture.maxRatio - 1) + (Math.pow( ((zoom.scale - gesture.maxRatio) + 1), 0.5 ));\n }\n if (zoom.scale < params.minRatio) {\n zoom.scale = (params.minRatio + 1) - (Math.pow( ((params.minRatio - zoom.scale) + 1), 0.5 ));\n }\n gesture.$imageEl.transform((\"translate3d(0,0,0) scale(\" + (zoom.scale) + \")\"));\n },\n onGestureEnd: function onGestureEnd(e) {\n var swiper = this;\n var params = swiper.params.zoom;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n if (!Support.gestures) {\n if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) {\n return;\n }\n if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) {\n return;\n }\n zoom.fakeGestureTouched = false;\n zoom.fakeGestureMoved = false;\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n gesture.$imageEl.transition(swiper.params.speed).transform((\"translate3d(0,0,0) scale(\" + (zoom.scale) + \")\"));\n zoom.currentScale = zoom.scale;\n zoom.isScaling = false;\n if (zoom.scale === 1) { gesture.$slideEl = undefined; }\n },\n onTouchStart: function onTouchStart(e) {\n var swiper = this;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n var image = zoom.image;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n if (image.isTouched) { return; }\n if (Device.android) { e.preventDefault(); }\n image.isTouched = true;\n image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n },\n onTouchMove: function onTouchMove(e) {\n var swiper = this;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n var image = zoom.image;\n var velocity = zoom.velocity;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n swiper.allowClick = false;\n if (!image.isTouched || !gesture.$slideEl) { return; }\n\n if (!image.isMoved) {\n image.width = gesture.$imageEl[0].offsetWidth;\n image.height = gesture.$imageEl[0].offsetHeight;\n image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0;\n image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0;\n gesture.slideWidth = gesture.$slideEl[0].offsetWidth;\n gesture.slideHeight = gesture.$slideEl[0].offsetHeight;\n gesture.$imageWrapEl.transition(0);\n if (swiper.rtl) {\n image.startX = -image.startX;\n image.startY = -image.startY;\n }\n }\n // Define if we need image drag\n var scaledWidth = image.width * zoom.scale;\n var scaledHeight = image.height * zoom.scale;\n\n if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) { return; }\n\n image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);\n image.maxX = -image.minX;\n image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);\n image.maxY = -image.minY;\n\n image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n\n if (!image.isMoved && !zoom.isScaling) {\n if (\n swiper.isHorizontal()\n && (\n (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x)\n || (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)\n )\n ) {\n image.isTouched = false;\n return;\n } if (\n !swiper.isHorizontal()\n && (\n (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y)\n || (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)\n )\n ) {\n image.isTouched = false;\n return;\n }\n }\n e.preventDefault();\n e.stopPropagation();\n\n image.isMoved = true;\n image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX;\n image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY;\n\n if (image.currentX < image.minX) {\n image.currentX = (image.minX + 1) - (Math.pow( ((image.minX - image.currentX) + 1), 0.8 ));\n }\n if (image.currentX > image.maxX) {\n image.currentX = (image.maxX - 1) + (Math.pow( ((image.currentX - image.maxX) + 1), 0.8 ));\n }\n\n if (image.currentY < image.minY) {\n image.currentY = (image.minY + 1) - (Math.pow( ((image.minY - image.currentY) + 1), 0.8 ));\n }\n if (image.currentY > image.maxY) {\n image.currentY = (image.maxY - 1) + (Math.pow( ((image.currentY - image.maxY) + 1), 0.8 ));\n }\n\n // Velocity\n if (!velocity.prevPositionX) { velocity.prevPositionX = image.touchesCurrent.x; }\n if (!velocity.prevPositionY) { velocity.prevPositionY = image.touchesCurrent.y; }\n if (!velocity.prevTime) { velocity.prevTime = Date.now(); }\n velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) { velocity.x = 0; }\n if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) { velocity.y = 0; }\n velocity.prevPositionX = image.touchesCurrent.x;\n velocity.prevPositionY = image.touchesCurrent.y;\n velocity.prevTime = Date.now();\n\n gesture.$imageWrapEl.transform((\"translate3d(\" + (image.currentX) + \"px, \" + (image.currentY) + \"px,0)\"));\n },\n onTouchEnd: function onTouchEnd() {\n var swiper = this;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n var image = zoom.image;\n var velocity = zoom.velocity;\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n if (!image.isTouched || !image.isMoved) {\n image.isTouched = false;\n image.isMoved = false;\n return;\n }\n image.isTouched = false;\n image.isMoved = false;\n var momentumDurationX = 300;\n var momentumDurationY = 300;\n var momentumDistanceX = velocity.x * momentumDurationX;\n var newPositionX = image.currentX + momentumDistanceX;\n var momentumDistanceY = velocity.y * momentumDurationY;\n var newPositionY = image.currentY + momentumDistanceY;\n\n // Fix duration\n if (velocity.x !== 0) { momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); }\n if (velocity.y !== 0) { momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); }\n var momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n\n image.currentX = newPositionX;\n image.currentY = newPositionY;\n\n // Define if we need image drag\n var scaledWidth = image.width * zoom.scale;\n var scaledHeight = image.height * zoom.scale;\n image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);\n image.maxX = -image.minX;\n image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);\n image.maxY = -image.minY;\n image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n\n gesture.$imageWrapEl.transition(momentumDuration).transform((\"translate3d(\" + (image.currentX) + \"px, \" + (image.currentY) + \"px,0)\"));\n },\n onTransitionEnd: function onTransitionEnd() {\n var swiper = this;\n var zoom = swiper.zoom;\n var gesture = zoom.gesture;\n if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {\n gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');\n gesture.$imageWrapEl.transform('translate3d(0,0,0)');\n\n zoom.scale = 1;\n zoom.currentScale = 1;\n\n gesture.$slideEl = undefined;\n gesture.$imageEl = undefined;\n gesture.$imageWrapEl = undefined;\n }\n },\n // Toggle Zoom\n toggle: function toggle(e) {\n var swiper = this;\n var zoom = swiper.zoom;\n\n if (zoom.scale && zoom.scale !== 1) {\n // Zoom Out\n zoom.out();\n } else {\n // Zoom In\n zoom.in(e);\n }\n },\n in: function in$1(e) {\n var swiper = this;\n\n var zoom = swiper.zoom;\n var params = swiper.params.zoom;\n var gesture = zoom.gesture;\n var image = zoom.image;\n\n if (!gesture.$slideEl) {\n gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);\n gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');\n gesture.$imageWrapEl = gesture.$imageEl.parent((\".\" + (params.containerClass)));\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n\n gesture.$slideEl.addClass((\"\" + (params.zoomedSlideClass)));\n\n var touchX;\n var touchY;\n var offsetX;\n var offsetY;\n var diffX;\n var diffY;\n var translateX;\n var translateY;\n var imageWidth;\n var imageHeight;\n var scaledWidth;\n var scaledHeight;\n var translateMinX;\n var translateMinY;\n var translateMaxX;\n var translateMaxY;\n var slideWidth;\n var slideHeight;\n\n if (typeof image.touchesStart.x === 'undefined' && e) {\n touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;\n touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;\n } else {\n touchX = image.touchesStart.x;\n touchY = image.touchesStart.y;\n }\n\n zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n if (e) {\n slideWidth = gesture.$slideEl[0].offsetWidth;\n slideHeight = gesture.$slideEl[0].offsetHeight;\n offsetX = gesture.$slideEl.offset().left;\n offsetY = gesture.$slideEl.offset().top;\n diffX = (offsetX + (slideWidth / 2)) - touchX;\n diffY = (offsetY + (slideHeight / 2)) - touchY;\n\n imageWidth = gesture.$imageEl[0].offsetWidth;\n imageHeight = gesture.$imageEl[0].offsetHeight;\n scaledWidth = imageWidth * zoom.scale;\n scaledHeight = imageHeight * zoom.scale;\n\n translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0);\n translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0);\n translateMaxX = -translateMinX;\n translateMaxY = -translateMinY;\n\n translateX = diffX * zoom.scale;\n translateY = diffY * zoom.scale;\n\n if (translateX < translateMinX) {\n translateX = translateMinX;\n }\n if (translateX > translateMaxX) {\n translateX = translateMaxX;\n }\n\n if (translateY < translateMinY) {\n translateY = translateMinY;\n }\n if (translateY > translateMaxY) {\n translateY = translateMaxY;\n }\n } else {\n translateX = 0;\n translateY = 0;\n }\n gesture.$imageWrapEl.transition(300).transform((\"translate3d(\" + translateX + \"px, \" + translateY + \"px,0)\"));\n gesture.$imageEl.transition(300).transform((\"translate3d(0,0,0) scale(\" + (zoom.scale) + \")\"));\n },\n out: function out() {\n var swiper = this;\n\n var zoom = swiper.zoom;\n var params = swiper.params.zoom;\n var gesture = zoom.gesture;\n\n if (!gesture.$slideEl) {\n gesture.$slideEl = swiper.clickedSlide ? $(swiper.clickedSlide) : swiper.slides.eq(swiper.activeIndex);\n gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas');\n gesture.$imageWrapEl = gesture.$imageEl.parent((\".\" + (params.containerClass)));\n }\n if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }\n\n zoom.scale = 1;\n zoom.currentScale = 1;\n gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');\n gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');\n gesture.$slideEl.removeClass((\"\" + (params.zoomedSlideClass)));\n gesture.$slideEl = undefined;\n },\n // Attach/Detach Events\n enable: function enable() {\n var swiper = this;\n var zoom = swiper.zoom;\n if (zoom.enabled) { return; }\n zoom.enabled = true;\n\n var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;\n\n // Scale image\n if (Support.gestures) {\n swiper.$wrapperEl.on('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener);\n swiper.$wrapperEl.on('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener);\n swiper.$wrapperEl.on('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.on(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener);\n swiper.$wrapperEl.on(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener);\n swiper.$wrapperEl.on(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener);\n }\n\n // Move image\n swiper.$wrapperEl.on(swiper.touchEvents.move, (\".\" + (swiper.params.zoom.containerClass)), zoom.onTouchMove);\n },\n disable: function disable() {\n var swiper = this;\n var zoom = swiper.zoom;\n if (!zoom.enabled) { return; }\n\n swiper.zoom.enabled = false;\n\n var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;\n\n // Scale image\n if (Support.gestures) {\n swiper.$wrapperEl.off('gesturestart', '.swiper-slide', zoom.onGestureStart, passiveListener);\n swiper.$wrapperEl.off('gesturechange', '.swiper-slide', zoom.onGestureChange, passiveListener);\n swiper.$wrapperEl.off('gestureend', '.swiper-slide', zoom.onGestureEnd, passiveListener);\n } else if (swiper.touchEvents.start === 'touchstart') {\n swiper.$wrapperEl.off(swiper.touchEvents.start, '.swiper-slide', zoom.onGestureStart, passiveListener);\n swiper.$wrapperEl.off(swiper.touchEvents.move, '.swiper-slide', zoom.onGestureChange, passiveListener);\n swiper.$wrapperEl.off(swiper.touchEvents.end, '.swiper-slide', zoom.onGestureEnd, passiveListener);\n }\n\n // Move image\n swiper.$wrapperEl.off(swiper.touchEvents.move, (\".\" + (swiper.params.zoom.containerClass)), zoom.onTouchMove);\n },\n };\n\n var Zoom$1 = {\n name: 'zoom',\n params: {\n zoom: {\n enabled: false,\n maxRatio: 3,\n minRatio: 1,\n toggle: true,\n containerClass: 'swiper-zoom-container',\n zoomedSlideClass: 'swiper-slide-zoomed',\n },\n },\n create: function create() {\n var swiper = this;\n var zoom = {\n enabled: false,\n scale: 1,\n currentScale: 1,\n isScaling: false,\n gesture: {\n $slideEl: undefined,\n slideWidth: undefined,\n slideHeight: undefined,\n $imageEl: undefined,\n $imageWrapEl: undefined,\n maxRatio: 3,\n },\n image: {\n isTouched: undefined,\n isMoved: undefined,\n currentX: undefined,\n currentY: undefined,\n minX: undefined,\n minY: undefined,\n maxX: undefined,\n maxY: undefined,\n width: undefined,\n height: undefined,\n startX: undefined,\n startY: undefined,\n touchesStart: {},\n touchesCurrent: {},\n },\n velocity: {\n x: undefined,\n y: undefined,\n prevPositionX: undefined,\n prevPositionY: undefined,\n prevTime: undefined,\n },\n };\n\n ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach(function (methodName) {\n zoom[methodName] = Zoom[methodName].bind(swiper);\n });\n Utils.extend(swiper, {\n zoom: zoom,\n });\n\n var scale = 1;\n Object.defineProperty(swiper.zoom, 'scale', {\n get: function get() {\n return scale;\n },\n set: function set(value) {\n if (scale !== value) {\n var imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined;\n var slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined;\n swiper.emit('zoomChange', value, imageEl, slideEl);\n }\n scale = value;\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.zoom.enabled) {\n swiper.zoom.enable();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n swiper.zoom.disable();\n },\n touchStart: function touchStart(e) {\n var swiper = this;\n if (!swiper.zoom.enabled) { return; }\n swiper.zoom.onTouchStart(e);\n },\n touchEnd: function touchEnd(e) {\n var swiper = this;\n if (!swiper.zoom.enabled) { return; }\n swiper.zoom.onTouchEnd(e);\n },\n doubleTap: function doubleTap(e) {\n var swiper = this;\n if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {\n swiper.zoom.toggle(e);\n }\n },\n transitionEnd: function transitionEnd() {\n var swiper = this;\n if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n swiper.zoom.onTransitionEnd();\n }\n },\n },\n };\n\n var Lazy = {\n loadInSlide: function loadInSlide(index, loadInDuplicate) {\n if ( loadInDuplicate === void 0 ) loadInDuplicate = true;\n\n var swiper = this;\n var params = swiper.params.lazy;\n if (typeof index === 'undefined') { return; }\n if (swiper.slides.length === 0) { return; }\n var isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n var $slideEl = isVirtual\n ? swiper.$wrapperEl.children((\".\" + (swiper.params.slideClass) + \"[data-swiper-slide-index=\\\"\" + index + \"\\\"]\"))\n : swiper.slides.eq(index);\n\n var $images = $slideEl.find((\".\" + (params.elementClass) + \":not(.\" + (params.loadedClass) + \"):not(.\" + (params.loadingClass) + \")\"));\n if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {\n $images = $images.add($slideEl[0]);\n }\n if ($images.length === 0) { return; }\n\n $images.each(function (imageIndex, imageEl) {\n var $imageEl = $(imageEl);\n $imageEl.addClass(params.loadingClass);\n\n var background = $imageEl.attr('data-background');\n var src = $imageEl.attr('data-src');\n var srcset = $imageEl.attr('data-srcset');\n var sizes = $imageEl.attr('data-sizes');\n\n swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, function () {\n if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) { return; }\n if (background) {\n $imageEl.css('background-image', (\"url(\\\"\" + background + \"\\\")\"));\n $imageEl.removeAttr('data-background');\n } else {\n if (srcset) {\n $imageEl.attr('srcset', srcset);\n $imageEl.removeAttr('data-srcset');\n }\n if (sizes) {\n $imageEl.attr('sizes', sizes);\n $imageEl.removeAttr('data-sizes');\n }\n if (src) {\n $imageEl.attr('src', src);\n $imageEl.removeAttr('data-src');\n }\n }\n\n $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);\n $slideEl.find((\".\" + (params.preloaderClass))).remove();\n if (swiper.params.loop && loadInDuplicate) {\n var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');\n if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {\n var originalSlide = swiper.$wrapperEl.children((\"[data-swiper-slide-index=\\\"\" + slideOriginalIndex + \"\\\"]:not(.\" + (swiper.params.slideDuplicateClass) + \")\"));\n swiper.lazy.loadInSlide(originalSlide.index(), false);\n } else {\n var duplicatedSlide = swiper.$wrapperEl.children((\".\" + (swiper.params.slideDuplicateClass) + \"[data-swiper-slide-index=\\\"\" + slideOriginalIndex + \"\\\"]\"));\n swiper.lazy.loadInSlide(duplicatedSlide.index(), false);\n }\n }\n swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]);\n });\n\n swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]);\n });\n },\n load: function load() {\n var swiper = this;\n var $wrapperEl = swiper.$wrapperEl;\n var swiperParams = swiper.params;\n var slides = swiper.slides;\n var activeIndex = swiper.activeIndex;\n var isVirtual = swiper.virtual && swiperParams.virtual.enabled;\n var params = swiperParams.lazy;\n\n var slidesPerView = swiperParams.slidesPerView;\n if (slidesPerView === 'auto') {\n slidesPerView = 0;\n }\n\n function slideExist(index) {\n if (isVirtual) {\n if ($wrapperEl.children((\".\" + (swiperParams.slideClass) + \"[data-swiper-slide-index=\\\"\" + index + \"\\\"]\")).length) {\n return true;\n }\n } else if (slides[index]) { return true; }\n return false;\n }\n function slideIndex(slideEl) {\n if (isVirtual) {\n return $(slideEl).attr('data-swiper-slide-index');\n }\n return $(slideEl).index();\n }\n\n if (!swiper.lazy.initialImageLoaded) { swiper.lazy.initialImageLoaded = true; }\n if (swiper.params.watchSlidesVisibility) {\n $wrapperEl.children((\".\" + (swiperParams.slideVisibleClass))).each(function (elIndex, slideEl) {\n var index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();\n swiper.lazy.loadInSlide(index);\n });\n } else if (slidesPerView > 1) {\n for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) {\n if (slideExist(i)) { swiper.lazy.loadInSlide(i); }\n }\n } else {\n swiper.lazy.loadInSlide(activeIndex);\n }\n if (params.loadPrevNext) {\n if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {\n var amount = params.loadPrevNextAmount;\n var spv = slidesPerView;\n var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);\n var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);\n // Next Slides\n for (var i$1 = activeIndex + slidesPerView; i$1 < maxIndex; i$1 += 1) {\n if (slideExist(i$1)) { swiper.lazy.loadInSlide(i$1); }\n }\n // Prev Slides\n for (var i$2 = minIndex; i$2 < activeIndex; i$2 += 1) {\n if (slideExist(i$2)) { swiper.lazy.loadInSlide(i$2); }\n }\n } else {\n var nextSlide = $wrapperEl.children((\".\" + (swiperParams.slideNextClass)));\n if (nextSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(nextSlide)); }\n\n var prevSlide = $wrapperEl.children((\".\" + (swiperParams.slidePrevClass)));\n if (prevSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(prevSlide)); }\n }\n }\n },\n };\n\n var Lazy$1 = {\n name: 'lazy',\n params: {\n lazy: {\n enabled: false,\n loadPrevNext: false,\n loadPrevNextAmount: 1,\n loadOnTransitionStart: false,\n\n elementClass: 'swiper-lazy',\n loadingClass: 'swiper-lazy-loading',\n loadedClass: 'swiper-lazy-loaded',\n preloaderClass: 'swiper-lazy-preloader',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n lazy: {\n initialImageLoaded: false,\n load: Lazy.load.bind(swiper),\n loadInSlide: Lazy.loadInSlide.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.lazy.enabled && swiper.params.preloadImages) {\n swiper.params.preloadImages = false;\n }\n },\n init: function init() {\n var swiper = this;\n if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) {\n swiper.lazy.load();\n }\n },\n scroll: function scroll() {\n var swiper = this;\n if (swiper.params.freeMode && !swiper.params.freeModeSticky) {\n swiper.lazy.load();\n }\n },\n resize: function resize() {\n var swiper = this;\n if (swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n },\n scrollbarDragMove: function scrollbarDragMove() {\n var swiper = this;\n if (swiper.params.lazy.enabled) {\n swiper.lazy.load();\n }\n },\n transitionStart: function transitionStart() {\n var swiper = this;\n if (swiper.params.lazy.enabled) {\n if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) {\n swiper.lazy.load();\n }\n }\n },\n transitionEnd: function transitionEnd() {\n var swiper = this;\n if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {\n swiper.lazy.load();\n }\n },\n },\n };\n\n /* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\n\n var Controller = {\n LinearSpline: function LinearSpline(x, y) {\n var binarySearch = (function search() {\n var maxIndex;\n var minIndex;\n var guess;\n return function (array, val) {\n minIndex = -1;\n maxIndex = array.length;\n while (maxIndex - minIndex > 1) {\n guess = maxIndex + minIndex >> 1;\n if (array[guess] <= val) {\n minIndex = guess;\n } else {\n maxIndex = guess;\n }\n }\n return maxIndex;\n };\n }());\n this.x = x;\n this.y = y;\n this.lastIndex = x.length - 1;\n // Given an x value (x2), return the expected y2 value:\n // (x1,y1) is the known point before given value,\n // (x3,y3) is the known point after given value.\n var i1;\n var i3;\n\n this.interpolate = function interpolate(x2) {\n if (!x2) { return 0; }\n\n // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n i3 = binarySearch(this.x, x2);\n i1 = i3 - 1;\n\n // We have our indexes i1 & i3, so we can calculate already:\n // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1];\n };\n return this;\n },\n // xxx: for now i will just save one spline function to to\n getInterpolateFunction: function getInterpolateFunction(c) {\n var swiper = this;\n if (!swiper.controller.spline) {\n swiper.controller.spline = swiper.params.loop\n ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid)\n : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid);\n }\n },\n setTranslate: function setTranslate(setTranslate$1, byController) {\n var swiper = this;\n var controlled = swiper.controller.control;\n var multiplier;\n var controlledTranslate;\n function setControlledTranslate(c) {\n // this will create an Interpolate function based on the snapGrids\n // x is the Grid of the scrolled scroller and y will be the controlled scroller\n // it makes sense to create this only once and recall it for the interpolation\n // the function does a lot of value caching for performance\n var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n if (swiper.params.controller.by === 'slide') {\n swiper.controller.getInterpolateFunction(c);\n // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n // but it did not work out\n controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n }\n\n if (!controlledTranslate || swiper.params.controller.by === 'container') {\n multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate();\n }\n\n if (swiper.params.controller.inverse) {\n controlledTranslate = c.maxTranslate() - controlledTranslate;\n }\n c.updateProgress(controlledTranslate);\n c.setTranslate(controlledTranslate, swiper);\n c.updateActiveIndex();\n c.updateSlidesClasses();\n }\n if (Array.isArray(controlled)) {\n for (var i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTranslate(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTranslate(controlled);\n }\n },\n setTransition: function setTransition(duration, byController) {\n var swiper = this;\n var controlled = swiper.controller.control;\n var i;\n function setControlledTransition(c) {\n c.setTransition(duration, swiper);\n if (duration !== 0) {\n c.transitionStart();\n if (c.params.autoHeight) {\n Utils.nextTick(function () {\n c.updateAutoHeight();\n });\n }\n c.$wrapperEl.transitionEnd(function () {\n if (!controlled) { return; }\n if (c.params.loop && swiper.params.controller.by === 'slide') {\n c.loopFix();\n }\n c.transitionEnd();\n });\n }\n }\n if (Array.isArray(controlled)) {\n for (i = 0; i < controlled.length; i += 1) {\n if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n setControlledTransition(controlled[i]);\n }\n }\n } else if (controlled instanceof Swiper && byController !== controlled) {\n setControlledTransition(controlled);\n }\n },\n };\n var Controller$1 = {\n name: 'controller',\n params: {\n controller: {\n control: undefined,\n inverse: false,\n by: 'slide', // or 'container'\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n controller: {\n control: swiper.params.controller.control,\n getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper),\n setTranslate: Controller.setTranslate.bind(swiper),\n setTransition: Controller.setTransition.bind(swiper),\n },\n });\n },\n on: {\n update: function update() {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n },\n resize: function resize() {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n },\n observerUpdate: function observerUpdate() {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n if (swiper.controller.spline) {\n swiper.controller.spline = undefined;\n delete swiper.controller.spline;\n }\n },\n setTranslate: function setTranslate(translate, byController) {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n swiper.controller.setTranslate(translate, byController);\n },\n setTransition: function setTransition(duration, byController) {\n var swiper = this;\n if (!swiper.controller.control) { return; }\n swiper.controller.setTransition(duration, byController);\n },\n },\n };\n\n var a11y = {\n makeElFocusable: function makeElFocusable($el) {\n $el.attr('tabIndex', '0');\n return $el;\n },\n addElRole: function addElRole($el, role) {\n $el.attr('role', role);\n return $el;\n },\n addElLabel: function addElLabel($el, label) {\n $el.attr('aria-label', label);\n return $el;\n },\n disableEl: function disableEl($el) {\n $el.attr('aria-disabled', true);\n return $el;\n },\n enableEl: function enableEl($el) {\n $el.attr('aria-disabled', false);\n return $el;\n },\n onEnterKey: function onEnterKey(e) {\n var swiper = this;\n var params = swiper.params.a11y;\n if (e.keyCode !== 13) { return; }\n var $targetEl = $(e.target);\n if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n if (!(swiper.isEnd && !swiper.params.loop)) {\n swiper.slideNext();\n }\n if (swiper.isEnd) {\n swiper.a11y.notify(params.lastSlideMessage);\n } else {\n swiper.a11y.notify(params.nextSlideMessage);\n }\n }\n if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n if (!(swiper.isBeginning && !swiper.params.loop)) {\n swiper.slidePrev();\n }\n if (swiper.isBeginning) {\n swiper.a11y.notify(params.firstSlideMessage);\n } else {\n swiper.a11y.notify(params.prevSlideMessage);\n }\n }\n if (swiper.pagination && $targetEl.is((\".\" + (swiper.params.pagination.bulletClass)))) {\n $targetEl[0].click();\n }\n },\n notify: function notify(message) {\n var swiper = this;\n var notification = swiper.a11y.liveRegion;\n if (notification.length === 0) { return; }\n notification.html('');\n notification.html(message);\n },\n updateNavigation: function updateNavigation() {\n var swiper = this;\n\n if (swiper.params.loop) { return; }\n var ref = swiper.navigation;\n var $nextEl = ref.$nextEl;\n var $prevEl = ref.$prevEl;\n\n if ($prevEl && $prevEl.length > 0) {\n if (swiper.isBeginning) {\n swiper.a11y.disableEl($prevEl);\n } else {\n swiper.a11y.enableEl($prevEl);\n }\n }\n if ($nextEl && $nextEl.length > 0) {\n if (swiper.isEnd) {\n swiper.a11y.disableEl($nextEl);\n } else {\n swiper.a11y.enableEl($nextEl);\n }\n }\n },\n updatePagination: function updatePagination() {\n var swiper = this;\n var params = swiper.params.a11y;\n if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {\n swiper.pagination.bullets.each(function (bulletIndex, bulletEl) {\n var $bulletEl = $(bulletEl);\n swiper.a11y.makeElFocusable($bulletEl);\n swiper.a11y.addElRole($bulletEl, 'button');\n swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/{{index}}/, $bulletEl.index() + 1));\n });\n }\n },\n init: function init() {\n var swiper = this;\n\n swiper.$el.append(swiper.a11y.liveRegion);\n\n // Navigation\n var params = swiper.params.a11y;\n var $nextEl;\n var $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n if ($nextEl) {\n swiper.a11y.makeElFocusable($nextEl);\n swiper.a11y.addElRole($nextEl, 'button');\n swiper.a11y.addElLabel($nextEl, params.nextSlideMessage);\n $nextEl.on('keydown', swiper.a11y.onEnterKey);\n }\n if ($prevEl) {\n swiper.a11y.makeElFocusable($prevEl);\n swiper.a11y.addElRole($prevEl, 'button');\n swiper.a11y.addElLabel($prevEl, params.prevSlideMessage);\n $prevEl.on('keydown', swiper.a11y.onEnterKey);\n }\n\n // Pagination\n if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {\n swiper.pagination.$el.on('keydown', (\".\" + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) { swiper.a11y.liveRegion.remove(); }\n\n var $nextEl;\n var $prevEl;\n if (swiper.navigation && swiper.navigation.$nextEl) {\n $nextEl = swiper.navigation.$nextEl;\n }\n if (swiper.navigation && swiper.navigation.$prevEl) {\n $prevEl = swiper.navigation.$prevEl;\n }\n if ($nextEl) {\n $nextEl.off('keydown', swiper.a11y.onEnterKey);\n }\n if ($prevEl) {\n $prevEl.off('keydown', swiper.a11y.onEnterKey);\n }\n\n // Pagination\n if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {\n swiper.pagination.$el.off('keydown', (\".\" + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);\n }\n },\n };\n var A11y = {\n name: 'a11y',\n params: {\n a11y: {\n enabled: true,\n notificationClass: 'swiper-notification',\n prevSlideMessage: 'Previous slide',\n nextSlideMessage: 'Next slide',\n firstSlideMessage: 'This is the first slide',\n lastSlideMessage: 'This is the last slide',\n paginationBulletMessage: 'Go to slide {{index}}',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n a11y: {\n liveRegion: $((\"\")),\n },\n });\n Object.keys(a11y).forEach(function (methodName) {\n swiper.a11y[methodName] = a11y[methodName].bind(swiper);\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.init();\n swiper.a11y.updateNavigation();\n },\n toEdge: function toEdge() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.updateNavigation();\n },\n fromEdge: function fromEdge() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.updateNavigation();\n },\n paginationUpdate: function paginationUpdate() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.updatePagination();\n },\n destroy: function destroy() {\n var swiper = this;\n if (!swiper.params.a11y.enabled) { return; }\n swiper.a11y.destroy();\n },\n },\n };\n\n var History = {\n init: function init() {\n var swiper = this;\n if (!swiper.params.history) { return; }\n if (!win.history || !win.history.pushState) {\n swiper.params.history.enabled = false;\n swiper.params.hashNavigation.enabled = true;\n return;\n }\n var history = swiper.history;\n history.initialized = true;\n history.paths = History.getPathValues();\n if (!history.paths.key && !history.paths.value) { return; }\n history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit);\n if (!swiper.params.history.replaceState) {\n win.addEventListener('popstate', swiper.history.setHistoryPopState);\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (!swiper.params.history.replaceState) {\n win.removeEventListener('popstate', swiper.history.setHistoryPopState);\n }\n },\n setHistoryPopState: function setHistoryPopState() {\n var swiper = this;\n swiper.history.paths = History.getPathValues();\n swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false);\n },\n getPathValues: function getPathValues() {\n var pathArray = win.location.pathname.slice(1).split('/').filter(function (part) { return part !== ''; });\n var total = pathArray.length;\n var key = pathArray[total - 2];\n var value = pathArray[total - 1];\n return { key: key, value: value };\n },\n setHistory: function setHistory(key, index) {\n var swiper = this;\n if (!swiper.history.initialized || !swiper.params.history.enabled) { return; }\n var slide = swiper.slides.eq(index);\n var value = History.slugify(slide.attr('data-history'));\n if (!win.location.pathname.includes(key)) {\n value = key + \"/\" + value;\n }\n var currentState = win.history.state;\n if (currentState && currentState.value === value) {\n return;\n }\n if (swiper.params.history.replaceState) {\n win.history.replaceState({ value: value }, null, value);\n } else {\n win.history.pushState({ value: value }, null, value);\n }\n },\n slugify: function slugify(text) {\n return text.toString()\n .replace(/\\s+/g, '-')\n .replace(/[^\\w-]+/g, '')\n .replace(/--+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n },\n scrollToSlide: function scrollToSlide(speed, value, runCallbacks) {\n var swiper = this;\n if (value) {\n for (var i = 0, length = swiper.slides.length; i < length; i += 1) {\n var slide = swiper.slides.eq(i);\n var slideHistory = History.slugify(slide.attr('data-history'));\n if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n var index = slide.index();\n swiper.slideTo(index, speed, runCallbacks);\n }\n }\n } else {\n swiper.slideTo(0, speed, runCallbacks);\n }\n },\n };\n\n var History$1 = {\n name: 'history',\n params: {\n history: {\n enabled: false,\n replaceState: false,\n key: 'slides',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n history: {\n init: History.init.bind(swiper),\n setHistory: History.setHistory.bind(swiper),\n setHistoryPopState: History.setHistoryPopState.bind(swiper),\n scrollToSlide: History.scrollToSlide.bind(swiper),\n destroy: History.destroy.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.history.enabled) {\n swiper.history.init();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.params.history.enabled) {\n swiper.history.destroy();\n }\n },\n transitionEnd: function transitionEnd() {\n var swiper = this;\n if (swiper.history.initialized) {\n swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);\n }\n },\n },\n };\n\n var HashNavigation = {\n onHashCange: function onHashCange() {\n var swiper = this;\n var newHash = doc.location.hash.replace('#', '');\n var activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');\n if (newHash !== activeSlideHash) {\n var newIndex = swiper.$wrapperEl.children((\".\" + (swiper.params.slideClass) + \"[data-hash=\\\"\" + newHash + \"\\\"]\")).index();\n if (typeof newIndex === 'undefined') { return; }\n swiper.slideTo(newIndex);\n }\n },\n setHash: function setHash() {\n var swiper = this;\n if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) { return; }\n if (swiper.params.hashNavigation.replaceState && win.history && win.history.replaceState) {\n win.history.replaceState(null, null, ((\"#\" + (swiper.slides.eq(swiper.activeIndex).attr('data-hash'))) || ''));\n } else {\n var slide = swiper.slides.eq(swiper.activeIndex);\n var hash = slide.attr('data-hash') || slide.attr('data-history');\n doc.location.hash = hash || '';\n }\n },\n init: function init() {\n var swiper = this;\n if (!swiper.params.hashNavigation.enabled || (swiper.params.history && swiper.params.history.enabled)) { return; }\n swiper.hashNavigation.initialized = true;\n var hash = doc.location.hash.replace('#', '');\n if (hash) {\n var speed = 0;\n for (var i = 0, length = swiper.slides.length; i < length; i += 1) {\n var slide = swiper.slides.eq(i);\n var slideHash = slide.attr('data-hash') || slide.attr('data-history');\n if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n var index = slide.index();\n swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);\n }\n }\n }\n if (swiper.params.hashNavigation.watchState) {\n $(win).on('hashchange', swiper.hashNavigation.onHashCange);\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.params.hashNavigation.watchState) {\n $(win).off('hashchange', swiper.hashNavigation.onHashCange);\n }\n },\n };\n var HashNavigation$1 = {\n name: 'hash-navigation',\n params: {\n hashNavigation: {\n enabled: false,\n replaceState: false,\n watchState: false,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n hashNavigation: {\n initialized: false,\n init: HashNavigation.init.bind(swiper),\n destroy: HashNavigation.destroy.bind(swiper),\n setHash: HashNavigation.setHash.bind(swiper),\n onHashCange: HashNavigation.onHashCange.bind(swiper),\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.hashNavigation.enabled) {\n swiper.hashNavigation.init();\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.params.hashNavigation.enabled) {\n swiper.hashNavigation.destroy();\n }\n },\n transitionEnd: function transitionEnd() {\n var swiper = this;\n if (swiper.hashNavigation.initialized) {\n swiper.hashNavigation.setHash();\n }\n },\n },\n };\n\n /* eslint no-underscore-dangle: \"off\" */\n\n var Autoplay = {\n run: function run() {\n var swiper = this;\n var $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n var delay = swiper.params.autoplay.delay;\n if ($activeSlideEl.attr('data-swiper-autoplay')) {\n delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n }\n swiper.autoplay.timeout = Utils.nextTick(function () {\n if (swiper.params.autoplay.reverseDirection) {\n if (swiper.params.loop) {\n swiper.loopFix();\n swiper.slidePrev(swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else if (!swiper.isBeginning) {\n swiper.slidePrev(swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else {\n swiper.autoplay.stop();\n }\n } else if (swiper.params.loop) {\n swiper.loopFix();\n swiper.slideNext(swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else if (!swiper.isEnd) {\n swiper.slideNext(swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else if (!swiper.params.autoplay.stopOnLastSlide) {\n swiper.slideTo(0, swiper.params.speed, true, true);\n swiper.emit('autoplay');\n } else {\n swiper.autoplay.stop();\n }\n }, delay);\n },\n start: function start() {\n var swiper = this;\n if (typeof swiper.autoplay.timeout !== 'undefined') { return false; }\n if (swiper.autoplay.running) { return false; }\n swiper.autoplay.running = true;\n swiper.emit('autoplayStart');\n swiper.autoplay.run();\n return true;\n },\n stop: function stop() {\n var swiper = this;\n if (!swiper.autoplay.running) { return false; }\n if (typeof swiper.autoplay.timeout === 'undefined') { return false; }\n\n if (swiper.autoplay.timeout) {\n clearTimeout(swiper.autoplay.timeout);\n swiper.autoplay.timeout = undefined;\n }\n swiper.autoplay.running = false;\n swiper.emit('autoplayStop');\n return true;\n },\n pause: function pause(speed) {\n var swiper = this;\n if (!swiper.autoplay.running) { return; }\n if (swiper.autoplay.paused) { return; }\n if (swiper.autoplay.timeout) { clearTimeout(swiper.autoplay.timeout); }\n swiper.autoplay.paused = true;\n if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n swiper.autoplay.paused = false;\n swiper.autoplay.run();\n } else {\n swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd);\n swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);\n }\n },\n };\n\n var Autoplay$1 = {\n name: 'autoplay',\n params: {\n autoplay: {\n enabled: false,\n delay: 3000,\n waitForTransition: true,\n disableOnInteraction: true,\n stopOnLastSlide: false,\n reverseDirection: false,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n autoplay: {\n running: false,\n paused: false,\n run: Autoplay.run.bind(swiper),\n start: Autoplay.start.bind(swiper),\n stop: Autoplay.stop.bind(swiper),\n pause: Autoplay.pause.bind(swiper),\n onTransitionEnd: function onTransitionEnd(e) {\n if (!swiper || swiper.destroyed || !swiper.$wrapperEl) { return; }\n if (e.target !== this) { return; }\n swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd);\n swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);\n swiper.autoplay.paused = false;\n if (!swiper.autoplay.running) {\n swiper.autoplay.stop();\n } else {\n swiper.autoplay.run();\n }\n },\n },\n });\n },\n on: {\n init: function init() {\n var swiper = this;\n if (swiper.params.autoplay.enabled) {\n swiper.autoplay.start();\n }\n },\n beforeTransitionStart: function beforeTransitionStart(speed, internal) {\n var swiper = this;\n if (swiper.autoplay.running) {\n if (internal || !swiper.params.autoplay.disableOnInteraction) {\n swiper.autoplay.pause(speed);\n } else {\n swiper.autoplay.stop();\n }\n }\n },\n sliderFirstMove: function sliderFirstMove() {\n var swiper = this;\n if (swiper.autoplay.running) {\n if (swiper.params.autoplay.disableOnInteraction) {\n swiper.autoplay.stop();\n } else {\n swiper.autoplay.pause();\n }\n }\n },\n destroy: function destroy() {\n var swiper = this;\n if (swiper.autoplay.running) {\n swiper.autoplay.stop();\n }\n },\n },\n };\n\n var Fade = {\n setTranslate: function setTranslate() {\n var swiper = this;\n var slides = swiper.slides;\n for (var i = 0; i < slides.length; i += 1) {\n var $slideEl = swiper.slides.eq(i);\n var offset = $slideEl[0].swiperSlideOffset;\n var tx = -offset;\n if (!swiper.params.virtualTranslate) { tx -= swiper.translate; }\n var ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n }\n var slideOpacity = swiper.params.fadeEffect.crossFade\n ? Math.max(1 - Math.abs($slideEl[0].progress), 0)\n : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);\n $slideEl\n .css({\n opacity: slideOpacity,\n })\n .transform((\"translate3d(\" + tx + \"px, \" + ty + \"px, 0px)\"));\n }\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n var slides = swiper.slides;\n var $wrapperEl = swiper.$wrapperEl;\n slides.transition(duration);\n if (swiper.params.virtualTranslate && duration !== 0) {\n var eventTriggered = false;\n slides.transitionEnd(function () {\n if (eventTriggered) { return; }\n if (!swiper || swiper.destroyed) { return; }\n eventTriggered = true;\n swiper.animating = false;\n var triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n for (var i = 0; i < triggerEvents.length; i += 1) {\n $wrapperEl.trigger(triggerEvents[i]);\n }\n });\n }\n },\n };\n\n var EffectFade = {\n name: 'effect-fade',\n params: {\n fadeEffect: {\n crossFade: false,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n fadeEffect: {\n setTranslate: Fade.setTranslate.bind(swiper),\n setTransition: Fade.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.effect !== 'fade') { return; }\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"fade\"));\n var overwriteParams = {\n slidesPerView: 1,\n slidesPerColumn: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: true,\n };\n Utils.extend(swiper.params, overwriteParams);\n Utils.extend(swiper.originalParams, overwriteParams);\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (swiper.params.effect !== 'fade') { return; }\n swiper.fadeEffect.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (swiper.params.effect !== 'fade') { return; }\n swiper.fadeEffect.setTransition(duration);\n },\n },\n };\n\n var Cube = {\n setTranslate: function setTranslate() {\n var swiper = this;\n var $el = swiper.$el;\n var $wrapperEl = swiper.$wrapperEl;\n var slides = swiper.slides;\n var swiperWidth = swiper.width;\n var swiperHeight = swiper.height;\n var rtl = swiper.rtlTranslate;\n var swiperSize = swiper.size;\n var params = swiper.params.cubeEffect;\n var isHorizontal = swiper.isHorizontal();\n var isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n var wrapperRotate = 0;\n var $cubeShadowEl;\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
            ');\n $wrapperEl.append($cubeShadowEl);\n }\n $cubeShadowEl.css({ height: (swiperWidth + \"px\") });\n } else {\n $cubeShadowEl = $el.find('.swiper-cube-shadow');\n if ($cubeShadowEl.length === 0) {\n $cubeShadowEl = $('
            ');\n $el.append($cubeShadowEl);\n }\n }\n }\n for (var i = 0; i < slides.length; i += 1) {\n var $slideEl = slides.eq(i);\n var slideIndex = i;\n if (isVirtual) {\n slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);\n }\n var slideAngle = slideIndex * 90;\n var round = Math.floor(slideAngle / 360);\n if (rtl) {\n slideAngle = -slideAngle;\n round = Math.floor(-slideAngle / 360);\n }\n var progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n var tx = 0;\n var ty = 0;\n var tz = 0;\n if (slideIndex % 4 === 0) {\n tx = -round * 4 * swiperSize;\n tz = 0;\n } else if ((slideIndex - 1) % 4 === 0) {\n tx = 0;\n tz = -round * 4 * swiperSize;\n } else if ((slideIndex - 2) % 4 === 0) {\n tx = swiperSize + (round * 4 * swiperSize);\n tz = swiperSize;\n } else if ((slideIndex - 3) % 4 === 0) {\n tx = -swiperSize;\n tz = (3 * swiperSize) + (swiperSize * 4 * round);\n }\n if (rtl) {\n tx = -tx;\n }\n\n if (!isHorizontal) {\n ty = tx;\n tx = 0;\n }\n\n var transform = \"rotateX(\" + (isHorizontal ? 0 : -slideAngle) + \"deg) rotateY(\" + (isHorizontal ? slideAngle : 0) + \"deg) translate3d(\" + tx + \"px, \" + ty + \"px, \" + tz + \"px)\";\n if (progress <= 1 && progress > -1) {\n wrapperRotate = (slideIndex * 90) + (progress * 90);\n if (rtl) { wrapperRotate = (-slideIndex * 90) - (progress * 90); }\n }\n $slideEl.transform(transform);\n if (params.slideShadows) {\n // Set shadows\n var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = $((\"
            \"));\n $slideEl.append(shadowBefore);\n }\n if (shadowAfter.length === 0) {\n shadowAfter = $((\"
            \"));\n $slideEl.append(shadowAfter);\n }\n if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }\n if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }\n }\n }\n $wrapperEl.css({\n '-webkit-transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n '-moz-transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n '-ms-transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n 'transform-origin': (\"50% 50% -\" + (swiperSize / 2) + \"px\"),\n });\n\n if (params.shadow) {\n if (isHorizontal) {\n $cubeShadowEl.transform((\"translate3d(0px, \" + ((swiperWidth / 2) + params.shadowOffset) + \"px, \" + (-swiperWidth / 2) + \"px) rotateX(90deg) rotateZ(0deg) scale(\" + (params.shadowScale) + \")\"));\n } else {\n var shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90);\n var multiplier = 1.5 - (\n (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2)\n + (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2)\n );\n var scale1 = params.shadowScale;\n var scale2 = params.shadowScale / multiplier;\n var offset = params.shadowOffset;\n $cubeShadowEl.transform((\"scale3d(\" + scale1 + \", 1, \" + scale2 + \") translate3d(0px, \" + ((swiperHeight / 2) + offset) + \"px, \" + (-swiperHeight / 2 / scale2) + \"px) rotateX(-90deg)\"));\n }\n }\n var zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0;\n $wrapperEl\n .transform((\"translate3d(0px,0,\" + zFactor + \"px) rotateX(\" + (swiper.isHorizontal() ? 0 : wrapperRotate) + \"deg) rotateY(\" + (swiper.isHorizontal() ? -wrapperRotate : 0) + \"deg)\"));\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n var $el = swiper.$el;\n var slides = swiper.slides;\n slides\n .transition(duration)\n .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')\n .transition(duration);\n if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n $el.find('.swiper-cube-shadow').transition(duration);\n }\n },\n };\n\n var EffectCube = {\n name: 'effect-cube',\n params: {\n cubeEffect: {\n slideShadows: true,\n shadow: true,\n shadowOffset: 20,\n shadowScale: 0.94,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n cubeEffect: {\n setTranslate: Cube.setTranslate.bind(swiper),\n setTransition: Cube.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.effect !== 'cube') { return; }\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"cube\"));\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"3d\"));\n var overwriteParams = {\n slidesPerView: 1,\n slidesPerColumn: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n resistanceRatio: 0,\n spaceBetween: 0,\n centeredSlides: false,\n virtualTranslate: true,\n };\n Utils.extend(swiper.params, overwriteParams);\n Utils.extend(swiper.originalParams, overwriteParams);\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (swiper.params.effect !== 'cube') { return; }\n swiper.cubeEffect.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (swiper.params.effect !== 'cube') { return; }\n swiper.cubeEffect.setTransition(duration);\n },\n },\n };\n\n var Flip = {\n setTranslate: function setTranslate() {\n var swiper = this;\n var slides = swiper.slides;\n var rtl = swiper.rtlTranslate;\n for (var i = 0; i < slides.length; i += 1) {\n var $slideEl = slides.eq(i);\n var progress = $slideEl[0].progress;\n if (swiper.params.flipEffect.limitRotation) {\n progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n }\n var offset = $slideEl[0].swiperSlideOffset;\n var rotate = -180 * progress;\n var rotateY = rotate;\n var rotateX = 0;\n var tx = -offset;\n var ty = 0;\n if (!swiper.isHorizontal()) {\n ty = tx;\n tx = 0;\n rotateX = -rotateY;\n rotateY = 0;\n } else if (rtl) {\n rotateY = -rotateY;\n }\n\n $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n\n if (swiper.params.flipEffect.slideShadows) {\n // Set shadows\n var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n if (shadowBefore.length === 0) {\n shadowBefore = $((\"
            \"));\n $slideEl.append(shadowBefore);\n }\n if (shadowAfter.length === 0) {\n shadowAfter = $((\"
            \"));\n $slideEl.append(shadowAfter);\n }\n if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }\n if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }\n }\n $slideEl\n .transform((\"translate3d(\" + tx + \"px, \" + ty + \"px, 0px) rotateX(\" + rotateX + \"deg) rotateY(\" + rotateY + \"deg)\"));\n }\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n var slides = swiper.slides;\n var activeIndex = swiper.activeIndex;\n var $wrapperEl = swiper.$wrapperEl;\n slides\n .transition(duration)\n .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')\n .transition(duration);\n if (swiper.params.virtualTranslate && duration !== 0) {\n var eventTriggered = false;\n // eslint-disable-next-line\n slides.eq(activeIndex).transitionEnd(function onTransitionEnd() {\n if (eventTriggered) { return; }\n if (!swiper || swiper.destroyed) { return; }\n // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;\n eventTriggered = true;\n swiper.animating = false;\n var triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n for (var i = 0; i < triggerEvents.length; i += 1) {\n $wrapperEl.trigger(triggerEvents[i]);\n }\n });\n }\n },\n };\n\n var EffectFlip = {\n name: 'effect-flip',\n params: {\n flipEffect: {\n slideShadows: true,\n limitRotation: true,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n flipEffect: {\n setTranslate: Flip.setTranslate.bind(swiper),\n setTransition: Flip.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.effect !== 'flip') { return; }\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"flip\"));\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"3d\"));\n var overwriteParams = {\n slidesPerView: 1,\n slidesPerColumn: 1,\n slidesPerGroup: 1,\n watchSlidesProgress: true,\n spaceBetween: 0,\n virtualTranslate: true,\n };\n Utils.extend(swiper.params, overwriteParams);\n Utils.extend(swiper.originalParams, overwriteParams);\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (swiper.params.effect !== 'flip') { return; }\n swiper.flipEffect.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (swiper.params.effect !== 'flip') { return; }\n swiper.flipEffect.setTransition(duration);\n },\n },\n };\n\n var Coverflow = {\n setTranslate: function setTranslate() {\n var swiper = this;\n var swiperWidth = swiper.width;\n var swiperHeight = swiper.height;\n var slides = swiper.slides;\n var $wrapperEl = swiper.$wrapperEl;\n var slidesSizesGrid = swiper.slidesSizesGrid;\n var params = swiper.params.coverflowEffect;\n var isHorizontal = swiper.isHorizontal();\n var transform = swiper.translate;\n var center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2);\n var rotate = isHorizontal ? params.rotate : -params.rotate;\n var translate = params.depth;\n // Each slide offset from center\n for (var i = 0, length = slides.length; i < length; i += 1) {\n var $slideEl = slides.eq(i);\n var slideSize = slidesSizesGrid[i];\n var slideOffset = $slideEl[0].swiperSlideOffset;\n var offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier;\n\n var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n // var rotateZ = 0\n var translateZ = -translate * Math.abs(offsetMultiplier);\n\n var translateY = isHorizontal ? 0 : params.stretch * (offsetMultiplier);\n var translateX = isHorizontal ? params.stretch * (offsetMultiplier) : 0;\n\n // Fix for ultra small values\n if (Math.abs(translateX) < 0.001) { translateX = 0; }\n if (Math.abs(translateY) < 0.001) { translateY = 0; }\n if (Math.abs(translateZ) < 0.001) { translateZ = 0; }\n if (Math.abs(rotateY) < 0.001) { rotateY = 0; }\n if (Math.abs(rotateX) < 0.001) { rotateX = 0; }\n\n var slideTransform = \"translate3d(\" + translateX + \"px,\" + translateY + \"px,\" + translateZ + \"px) rotateX(\" + rotateX + \"deg) rotateY(\" + rotateY + \"deg)\";\n\n $slideEl.transform(slideTransform);\n $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n if (params.slideShadows) {\n // Set shadows\n var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n if ($shadowBeforeEl.length === 0) {\n $shadowBeforeEl = $((\"
            \"));\n $slideEl.append($shadowBeforeEl);\n }\n if ($shadowAfterEl.length === 0) {\n $shadowAfterEl = $((\"
            \"));\n $slideEl.append($shadowAfterEl);\n }\n if ($shadowBeforeEl.length) { $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; }\n if ($shadowAfterEl.length) { $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; }\n }\n }\n\n // Set correct perspective for IE10\n if (Support.pointerEvents || Support.prefixedPointerEvents) {\n var ws = $wrapperEl[0].style;\n ws.perspectiveOrigin = center + \"px 50%\";\n }\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n swiper.slides\n .transition(duration)\n .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')\n .transition(duration);\n },\n };\n\n var EffectCoverflow = {\n name: 'effect-coverflow',\n params: {\n coverflowEffect: {\n rotate: 50,\n stretch: 0,\n depth: 100,\n modifier: 1,\n slideShadows: true,\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n coverflowEffect: {\n setTranslate: Coverflow.setTranslate.bind(swiper),\n setTransition: Coverflow.setTransition.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n if (swiper.params.effect !== 'coverflow') { return; }\n\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"coverflow\"));\n swiper.classNames.push(((swiper.params.containerModifierClass) + \"3d\"));\n\n swiper.params.watchSlidesProgress = true;\n swiper.originalParams.watchSlidesProgress = true;\n },\n setTranslate: function setTranslate() {\n var swiper = this;\n if (swiper.params.effect !== 'coverflow') { return; }\n swiper.coverflowEffect.setTranslate();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n if (swiper.params.effect !== 'coverflow') { return; }\n swiper.coverflowEffect.setTransition(duration);\n },\n },\n };\n\n var Thumbs = {\n init: function init() {\n var swiper = this;\n var ref = swiper.params;\n var thumbsParams = ref.thumbs;\n var SwiperClass = swiper.constructor;\n if (thumbsParams.swiper instanceof SwiperClass) {\n swiper.thumbs.swiper = thumbsParams.swiper;\n Utils.extend(swiper.thumbs.swiper.originalParams, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n Utils.extend(swiper.thumbs.swiper.params, {\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n });\n } else if (Utils.isObject(thumbsParams.swiper)) {\n swiper.thumbs.swiper = new SwiperClass(Utils.extend({}, thumbsParams.swiper, {\n watchSlidesVisibility: true,\n watchSlidesProgress: true,\n slideToClickedSlide: false,\n }));\n swiper.thumbs.swiperCreated = true;\n }\n swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);\n swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick);\n },\n onThumbClick: function onThumbClick() {\n var swiper = this;\n var thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) { return; }\n var clickedIndex = thumbsSwiper.clickedIndex;\n var clickedSlide = thumbsSwiper.clickedSlide;\n if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) { return; }\n if (typeof clickedIndex === 'undefined' || clickedIndex === null) { return; }\n var slideToIndex;\n if (thumbsSwiper.params.loop) {\n slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n } else {\n slideToIndex = clickedIndex;\n }\n if (swiper.params.loop) {\n var currentIndex = swiper.activeIndex;\n if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {\n swiper.loopFix();\n // eslint-disable-next-line\n swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n currentIndex = swiper.activeIndex;\n }\n var prevIndex = swiper.slides.eq(currentIndex).prevAll((\"[data-swiper-slide-index=\\\"\" + slideToIndex + \"\\\"]\")).eq(0).index();\n var nextIndex = swiper.slides.eq(currentIndex).nextAll((\"[data-swiper-slide-index=\\\"\" + slideToIndex + \"\\\"]\")).eq(0).index();\n if (typeof prevIndex === 'undefined') { slideToIndex = nextIndex; }\n else if (typeof nextIndex === 'undefined') { slideToIndex = prevIndex; }\n else if (nextIndex - currentIndex < currentIndex - prevIndex) { slideToIndex = nextIndex; }\n else { slideToIndex = prevIndex; }\n }\n swiper.slideTo(slideToIndex);\n },\n update: function update(initial) {\n var swiper = this;\n var thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) { return; }\n\n var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto'\n ? thumbsSwiper.slidesPerViewDynamic()\n : thumbsSwiper.params.slidesPerView;\n\n if (swiper.realIndex !== thumbsSwiper.realIndex) {\n var currentThumbsIndex = thumbsSwiper.activeIndex;\n var newThumbsIndex;\n if (thumbsSwiper.params.loop) {\n if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {\n thumbsSwiper.loopFix();\n // eslint-disable-next-line\n thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;\n currentThumbsIndex = thumbsSwiper.activeIndex;\n }\n // Find actual thumbs index to slide to\n var prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll((\"[data-swiper-slide-index=\\\"\" + (swiper.realIndex) + \"\\\"]\")).eq(0).index();\n var nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll((\"[data-swiper-slide-index=\\\"\" + (swiper.realIndex) + \"\\\"]\")).eq(0).index();\n if (typeof prevThumbsIndex === 'undefined') { newThumbsIndex = nextThumbsIndex; }\n else if (typeof nextThumbsIndex === 'undefined') { newThumbsIndex = prevThumbsIndex; }\n else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = currentThumbsIndex; }\n else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = nextThumbsIndex; }\n else { newThumbsIndex = prevThumbsIndex; }\n } else {\n newThumbsIndex = swiper.realIndex;\n }\n if (thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {\n if (thumbsSwiper.params.centeredSlides) {\n if (newThumbsIndex > currentThumbsIndex) {\n newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n } else {\n newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n }\n } else if (newThumbsIndex > currentThumbsIndex) {\n newThumbsIndex = newThumbsIndex - slidesPerView + 1;\n }\n thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);\n }\n }\n\n // Activate thumbs\n var thumbsToActivate = 1;\n var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n\n if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n thumbsToActivate = swiper.params.slidesPerView;\n }\n\n thumbsSwiper.slides.removeClass(thumbActiveClass);\n if (thumbsSwiper.params.loop) {\n for (var i = 0; i < thumbsToActivate; i += 1) {\n thumbsSwiper.$wrapperEl.children((\"[data-swiper-slide-index=\\\"\" + (swiper.realIndex + i) + \"\\\"]\")).addClass(thumbActiveClass);\n }\n } else {\n for (var i$1 = 0; i$1 < thumbsToActivate; i$1 += 1) {\n thumbsSwiper.slides.eq(swiper.realIndex + i$1).addClass(thumbActiveClass);\n }\n }\n },\n };\n var Thumbs$1 = {\n name: 'thumbs',\n params: {\n thumbs: {\n swiper: null,\n slideThumbActiveClass: 'swiper-slide-thumb-active',\n thumbsContainerClass: 'swiper-container-thumbs',\n },\n },\n create: function create() {\n var swiper = this;\n Utils.extend(swiper, {\n thumbs: {\n swiper: null,\n init: Thumbs.init.bind(swiper),\n update: Thumbs.update.bind(swiper),\n onThumbClick: Thumbs.onThumbClick.bind(swiper),\n },\n });\n },\n on: {\n beforeInit: function beforeInit() {\n var swiper = this;\n var ref = swiper.params;\n var thumbs = ref.thumbs;\n if (!thumbs || !thumbs.swiper) { return; }\n swiper.thumbs.init();\n swiper.thumbs.update(true);\n },\n slideChange: function slideChange() {\n var swiper = this;\n if (!swiper.thumbs.swiper) { return; }\n swiper.thumbs.update();\n },\n update: function update() {\n var swiper = this;\n if (!swiper.thumbs.swiper) { return; }\n swiper.thumbs.update();\n },\n resize: function resize() {\n var swiper = this;\n if (!swiper.thumbs.swiper) { return; }\n swiper.thumbs.update();\n },\n observerUpdate: function observerUpdate() {\n var swiper = this;\n if (!swiper.thumbs.swiper) { return; }\n swiper.thumbs.update();\n },\n setTransition: function setTransition(duration) {\n var swiper = this;\n var thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) { return; }\n thumbsSwiper.setTransition(duration);\n },\n beforeDestroy: function beforeDestroy() {\n var swiper = this;\n var thumbsSwiper = swiper.thumbs.swiper;\n if (!thumbsSwiper) { return; }\n if (swiper.thumbs.swiperCreated && thumbsSwiper) {\n thumbsSwiper.destroy();\n }\n },\n },\n };\n\n // Swiper Class\n\n var components = [\n Device$1,\n Support$1,\n Browser$1,\n Resize,\n Observer$1,\n Virtual$1,\n Keyboard$1,\n Mousewheel$1,\n Navigation$1,\n Pagination$1,\n Scrollbar$1,\n Parallax$1,\n Zoom$1,\n Lazy$1,\n Controller$1,\n A11y,\n History$1,\n HashNavigation$1,\n Autoplay$1,\n EffectFade,\n EffectCube,\n EffectFlip,\n EffectCoverflow,\n Thumbs$1\n ];\n\n if (typeof Swiper.use === 'undefined') {\n Swiper.use = Swiper.Class.use;\n Swiper.installModule = Swiper.Class.installModule;\n }\n\n Swiper.use(components);\n\n return Swiper;\n\n}));\n"]} \ No newline at end of file diff --git a/assets/3rd/toast/jquery.toast.js b/assets/3rd/toast/jquery.toast.js new file mode 100755 index 00000000..77cdf45c --- /dev/null +++ b/assets/3rd/toast/jquery.toast.js @@ -0,0 +1,359 @@ +// jQuery toast plugin created by Kamran Ahmed copyright MIT license 2015 +if ( typeof Object.create !== 'function' ) { + Object.create = function( obj ) { + function F() {} + F.prototype = obj; + return new F(); + }; +} + +(function( $, window, document, undefined ) { + + "use strict"; + + var Toast = { + + _positionClasses : ['bottom-left', 'bottom-right', 'top-right', 'top-left', 'bottom-center', 'top-center', 'mid-center'], + _defaultIcons : ['success', 'error', 'info', 'warning'], + + init: function (options, elem) { + this.prepareOptions(options, $.toast.options); + this.process(); + }, + + prepareOptions: function(options, options_to_extend) { + var _options = {}; + if ( ( typeof options === 'string' ) || ( options instanceof Array ) ) { + _options.text = options; + } else { + _options = options; + } + this.options = $.extend( {}, options_to_extend, _options ); + }, + + process: function () { + this.setup(); + this.addToDom(); + this.position(); + this.bindToast(); + this.animate(); + }, + + setup: function () { + + var _toastContent = ''; + + this._toastEl = this._toastEl || $('
            ', { + class : 'jq-toast-single' + }); + + // For the loader on top + _toastContent += ''; + + if ( this.options.allowToastClose ) { + _toastContent += '×'; + }; + + if ( this.options.text instanceof Array ) { + + if ( this.options.heading ) { + _toastContent +='

            ' + this.options.heading + '

            '; + }; + + _toastContent += '
              '; + for (var i = 0; i < this.options.text.length; i++) { + _toastContent += '
            • ' + this.options.text[i] + '
            • '; + } + _toastContent += '
            '; + + } else { + if ( this.options.heading ) { + _toastContent +='

            ' + this.options.heading + '

            '; + }; + _toastContent += this.options.text; + } + + this._toastEl.html( _toastContent ); + + if ( this.options.bgColor !== false ) { + this._toastEl.css("background-color", this.options.bgColor); + }; + + if ( this.options.textColor !== false ) { + this._toastEl.css("color", this.options.textColor); + }; + + if ( this.options.textAlign ) { + this._toastEl.css('text-align', this.options.textAlign); + } + + if ( this.options.icon !== false ) { + this._toastEl.addClass('jq-has-icon'); + + if ( $.inArray(this.options.icon, this._defaultIcons) !== -1 ) { + this._toastEl.addClass('jq-icon-' + this.options.icon); + }; + }; + + if ( this.options.class !== false ){ + this._toastEl.addClass(this.options.class) + } + }, + + position: function () { + if ( ( typeof this.options.position === 'string' ) && ( $.inArray( this.options.position, this._positionClasses) !== -1 ) ) { + + if ( this.options.position === 'bottom-center' ) { + this._container.css({ + left: ( $(window).outerWidth() / 2 ) - this._container.outerWidth()/2, + bottom: 20 + }); + } else if ( this.options.position === 'top-center' ) { + this._container.css({ + left: ( $(window).outerWidth() / 2 ) - this._container.outerWidth()/2, + top: 20 + }); + } else if ( this.options.position === 'mid-center' ) { + this._container.css({ + left: ( $(window).outerWidth() / 2 ) - this._container.outerWidth()/2, + top: ( $(window).outerHeight() / 2 ) - this._container.outerHeight()/2 + }); + } else { + this._container.addClass( this.options.position ); + } + + } else if ( typeof this.options.position === 'object' ) { + this._container.css({ + top : this.options.position.top ? this.options.position.top : 'auto', + bottom : this.options.position.bottom ? this.options.position.bottom : 'auto', + left : this.options.position.left ? this.options.position.left : 'auto', + right : this.options.position.right ? this.options.position.right : 'auto' + }); + } else { + this._container.addClass( 'bottom-left' ); + } + }, + + bindToast: function () { + + var that = this; + + this._toastEl.on('afterShown', function () { + that.processLoader(); + }); + + this._toastEl.find('.close-jq-toast-single').on('click', function ( e ) { + + e.preventDefault(); + + if( that.options.showHideTransition === 'fade') { + that._toastEl.trigger('beforeHide'); + that._toastEl.fadeOut(function () { + that._toastEl.trigger('afterHidden'); + }); + } else if ( that.options.showHideTransition === 'slide' ) { + that._toastEl.trigger('beforeHide'); + that._toastEl.slideUp(function () { + that._toastEl.trigger('afterHidden'); + }); + } else { + that._toastEl.trigger('beforeHide'); + that._toastEl.hide(function () { + that._toastEl.trigger('afterHidden'); + }); + } + }); + + if ( typeof this.options.beforeShow == 'function' ) { + this._toastEl.on('beforeShow', function () { + that.options.beforeShow(); + }); + }; + + if ( typeof this.options.afterShown == 'function' ) { + this._toastEl.on('afterShown', function () { + that.options.afterShown(); + }); + }; + + if ( typeof this.options.beforeHide == 'function' ) { + this._toastEl.on('beforeHide', function () { + that.options.beforeHide(); + }); + }; + + if ( typeof this.options.afterHidden == 'function' ) { + this._toastEl.on('afterHidden', function () { + that.options.afterHidden(); + }); + }; + }, + + addToDom: function () { + + var _container = $('.jq-toast-wrap'); + + if ( _container.length === 0 ) { + + _container = $('
            ',{ + class: "jq-toast-wrap", + role: "alert", + "aria-live": "polite" + }); + + $('body').append( _container ); + + } else if ( !this.options.stack || isNaN( parseInt(this.options.stack, 10) ) ) { + _container.empty(); + } + + _container.find('.jq-toast-single:hidden').remove(); + + _container.append( this._toastEl ); + + if ( this.options.stack && !isNaN( parseInt( this.options.stack ), 10 ) ) { + + var _prevToastCount = _container.find('.jq-toast-single').length, + _extToastCount = _prevToastCount - this.options.stack; + + if ( _extToastCount > 0 ) { + $('.jq-toast-wrap').find('.jq-toast-single').slice(0, _extToastCount).remove(); + }; + + } + + this._container = _container; + }, + + canAutoHide: function () { + return ( this.options.hideAfter !== false ) && !isNaN( parseInt( this.options.hideAfter, 10 ) ); + }, + + processLoader: function () { + // Show the loader only, if auto-hide is on and loader is demanded + if (!this.canAutoHide() || this.options.loader === false) { + return false; + } + + var loader = this._toastEl.find('.jq-toast-loader'); + + // 400 is the default time that jquery uses for fade/slide + // Divide by 1000 for milliseconds to seconds conversion + var transitionTime = (this.options.hideAfter - 400) / 1000 + 's'; + var loaderBg = this.options.loaderBg; + + var style = loader.attr('style') || ''; + style = style.substring(0, style.indexOf('-webkit-transition')); // Remove the last transition definition + + style += '-webkit-transition: width ' + transitionTime + ' ease-in; \ + -o-transition: width ' + transitionTime + ' ease-in; \ + transition: width ' + transitionTime + ' ease-in; \ + background-color: ' + loaderBg + ';'; + + + loader.attr('style', style).addClass('jq-toast-loaded'); + }, + + animate: function () { + + var that = this; + + this._toastEl.hide(); + + this._toastEl.trigger('beforeShow'); + + if ( this.options.showHideTransition.toLowerCase() === 'fade' ) { + this._toastEl.fadeIn(function ( ){ + that._toastEl.trigger('afterShown'); + }); + } else if ( this.options.showHideTransition.toLowerCase() === 'slide' ) { + this._toastEl.slideDown(function ( ){ + that._toastEl.trigger('afterShown'); + }); + } else { + this._toastEl.show(function ( ){ + that._toastEl.trigger('afterShown'); + }); + } + + if (this.canAutoHide()) { + + var that = this; + + window.setTimeout(function(){ + + if ( that.options.showHideTransition.toLowerCase() === 'fade' ) { + that._toastEl.trigger('beforeHide'); + that._toastEl.fadeOut(function () { + that._toastEl.trigger('afterHidden'); + }); + } else if ( that.options.showHideTransition.toLowerCase() === 'slide' ) { + that._toastEl.trigger('beforeHide'); + that._toastEl.slideUp(function () { + that._toastEl.trigger('afterHidden'); + }); + } else { + that._toastEl.trigger('beforeHide'); + that._toastEl.hide(function () { + that._toastEl.trigger('afterHidden'); + }); + } + + }, this.options.hideAfter); + }; + }, + + reset: function ( resetWhat ) { + + if ( resetWhat === 'all' ) { + $('.jq-toast-wrap').remove(); + } else { + this._toastEl.remove(); + } + + }, + + update: function(options) { + this.prepareOptions(options, this.options); + this.setup(); + this.bindToast(); + } + }; + + $.toast = function(options) { + var toast = Object.create(Toast); + toast.init(options, this); + + return { + + reset: function ( what ) { + toast.reset( what ); + }, + + update: function( options ) { + toast.update( options ); + } + } + }; + + $.toast.options = { + text: '', + heading: '', + showHideTransition: 'fade', + allowToastClose: true, + hideAfter: 3000, + loader: true, + loaderBg: '#9EC600', + stack: 5, + position: 'bottom-left', + bgColor: false, + textColor: false, + textAlign: 'left', + icon: false, + beforeShow: function () {}, + afterShown: function () {}, + beforeHide: function () {}, + afterHidden: function () {} + }; + +})( jQuery, window, document ); diff --git a/assets/3rd/tooltipster/css/tooltipster.bundle.min.css b/assets/3rd/tooltipster/css/tooltipster.bundle.min.css new file mode 100755 index 00000000..d8f30fee --- /dev/null +++ b/assets/3rd/tooltipster/css/tooltipster.bundle.min.css @@ -0,0 +1 @@ +.tooltipster-fall,.tooltipster-grow.tooltipster-show{-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-base{display:flex;pointer-events:none;position:absolute}.tooltipster-box{flex:1 1 auto}.tooltipster-content{box-sizing:border-box;max-height:100%;max-width:100%;overflow:auto}.tooltipster-ruler{bottom:0;left:0;overflow:hidden;position:fixed;right:0;top:0;visibility:hidden}.tooltipster-fade{opacity:0;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;-ms-transition-property:opacity;transition-property:opacity}.tooltipster-fade.tooltipster-show{opacity:1}.tooltipster-grow{-webkit-transform:scale(0,0);-moz-transform:scale(0,0);-o-transform:scale(0,0);-ms-transform:scale(0,0);transform:scale(0,0);-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-backface-visibility:hidden}.tooltipster-grow.tooltipster-show{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-o-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-swing{opacity:0;-webkit-transform:rotateZ(4deg);-moz-transform:rotateZ(4deg);-o-transform:rotateZ(4deg);-ms-transform:rotateZ(4deg);transform:rotateZ(4deg);-webkit-transition-property:-webkit-transform,opacity;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform}.tooltipster-swing.tooltipster-show{opacity:1;-webkit-transform:rotateZ(0);-moz-transform:rotateZ(0);-o-transform:rotateZ(0);-ms-transform:rotateZ(0);transform:rotateZ(0);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,1);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-moz-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-ms-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-o-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);transition-timing-function:cubic-bezier(.23,.635,.495,2.4)}.tooltipster-fall{-webkit-transition-property:top;-moz-transition-property:top;-o-transition-property:top;-ms-transition-property:top;transition-property:top;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-fall.tooltipster-initial{top:0!important}.tooltipster-fall.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;top:0!important;opacity:0}.tooltipster-slide{-webkit-transition-property:left;-moz-transition-property:left;-o-transition-property:left;-ms-transition-property:left;transition-property:left;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-slide.tooltipster-initial{left:-40px!important}.tooltipster-slide.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;left:0!important;opacity:0}@keyframes tooltipster-fading{0%{opacity:0}100%{opacity:1}}.tooltipster-update-fade{animation:tooltipster-fading .4s}@keyframes tooltipster-rotating{25%{transform:rotate(-2deg)}75%{transform:rotate(2deg)}100%{transform:rotate(0)}}.tooltipster-update-rotate{animation:tooltipster-rotating .6s}@keyframes tooltipster-scaling{50%{transform:scale(1.1)}100%{transform:scale(1)}}.tooltipster-update-scale{animation:tooltipster-scaling .6s}.tooltipster-sidetip .tooltipster-box{background:#565656;border:2px solid #000;border-radius:4px}.tooltipster-sidetip.tooltipster-bottom .tooltipster-box{margin-top:8px}.tooltipster-sidetip.tooltipster-left .tooltipster-box{margin-right:8px}.tooltipster-sidetip.tooltipster-right .tooltipster-box{margin-left:8px}.tooltipster-sidetip.tooltipster-top .tooltipster-box{margin-bottom:8px}.tooltipster-sidetip .tooltipster-content{color:#fff;line-height:18px;padding:6px 14px}.tooltipster-sidetip .tooltipster-arrow{overflow:hidden;position:absolute}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow{height:10px;margin-left:-10px;top:0;width:20px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow{height:20px;margin-top:-10px;right:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow{height:20px;margin-top:-10px;left:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow{bottom:0;height:10px;margin-left:-10px;width:20px}.tooltipster-sidetip .tooltipster-arrow-background,.tooltipster-sidetip .tooltipster-arrow-border{height:0;position:absolute;width:0}.tooltipster-sidetip .tooltipster-arrow-background{border:10px solid transparent}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#565656;left:0;top:3px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-background{border-left-color:#565656;left:-3px;top:0}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-background{border-right-color:#565656;left:3px;top:0}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-background{border-top-color:#565656;left:0;top:-3px}.tooltipster-sidetip .tooltipster-arrow-border{border:10px solid transparent;left:0;top:0}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#000}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-border{border-left-color:#000}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-border{border-right-color:#000}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-border{border-top-color:#000}.tooltipster-sidetip .tooltipster-arrow-uncropped{position:relative}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-uncropped{top:-10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-uncropped{left:-10px} \ No newline at end of file diff --git a/assets/3rd/tooltipster/js/tooltipster.bundle.min.js b/assets/3rd/tooltipster/js/tooltipster.bundle.min.js new file mode 100755 index 00000000..0289853f --- /dev/null +++ b/assets/3rd/tooltipster/js/tooltipster.bundle.min.js @@ -0,0 +1,2 @@ +/*! tooltipster v4.2.6 */!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(a){function b(a){this.$container,this.constraints=null,this.__$tooltip,this.__init(a)}function c(b,c){var d=!0;return a.each(b,function(a,e){return void 0===c[a]||b[a]!==c[a]?(d=!1,!1):void 0}),d}function d(b){var c=b.attr("id"),d=c?h.window.document.getElementById(c):null;return d?d===b[0]:a.contains(h.window.document.body,b[0])}function e(){if(!g)return!1;var a=g.document.body||g.document.documentElement,b=a.style,c="transition",d=["Moz","Webkit","Khtml","O","ms"];if("string"==typeof b[c])return!0;c=c.charAt(0).toUpperCase()+c.substr(1);for(var e=0;e0?e=c.__plugins[d]:a.each(c.__plugins,function(a,b){return b.name.substring(b.name.length-d.length-1)=="."+d?(e=b,!1):void 0}),e}if(b.name.indexOf(".")<0)throw new Error("Plugins must be namespaced");return c.__plugins[b.name]=b,b.core&&c.__bridge(b.core,c,b.name),this},_trigger:function(){var a=Array.prototype.slice.apply(arguments);return"string"==typeof a[0]&&(a[0]={type:a[0]}),this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,a),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,a),this},instances:function(b){var c=[],d=b||".tooltipstered";return a(d).each(function(){var b=a(this),d=b.data("tooltipster-ns");d&&a.each(d,function(a,d){c.push(b.data(d))})}),c},instancesLatest:function(){return this.__instancesLatestArr},off:function(){return this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},origins:function(b){var c=b?b+" ":"";return a(c+".tooltipstered").toArray()},setDefaults:function(b){return a.extend(f,b),this},triggerHandler:function(){return this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},a.tooltipster=new i,a.Tooltipster=function(b,c){this.__callbacks={close:[],open:[]},this.__closingTime,this.__Content,this.__contentBcr,this.__destroyed=!1,this.__$emitterPrivate=a({}),this.__$emitterPublic=a({}),this.__enabled=!0,this.__garbageCollector,this.__Geometry,this.__lastPosition,this.__namespace="tooltipster-"+Math.round(1e6*Math.random()),this.__options,this.__$originParents,this.__pointerIsOverOrigin=!1,this.__previousThemes=[],this.__state="closed",this.__timeouts={close:[],open:null},this.__touchEvents=[],this.__tracker=null,this._$origin,this._$tooltip,this.__init(b,c)},a.Tooltipster.prototype={__init:function(b,c){var d=this;if(d._$origin=a(b),d.__options=a.extend(!0,{},f,c),d.__optionsFormat(),!h.IE||h.IE>=d.__options.IEmin){var e=null;if(void 0===d._$origin.data("tooltipster-initialTitle")&&(e=d._$origin.attr("title"),void 0===e&&(e=null),d._$origin.data("tooltipster-initialTitle",e)),null!==d.__options.content)d.__contentSet(d.__options.content);else{var g,i=d._$origin.attr("data-tooltip-content");i&&(g=a(i)),g&&g[0]?d.__contentSet(g.first()):d.__contentSet(e)}d._$origin.removeAttr("title").addClass("tooltipstered"),d.__prepareOrigin(),d.__prepareGC(),a.each(d.__options.plugins,function(a,b){d._plug(b)}),h.hasTouchCapability&&a(h.window.document.body).on("touchmove."+d.__namespace+"-triggerOpen",function(a){d._touchRecordEvent(a)}),d._on("created",function(){d.__prepareTooltip()})._on("repositioned",function(a){d.__lastPosition=a.position})}else d.__options.disabled=!0},__contentInsert:function(){var a=this,b=a._$tooltip.find(".tooltipster-content"),c=a.__Content,d=function(a){c=a};return a._trigger({type:"format",content:a.__Content,format:d}),a.__options.functionFormat&&(c=a.__options.functionFormat.call(a,a,{origin:a._$origin[0]},a.__Content)),"string"!=typeof c||a.__options.contentAsHTML?b.empty().append(c):b.text(c),a},__contentSet:function(b){return b instanceof a&&this.__options.contentCloning&&(b=b.clone(!0)),this.__Content=b,this._trigger({type:"updated",content:b}),this},__destroyError:function(){throw new Error("This tooltip has been destroyed and cannot execute your method call.")},__geometry:function(){var b=this,c=b._$origin,d=b._$origin.is("area");if(d){var e=b._$origin.parent().attr("name");c=a('img[usemap="#'+e+'"]')}var f=c[0].getBoundingClientRect(),g=a(h.window.document),i=a(h.window),j=c,k={available:{document:null,window:null},document:{size:{height:g.height(),width:g.width()}},window:{scroll:{left:h.window.scrollX||h.window.document.documentElement.scrollLeft,top:h.window.scrollY||h.window.document.documentElement.scrollTop},size:{height:i.height(),width:i.width()}},origin:{fixedLineage:!1,offset:{},size:{height:f.bottom-f.top,width:f.right-f.left},usemapImage:d?c[0]:null,windowOffset:{bottom:f.bottom,left:f.left,right:f.right,top:f.top}}};if(d){var l=b._$origin.attr("shape"),m=b._$origin.attr("coords");if(m&&(m=m.split(","),a.map(m,function(a,b){m[b]=parseInt(a)})),"default"!=l)switch(l){case"circle":var n=m[0],o=m[1],p=m[2],q=o-p,r=n-p;k.origin.size.height=2*p,k.origin.size.width=k.origin.size.height,k.origin.windowOffset.left+=r,k.origin.windowOffset.top+=q;break;case"rect":var s=m[0],t=m[1],u=m[2],v=m[3];k.origin.size.height=v-t,k.origin.size.width=u-s,k.origin.windowOffset.left+=s,k.origin.windowOffset.top+=t;break;case"poly":for(var w=0,x=0,y=0,z=0,A="even",B=0;By&&(y=C,0===B&&(w=y)),w>C&&(w=C),A="odd"):(C>z&&(z=C,1==B&&(x=z)),x>C&&(x=C),A="even")}k.origin.size.height=z-x,k.origin.size.width=y-w,k.origin.windowOffset.left+=w,k.origin.windowOffset.top+=x}}var D=function(a){k.origin.size.height=a.height,k.origin.windowOffset.left=a.left,k.origin.windowOffset.top=a.top,k.origin.size.width=a.width};for(b._trigger({type:"geometry",edit:D,geometry:{height:k.origin.size.height,left:k.origin.windowOffset.left,top:k.origin.windowOffset.top,width:k.origin.size.width}}),k.origin.windowOffset.right=k.origin.windowOffset.left+k.origin.size.width,k.origin.windowOffset.bottom=k.origin.windowOffset.top+k.origin.size.height,k.origin.offset.left=k.origin.windowOffset.left+k.window.scroll.left,k.origin.offset.top=k.origin.windowOffset.top+k.window.scroll.top,k.origin.offset.bottom=k.origin.offset.top+k.origin.size.height,k.origin.offset.right=k.origin.offset.left+k.origin.size.width,k.available.document={bottom:{height:k.document.size.height-k.origin.offset.bottom,width:k.document.size.width},left:{height:k.document.size.height,width:k.origin.offset.left},right:{height:k.document.size.height,width:k.document.size.width-k.origin.offset.right},top:{height:k.origin.offset.top,width:k.document.size.width}},k.available.window={bottom:{height:Math.max(k.window.size.height-Math.max(k.origin.windowOffset.bottom,0),0),width:k.window.size.width},left:{height:k.window.size.height,width:Math.max(k.origin.windowOffset.left,0)},right:{height:k.window.size.height,width:Math.max(k.window.size.width-Math.max(k.origin.windowOffset.right,0),0)},top:{height:Math.max(k.origin.windowOffset.top,0),width:k.window.size.width}};"html"!=j[0].tagName.toLowerCase();){if("fixed"==j.css("position")){k.origin.fixedLineage=!0;break}j=j.parent()}return k},__optionsFormat:function(){return"number"==typeof this.__options.animationDuration&&(this.__options.animationDuration=[this.__options.animationDuration,this.__options.animationDuration]),"number"==typeof this.__options.delay&&(this.__options.delay=[this.__options.delay,this.__options.delay]),"number"==typeof this.__options.delayTouch&&(this.__options.delayTouch=[this.__options.delayTouch,this.__options.delayTouch]),"string"==typeof this.__options.theme&&(this.__options.theme=[this.__options.theme]),null===this.__options.parent?this.__options.parent=a(h.window.document.body):"string"==typeof this.__options.parent&&(this.__options.parent=a(this.__options.parent)),"hover"==this.__options.trigger?(this.__options.triggerOpen={mouseenter:!0,touchstart:!0},this.__options.triggerClose={mouseleave:!0,originClick:!0,touchleave:!0}):"click"==this.__options.trigger&&(this.__options.triggerOpen={click:!0,tap:!0},this.__options.triggerClose={click:!0,tap:!0}),this._trigger("options"),this},__prepareGC:function(){var b=this;return b.__options.selfDestruction?b.__garbageCollector=setInterval(function(){var c=(new Date).getTime();b.__touchEvents=a.grep(b.__touchEvents,function(a,b){return c-a.time>6e4}),d(b._$origin)||b.close(function(){b.destroy()})},2e4):clearInterval(b.__garbageCollector),b},__prepareOrigin:function(){var a=this;if(a._$origin.off("."+a.__namespace+"-triggerOpen"),h.hasTouchCapability&&a._$origin.on("touchstart."+a.__namespace+"-triggerOpen touchend."+a.__namespace+"-triggerOpen touchcancel."+a.__namespace+"-triggerOpen",function(b){a._touchRecordEvent(b)}),a.__options.triggerOpen.click||a.__options.triggerOpen.tap&&h.hasTouchCapability){var b="";a.__options.triggerOpen.click&&(b+="click."+a.__namespace+"-triggerOpen "),a.__options.triggerOpen.tap&&h.hasTouchCapability&&(b+="touchend."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){a._touchIsMeaningfulEvent(b)&&a._open(b)})}if(a.__options.triggerOpen.mouseenter||a.__options.triggerOpen.touchstart&&h.hasTouchCapability){var b="";a.__options.triggerOpen.mouseenter&&(b+="mouseenter."+a.__namespace+"-triggerOpen "),a.__options.triggerOpen.touchstart&&h.hasTouchCapability&&(b+="touchstart."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){!a._touchIsTouchEvent(b)&&a._touchIsEmulatedEvent(b)||(a.__pointerIsOverOrigin=!0,a._openShortly(b))})}if(a.__options.triggerClose.mouseleave||a.__options.triggerClose.touchleave&&h.hasTouchCapability){var b="";a.__options.triggerClose.mouseleave&&(b+="mouseleave."+a.__namespace+"-triggerOpen "),a.__options.triggerClose.touchleave&&h.hasTouchCapability&&(b+="touchend."+a.__namespace+"-triggerOpen touchcancel."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){a._touchIsMeaningfulEvent(b)&&(a.__pointerIsOverOrigin=!1)})}return a},__prepareTooltip:function(){var b=this,c=b.__options.interactive?"auto":"";return b._$tooltip.attr("id",b.__namespace).css({"pointer-events":c,zIndex:b.__options.zIndex}),a.each(b.__previousThemes,function(a,c){b._$tooltip.removeClass(c)}),a.each(b.__options.theme,function(a,c){b._$tooltip.addClass(c)}),b.__previousThemes=a.merge([],b.__options.theme),b},__scrollHandler:function(b){var c=this;if(c.__options.triggerClose.scroll)c._close(b);else if(d(c._$origin)&&d(c._$tooltip)){var e=null;if(b.target===h.window.document)c.__Geometry.origin.fixedLineage||c.__options.repositionOnScroll&&c.reposition(b);else{e=c.__geometry();var f=!1;if("fixed"!=c._$origin.css("position")&&c.__$originParents.each(function(b,c){var d=a(c),g=d.css("overflow-x"),h=d.css("overflow-y");if("visible"!=g||"visible"!=h){var i=c.getBoundingClientRect();if("visible"!=g&&(e.origin.windowOffset.lefti.right))return f=!0,!1;if("visible"!=h&&(e.origin.windowOffset.topi.bottom))return f=!0,!1}return"fixed"==d.css("position")?!1:void 0}),f)c._$tooltip.css("visibility","hidden");else if(c._$tooltip.css("visibility","visible"),c.__options.repositionOnScroll)c.reposition(b);else{var g=e.origin.offset.left-c.__Geometry.origin.offset.left,i=e.origin.offset.top-c.__Geometry.origin.offset.top;c._$tooltip.css({left:c.__lastPosition.coord.left+g,top:c.__lastPosition.coord.top+i})}}c._trigger({type:"scroll",event:b,geo:e})}return c},__stateSet:function(a){return this.__state=a,this._trigger({type:"state",state:a}),this},__timeoutsClear:function(){return clearTimeout(this.__timeouts.open),this.__timeouts.open=null,a.each(this.__timeouts.close,function(a,b){clearTimeout(b)}),this.__timeouts.close=[],this},__trackerStart:function(){var a=this,b=a._$tooltip.find(".tooltipster-content");return a.__options.trackTooltip&&(a.__contentBcr=b[0].getBoundingClientRect()),a.__tracker=setInterval(function(){if(d(a._$origin)&&d(a._$tooltip)){if(a.__options.trackOrigin){var e=a.__geometry(),f=!1;c(e.origin.size,a.__Geometry.origin.size)&&(a.__Geometry.origin.fixedLineage?c(e.origin.windowOffset,a.__Geometry.origin.windowOffset)&&(f=!0):c(e.origin.offset,a.__Geometry.origin.offset)&&(f=!0)),f||(a.__options.triggerClose.mouseleave?a._close():a.reposition())}if(a.__options.trackTooltip){var g=b[0].getBoundingClientRect();g.height===a.__contentBcr.height&&g.width===a.__contentBcr.width||(a.reposition(),a.__contentBcr=g)}}else a._close()},a.__options.trackerInterval),a},_close:function(b,c,d){var e=this,f=!0;if(e._trigger({type:"close",event:b,stop:function(){f=!1}}),f||d){c&&e.__callbacks.close.push(c),e.__callbacks.open=[],e.__timeoutsClear();var g=function(){a.each(e.__callbacks.close,function(a,c){c.call(e,e,{event:b,origin:e._$origin[0]})}),e.__callbacks.close=[]};if("closed"!=e.__state){var i=!0,j=new Date,k=j.getTime(),l=k+e.__options.animationDuration[1];if("disappearing"==e.__state&&l>e.__closingTime&&e.__options.animationDuration[1]>0&&(i=!1),i){e.__closingTime=l,"disappearing"!=e.__state&&e.__stateSet("disappearing");var m=function(){clearInterval(e.__tracker),e._trigger({type:"closing",event:b}),e._$tooltip.off("."+e.__namespace+"-triggerClose").removeClass("tooltipster-dying"),a(h.window).off("."+e.__namespace+"-triggerClose"),e.__$originParents.each(function(b,c){a(c).off("scroll."+e.__namespace+"-triggerClose")}),e.__$originParents=null,a(h.window.document.body).off("."+e.__namespace+"-triggerClose"),e._$origin.off("."+e.__namespace+"-triggerClose"),e._off("dismissable"),e.__stateSet("closed"),e._trigger({type:"after",event:b}),e.__options.functionAfter&&e.__options.functionAfter.call(e,e,{event:b,origin:e._$origin[0]}),g()};h.hasTransitions?(e._$tooltip.css({"-moz-animation-duration":e.__options.animationDuration[1]+"ms","-ms-animation-duration":e.__options.animationDuration[1]+"ms","-o-animation-duration":e.__options.animationDuration[1]+"ms","-webkit-animation-duration":e.__options.animationDuration[1]+"ms","animation-duration":e.__options.animationDuration[1]+"ms","transition-duration":e.__options.animationDuration[1]+"ms"}),e._$tooltip.clearQueue().removeClass("tooltipster-show").addClass("tooltipster-dying"),e.__options.animationDuration[1]>0&&e._$tooltip.delay(e.__options.animationDuration[1]),e._$tooltip.queue(m)):e._$tooltip.stop().fadeOut(e.__options.animationDuration[1],m)}}else g()}return e},_off:function(){return this.__$emitterPrivate.off.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_on:function(){return this.__$emitterPrivate.on.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_one:function(){return this.__$emitterPrivate.one.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_open:function(b,c){var e=this;if(!e.__destroying&&d(e._$origin)&&e.__enabled){var f=!0;if("closed"==e.__state&&(e._trigger({type:"before",event:b,stop:function(){f=!1}}),f&&e.__options.functionBefore&&(f=e.__options.functionBefore.call(e,e,{event:b,origin:e._$origin[0]}))),f!==!1&&null!==e.__Content){c&&e.__callbacks.open.push(c),e.__callbacks.close=[],e.__timeoutsClear();var g,i=function(){"stable"!=e.__state&&e.__stateSet("stable"),a.each(e.__callbacks.open,function(a,b){b.call(e,e,{origin:e._$origin[0],tooltip:e._$tooltip[0]})}),e.__callbacks.open=[]};if("closed"!==e.__state)g=0,"disappearing"===e.__state?(e.__stateSet("appearing"),h.hasTransitions?(e._$tooltip.clearQueue().removeClass("tooltipster-dying").addClass("tooltipster-show"),e.__options.animationDuration[0]>0&&e._$tooltip.delay(e.__options.animationDuration[0]),e._$tooltip.queue(i)):e._$tooltip.stop().fadeIn(i)):"stable"==e.__state&&i();else{if(e.__stateSet("appearing"),g=e.__options.animationDuration[0],e.__contentInsert(),e.reposition(b,!0),h.hasTransitions?(e._$tooltip.addClass("tooltipster-"+e.__options.animation).addClass("tooltipster-initial").css({"-moz-animation-duration":e.__options.animationDuration[0]+"ms","-ms-animation-duration":e.__options.animationDuration[0]+"ms","-o-animation-duration":e.__options.animationDuration[0]+"ms","-webkit-animation-duration":e.__options.animationDuration[0]+"ms","animation-duration":e.__options.animationDuration[0]+"ms","transition-duration":e.__options.animationDuration[0]+"ms"}),setTimeout(function(){"closed"!=e.__state&&(e._$tooltip.addClass("tooltipster-show").removeClass("tooltipster-initial"),e.__options.animationDuration[0]>0&&e._$tooltip.delay(e.__options.animationDuration[0]),e._$tooltip.queue(i))},0)):e._$tooltip.css("display","none").fadeIn(e.__options.animationDuration[0],i),e.__trackerStart(),a(h.window).on("resize."+e.__namespace+"-triggerClose",function(b){var c=a(document.activeElement);(c.is("input")||c.is("textarea"))&&a.contains(e._$tooltip[0],c[0])||e.reposition(b)}).on("scroll."+e.__namespace+"-triggerClose",function(a){e.__scrollHandler(a)}),e.__$originParents=e._$origin.parents(),e.__$originParents.each(function(b,c){a(c).on("scroll."+e.__namespace+"-triggerClose",function(a){e.__scrollHandler(a)})}),e.__options.triggerClose.mouseleave||e.__options.triggerClose.touchleave&&h.hasTouchCapability){e._on("dismissable",function(a){a.dismissable?a.delay?(m=setTimeout(function(){e._close(a.event)},a.delay),e.__timeouts.close.push(m)):e._close(a):clearTimeout(m)});var j=e._$origin,k="",l="",m=null;e.__options.interactive&&(j=j.add(e._$tooltip)),e.__options.triggerClose.mouseleave&&(k+="mouseenter."+e.__namespace+"-triggerClose ",l+="mouseleave."+e.__namespace+"-triggerClose "),e.__options.triggerClose.touchleave&&h.hasTouchCapability&&(k+="touchstart."+e.__namespace+"-triggerClose",l+="touchend."+e.__namespace+"-triggerClose touchcancel."+e.__namespace+"-triggerClose"),j.on(l,function(a){if(e._touchIsTouchEvent(a)||!e._touchIsEmulatedEvent(a)){var b="mouseleave"==a.type?e.__options.delay:e.__options.delayTouch;e._trigger({delay:b[1],dismissable:!0,event:a,type:"dismissable"})}}).on(k,function(a){!e._touchIsTouchEvent(a)&&e._touchIsEmulatedEvent(a)||e._trigger({dismissable:!1,event:a,type:"dismissable"})})}e.__options.triggerClose.originClick&&e._$origin.on("click."+e.__namespace+"-triggerClose",function(a){e._touchIsTouchEvent(a)||e._touchIsEmulatedEvent(a)||e._close(a)}),(e.__options.triggerClose.click||e.__options.triggerClose.tap&&h.hasTouchCapability)&&setTimeout(function(){if("closed"!=e.__state){var b="",c=a(h.window.document.body);e.__options.triggerClose.click&&(b+="click."+e.__namespace+"-triggerClose "),e.__options.triggerClose.tap&&h.hasTouchCapability&&(b+="touchend."+e.__namespace+"-triggerClose"),c.on(b,function(b){e._touchIsMeaningfulEvent(b)&&(e._touchRecordEvent(b),e.__options.interactive&&a.contains(e._$tooltip[0],b.target)||e._close(b))}),e.__options.triggerClose.tap&&h.hasTouchCapability&&c.on("touchstart."+e.__namespace+"-triggerClose",function(a){e._touchRecordEvent(a)})}},0),e._trigger("ready"),e.__options.functionReady&&e.__options.functionReady.call(e,e,{origin:e._$origin[0],tooltip:e._$tooltip[0]})}if(e.__options.timer>0){var m=setTimeout(function(){e._close()},e.__options.timer+g);e.__timeouts.close.push(m)}}}return e},_openShortly:function(a){var b=this,c=!0;if("stable"!=b.__state&&"appearing"!=b.__state&&!b.__timeouts.open&&(b._trigger({type:"start",event:a,stop:function(){c=!1}}),c)){var d=0==a.type.indexOf("touch")?b.__options.delayTouch:b.__options.delay;d[0]?b.__timeouts.open=setTimeout(function(){b.__timeouts.open=null,b.__pointerIsOverOrigin&&b._touchIsMeaningfulEvent(a)?(b._trigger("startend"),b._open(a)):b._trigger("startcancel")},d[0]):(b._trigger("startend"),b._open(a))}return b},_optionsExtract:function(b,c){var d=this,e=a.extend(!0,{},c),f=d.__options[b];return f||(f={},a.each(c,function(a,b){var c=d.__options[a];void 0!==c&&(f[a]=c)})),a.each(e,function(b,c){void 0!==f[b]&&("object"!=typeof c||c instanceof Array||null==c||"object"!=typeof f[b]||f[b]instanceof Array||null==f[b]?e[b]=f[b]:a.extend(e[b],f[b]))}),e},_plug:function(b){var c=a.tooltipster._plugin(b);if(!c)throw new Error('The "'+b+'" plugin is not defined');return c.instance&&a.tooltipster.__bridge(c.instance,this,c.name),this},_touchIsEmulatedEvent:function(a){for(var b=!1,c=(new Date).getTime(),d=this.__touchEvents.length-1;d>=0;d--){var e=this.__touchEvents[d];if(!(c-e.time<500))break;e.target===a.target&&(b=!0)}return b},_touchIsMeaningfulEvent:function(a){return this._touchIsTouchEvent(a)&&!this._touchSwiped(a.target)||!this._touchIsTouchEvent(a)&&!this._touchIsEmulatedEvent(a)},_touchIsTouchEvent:function(a){return 0==a.type.indexOf("touch")},_touchRecordEvent:function(a){return this._touchIsTouchEvent(a)&&(a.time=(new Date).getTime(),this.__touchEvents.push(a)),this},_touchSwiped:function(a){for(var b=!1,c=this.__touchEvents.length-1;c>=0;c--){var d=this.__touchEvents[c];if("touchmove"==d.type){b=!0;break}if("touchstart"==d.type&&a===d.target)break}return b},_trigger:function(){var b=Array.prototype.slice.apply(arguments);return"string"==typeof b[0]&&(b[0]={type:b[0]}),b[0].instance=this,b[0].origin=this._$origin?this._$origin[0]:null,b[0].tooltip=this._$tooltip?this._$tooltip[0]:null,this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,b),a.tooltipster._trigger.apply(a.tooltipster,b),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,b),this},_unplug:function(b){var c=this;if(c[b]){var d=a.tooltipster._plugin(b);d.instance&&a.each(d.instance,function(a,d){c[a]&&c[a].bridged===c[b]&&delete c[a]}),c[b].__destroy&&c[b].__destroy(),delete c[b]}return c},close:function(a){return this.__destroyed?this.__destroyError():this._close(null,a),this},content:function(a){var b=this;if(void 0===a)return b.__Content;if(b.__destroyed)b.__destroyError();else if(b.__contentSet(a),null!==b.__Content){if("closed"!==b.__state&&(b.__contentInsert(),b.reposition(),b.__options.updateAnimation))if(h.hasTransitions){var c=b.__options.updateAnimation;b._$tooltip.addClass("tooltipster-update-"+c),setTimeout(function(){"closed"!=b.__state&&b._$tooltip.removeClass("tooltipster-update-"+c)},1e3)}else b._$tooltip.fadeTo(200,.5,function(){"closed"!=b.__state&&b._$tooltip.fadeTo(200,1)})}else b._close();return b},destroy:function(){var b=this;if(b.__destroyed)b.__destroyError();else{"closed"!=b.__state?b.option("animationDuration",0)._close(null,null,!0):b.__timeoutsClear(),b._trigger("destroy"),b.__destroyed=!0,b._$origin.removeData(b.__namespace).off("."+b.__namespace+"-triggerOpen"),a(h.window.document.body).off("."+b.__namespace+"-triggerOpen");var c=b._$origin.data("tooltipster-ns");if(c)if(1===c.length){var d=null;"previous"==b.__options.restoration?d=b._$origin.data("tooltipster-initialTitle"):"current"==b.__options.restoration&&(d="string"==typeof b.__Content?b.__Content:a("
            ").append(b.__Content).html()),d&&b._$origin.attr("title",d),b._$origin.removeClass("tooltipstered"),b._$origin.removeData("tooltipster-ns").removeData("tooltipster-initialTitle")}else c=a.grep(c,function(a,c){return a!==b.__namespace}),b._$origin.data("tooltipster-ns",c);b._trigger("destroyed"),b._off(),b.off(),b.__Content=null,b.__$emitterPrivate=null,b.__$emitterPublic=null,b.__options.parent=null,b._$origin=null,b._$tooltip=null,a.tooltipster.__instancesLatestArr=a.grep(a.tooltipster.__instancesLatestArr,function(a,c){return b!==a}),clearInterval(b.__garbageCollector)}return b},disable:function(){return this.__destroyed?(this.__destroyError(),this):(this._close(),this.__enabled=!1,this)},elementOrigin:function(){return this.__destroyed?void this.__destroyError():this._$origin[0]},elementTooltip:function(){return this._$tooltip?this._$tooltip[0]:null},enable:function(){return this.__enabled=!0,this},hide:function(a){return this.close(a)},instance:function(){return this},off:function(){return this.__destroyed||this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},open:function(a){return this.__destroyed?this.__destroyError():this._open(null,a),this},option:function(b,c){return void 0===c?this.__options[b]:(this.__destroyed?this.__destroyError():(this.__options[b]=c,this.__optionsFormat(),a.inArray(b,["trigger","triggerClose","triggerOpen"])>=0&&this.__prepareOrigin(),"selfDestruction"===b&&this.__prepareGC()),this)},reposition:function(a,b){var c=this;return c.__destroyed?c.__destroyError():"closed"!=c.__state&&d(c._$origin)&&(b||d(c._$tooltip))&&(b||c._$tooltip.detach(),c.__Geometry=c.__geometry(),c._trigger({type:"reposition",event:a,helper:{geo:c.__Geometry}})),c},show:function(a){return this.open(a)},status:function(){return{destroyed:this.__destroyed,enabled:this.__enabled,open:"closed"!==this.__state,state:this.__state}},triggerHandler:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},a.fn.tooltipster=function(){var b=Array.prototype.slice.apply(arguments),c="You are using a single HTML element as content for several tooltips. You probably want to set the contentCloning option to TRUE.";if(0===this.length)return this;if("string"==typeof b[0]){var d="#*$~&";return this.each(function(){var e=a(this).data("tooltipster-ns"),f=e?a(this).data(e[0]):null;if(!f)throw new Error("You called Tooltipster's \""+b[0]+'" method on an uninitialized element');if("function"!=typeof f[b[0]])throw new Error('Unknown method "'+b[0]+'"');this.length>1&&"content"==b[0]&&(b[1]instanceof a||"object"==typeof b[1]&&null!=b[1]&&b[1].tagName)&&!f.__options.contentCloning&&f.__options.debug&&console.log(c);var g=f[b[0]](b[1],b[2]);return g!==f||"instance"===b[0]?(d=g,!1):void 0}),"#*$~&"!==d?d:this}a.tooltipster.__instancesLatestArr=[];var e=b[0]&&void 0!==b[0].multiple,g=e&&b[0].multiple||!e&&f.multiple,h=b[0]&&void 0!==b[0].content,i=h&&b[0].content||!h&&f.content,j=b[0]&&void 0!==b[0].contentCloning,k=j&&b[0].contentCloning||!j&&f.contentCloning,l=b[0]&&void 0!==b[0].debug,m=l&&b[0].debug||!l&&f.debug;return this.length>1&&(i instanceof a||"object"==typeof i&&null!=i&&i.tagName)&&!k&&m&&console.log(c),this.each(function(){var c=!1,d=a(this),e=d.data("tooltipster-ns"),f=null;e?g?c=!0:m&&(console.log("Tooltipster: one or more tooltips are already attached to the element below. Ignoring."),console.log(this)):c=!0,c&&(f=new a.Tooltipster(this,b[0]),e||(e=[]),e.push(f.__namespace),d.data("tooltipster-ns",e),d.data(f.__namespace,f),f.__options.functionInit&&f.__options.functionInit.call(f,f,{origin:this}),f._trigger("init")),a.tooltipster.__instancesLatestArr.push(f)}),this},b.prototype={__init:function(b){this.__$tooltip=b,this.__$tooltip.css({left:0,overflow:"hidden",position:"absolute",top:0}).find(".tooltipster-content").css("overflow","auto"),this.$container=a('
            ').append(this.__$tooltip).appendTo(h.window.document.body)},__forceRedraw:function(){var a=this.__$tooltip.parent();this.__$tooltip.detach(),this.__$tooltip.appendTo(a)},constrain:function(a,b){return this.constraints={width:a,height:b},this.__$tooltip.css({display:"block",height:"",overflow:"auto",width:a}),this},destroy:function(){this.__$tooltip.detach().find(".tooltipster-content").css({display:"",overflow:""}),this.$container.remove()},free:function(){return this.constraints=null,this.__$tooltip.css({display:"",height:"",overflow:"visible",width:""}),this},measure:function(){this.__forceRedraw();var a=this.__$tooltip[0].getBoundingClientRect(),b={size:{height:a.height||a.bottom-a.top,width:a.width||a.right-a.left}};if(this.constraints){var c=this.__$tooltip.find(".tooltipster-content"),d=this.__$tooltip.outerHeight(),e=c[0].getBoundingClientRect(),f={height:d<=this.constraints.height,width:a.width<=this.constraints.width&&e.width>=c[0].scrollWidth-1};b.fits=f.height&&f.width}return h.IE&&h.IE<=11&&b.size.width!==h.window.document.documentElement.clientWidth&&(b.size.width=Math.ceil(b.size.width)+1),b}};var j=navigator.userAgent.toLowerCase();-1!=j.indexOf("msie")?h.IE=parseInt(j.split("msie")[1]):-1!==j.toLowerCase().indexOf("trident")&&-1!==j.indexOf(" rv:11")?h.IE=11:-1!=j.toLowerCase().indexOf("edge/")&&(h.IE=parseInt(j.toLowerCase().split("edge/")[1]));var k="tooltipster.sideTip";return a.tooltipster._plugin({name:k,instance:{__defaults:function(){return{arrow:!0,distance:6,functionPosition:null,maxWidth:null,minIntersection:16,minWidth:0,position:null,side:"top",viewportAware:!0}},__init:function(a){var b=this;b.__instance=a,b.__namespace="tooltipster-sideTip-"+Math.round(1e6*Math.random()),b.__previousState="closed",b.__options,b.__optionsFormat(),b.__instance._on("state."+b.__namespace,function(a){"closed"==a.state?b.__close():"appearing"==a.state&&"closed"==b.__previousState&&b.__create(),b.__previousState=a.state}),b.__instance._on("options."+b.__namespace,function(){b.__optionsFormat()}),b.__instance._on("reposition."+b.__namespace,function(a){b.__reposition(a.event,a.helper)})},__close:function(){this.__instance.content()instanceof a&&this.__instance.content().detach(),this.__instance._$tooltip.remove(),this.__instance._$tooltip=null},__create:function(){var b=a('
            ');this.__options.arrow||b.find(".tooltipster-box").css("margin",0).end().find(".tooltipster-arrow").hide(),this.__options.minWidth&&b.css("min-width",this.__options.minWidth+"px"),this.__options.maxWidth&&b.css("max-width",this.__options.maxWidth+"px"), +this.__instance._$tooltip=b,this.__instance._trigger("created")},__destroy:function(){this.__instance._off("."+self.__namespace)},__optionsFormat:function(){var b=this;if(b.__options=b.__instance._optionsExtract(k,b.__defaults()),b.__options.position&&(b.__options.side=b.__options.position),"object"!=typeof b.__options.distance&&(b.__options.distance=[b.__options.distance]),b.__options.distance.length<4&&(void 0===b.__options.distance[1]&&(b.__options.distance[1]=b.__options.distance[0]),void 0===b.__options.distance[2]&&(b.__options.distance[2]=b.__options.distance[0]),void 0===b.__options.distance[3]&&(b.__options.distance[3]=b.__options.distance[1]),b.__options.distance={top:b.__options.distance[0],right:b.__options.distance[1],bottom:b.__options.distance[2],left:b.__options.distance[3]}),"string"==typeof b.__options.side){var c={top:"bottom",right:"left",bottom:"top",left:"right"};b.__options.side=[b.__options.side,c[b.__options.side]],"left"==b.__options.side[0]||"right"==b.__options.side[0]?b.__options.side.push("top","bottom"):b.__options.side.push("right","left")}6===a.tooltipster._env.IE&&b.__options.arrow!==!0&&(b.__options.arrow=!1)},__reposition:function(b,c){var d,e=this,f=e.__targetFind(c),g=[];e.__instance._$tooltip.detach();var h=e.__instance._$tooltip.clone(),i=a.tooltipster._getRuler(h),j=!1,k=e.__instance.option("animation");switch(k&&h.removeClass("tooltipster-"+k),a.each(["window","document"],function(d,k){var l=null;if(e.__instance._trigger({container:k,helper:c,satisfied:j,takeTest:function(a){l=a},results:g,type:"positionTest"}),1==l||0!=l&&0==j&&("window"!=k||e.__options.viewportAware))for(var d=0;d=h.outerSize.width&&c.geo.available[k][n].height>=h.outerSize.height?h.fits=!0:h.fits=!1:h.fits=p.fits,"window"==k&&(h.fits?"top"==n||"bottom"==n?h.whole=c.geo.origin.windowOffset.right>=e.__options.minIntersection&&c.geo.window.size.width-c.geo.origin.windowOffset.left>=e.__options.minIntersection:h.whole=c.geo.origin.windowOffset.bottom>=e.__options.minIntersection&&c.geo.window.size.height-c.geo.origin.windowOffset.top>=e.__options.minIntersection:h.whole=!1),g.push(h),h.whole)j=!0;else if("natural"==h.mode&&(h.fits||h.size.width<=c.geo.available[k][n].width))return!1}})}}),e.__instance._trigger({edit:function(a){g=a},event:b,helper:c,results:g,type:"positionTested"}),g.sort(function(a,b){if(a.whole&&!b.whole)return-1;if(!a.whole&&b.whole)return 1;if(a.whole&&b.whole){var c=e.__options.side.indexOf(a.side),d=e.__options.side.indexOf(b.side);return d>c?-1:c>d?1:"natural"==a.mode?-1:1}if(a.fits&&!b.fits)return-1;if(!a.fits&&b.fits)return 1;if(a.fits&&b.fits){var c=e.__options.side.indexOf(a.side),d=e.__options.side.indexOf(b.side);return d>c?-1:c>d?1:"natural"==a.mode?-1:1}return"document"==a.container&&"bottom"==a.side&&"natural"==a.mode?-1:1}),d=g[0],d.coord={},d.side){case"left":case"right":d.coord.top=Math.floor(d.target-d.size.height/2);break;case"bottom":case"top":d.coord.left=Math.floor(d.target-d.size.width/2)}switch(d.side){case"left":d.coord.left=c.geo.origin.windowOffset.left-d.outerSize.width;break;case"right":d.coord.left=c.geo.origin.windowOffset.right+d.distance.horizontal;break;case"top":d.coord.top=c.geo.origin.windowOffset.top-d.outerSize.height;break;case"bottom":d.coord.top=c.geo.origin.windowOffset.bottom+d.distance.vertical}"window"==d.container?"top"==d.side||"bottom"==d.side?d.coord.left<0?c.geo.origin.windowOffset.right-this.__options.minIntersection>=0?d.coord.left=0:d.coord.left=c.geo.origin.windowOffset.right-this.__options.minIntersection-1:d.coord.left>c.geo.window.size.width-d.size.width&&(c.geo.origin.windowOffset.left+this.__options.minIntersection<=c.geo.window.size.width?d.coord.left=c.geo.window.size.width-d.size.width:d.coord.left=c.geo.origin.windowOffset.left+this.__options.minIntersection+1-d.size.width):d.coord.top<0?c.geo.origin.windowOffset.bottom-this.__options.minIntersection>=0?d.coord.top=0:d.coord.top=c.geo.origin.windowOffset.bottom-this.__options.minIntersection-1:d.coord.top>c.geo.window.size.height-d.size.height&&(c.geo.origin.windowOffset.top+this.__options.minIntersection<=c.geo.window.size.height?d.coord.top=c.geo.window.size.height-d.size.height:d.coord.top=c.geo.origin.windowOffset.top+this.__options.minIntersection+1-d.size.height):(d.coord.left>c.geo.window.size.width-d.size.width&&(d.coord.left=c.geo.window.size.width-d.size.width),d.coord.left<0&&(d.coord.left=0)),e.__sideChange(h,d.side),c.tooltipClone=h[0],c.tooltipParent=e.__instance.option("parent").parent[0],c.mode=d.mode,c.whole=d.whole,c.origin=e.__instance._$origin[0],c.tooltip=e.__instance._$tooltip[0],delete d.container,delete d.fits,delete d.mode,delete d.outerSize,delete d.whole,d.distance=d.distance.horizontal||d.distance.vertical;var l=a.extend(!0,{},d);if(e.__instance._trigger({edit:function(a){d=a},event:b,helper:c,position:l,type:"position"}),e.__options.functionPosition){var m=e.__options.functionPosition.call(e,e.__instance,c,l);m&&(d=m)}i.destroy();var n,o;"top"==d.side||"bottom"==d.side?(n={prop:"left",val:d.target-d.coord.left},o=d.size.width-this.__options.minIntersection):(n={prop:"top",val:d.target-d.coord.top},o=d.size.height-this.__options.minIntersection),n.valo&&(n.val=o);var p;p=c.geo.origin.fixedLineage?c.geo.origin.windowOffset:{left:c.geo.origin.windowOffset.left+c.geo.window.scroll.left,top:c.geo.origin.windowOffset.top+c.geo.window.scroll.top},d.coord={left:p.left+(d.coord.left-c.geo.origin.windowOffset.left),top:p.top+(d.coord.top-c.geo.origin.windowOffset.top)},e.__sideChange(e.__instance._$tooltip,d.side),c.geo.origin.fixedLineage?e.__instance._$tooltip.css("position","fixed"):e.__instance._$tooltip.css("position",""),e.__instance._$tooltip.css({left:d.coord.left,top:d.coord.top,height:d.size.height,width:d.size.width}).find(".tooltipster-arrow").css({left:"",top:""}).css(n.prop,n.val),e.__instance._$tooltip.appendTo(e.__instance.option("parent")),e.__instance._trigger({type:"repositioned",event:b,position:d})},__sideChange:function(a,b){a.removeClass("tooltipster-bottom").removeClass("tooltipster-left").removeClass("tooltipster-right").removeClass("tooltipster-top").addClass("tooltipster-"+b)},__targetFind:function(a){var b={},c=this.__instance._$origin[0].getClientRects();if(c.length>1){var d=this.__instance._$origin.css("opacity");1==d&&(this.__instance._$origin.css("opacity",.99),c=this.__instance._$origin[0].getClientRects(),this.__instance._$origin.css("opacity",1))}if(c.length<2)b.top=Math.floor(a.geo.origin.windowOffset.left+a.geo.origin.size.width/2),b.bottom=b.top,b.left=Math.floor(a.geo.origin.windowOffset.top+a.geo.origin.size.height/2),b.right=b.left;else{var e=c[0];b.top=Math.floor(e.left+(e.right-e.left)/2),e=c.length>2?c[Math.ceil(c.length/2)-1]:c[0],b.right=Math.floor(e.top+(e.bottom-e.top)/2),e=c[c.length-1],b.bottom=Math.floor(e.left+(e.right-e.left)/2),e=c.length>2?c[Math.ceil((c.length+1)/2)-1]:c[c.length-1],b.left=Math.floor(e.top+(e.bottom-e.top)/2)}return b}}}),a}); \ No newline at end of file diff --git a/assets/admin.css b/assets/admin.css new file mode 100755 index 00000000..22a19285 --- /dev/null +++ b/assets/admin.css @@ -0,0 +1,209 @@ +.post-type-opalestate_property .post-state { + background: #ef114c; + font-size: 10px; + font-weight: normal; + padding: 3px 6px; + color: #FFF; + border-radius: 5px 5px 5px; +} + +.fixed .column-featured, +.fixed .column-sku { + width: 10%; +} + +.fixed .column-address { + width: 20%; +} + +.type-download { + float: left; + margin: 0 1em 1em 0 !important; + padding: 0; + vertical-align: top; + width: 280px; + text-decoration: none; + color: inherit; + border: 2px solid #ddd; + display: block; + overflow: hidden; + background: #f5f5f5; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + -webkit-transition-property: border, background, color; + transition-property: border, background, color; + -webkit-transition-duration: .05s; + transition-duration: .05s; + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + position: relative; + background: #FFF; +} + +.type-download:hover { + border-color: #0073aa; +} + +.type-download h4 { + margin: 6px 0px; +} + +.type-download a { + font-size: 18px; + font-weight: bold; + outline: 0 none; + text-decoration: none; +} + +.type-download .feed-content { + color: #72777c; +} + +.type-download img { + max-width: 100%; +} + +.type-download .feed-content { + padding: 15px 20px; +} + +.type-download .feed-bottom { + background: #ddd; + padding: 15px 8px; +} + +.type-download:hover .feed-bottom { + background: #0073aa; +} + +.vc_element-icon.icon-wpb-estates-1 { + background-image: url(images/1.png); +} + +.vc_element-icon.icon-wpb-estates-2 { + background-image: url(images/2.png); +} + +.vc_element-icon.icon-wpb-estates-3 { + background-image: url(images/3.png); +} + +.vc_element-icon.icon-wpb-estates-4 { + background-image: url(images/4.png); +} + +.vc_element-icon.icon-wpb-estates-5 { + background-image: url(images/5.png); +} + +.vc_element-icon.icon-wpb-estates-6 { + background-image: url(images/6.png); +} + +.vc_element-icon.icon-wpb-estates-7 { + background-image: url(images/7.png); +} + +.vc_element-icon.icon-wpb-estates-8 { + background-image: url(images/8.png); +} + +.vc_element-icon.icon-wpb-estates-9 { + background-image: url(images/9.png); +} + +.vc_element-icon.icon-wpb-estates-10 { + background-image: url(images/10.png); +} + +.vc_element-icon.icon-wpb-estates-11 { + background-image: url(images/11.png); +} + +.vc_element-icon.icon-wpb-estates-12 { + background-image: url(images/12.png); +} + +.vc_element-icon.icon-wpb-estates-13 { + background-image: url(images/13.png); +} + +.vc_element-icon.icon-wpb-estates-14 { + background-image: url(images/14.png); +} + +.vc_element-icon.icon-wpb-estates-15 { + background-image: url(images/15.png); +} + +.vc_element-icon.icon-wpb-estates-16 { + background-image: url(images/16.png); +} + +.vc_element-icon.icon-wpb-estates-17 { + background-image: url(images/17.png); +} + +.vc_element-icon.icon-wpb-estates-18 { + background-image: url(images/18.png); +} + +.vc_element-icon.icon-wpb-estates-19 { + background-image: url(images/19.png); +} + +/** CMD BOX 2 */ +.cmb2-wrap .field-row-2 .cmb-row { + display: inline-block; + width: 50%; +} + +.cmb2-wrap .field-row-2 .cmb-row:nth-child(even) > div { + padding-left: 12px; +} + +.cmb2-wrap .cmb-td { + padding: 4px 0; +} + +.cmb2-wrap .cmb-th { + padding: 0px 10px 10px 0; +} + +/***/ +.form-settings-wrap { + display: flex; +} +.form-settings-wrap .cmb2-wrap { + min-height: 300px; +} +.form-settings-wrap .subtab-settings-navs { + width: 220px; + background: #2f73e9; + min-height: 300px; +} +.form-settings-wrap .subtab-settings-navs ul { + padding: 0; + margin: 0; +} +.form-settings-wrap .subtab-settings-navs ul li { + padding: 0; + margin: 0; +} +.form-settings-wrap .subtab-settings-navs ul li a { + display: block; + padding: 12px 6px; + background: #2f73e9; + text-align: right; + text-decoration: none; + color: #FFF; + font-weight: bold; +} +.form-settings-wrap .subtab-settings-navs ul li a.active { + background-color: #f1f1f1; + color: #000; +} +.form-settings-wrap .form-settings-form { + padding-left: 20px; + padding-right: 20px; +} diff --git a/assets/cluster-icon.png b/assets/cluster-icon.png new file mode 100755 index 0000000000000000000000000000000000000000..e99e5ec9a4ea418a00586d2067e2eb59d96089a1 GIT binary patch literal 4175 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 Ze*ofn_%Qy4FHisg002ovPDHLkV1j)V*mnQ` literal 0 HcmV?d00001 diff --git a/assets/cmb2-front.css b/assets/cmb2-front.css new file mode 100755 index 00000000..87ac3bc6 --- /dev/null +++ b/assets/cmb2-front.css @@ -0,0 +1,1303 @@ +@charset "UTF-8"; +.cmb2-uploader-files { + display: flex; + flex-wrap: wrap; +} +.cmb2-uploader-files > div { + width: 180px; + height: 130px; + overflow: hidden; +} +.cmb2-uploader-files .preview-image { + height: 100%; +} +.cmb2-uploader-files .preview-image img { + height: 100%; +} +.cmb2-uploader-files .button-placehold { + border: dashed 1px #ebebeb; + cursor: pointer; + text-align: center; +} +.cmb2-uploader-files .button-placehold i { + display: block; + font-size: 24px; + margin-bottom: 8px; +} +.cmb2-uploader-files .button-placehold .button-placehold-content { + position: relative; + top: 50%; + transform: translateY(-50%); +} +.cmb2-uploader-files input.select-file { + display: none; +} + +.uploader-item-preview { + position: relative; +} +.uploader-item-preview .btn-close { + position: absolute; + top: 4px; + right: 5px; + width: 15px; + height: 15px; + cursor: pointer; +} +.uploader-item-preview .btn-close:hover::before { + color: red; +} +.uploader-item-preview .btn-close::before { + content: '\f00d'; + font-family: Fontawesome; + transition: all .3s ease-in-out; +} +.uploader-item-preview .preview-icon { + padding-top: 4px; +} + +/*-------------------------------------------------------------- + * Main Wrap +--------------------------------------------------------------*/ +.cmb2-wrap { + margin: 0; +} +.cmb2-wrap input, +.cmb2-wrap textarea { + font-size: 14px; + max-width: 100%; + padding: 5px; +} +.cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} +.cmb2-wrap textarea { + width: 500px; +} +.cmb2-wrap textarea.cmb2-textarea-code { + font-family: "Courier 10 Pitch", Courier, monospace; + line-height: 16px; +} +.cmb2-wrap input.cmb2-text-small, .cmb2-wrap input.cmb2-timepicker { + width: 100px; +} +.cmb2-wrap input.cmb2-text-money { + width: 90px; +} +.cmb2-wrap input.cmb2-text-medium { + width: 230px; +} +.cmb2-wrap input.cmb2-upload-file { + width: 65%; +} +.cmb2-wrap input.ed_button { + padding: 2px 4px; +} +.cmb2-wrap input:not([type="hidden"]) + input, +.cmb2-wrap input:not([type="hidden"]) + .button-secondary, +.cmb2-wrap input:not([type="hidden"]) + select { + margin-left: 20px; +} +.cmb2-wrap ul { + margin: 0; +} +.cmb2-wrap li { + font-size: 14px; + line-height: 16px; + margin: 1px 0 5px 0; +} +.cmb2-wrap select { + font-size: 14px; + margin-top: 3px; +} +.cmb2-wrap input:focus, +.cmb2-wrap textarea:focus { + background: #fffff8; +} +.cmb2-wrap input[type="radio"] { + margin: 0 5px 0 0; + padding: 0; +} +.cmb2-wrap input[type="checkbox"] { + margin: 0 5px 0 0; + padding: 0; +} +.cmb2-wrap .button-secondary { + color: #555; + border-color: #cccccc; + background: #f7f7f7; + box-shadow: 0 1px 0 #cccccc; + display: inline-block; + text-decoration: none; + font-size: 13px; + line-height: 26px; + height: 28px; + margin: 0; + padding: 0 10px 1px; + cursor: pointer; + border-width: 1px; + border-style: solid; + -webkit-appearance: none; + border-radius: 3px; + white-space: nowrap; + box-sizing: border-box; +} +.cmb2-wrap .button-secondary:hover { + background: #fafafa; + border-color: #999; + color: #23282d; +} +.cmb2-wrap .mceLayout { + border: 1px solid #e9e9e9 !important; +} +.cmb2-wrap .mceIframeContainer { + background: #ffffff; +} +.cmb2-wrap .meta_mce { + width: 97%; +} +.cmb2-wrap .meta_mce textarea { + width: 100%; +} +.cmb2-wrap .field-row-2 { + margin: 0 -15px; +} +.cmb2-wrap .field-row-2::after { + content: ""; + display: block; + clear: both; +} +.cmb2-wrap .field-row-2 .cmb-row { + display: block; + float: left; + width: 100%; + padding-left: 15px; + padding-right: 15px; +} +@media screen and (min-width: 768px) { + .cmb2-wrap .field-row-2 .cmb-row { + width: 50%; + } +} +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-input-wrap { + vertical-align: middle; +} +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-container { + margin: 0 10px 0 0; +} +.cmb2-wrap .cmb-row { + margin: 0; +} +.cmb2-wrap .cmb-row:after { + content: ''; + clear: both; + display: block; + width: 100%; +} +.cmb2-wrap .cmb-row.cmb-repeat .cmb2-metabox-description { + padding-top: 0; + padding-bottom: 1em; +} + +.cmb2-metabox { + clear: both; + margin: 0; +} +.cmb2-metabox > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox > .cmb-row:first-of-type > .cmb-th, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-th { + border: 0; +} + +.cmb-add-row { + margin: 1.8em 0 0; +} + +.cmb-nested .cmb-td, +.cmb-repeatable-group .cmb-th, +.cmb-repeatable-group:first-of-type { + border: 0; +} + +.cmb-row:last-of-type, +.cmb2-wrap .cmb-row:last-of-type, +.cmb-repeatable-group:last-of-type { + border-bottom: 0; +} + +.cmb-repeatable-grouping { + border: 1px solid #e9e9e9; + padding: 0 1em; +} +.cmb-repeatable-grouping.cmb-row { + margin: 0 0 0.8em; +} + +.cmb-th { + color: #0a1938; + float: left; + font-weight: 500; + line-height: 1.2; + padding: 20px 10px 20px 0; + vertical-align: top; + width: 200px; +} +@media (max-width: 450px) { + .cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: left; + width: 100%; + } + .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; + } +} + +.cmb-td { + line-height: 1.3; + max-width: 100%; + padding: 15px 10px; + vertical-align: middle; +} + +.cmb-type-title .cmb-td { + padding: 0; +} + +.cmb-th label { + display: block; + padding: 5px 0; +} + +.cmb-th + .cmb-td { + float: left; +} + +.cmb-td .cmb-td { + padding-bottom: 1em; +} + +.cmb-remove-row { + text-align: right; +} + +.empty-row.hidden { + display: none; +} + +.cmb-repeat-table { + background-color: #fafafa; + border: 1px solid #e1e1e1; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row { + position: relative; + counter-increment: el; + margin: 0; + padding: 10px 10px 10px 50px; + border-bottom: none !important; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row + .cmb-repeat-row { + border-top: solid 1px #e9e9e9; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row.ui-sortable-helper { + outline: dashed 2px #e9e9e9 !important; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row:before { + content: counter(el); + display: block; + top: 0; + left: 0; + position: absolute; + width: 35px; + height: 100%; + line-height: 35px; + cursor: move; + color: #757575; + text-align: center; + border-right: solid 1px #e9e9e9; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row .cmb-td { + margin: 0; + padding: 0; +} +.cmb-repeat-table + .cmb-add-row { + margin: 0; +} +.cmb-repeat-table + .cmb-add-row:before { + content: ''; + width: 1px; + height: 1.6em; + display: block; + margin-left: 17px; + background-color: gainsboro; +} +.cmb-repeat-table .cmb-remove-row { + top: 7px; + right: 7px; + position: absolute; + width: auto; + margin-left: 0; + padding: 0 !important; + display: none; +} +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button { + font-size: 20px; + text-indent: -1000px; + overflow: hidden; + position: relative; + height: auto; + line-height: 1; + padding: 0 10px 0; +} +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button:before { + content: ""; + font-family: 'Dashicons'; + speak: none; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + margin: 0; + text-indent: 0; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + text-align: center; +} +.cmb-repeat-table .cmb-repeat-row:hover .cmb-remove-row { + display: block; +} + +.cmb-repeatable-group .cmb-th { + padding: 5px; +} +.cmb-repeatable-group .cmb-group-title { + background-color: #e9e9e9; + padding: 8px 12px 8px 2.2em; + margin: 0 -1em; + min-height: 1.5em; + font-size: 14px; + line-height: 1.4; +} +.cmb-repeatable-group .cmb-group-title h4 { + border: 0; + margin: 0; + font-size: 1.2em; + font-weight: 500; + padding: 0.5em 0.75em; +} +.cmb-repeatable-group .cmb-group-title .cmb-th { + display: block; + width: 100%; +} +.cmb-repeatable-group .cmb-group-description .cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: left; + width: 100%; +} +.cmb-repeatable-group .cmb-group-description .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; +} +.cmb-repeatable-group .cmb-shift-rows { + font-size: 1em; + margin-right: 1em; + text-decoration: none; +} +.cmb-repeatable-group .cmb-shift-rows .dashicons { + font-size: 1.5em; + height: 1.5em; + line-height: 1.2em; + width: 1em; +} +.cmb-repeatable-group .cmb-shift-rows .dashicons.dashicons-arrow-down-alt2 { + line-height: 1.3em; +} +.cmb-repeatable-group .cmb2-upload-button { + float: right; +} + +p.cmb2-metabox-description { + color: #757575; + font-style: italic; + margin: 0; + padding-top: .5em; +} + +span.cmb2-metabox-description { + color: #757575; + font-style: italic; +} + +.cmb2-metabox-title { + margin: 0 0 5px 0; + padding: 5px 0 0 0; + font-size: 14px; +} + +.cmb-inline ul { + padding: 4px 0 0 0; +} + +.cmb-inline li { + display: inline-block; + padding-right: 18px; +} + +.cmb-type-textarea-code pre { + margin: 0; +} + +.cmb2-media-status .img-status { + clear: none; + display: inline-block; + vertical-align: middle; + margin-right: 10px; + width: auto; +} +.cmb2-media-status .img-status img { + max-width: 350px; + height: auto; +} +.cmb2-media-status .img-status img, +.cmb2-media-status .embed-status { + background: #eee; + border: 5px solid #ffffff; + outline: 1px solid #e9e9e9; + box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.05); + background-image: linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0), linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0); + background-position: 0 0, 10px 10px; + background-size: 20px 20px; + border-radius: 2px; + -moz-border-radius: 2px; + margin: 15px 0 0 0; +} +.cmb2-media-status .embed-status { + float: left; + max-width: 800px; +} +.cmb2-media-status .img-status, .cmb2-media-status .embed-status { + position: relative; +} +.cmb2-media-status .img-status .cmb2-remove-file-button, .cmb2-media-status .embed-status .cmb2-remove-file-button { + background: url(../images/ico-delete.png); + height: 16px; + left: -5px; + position: absolute; + text-indent: -9999px; + top: -5px; + width: 16px; +} +.cmb2-media-status .img-status .cmb2-remove-file-button { + top: 10px; +} +.cmb2-media-status .img-status img, .cmb2-media-status .file-status > span { + cursor: pointer; +} +.cmb2-media-status.cmb-attach-list .img-status img, .cmb2-media-status.cmb-attach-list .file-status > span { + cursor: move; +} + +.cmb-type-file-list .cmb2-media-status .img-status { + clear: none; + vertical-align: middle; + width: auto; + margin-right: 10px; + margin-bottom: 10px; + margin-top: 0; +} + +.cmb-attach-list li { + clear: both; + display: inline-block; + width: 100%; + margin-top: 5px; + margin-bottom: 10px; +} +.cmb-attach-list li img { + float: left; + margin-right: 10px; +} + +.cmb2-remove-wrapper { + margin: 0; +} + +.child-cmb2 .cmb-th { + text-align: left; +} + +.cmb2-indented-hierarchy { + padding-left: 1.5em; +} + +@media (max-width: 450px) { + .cmb-th, + .cmb-td, + .cmb-th + .cmb-td { + display: block; + float: none; + width: 100%; + } +} +.opalestate-submission-form { + position: relative; +} +.opalestate-submission-form .cmb-td { + width: 100%; + padding: 15px 0; +} +.opalestate-submission-form .cmb-th { + width: 100%; + padding-bottom: 0; + padding-top: 15px; +} +.opalestate-submission-form .cmb-th label { + margin: 0; + padding: 0; +} +.opalestate-submission-form span.cmb2-metabox-description { + padding-top: .5em; + display: block; +} +.opalestate-submission-form .cmb2-wrap input.cmb2-text-medium, .opalestate-submission-form .cmb2-wrap input.cmb2-text-small { + width: 100%; +} +.opalestate-submission-form .opalestate-tab-content::after { + content: ''; + display: block; + clear: both; +} +@media screen and (min-width: 768px) { + .opalestate-submission-form .submission-next-btn { + float: right; + } +} +.opalestate-submission-form .btn-submit-cmb { + position: absolute; + bottom: 0px; + right: 0px; + padding: 19px 25px 17px 20px; +} +@media screen and (max-width: 767px) { + .opalestate-submission-form .btn-submit-cmb { + position: relative; + bottom: 0; + right: 0; + margin-top: 15px; + } +} +.opalestate-submission-form .btn-submit-cmb::before { + content: "\f138"; + font-family: Fontawesome; + margin-right: 18px; + padding-right: 20px; +} +.opalestate-submission-form .btn-submit-cmb::after { + content: ""; + width: 52px; + position: absolute; + top: 0; + left: 0; + height: 100%; + background-color: transparent; + -webkit-box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15); + box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15); +} +.opalestate-submission-form .submission-back-btn, .opalestate-submission-form .submission-next-btn, .opalestate-submission-form .submission-next-btn { + margin-top: 15px; +} +.opalestate-submission-form .cmb-repeatable-group .cmb-group-title { + font-size: 15px; +} +.opalestate-submission-form .cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row { + top: .4em; +} +.opalestate-submission-form .cmb-type-group .field-row-2 .cmb-row { + border-bottom: none; + margin-bottom: 0; + padding-bottom: 0; +} +.opalestate-submission-form .cmb-type-group .cmb-row { + padding-top: 15px; + padding-bottom: 15px; + margin-bottom: 15px; +} +.opalestate-submission-form .cmb-type-group .cmb-row.postbox { + padding-top: 0; + border-bottom: 1px solid #e9e9e9; +} +.opalestate-submission-form .cmb-type-group .cmb-th { + width: 100%; + padding: 0; + float: none; +} +.opalestate-submission-form .cmb-type-group .cmb-th + .cmb-td { + width: 100%; + float: none; + padding: 15px 0; +} + +/*-------------------------------------------------------------- + * Post Metaboxes +--------------------------------------------------------------*/ +#poststuff .cmb-group-title { + margin-left: -1em; + margin-right: -1em; + min-height: 1.5em; +} + +#poststuff .repeatable .cmb-group-title { + padding-left: 2.2em; +} + +.cmb2-postbox .cmb2-wrap, .cmb-type-group .cmb2-wrap { + margin: 0; +} +.cmb2-postbox .cmb2-wrap > .cmb-field-list > .cmb-row, .cmb-type-group .cmb2-wrap > .cmb-field-list > .cmb-row { + padding: 1.8em 0; +} +.cmb2-postbox .cmb2-wrap input[type=text].cmb2-oembed, .cmb-type-group .cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} +.cmb2-postbox .cmb-row, .cmb-type-group .cmb-row { + padding: 0 0 1.8em; + margin: 0 0 0.8em; +} +.cmb2-postbox .cmb-row .cmbhandle, .cmb-type-group .cmb-row .cmbhandle { + right: -1em; + position: relative; + color: #222222; +} +.cmb2-postbox .cmb-repeatable-grouping, .cmb-type-group .cmb-repeatable-grouping { + padding: 0 1em; + max-width: 100%; + min-width: 1px !important; +} +.cmb2-postbox .cmb-repeatable-group > .cmb-row, .cmb-type-group .cmb-repeatable-group > .cmb-row { + padding-bottom: 0; +} +.cmb2-postbox .cmb-th, .cmb-type-group .cmb-th { + width: 18%; + padding: 0 2% 0 0; +} +.cmb2-postbox .cmb-td, .cmb-type-group .cmb-td { + margin-bottom: 0; + padding: 0; + line-height: 1.3; +} +.cmb2-postbox .cmb-th + .cmb-td, .cmb-type-group .cmb-th + .cmb-td { + width: 80%; + float: right; +} +.cmb2-postbox .cmb-row:not(:last-of-type), +.cmb2-postbox .cmb-repeatable-group:not(:last-of-type), .cmb-type-group .cmb-row:not(:last-of-type), +.cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 1px solid #e9e9e9; +} +@media (max-width: 450px) { + .cmb2-postbox .cmb-row:not(:last-of-type), + .cmb2-postbox .cmb-repeatable-group:not(:last-of-type), .cmb-type-group .cmb-row:not(:last-of-type), + .cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 0; + } +} +.cmb2-postbox .cmb-repeat-group-field, +.cmb2-postbox .cmb-remove-field-row, .cmb-type-group .cmb-repeat-group-field, +.cmb-type-group .cmb-remove-field-row { + padding-top: 1.8em; +} + +/*-------------------------------------------------------------- + * Context Metaboxes +--------------------------------------------------------------*/ +/* Metabox collapse arrow indicators */ +.js .cmb2-postbox.context-box .toggle-indicator:before { + content: "\f142"; + display: inline-block; + font: normal 20px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} +.js .cmb2-postbox.context-box.closed .toggle-indicator:before { + content: "\f140"; +} + +.cmb2-postbox.context-box { + margin-bottom: 10px; +} +.cmb2-postbox.context-box.context-before_permalink-box { + margin-top: 10px; +} +.cmb2-postbox.context-box.context-after_title-box { + margin-top: 10px; +} +.cmb2-postbox.context-box.context-after_editor-box { + margin-top: 20px; + margin-bottom: 0; +} +.cmb2-postbox.context-box.context-form_top-box { + margin-top: 10px; +} +.cmb2-postbox.context-box.context-form_top-box .hndle { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} +.cmb2-postbox.context-box .hndle { + cursor: auto; +} + +.cmb2-context-wrap { + margin-top: 10px; +} +.cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-right: 300px; + width: auto; +} +.cmb2-context-wrap.cmb2-context-wrap-no-title .cmb2-metabox { + padding: 10px; +} +.cmb2-context-wrap .cmb-th { + padding: 0 2% 0 0; + width: 18%; +} +.cmb2-context-wrap .cmb-td { + width: 80%; + padding: 0; +} +.cmb2-context-wrap .cmb-row { + margin-bottom: 10px; +} +.cmb2-context-wrap .cmb-row:last-of-type { + margin-bottom: 0; +} + +/* one column on the post write/edit screen */ +@media only screen and (max-width: 850px) { + .cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-right: 0; + } +} +/*-------------------------------------------------------------- + * Misc. +--------------------------------------------------------------*/ +#poststuff .cmb-repeatable-group h2 { + margin: 0; +} + +.edit-tags-php .cmb2-metabox-title, +.profile-php .cmb2-metabox-title, +.user-edit-php .cmb2-metabox-title { + font-size: 1.4em; +} + +.cmb2-postbox .cmb-spinner, .cmb2-no-box-wrap .cmb-spinner { + float: left; + display: none; +} + +.cmb-spinner { + display: none; +} +.cmb-spinner.is-active { + display: block; +} + +/*-------------------------------------------------------------- + * Collapsible UI +--------------------------------------------------------------*/ +.cmb2-metabox .cmbhandle { + color: #757575; + float: right; + width: 27px; + height: 30px; + cursor: pointer; + right: -1em; + position: relative; +} +.cmb2-metabox .cmbhandle:before { + content: '\f142'; + right: 12px; + font: normal 20px/1 'dashicons'; + speak: none; + display: inline-block; + padding: 8px 10px; + top: 0; + position: relative; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} +.cmb2-metabox .postbox.closed .cmbhandle:before { + content: '\f140'; +} +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row { + -webkit-appearance: none !important; + background: none !important; + border: none !important; + position: absolute; + left: 0; + top: .5em; + line-height: 1em; + padding: 2px 6px 3px; + opacity: .5; +} +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]) { + cursor: pointer; + color: #a00; + opacity: 1; +} +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]):hover { + color: #f00; +} + +/* + * jQuery UI CSS Framework 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * WordPress Styles adopted from "jQuery UI Datepicker CSS for WordPress" + * https://github.com/stuttter/wp-datepicker-styling + * + */ +* html .cmb2-element.ui-helper-clearfix { + height: 1%; +} + +.cmb2-element.ui-datepicker, .cmb2-element .ui-datepicker { + padding: 0; + margin: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + background-color: #fff; + border: 1px solid #dfdfdf; + border-top: none; + -webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + min-width: 17em; + /* Default Color Scheme */ +} +.cmb2-element.ui-datepicker *, .cmb2-element .ui-datepicker * { + padding: 0; + font-family: "Open Sans", sans-serif; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.cmb2-element.ui-datepicker table, .cmb2-element .ui-datepicker table { + font-size: 13px; + margin: 0; + border: none; + border-collapse: collapse; +} +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, .cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background-image: none; + border: none; + color: #fff; + font-weight: normal; +} +.cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: transparent; + border-color: transparent; + cursor: pointer; +} +.cmb2-element.ui-datepicker .ui-datepicker-title, .cmb2-element .ui-datepicker .ui-datepicker-title { + margin: 0; + padding: 10px 0; + color: #fff; + font-size: 14px; + line-height: 14px; + text-align: center; +} +.cmb2-element.ui-datepicker .ui-datepicker-title select, .cmb2-element .ui-datepicker .ui-datepicker-title select { + margin-top: -8px; + margin-bottom: -8px; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-next, .cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-next { + position: relative; + top: 8px; + height: 34px; + width: 34px; +} +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-next, .cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-next { + border: none; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover, .cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-prev-hover { + left: 0; +} +.cmb2-element.ui-datepicker .ui-datepicker-next, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover, .cmb2-element .ui-datepicker .ui-datepicker-next, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover { + right: 0; +} +.cmb2-element.ui-datepicker .ui-datepicker-next span, +.cmb2-element.ui-datepicker .ui-datepicker-prev span, .cmb2-element .ui-datepicker .ui-datepicker-next span, +.cmb2-element .ui-datepicker .ui-datepicker-prev span { + display: none; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev, .cmb2-element .ui-datepicker .ui-datepicker-prev { + float: left; +} +.cmb2-element.ui-datepicker .ui-datepicker-next, .cmb2-element .ui-datepicker .ui-datepicker-next { + float: right; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.cmb2-element.ui-datepicker .ui-datepicker-next:before, .cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.cmb2-element .ui-datepicker .ui-datepicker-next:before { + font: normal 20px/34px 'dashicons'; + padding-left: 7px; + color: #fff; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: 34px; + height: 34px; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, .cmb2-element .ui-datepicker .ui-datepicker-prev:before { + content: '\f341'; +} +.cmb2-element.ui-datepicker .ui-datepicker-next:before, .cmb2-element .ui-datepicker .ui-datepicker-next:before { + content: '\f345'; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover:before, .cmb2-element .ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover:before { + opacity: 0.7; +} +.cmb2-element.ui-datepicker select.ui-datepicker-month, +.cmb2-element.ui-datepicker select.ui-datepicker-year, .cmb2-element .ui-datepicker select.ui-datepicker-month, +.cmb2-element .ui-datepicker select.ui-datepicker-year { + width: 33%; + background: transparent; + border-color: transparent; + box-shadow: none; + color: #fff; + display: inline-block; +} +.cmb2-element.ui-datepicker select.ui-datepicker-month option, +.cmb2-element.ui-datepicker select.ui-datepicker-year option, .cmb2-element .ui-datepicker select.ui-datepicker-month option, +.cmb2-element .ui-datepicker select.ui-datepicker-year option { + color: #333; +} +.cmb2-element.ui-datepicker thead, .cmb2-element .ui-datepicker thead { + color: #fff; + font-weight: 600; +} +.cmb2-element.ui-datepicker thead th, .cmb2-element .ui-datepicker thead th { + font-weight: normal; +} +.cmb2-element.ui-datepicker th, .cmb2-element .ui-datepicker th { + padding: 10px; +} +.cmb2-element.ui-datepicker td, .cmb2-element .ui-datepicker td { + padding: 0; + border: 1px solid #f4f4f4; +} +.cmb2-element.ui-datepicker td.ui-datepicker-other-month, .cmb2-element .ui-datepicker td.ui-datepicker-other-month { + border: transparent; +} +.cmb2-element.ui-datepicker td.ui-datepicker-week-end, .cmb2-element .ui-datepicker td.ui-datepicker-week-end { + background-color: #f4f4f4; + border: 1px solid #f4f4f4; +} +.cmb2-element.ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today, .cmb2-element .ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today { + -webkit-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); +} +.cmb2-element.ui-datepicker td.ui-datepicker-today, .cmb2-element .ui-datepicker td.ui-datepicker-today { + background-color: #f0f0c0; +} +.cmb2-element.ui-datepicker td.ui-datepicker-current-day, .cmb2-element .ui-datepicker td.ui-datepicker-current-day { + background: #bbdd88; +} +.cmb2-element.ui-datepicker td .ui-state-default, .cmb2-element .ui-datepicker td .ui-state-default { + background: transparent; + border: none; + text-align: center; + text-decoration: none; + width: auto; + display: block; + padding: 5px 10px; + font-weight: normal; + color: #444; +} +.cmb2-element.ui-datepicker td.ui-state-disabled .ui-state-default, .cmb2-element .ui-datepicker td.ui-state-disabled .ui-state-default { + opacity: 0.5; +} +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, .cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} +.cmb2-element.ui-datepicker thead, .cmb2-element .ui-datepicker thead { + background: #32373c; +} +.cmb2-element.ui-datepicker td .ui-state-hover, .cmb2-element.ui-datepicker td .ui-state-active, .cmb2-element .ui-datepicker td .ui-state-hover, .cmb2-element .ui-datepicker td .ui-state-active { + background: #0073aa; + color: #fff; +} +.cmb2-element.ui-datepicker .ui-timepicker-div, .cmb2-element .ui-datepicker .ui-timepicker-div { + font-size: 14px; +} +.cmb2-element.ui-datepicker .ui-timepicker-div dl, .cmb2-element .ui-datepicker .ui-timepicker-div dl { + text-align: left; + padding: 0 .6em; +} +.cmb2-element.ui-datepicker .ui-timepicker-div dl dt, .cmb2-element .ui-datepicker .ui-timepicker-div dl dt { + float: left; + clear: left; + padding: 0 0 0 5px; +} +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd, .cmb2-element .ui-datepicker .ui-timepicker-div dl dd { + margin: 0 10px 10px 40%; +} +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd select, .cmb2-element .ui-datepicker .ui-timepicker-div dl dd select { + width: 100%; +} +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane { + padding: .6em; + text-align: left; +} +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, .cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary { + padding: 0 10px 1px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + margin: 0 .6em .4em .4em; +} + +.admin-color-fresh .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-fresh .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} +.admin-color-fresh .cmb2-element.ui-datepicker thead, .admin-color-fresh .cmb2-element .ui-datepicker thead { + background: #32373c; +} +.admin-color-fresh .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-fresh .cmb2-element .ui-datepicker td .ui-state-hover { + background: #0073aa; + color: #fff; +} + +.admin-color-blue .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-blue .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #52accc; +} +.admin-color-blue .cmb2-element.ui-datepicker thead, .admin-color-blue .cmb2-element .ui-datepicker thead { + background: #4796b3; +} +.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-blue .cmb2-element.ui-datepicker td .ui-state-active, .admin-color-blue .cmb2-element .ui-datepicker td .ui-state-hover, .admin-color-blue .cmb2-element .ui-datepicker td .ui-state-active { + background: #096484; + color: #fff; +} +.admin-color-blue .cmb2-element.ui-datepicker td.ui-datepicker-today, .admin-color-blue .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +.admin-color-coffee .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-coffee .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #59524c; +} +.admin-color-coffee .cmb2-element.ui-datepicker thead, .admin-color-coffee .cmb2-element .ui-datepicker thead { + background: #46403c; +} +.admin-color-coffee .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-coffee .cmb2-element .ui-datepicker td .ui-state-hover { + background: #c7a589; + color: #fff; +} + +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #523f6d; +} +.admin-color-ectoplasm .cmb2-element.ui-datepicker thead, .admin-color-ectoplasm .cmb2-element .ui-datepicker thead { + background: #413256; +} +.admin-color-ectoplasm .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-ectoplasm .cmb2-element .ui-datepicker td .ui-state-hover { + background: #a3b745; + color: #fff; +} + +.admin-color-midnight .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-midnight .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #363b3f; +} +.admin-color-midnight .cmb2-element.ui-datepicker thead, .admin-color-midnight .cmb2-element .ui-datepicker thead { + background: #26292c; +} +.admin-color-midnight .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-midnight .cmb2-element .ui-datepicker td .ui-state-hover { + background: #e14d43; + color: #fff; +} + +.admin-color-ocean .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-ocean .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #738e96; +} +.admin-color-ocean .cmb2-element.ui-datepicker thead, .admin-color-ocean .cmb2-element .ui-datepicker thead { + background: #627c83; +} +.admin-color-ocean .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-ocean .cmb2-element .ui-datepicker td .ui-state-hover { + background: #9ebaa0; + color: #fff; +} + +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, .admin-color-sunrise .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: #cf4944; +} +.admin-color-sunrise .cmb2-element.ui-datepicker th, .admin-color-sunrise .cmb2-element .ui-datepicker th { + border-color: #be3631; + background: #be3631; +} +.admin-color-sunrise .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-sunrise .cmb2-element .ui-datepicker td .ui-state-hover { + background: #dd823b; + color: #fff; +} + +.admin-color-light .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-light .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #e5e5e5; +} +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-year, .admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-year { + color: #555; +} +.admin-color-light .cmb2-element.ui-datepicker thead, .admin-color-light .cmb2-element .ui-datepicker thead { + background: #888; +} +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-next:before, .admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element .ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-next:before { + color: #555; +} +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-light .cmb2-element.ui-datepicker td .ui-state-active, .admin-color-light .cmb2-element .ui-datepicker td .ui-state-hover, .admin-color-light .cmb2-element .ui-datepicker td .ui-state-active { + background: #ccc; +} +.admin-color-light .cmb2-element.ui-datepicker td.ui-datepicker-today, .admin-color-light .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #56b274; +} +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker thead, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker thead { + background: #36533f; +} +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker td .ui-state-hover { + background: #446950; + color: #fff; +} + +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #4ca26a; +} +.admin-color-bbp-mint .cmb2-element.ui-datepicker thead, .admin-color-bbp-mint .cmb2-element .ui-datepicker thead { + background: #4f6d59; +} +.admin-color-bbp-mint .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-bbp-mint .cmb2-element .ui-datepicker td .ui-state-hover { + background: #5fb37c; + color: #fff; +} + +/** + * CMB2 Frontend + */ +/*-------------------------------------------------------------- + * CMB2 Frontend +--------------------------------------------------------------*/ +.closed .inside { + display: none; +} + +.cmb-repeatable-grouping { + position: relative; +} +.cmb-repeatable-grouping .cmb-group-title { + margin-left: -1em; + margin-right: -1em; + min-height: 1.5em; +} +.cmb-repeatable-grouping h3 { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} + +.cmb-repeatable-group.repeatable .cmb-group-title { + padding-left: 2.2em; +} +.cmb-repeatable-group.non-repeatable .cmb-group-title { + padding-left: 12px; +} + +.cmb-type-group .cmb-row .cmbhandle { + right: 0; + position: absolute; +} + +.cmb-spinner { + background: url(images/spinner.gif) no-repeat; + -webkit-background-size: 20px 20px; + background-size: 20px 20px; + display: none; + float: right; + vertical-align: middle; + opacity: 0.7; + filter: alpha(opacity=70); + width: 20px; + height: 20px; + margin: 4px 10px 0; +} diff --git a/assets/cmb2/cmb2-display.css b/assets/cmb2/cmb2-display.css new file mode 100755 index 00000000..eafd9fd3 --- /dev/null +++ b/assets/cmb2/cmb2-display.css @@ -0,0 +1,31 @@ +/*-------------------------------------------------------------- + * CMB2 Display Styling +--------------------------------------------------------------*/ +.cmb2-colorpicker-swatch span { + display: inline-block; + width: 1em; + height: 1em; + border-radius: 1em; + float: left; + margin-top: 3px; + margin-right: 2px; +} + +.cmb2-code { + overflow: scroll; +} + +.cmb-image-display { + max-width: 100%; + height: auto; +} + +.cmb2-display-file-list li { + display: inline; + margin: 0 .5em .5em 0; +} + +.cmb2-oembed * { + max-width: 100%; + height: auto; +} diff --git a/assets/cmb2/cmb2-front.css b/assets/cmb2/cmb2-front.css new file mode 100755 index 00000000..87ac3bc6 --- /dev/null +++ b/assets/cmb2/cmb2-front.css @@ -0,0 +1,1303 @@ +@charset "UTF-8"; +.cmb2-uploader-files { + display: flex; + flex-wrap: wrap; +} +.cmb2-uploader-files > div { + width: 180px; + height: 130px; + overflow: hidden; +} +.cmb2-uploader-files .preview-image { + height: 100%; +} +.cmb2-uploader-files .preview-image img { + height: 100%; +} +.cmb2-uploader-files .button-placehold { + border: dashed 1px #ebebeb; + cursor: pointer; + text-align: center; +} +.cmb2-uploader-files .button-placehold i { + display: block; + font-size: 24px; + margin-bottom: 8px; +} +.cmb2-uploader-files .button-placehold .button-placehold-content { + position: relative; + top: 50%; + transform: translateY(-50%); +} +.cmb2-uploader-files input.select-file { + display: none; +} + +.uploader-item-preview { + position: relative; +} +.uploader-item-preview .btn-close { + position: absolute; + top: 4px; + right: 5px; + width: 15px; + height: 15px; + cursor: pointer; +} +.uploader-item-preview .btn-close:hover::before { + color: red; +} +.uploader-item-preview .btn-close::before { + content: '\f00d'; + font-family: Fontawesome; + transition: all .3s ease-in-out; +} +.uploader-item-preview .preview-icon { + padding-top: 4px; +} + +/*-------------------------------------------------------------- + * Main Wrap +--------------------------------------------------------------*/ +.cmb2-wrap { + margin: 0; +} +.cmb2-wrap input, +.cmb2-wrap textarea { + font-size: 14px; + max-width: 100%; + padding: 5px; +} +.cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} +.cmb2-wrap textarea { + width: 500px; +} +.cmb2-wrap textarea.cmb2-textarea-code { + font-family: "Courier 10 Pitch", Courier, monospace; + line-height: 16px; +} +.cmb2-wrap input.cmb2-text-small, .cmb2-wrap input.cmb2-timepicker { + width: 100px; +} +.cmb2-wrap input.cmb2-text-money { + width: 90px; +} +.cmb2-wrap input.cmb2-text-medium { + width: 230px; +} +.cmb2-wrap input.cmb2-upload-file { + width: 65%; +} +.cmb2-wrap input.ed_button { + padding: 2px 4px; +} +.cmb2-wrap input:not([type="hidden"]) + input, +.cmb2-wrap input:not([type="hidden"]) + .button-secondary, +.cmb2-wrap input:not([type="hidden"]) + select { + margin-left: 20px; +} +.cmb2-wrap ul { + margin: 0; +} +.cmb2-wrap li { + font-size: 14px; + line-height: 16px; + margin: 1px 0 5px 0; +} +.cmb2-wrap select { + font-size: 14px; + margin-top: 3px; +} +.cmb2-wrap input:focus, +.cmb2-wrap textarea:focus { + background: #fffff8; +} +.cmb2-wrap input[type="radio"] { + margin: 0 5px 0 0; + padding: 0; +} +.cmb2-wrap input[type="checkbox"] { + margin: 0 5px 0 0; + padding: 0; +} +.cmb2-wrap .button-secondary { + color: #555; + border-color: #cccccc; + background: #f7f7f7; + box-shadow: 0 1px 0 #cccccc; + display: inline-block; + text-decoration: none; + font-size: 13px; + line-height: 26px; + height: 28px; + margin: 0; + padding: 0 10px 1px; + cursor: pointer; + border-width: 1px; + border-style: solid; + -webkit-appearance: none; + border-radius: 3px; + white-space: nowrap; + box-sizing: border-box; +} +.cmb2-wrap .button-secondary:hover { + background: #fafafa; + border-color: #999; + color: #23282d; +} +.cmb2-wrap .mceLayout { + border: 1px solid #e9e9e9 !important; +} +.cmb2-wrap .mceIframeContainer { + background: #ffffff; +} +.cmb2-wrap .meta_mce { + width: 97%; +} +.cmb2-wrap .meta_mce textarea { + width: 100%; +} +.cmb2-wrap .field-row-2 { + margin: 0 -15px; +} +.cmb2-wrap .field-row-2::after { + content: ""; + display: block; + clear: both; +} +.cmb2-wrap .field-row-2 .cmb-row { + display: block; + float: left; + width: 100%; + padding-left: 15px; + padding-right: 15px; +} +@media screen and (min-width: 768px) { + .cmb2-wrap .field-row-2 .cmb-row { + width: 50%; + } +} +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-input-wrap { + vertical-align: middle; +} +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-container { + margin: 0 10px 0 0; +} +.cmb2-wrap .cmb-row { + margin: 0; +} +.cmb2-wrap .cmb-row:after { + content: ''; + clear: both; + display: block; + width: 100%; +} +.cmb2-wrap .cmb-row.cmb-repeat .cmb2-metabox-description { + padding-top: 0; + padding-bottom: 1em; +} + +.cmb2-metabox { + clear: both; + margin: 0; +} +.cmb2-metabox > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox > .cmb-row:first-of-type > .cmb-th, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-th { + border: 0; +} + +.cmb-add-row { + margin: 1.8em 0 0; +} + +.cmb-nested .cmb-td, +.cmb-repeatable-group .cmb-th, +.cmb-repeatable-group:first-of-type { + border: 0; +} + +.cmb-row:last-of-type, +.cmb2-wrap .cmb-row:last-of-type, +.cmb-repeatable-group:last-of-type { + border-bottom: 0; +} + +.cmb-repeatable-grouping { + border: 1px solid #e9e9e9; + padding: 0 1em; +} +.cmb-repeatable-grouping.cmb-row { + margin: 0 0 0.8em; +} + +.cmb-th { + color: #0a1938; + float: left; + font-weight: 500; + line-height: 1.2; + padding: 20px 10px 20px 0; + vertical-align: top; + width: 200px; +} +@media (max-width: 450px) { + .cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: left; + width: 100%; + } + .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; + } +} + +.cmb-td { + line-height: 1.3; + max-width: 100%; + padding: 15px 10px; + vertical-align: middle; +} + +.cmb-type-title .cmb-td { + padding: 0; +} + +.cmb-th label { + display: block; + padding: 5px 0; +} + +.cmb-th + .cmb-td { + float: left; +} + +.cmb-td .cmb-td { + padding-bottom: 1em; +} + +.cmb-remove-row { + text-align: right; +} + +.empty-row.hidden { + display: none; +} + +.cmb-repeat-table { + background-color: #fafafa; + border: 1px solid #e1e1e1; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row { + position: relative; + counter-increment: el; + margin: 0; + padding: 10px 10px 10px 50px; + border-bottom: none !important; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row + .cmb-repeat-row { + border-top: solid 1px #e9e9e9; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row.ui-sortable-helper { + outline: dashed 2px #e9e9e9 !important; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row:before { + content: counter(el); + display: block; + top: 0; + left: 0; + position: absolute; + width: 35px; + height: 100%; + line-height: 35px; + cursor: move; + color: #757575; + text-align: center; + border-right: solid 1px #e9e9e9; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row .cmb-td { + margin: 0; + padding: 0; +} +.cmb-repeat-table + .cmb-add-row { + margin: 0; +} +.cmb-repeat-table + .cmb-add-row:before { + content: ''; + width: 1px; + height: 1.6em; + display: block; + margin-left: 17px; + background-color: gainsboro; +} +.cmb-repeat-table .cmb-remove-row { + top: 7px; + right: 7px; + position: absolute; + width: auto; + margin-left: 0; + padding: 0 !important; + display: none; +} +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button { + font-size: 20px; + text-indent: -1000px; + overflow: hidden; + position: relative; + height: auto; + line-height: 1; + padding: 0 10px 0; +} +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button:before { + content: ""; + font-family: 'Dashicons'; + speak: none; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + margin: 0; + text-indent: 0; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + text-align: center; +} +.cmb-repeat-table .cmb-repeat-row:hover .cmb-remove-row { + display: block; +} + +.cmb-repeatable-group .cmb-th { + padding: 5px; +} +.cmb-repeatable-group .cmb-group-title { + background-color: #e9e9e9; + padding: 8px 12px 8px 2.2em; + margin: 0 -1em; + min-height: 1.5em; + font-size: 14px; + line-height: 1.4; +} +.cmb-repeatable-group .cmb-group-title h4 { + border: 0; + margin: 0; + font-size: 1.2em; + font-weight: 500; + padding: 0.5em 0.75em; +} +.cmb-repeatable-group .cmb-group-title .cmb-th { + display: block; + width: 100%; +} +.cmb-repeatable-group .cmb-group-description .cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: left; + width: 100%; +} +.cmb-repeatable-group .cmb-group-description .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; +} +.cmb-repeatable-group .cmb-shift-rows { + font-size: 1em; + margin-right: 1em; + text-decoration: none; +} +.cmb-repeatable-group .cmb-shift-rows .dashicons { + font-size: 1.5em; + height: 1.5em; + line-height: 1.2em; + width: 1em; +} +.cmb-repeatable-group .cmb-shift-rows .dashicons.dashicons-arrow-down-alt2 { + line-height: 1.3em; +} +.cmb-repeatable-group .cmb2-upload-button { + float: right; +} + +p.cmb2-metabox-description { + color: #757575; + font-style: italic; + margin: 0; + padding-top: .5em; +} + +span.cmb2-metabox-description { + color: #757575; + font-style: italic; +} + +.cmb2-metabox-title { + margin: 0 0 5px 0; + padding: 5px 0 0 0; + font-size: 14px; +} + +.cmb-inline ul { + padding: 4px 0 0 0; +} + +.cmb-inline li { + display: inline-block; + padding-right: 18px; +} + +.cmb-type-textarea-code pre { + margin: 0; +} + +.cmb2-media-status .img-status { + clear: none; + display: inline-block; + vertical-align: middle; + margin-right: 10px; + width: auto; +} +.cmb2-media-status .img-status img { + max-width: 350px; + height: auto; +} +.cmb2-media-status .img-status img, +.cmb2-media-status .embed-status { + background: #eee; + border: 5px solid #ffffff; + outline: 1px solid #e9e9e9; + box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.05); + background-image: linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0), linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0); + background-position: 0 0, 10px 10px; + background-size: 20px 20px; + border-radius: 2px; + -moz-border-radius: 2px; + margin: 15px 0 0 0; +} +.cmb2-media-status .embed-status { + float: left; + max-width: 800px; +} +.cmb2-media-status .img-status, .cmb2-media-status .embed-status { + position: relative; +} +.cmb2-media-status .img-status .cmb2-remove-file-button, .cmb2-media-status .embed-status .cmb2-remove-file-button { + background: url(../images/ico-delete.png); + height: 16px; + left: -5px; + position: absolute; + text-indent: -9999px; + top: -5px; + width: 16px; +} +.cmb2-media-status .img-status .cmb2-remove-file-button { + top: 10px; +} +.cmb2-media-status .img-status img, .cmb2-media-status .file-status > span { + cursor: pointer; +} +.cmb2-media-status.cmb-attach-list .img-status img, .cmb2-media-status.cmb-attach-list .file-status > span { + cursor: move; +} + +.cmb-type-file-list .cmb2-media-status .img-status { + clear: none; + vertical-align: middle; + width: auto; + margin-right: 10px; + margin-bottom: 10px; + margin-top: 0; +} + +.cmb-attach-list li { + clear: both; + display: inline-block; + width: 100%; + margin-top: 5px; + margin-bottom: 10px; +} +.cmb-attach-list li img { + float: left; + margin-right: 10px; +} + +.cmb2-remove-wrapper { + margin: 0; +} + +.child-cmb2 .cmb-th { + text-align: left; +} + +.cmb2-indented-hierarchy { + padding-left: 1.5em; +} + +@media (max-width: 450px) { + .cmb-th, + .cmb-td, + .cmb-th + .cmb-td { + display: block; + float: none; + width: 100%; + } +} +.opalestate-submission-form { + position: relative; +} +.opalestate-submission-form .cmb-td { + width: 100%; + padding: 15px 0; +} +.opalestate-submission-form .cmb-th { + width: 100%; + padding-bottom: 0; + padding-top: 15px; +} +.opalestate-submission-form .cmb-th label { + margin: 0; + padding: 0; +} +.opalestate-submission-form span.cmb2-metabox-description { + padding-top: .5em; + display: block; +} +.opalestate-submission-form .cmb2-wrap input.cmb2-text-medium, .opalestate-submission-form .cmb2-wrap input.cmb2-text-small { + width: 100%; +} +.opalestate-submission-form .opalestate-tab-content::after { + content: ''; + display: block; + clear: both; +} +@media screen and (min-width: 768px) { + .opalestate-submission-form .submission-next-btn { + float: right; + } +} +.opalestate-submission-form .btn-submit-cmb { + position: absolute; + bottom: 0px; + right: 0px; + padding: 19px 25px 17px 20px; +} +@media screen and (max-width: 767px) { + .opalestate-submission-form .btn-submit-cmb { + position: relative; + bottom: 0; + right: 0; + margin-top: 15px; + } +} +.opalestate-submission-form .btn-submit-cmb::before { + content: "\f138"; + font-family: Fontawesome; + margin-right: 18px; + padding-right: 20px; +} +.opalestate-submission-form .btn-submit-cmb::after { + content: ""; + width: 52px; + position: absolute; + top: 0; + left: 0; + height: 100%; + background-color: transparent; + -webkit-box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15); + box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15); +} +.opalestate-submission-form .submission-back-btn, .opalestate-submission-form .submission-next-btn, .opalestate-submission-form .submission-next-btn { + margin-top: 15px; +} +.opalestate-submission-form .cmb-repeatable-group .cmb-group-title { + font-size: 15px; +} +.opalestate-submission-form .cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row { + top: .4em; +} +.opalestate-submission-form .cmb-type-group .field-row-2 .cmb-row { + border-bottom: none; + margin-bottom: 0; + padding-bottom: 0; +} +.opalestate-submission-form .cmb-type-group .cmb-row { + padding-top: 15px; + padding-bottom: 15px; + margin-bottom: 15px; +} +.opalestate-submission-form .cmb-type-group .cmb-row.postbox { + padding-top: 0; + border-bottom: 1px solid #e9e9e9; +} +.opalestate-submission-form .cmb-type-group .cmb-th { + width: 100%; + padding: 0; + float: none; +} +.opalestate-submission-form .cmb-type-group .cmb-th + .cmb-td { + width: 100%; + float: none; + padding: 15px 0; +} + +/*-------------------------------------------------------------- + * Post Metaboxes +--------------------------------------------------------------*/ +#poststuff .cmb-group-title { + margin-left: -1em; + margin-right: -1em; + min-height: 1.5em; +} + +#poststuff .repeatable .cmb-group-title { + padding-left: 2.2em; +} + +.cmb2-postbox .cmb2-wrap, .cmb-type-group .cmb2-wrap { + margin: 0; +} +.cmb2-postbox .cmb2-wrap > .cmb-field-list > .cmb-row, .cmb-type-group .cmb2-wrap > .cmb-field-list > .cmb-row { + padding: 1.8em 0; +} +.cmb2-postbox .cmb2-wrap input[type=text].cmb2-oembed, .cmb-type-group .cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} +.cmb2-postbox .cmb-row, .cmb-type-group .cmb-row { + padding: 0 0 1.8em; + margin: 0 0 0.8em; +} +.cmb2-postbox .cmb-row .cmbhandle, .cmb-type-group .cmb-row .cmbhandle { + right: -1em; + position: relative; + color: #222222; +} +.cmb2-postbox .cmb-repeatable-grouping, .cmb-type-group .cmb-repeatable-grouping { + padding: 0 1em; + max-width: 100%; + min-width: 1px !important; +} +.cmb2-postbox .cmb-repeatable-group > .cmb-row, .cmb-type-group .cmb-repeatable-group > .cmb-row { + padding-bottom: 0; +} +.cmb2-postbox .cmb-th, .cmb-type-group .cmb-th { + width: 18%; + padding: 0 2% 0 0; +} +.cmb2-postbox .cmb-td, .cmb-type-group .cmb-td { + margin-bottom: 0; + padding: 0; + line-height: 1.3; +} +.cmb2-postbox .cmb-th + .cmb-td, .cmb-type-group .cmb-th + .cmb-td { + width: 80%; + float: right; +} +.cmb2-postbox .cmb-row:not(:last-of-type), +.cmb2-postbox .cmb-repeatable-group:not(:last-of-type), .cmb-type-group .cmb-row:not(:last-of-type), +.cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 1px solid #e9e9e9; +} +@media (max-width: 450px) { + .cmb2-postbox .cmb-row:not(:last-of-type), + .cmb2-postbox .cmb-repeatable-group:not(:last-of-type), .cmb-type-group .cmb-row:not(:last-of-type), + .cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 0; + } +} +.cmb2-postbox .cmb-repeat-group-field, +.cmb2-postbox .cmb-remove-field-row, .cmb-type-group .cmb-repeat-group-field, +.cmb-type-group .cmb-remove-field-row { + padding-top: 1.8em; +} + +/*-------------------------------------------------------------- + * Context Metaboxes +--------------------------------------------------------------*/ +/* Metabox collapse arrow indicators */ +.js .cmb2-postbox.context-box .toggle-indicator:before { + content: "\f142"; + display: inline-block; + font: normal 20px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} +.js .cmb2-postbox.context-box.closed .toggle-indicator:before { + content: "\f140"; +} + +.cmb2-postbox.context-box { + margin-bottom: 10px; +} +.cmb2-postbox.context-box.context-before_permalink-box { + margin-top: 10px; +} +.cmb2-postbox.context-box.context-after_title-box { + margin-top: 10px; +} +.cmb2-postbox.context-box.context-after_editor-box { + margin-top: 20px; + margin-bottom: 0; +} +.cmb2-postbox.context-box.context-form_top-box { + margin-top: 10px; +} +.cmb2-postbox.context-box.context-form_top-box .hndle { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} +.cmb2-postbox.context-box .hndle { + cursor: auto; +} + +.cmb2-context-wrap { + margin-top: 10px; +} +.cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-right: 300px; + width: auto; +} +.cmb2-context-wrap.cmb2-context-wrap-no-title .cmb2-metabox { + padding: 10px; +} +.cmb2-context-wrap .cmb-th { + padding: 0 2% 0 0; + width: 18%; +} +.cmb2-context-wrap .cmb-td { + width: 80%; + padding: 0; +} +.cmb2-context-wrap .cmb-row { + margin-bottom: 10px; +} +.cmb2-context-wrap .cmb-row:last-of-type { + margin-bottom: 0; +} + +/* one column on the post write/edit screen */ +@media only screen and (max-width: 850px) { + .cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-right: 0; + } +} +/*-------------------------------------------------------------- + * Misc. +--------------------------------------------------------------*/ +#poststuff .cmb-repeatable-group h2 { + margin: 0; +} + +.edit-tags-php .cmb2-metabox-title, +.profile-php .cmb2-metabox-title, +.user-edit-php .cmb2-metabox-title { + font-size: 1.4em; +} + +.cmb2-postbox .cmb-spinner, .cmb2-no-box-wrap .cmb-spinner { + float: left; + display: none; +} + +.cmb-spinner { + display: none; +} +.cmb-spinner.is-active { + display: block; +} + +/*-------------------------------------------------------------- + * Collapsible UI +--------------------------------------------------------------*/ +.cmb2-metabox .cmbhandle { + color: #757575; + float: right; + width: 27px; + height: 30px; + cursor: pointer; + right: -1em; + position: relative; +} +.cmb2-metabox .cmbhandle:before { + content: '\f142'; + right: 12px; + font: normal 20px/1 'dashicons'; + speak: none; + display: inline-block; + padding: 8px 10px; + top: 0; + position: relative; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} +.cmb2-metabox .postbox.closed .cmbhandle:before { + content: '\f140'; +} +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row { + -webkit-appearance: none !important; + background: none !important; + border: none !important; + position: absolute; + left: 0; + top: .5em; + line-height: 1em; + padding: 2px 6px 3px; + opacity: .5; +} +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]) { + cursor: pointer; + color: #a00; + opacity: 1; +} +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]):hover { + color: #f00; +} + +/* + * jQuery UI CSS Framework 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * WordPress Styles adopted from "jQuery UI Datepicker CSS for WordPress" + * https://github.com/stuttter/wp-datepicker-styling + * + */ +* html .cmb2-element.ui-helper-clearfix { + height: 1%; +} + +.cmb2-element.ui-datepicker, .cmb2-element .ui-datepicker { + padding: 0; + margin: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + background-color: #fff; + border: 1px solid #dfdfdf; + border-top: none; + -webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + min-width: 17em; + /* Default Color Scheme */ +} +.cmb2-element.ui-datepicker *, .cmb2-element .ui-datepicker * { + padding: 0; + font-family: "Open Sans", sans-serif; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.cmb2-element.ui-datepicker table, .cmb2-element .ui-datepicker table { + font-size: 13px; + margin: 0; + border: none; + border-collapse: collapse; +} +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, .cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background-image: none; + border: none; + color: #fff; + font-weight: normal; +} +.cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: transparent; + border-color: transparent; + cursor: pointer; +} +.cmb2-element.ui-datepicker .ui-datepicker-title, .cmb2-element .ui-datepicker .ui-datepicker-title { + margin: 0; + padding: 10px 0; + color: #fff; + font-size: 14px; + line-height: 14px; + text-align: center; +} +.cmb2-element.ui-datepicker .ui-datepicker-title select, .cmb2-element .ui-datepicker .ui-datepicker-title select { + margin-top: -8px; + margin-bottom: -8px; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-next, .cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-next { + position: relative; + top: 8px; + height: 34px; + width: 34px; +} +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-next, .cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-next { + border: none; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover, .cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-prev-hover { + left: 0; +} +.cmb2-element.ui-datepicker .ui-datepicker-next, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover, .cmb2-element .ui-datepicker .ui-datepicker-next, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover { + right: 0; +} +.cmb2-element.ui-datepicker .ui-datepicker-next span, +.cmb2-element.ui-datepicker .ui-datepicker-prev span, .cmb2-element .ui-datepicker .ui-datepicker-next span, +.cmb2-element .ui-datepicker .ui-datepicker-prev span { + display: none; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev, .cmb2-element .ui-datepicker .ui-datepicker-prev { + float: left; +} +.cmb2-element.ui-datepicker .ui-datepicker-next, .cmb2-element .ui-datepicker .ui-datepicker-next { + float: right; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.cmb2-element.ui-datepicker .ui-datepicker-next:before, .cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.cmb2-element .ui-datepicker .ui-datepicker-next:before { + font: normal 20px/34px 'dashicons'; + padding-left: 7px; + color: #fff; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: 34px; + height: 34px; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, .cmb2-element .ui-datepicker .ui-datepicker-prev:before { + content: '\f341'; +} +.cmb2-element.ui-datepicker .ui-datepicker-next:before, .cmb2-element .ui-datepicker .ui-datepicker-next:before { + content: '\f345'; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover:before, .cmb2-element .ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover:before { + opacity: 0.7; +} +.cmb2-element.ui-datepicker select.ui-datepicker-month, +.cmb2-element.ui-datepicker select.ui-datepicker-year, .cmb2-element .ui-datepicker select.ui-datepicker-month, +.cmb2-element .ui-datepicker select.ui-datepicker-year { + width: 33%; + background: transparent; + border-color: transparent; + box-shadow: none; + color: #fff; + display: inline-block; +} +.cmb2-element.ui-datepicker select.ui-datepicker-month option, +.cmb2-element.ui-datepicker select.ui-datepicker-year option, .cmb2-element .ui-datepicker select.ui-datepicker-month option, +.cmb2-element .ui-datepicker select.ui-datepicker-year option { + color: #333; +} +.cmb2-element.ui-datepicker thead, .cmb2-element .ui-datepicker thead { + color: #fff; + font-weight: 600; +} +.cmb2-element.ui-datepicker thead th, .cmb2-element .ui-datepicker thead th { + font-weight: normal; +} +.cmb2-element.ui-datepicker th, .cmb2-element .ui-datepicker th { + padding: 10px; +} +.cmb2-element.ui-datepicker td, .cmb2-element .ui-datepicker td { + padding: 0; + border: 1px solid #f4f4f4; +} +.cmb2-element.ui-datepicker td.ui-datepicker-other-month, .cmb2-element .ui-datepicker td.ui-datepicker-other-month { + border: transparent; +} +.cmb2-element.ui-datepicker td.ui-datepicker-week-end, .cmb2-element .ui-datepicker td.ui-datepicker-week-end { + background-color: #f4f4f4; + border: 1px solid #f4f4f4; +} +.cmb2-element.ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today, .cmb2-element .ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today { + -webkit-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); +} +.cmb2-element.ui-datepicker td.ui-datepicker-today, .cmb2-element .ui-datepicker td.ui-datepicker-today { + background-color: #f0f0c0; +} +.cmb2-element.ui-datepicker td.ui-datepicker-current-day, .cmb2-element .ui-datepicker td.ui-datepicker-current-day { + background: #bbdd88; +} +.cmb2-element.ui-datepicker td .ui-state-default, .cmb2-element .ui-datepicker td .ui-state-default { + background: transparent; + border: none; + text-align: center; + text-decoration: none; + width: auto; + display: block; + padding: 5px 10px; + font-weight: normal; + color: #444; +} +.cmb2-element.ui-datepicker td.ui-state-disabled .ui-state-default, .cmb2-element .ui-datepicker td.ui-state-disabled .ui-state-default { + opacity: 0.5; +} +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, .cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} +.cmb2-element.ui-datepicker thead, .cmb2-element .ui-datepicker thead { + background: #32373c; +} +.cmb2-element.ui-datepicker td .ui-state-hover, .cmb2-element.ui-datepicker td .ui-state-active, .cmb2-element .ui-datepicker td .ui-state-hover, .cmb2-element .ui-datepicker td .ui-state-active { + background: #0073aa; + color: #fff; +} +.cmb2-element.ui-datepicker .ui-timepicker-div, .cmb2-element .ui-datepicker .ui-timepicker-div { + font-size: 14px; +} +.cmb2-element.ui-datepicker .ui-timepicker-div dl, .cmb2-element .ui-datepicker .ui-timepicker-div dl { + text-align: left; + padding: 0 .6em; +} +.cmb2-element.ui-datepicker .ui-timepicker-div dl dt, .cmb2-element .ui-datepicker .ui-timepicker-div dl dt { + float: left; + clear: left; + padding: 0 0 0 5px; +} +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd, .cmb2-element .ui-datepicker .ui-timepicker-div dl dd { + margin: 0 10px 10px 40%; +} +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd select, .cmb2-element .ui-datepicker .ui-timepicker-div dl dd select { + width: 100%; +} +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane { + padding: .6em; + text-align: left; +} +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, .cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary { + padding: 0 10px 1px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + margin: 0 .6em .4em .4em; +} + +.admin-color-fresh .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-fresh .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} +.admin-color-fresh .cmb2-element.ui-datepicker thead, .admin-color-fresh .cmb2-element .ui-datepicker thead { + background: #32373c; +} +.admin-color-fresh .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-fresh .cmb2-element .ui-datepicker td .ui-state-hover { + background: #0073aa; + color: #fff; +} + +.admin-color-blue .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-blue .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #52accc; +} +.admin-color-blue .cmb2-element.ui-datepicker thead, .admin-color-blue .cmb2-element .ui-datepicker thead { + background: #4796b3; +} +.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-blue .cmb2-element.ui-datepicker td .ui-state-active, .admin-color-blue .cmb2-element .ui-datepicker td .ui-state-hover, .admin-color-blue .cmb2-element .ui-datepicker td .ui-state-active { + background: #096484; + color: #fff; +} +.admin-color-blue .cmb2-element.ui-datepicker td.ui-datepicker-today, .admin-color-blue .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +.admin-color-coffee .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-coffee .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #59524c; +} +.admin-color-coffee .cmb2-element.ui-datepicker thead, .admin-color-coffee .cmb2-element .ui-datepicker thead { + background: #46403c; +} +.admin-color-coffee .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-coffee .cmb2-element .ui-datepicker td .ui-state-hover { + background: #c7a589; + color: #fff; +} + +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #523f6d; +} +.admin-color-ectoplasm .cmb2-element.ui-datepicker thead, .admin-color-ectoplasm .cmb2-element .ui-datepicker thead { + background: #413256; +} +.admin-color-ectoplasm .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-ectoplasm .cmb2-element .ui-datepicker td .ui-state-hover { + background: #a3b745; + color: #fff; +} + +.admin-color-midnight .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-midnight .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #363b3f; +} +.admin-color-midnight .cmb2-element.ui-datepicker thead, .admin-color-midnight .cmb2-element .ui-datepicker thead { + background: #26292c; +} +.admin-color-midnight .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-midnight .cmb2-element .ui-datepicker td .ui-state-hover { + background: #e14d43; + color: #fff; +} + +.admin-color-ocean .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-ocean .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #738e96; +} +.admin-color-ocean .cmb2-element.ui-datepicker thead, .admin-color-ocean .cmb2-element .ui-datepicker thead { + background: #627c83; +} +.admin-color-ocean .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-ocean .cmb2-element .ui-datepicker td .ui-state-hover { + background: #9ebaa0; + color: #fff; +} + +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, .admin-color-sunrise .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: #cf4944; +} +.admin-color-sunrise .cmb2-element.ui-datepicker th, .admin-color-sunrise .cmb2-element .ui-datepicker th { + border-color: #be3631; + background: #be3631; +} +.admin-color-sunrise .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-sunrise .cmb2-element .ui-datepicker td .ui-state-hover { + background: #dd823b; + color: #fff; +} + +.admin-color-light .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-light .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #e5e5e5; +} +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-year, .admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-year { + color: #555; +} +.admin-color-light .cmb2-element.ui-datepicker thead, .admin-color-light .cmb2-element .ui-datepicker thead { + background: #888; +} +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-next:before, .admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element .ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-next:before { + color: #555; +} +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-light .cmb2-element.ui-datepicker td .ui-state-active, .admin-color-light .cmb2-element .ui-datepicker td .ui-state-hover, .admin-color-light .cmb2-element .ui-datepicker td .ui-state-active { + background: #ccc; +} +.admin-color-light .cmb2-element.ui-datepicker td.ui-datepicker-today, .admin-color-light .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #56b274; +} +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker thead, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker thead { + background: #36533f; +} +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker td .ui-state-hover { + background: #446950; + color: #fff; +} + +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #4ca26a; +} +.admin-color-bbp-mint .cmb2-element.ui-datepicker thead, .admin-color-bbp-mint .cmb2-element .ui-datepicker thead { + background: #4f6d59; +} +.admin-color-bbp-mint .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-bbp-mint .cmb2-element .ui-datepicker td .ui-state-hover { + background: #5fb37c; + color: #fff; +} + +/** + * CMB2 Frontend + */ +/*-------------------------------------------------------------- + * CMB2 Frontend +--------------------------------------------------------------*/ +.closed .inside { + display: none; +} + +.cmb-repeatable-grouping { + position: relative; +} +.cmb-repeatable-grouping .cmb-group-title { + margin-left: -1em; + margin-right: -1em; + min-height: 1.5em; +} +.cmb-repeatable-grouping h3 { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} + +.cmb-repeatable-group.repeatable .cmb-group-title { + padding-left: 2.2em; +} +.cmb-repeatable-group.non-repeatable .cmb-group-title { + padding-left: 12px; +} + +.cmb-type-group .cmb-row .cmbhandle { + right: 0; + position: absolute; +} + +.cmb-spinner { + background: url(images/spinner.gif) no-repeat; + -webkit-background-size: 20px 20px; + background-size: 20px 20px; + display: none; + float: right; + vertical-align: middle; + opacity: 0.7; + filter: alpha(opacity=70); + width: 20px; + height: 20px; + margin: 4px 10px 0; +} diff --git a/assets/cmb2/cmb2.css b/assets/cmb2/cmb2.css new file mode 100755 index 00000000..8c542993 --- /dev/null +++ b/assets/cmb2/cmb2.css @@ -0,0 +1,1277 @@ +@charset "UTF-8"; +/*-------------------------------------------------------------- + * Main Wrap +--------------------------------------------------------------*/ +.cmb2-wrap { + margin: 0; +} +.cmb2-wrap input, +.cmb2-wrap textarea { + font-size: 14px; + max-width: 100%; + padding: 5px; +} +.cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} +.cmb2-wrap textarea { + width: 500px; +} +.cmb2-wrap textarea.cmb2-textarea-code { + font-family: "Courier 10 Pitch", Courier, monospace; + line-height: 16px; +} +.cmb2-wrap input.cmb2-text-small, .cmb2-wrap input.cmb2-timepicker { + width: 100px; +} +.cmb2-wrap input.cmb2-text-money { + width: 90px; +} +.cmb2-wrap input.cmb2-text-medium { + width: 230px; +} +.cmb2-wrap input.cmb2-upload-file { + width: 65%; +} +.cmb2-wrap input.ed_button { + padding: 2px 4px; +} +.cmb2-wrap input:not([type="hidden"]) + input, +.cmb2-wrap input:not([type="hidden"]) + .button-secondary, +.cmb2-wrap input:not([type="hidden"]) + select { + margin-left: 20px; +} +.cmb2-wrap ul { + margin: 0; +} +.cmb2-wrap li { + font-size: 14px; + line-height: 16px; + margin: 1px 0 5px 0; +} +.cmb2-wrap select { + font-size: 14px; + margin-top: 3px; +} +.cmb2-wrap input:focus, +.cmb2-wrap textarea:focus { + background: #fffff8; +} +.cmb2-wrap input[type="radio"] { + margin: 0 5px 0 0; + padding: 0; +} +.cmb2-wrap input[type="checkbox"] { + margin: 0 5px 0 0; + padding: 0; +} +.cmb2-wrap .button-secondary { + color: #555; + border-color: #cccccc; + background: #f7f7f7; + box-shadow: 0 1px 0 #cccccc; + display: inline-block; + text-decoration: none; + font-size: 13px; + line-height: 26px; + height: 28px; + margin: 0; + padding: 0 10px 1px; + cursor: pointer; + border-width: 1px; + border-style: solid; + -webkit-appearance: none; + border-radius: 3px; + white-space: nowrap; + box-sizing: border-box; +} +.cmb2-wrap .button-secondary:hover { + background: #fafafa; + border-color: #999; + color: #23282d; +} +.cmb2-wrap .mceLayout { + border: 1px solid #e9e9e9 !important; +} +.cmb2-wrap .mceIframeContainer { + background: #ffffff; +} +.cmb2-wrap .meta_mce { + width: 97%; +} +.cmb2-wrap .meta_mce textarea { + width: 100%; +} +.cmb2-wrap .field-row-2 { + margin: 0 -15px; +} +.cmb2-wrap .field-row-2::after { + content: ""; + display: block; + clear: both; +} +.cmb2-wrap .field-row-2 .cmb-row { + display: block; + float: left; + width: 100%; + padding-left: 15px; + padding-right: 15px; +} +@media screen and (min-width: 768px) { + .cmb2-wrap .field-row-2 .cmb-row { + width: 50%; + } +} +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-input-wrap { + vertical-align: middle; +} +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-container { + margin: 0 10px 0 0; +} +.cmb2-wrap .cmb-row { + margin: 0; +} +.cmb2-wrap .cmb-row:after { + content: ''; + clear: both; + display: block; + width: 100%; +} +.cmb2-wrap .cmb-row.cmb-repeat .cmb2-metabox-description { + padding-top: 0; + padding-bottom: 1em; +} + +.cmb2-metabox { + clear: both; + margin: 0; +} +.cmb2-metabox > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox > .cmb-row:first-of-type > .cmb-th, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-th { + border: 0; +} + +.cmb-add-row { + margin: 1.8em 0 0; +} + +.cmb-nested .cmb-td, +.cmb-repeatable-group .cmb-th, +.cmb-repeatable-group:first-of-type { + border: 0; +} + +.cmb-row:last-of-type, +.cmb2-wrap .cmb-row:last-of-type, +.cmb-repeatable-group:last-of-type { + border-bottom: 0; +} + +.cmb-repeatable-grouping { + border: 1px solid #e9e9e9; + padding: 0 1em; +} +.cmb-repeatable-grouping.cmb-row { + margin: 0 0 0.8em; +} + +.cmb-th { + color: #0a1938; + float: left; + font-weight: 500; + line-height: 1.2; + padding: 20px 10px 20px 0; + vertical-align: top; + width: 200px; +} +@media (max-width: 450px) { + .cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: left; + width: 100%; + } + .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; + } +} + +.cmb-td { + line-height: 1.3; + max-width: 100%; + padding: 15px 10px; + vertical-align: middle; +} + +.cmb-type-title .cmb-td { + padding: 0; +} + +.cmb-th label { + display: block; + padding: 5px 0; +} + +.cmb-th + .cmb-td { + float: left; +} + +.cmb-td .cmb-td { + padding-bottom: 1em; +} + +.cmb-remove-row { + text-align: right; +} + +.empty-row.hidden { + display: none; +} + +.cmb-repeat-table { + background-color: #fafafa; + border: 1px solid #e1e1e1; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row { + position: relative; + counter-increment: el; + margin: 0; + padding: 10px 10px 10px 50px; + border-bottom: none !important; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row + .cmb-repeat-row { + border-top: solid 1px #e9e9e9; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row.ui-sortable-helper { + outline: dashed 2px #e9e9e9 !important; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row:before { + content: counter(el); + display: block; + top: 0; + left: 0; + position: absolute; + width: 35px; + height: 100%; + line-height: 35px; + cursor: move; + color: #757575; + text-align: center; + border-right: solid 1px #e9e9e9; +} +.cmb-repeat-table .cmb-row.cmb-repeat-row .cmb-td { + margin: 0; + padding: 0; +} +.cmb-repeat-table + .cmb-add-row { + margin: 0; +} +.cmb-repeat-table + .cmb-add-row:before { + content: ''; + width: 1px; + height: 1.6em; + display: block; + margin-left: 17px; + background-color: gainsboro; +} +.cmb-repeat-table .cmb-remove-row { + top: 7px; + right: 7px; + position: absolute; + width: auto; + margin-left: 0; + padding: 0 !important; + display: none; +} +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button { + font-size: 20px; + text-indent: -1000px; + overflow: hidden; + position: relative; + height: auto; + line-height: 1; + padding: 0 10px 0; +} +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button:before { + content: ""; + font-family: 'Dashicons'; + speak: none; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + margin: 0; + text-indent: 0; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + text-align: center; +} +.cmb-repeat-table .cmb-repeat-row:hover .cmb-remove-row { + display: block; +} + +.cmb-repeatable-group .cmb-th { + padding: 5px; +} +.cmb-repeatable-group .cmb-group-title { + background-color: #e9e9e9; + padding: 8px 12px 8px 2.2em; + margin: 0 -1em; + min-height: 1.5em; + font-size: 14px; + line-height: 1.4; +} +.cmb-repeatable-group .cmb-group-title h4 { + border: 0; + margin: 0; + font-size: 1.2em; + font-weight: 500; + padding: 0.5em 0.75em; +} +.cmb-repeatable-group .cmb-group-title .cmb-th { + display: block; + width: 100%; +} +.cmb-repeatable-group .cmb-group-description .cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: left; + width: 100%; +} +.cmb-repeatable-group .cmb-group-description .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; +} +.cmb-repeatable-group .cmb-shift-rows { + font-size: 1em; + margin-right: 1em; + text-decoration: none; +} +.cmb-repeatable-group .cmb-shift-rows .dashicons { + font-size: 1.5em; + height: 1.5em; + line-height: 1.2em; + width: 1em; +} +.cmb-repeatable-group .cmb-shift-rows .dashicons.dashicons-arrow-down-alt2 { + line-height: 1.3em; +} +.cmb-repeatable-group .cmb2-upload-button { + float: right; +} + +p.cmb2-metabox-description { + color: #757575; + font-style: italic; + margin: 0; + padding-top: .5em; +} + +span.cmb2-metabox-description { + color: #757575; + font-style: italic; +} + +.cmb2-metabox-title { + margin: 0 0 5px 0; + padding: 5px 0 0 0; + font-size: 14px; +} + +.cmb-inline ul { + padding: 4px 0 0 0; +} + +.cmb-inline li { + display: inline-block; + padding-right: 18px; +} + +.cmb-type-textarea-code pre { + margin: 0; +} + +.cmb2-media-status .img-status { + clear: none; + display: inline-block; + vertical-align: middle; + margin-right: 10px; + width: auto; +} +.cmb2-media-status .img-status img { + max-width: 350px; + height: auto; +} +.cmb2-media-status .img-status img, +.cmb2-media-status .embed-status { + background: #eee; + border: 5px solid #ffffff; + outline: 1px solid #e9e9e9; + box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.05); + background-image: linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0), linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0); + background-position: 0 0, 10px 10px; + background-size: 20px 20px; + border-radius: 2px; + -moz-border-radius: 2px; + margin: 15px 0 0 0; +} +.cmb2-media-status .embed-status { + float: left; + max-width: 800px; +} +.cmb2-media-status .img-status, .cmb2-media-status .embed-status { + position: relative; +} +.cmb2-media-status .img-status .cmb2-remove-file-button, .cmb2-media-status .embed-status .cmb2-remove-file-button { + background: url(../images/ico-delete.png); + height: 16px; + left: -5px; + position: absolute; + text-indent: -9999px; + top: -5px; + width: 16px; +} +.cmb2-media-status .img-status .cmb2-remove-file-button { + top: 10px; +} +.cmb2-media-status .img-status img, .cmb2-media-status .file-status > span { + cursor: pointer; +} +.cmb2-media-status.cmb-attach-list .img-status img, .cmb2-media-status.cmb-attach-list .file-status > span { + cursor: move; +} + +.cmb-type-file-list .cmb2-media-status .img-status { + clear: none; + vertical-align: middle; + width: auto; + margin-right: 10px; + margin-bottom: 10px; + margin-top: 0; +} + +.cmb-attach-list li { + clear: both; + display: inline-block; + width: 100%; + margin-top: 5px; + margin-bottom: 10px; +} +.cmb-attach-list li img { + float: left; + margin-right: 10px; +} + +.cmb2-remove-wrapper { + margin: 0; +} + +.child-cmb2 .cmb-th { + text-align: left; +} + +.cmb2-indented-hierarchy { + padding-left: 1.5em; +} + +@media (max-width: 450px) { + .cmb-th, + .cmb-td, + .cmb-th + .cmb-td { + display: block; + float: none; + width: 100%; + } +} +.opalestate-submission-form { + position: relative; +} +.opalestate-submission-form .cmb-td { + width: 100%; + padding: 15px 0; +} +.opalestate-submission-form .cmb-th { + width: 100%; + padding-bottom: 0; + padding-top: 15px; +} +.opalestate-submission-form .cmb-th label { + margin: 0; + padding: 0; +} +.opalestate-submission-form span.cmb2-metabox-description { + padding-top: .5em; + display: block; +} +.opalestate-submission-form .cmb2-wrap input.cmb2-text-medium, .opalestate-submission-form .cmb2-wrap input.cmb2-text-small { + width: 100%; +} +.opalestate-submission-form .opalestate-tab-content::after { + content: ''; + display: block; + clear: both; +} +@media screen and (min-width: 768px) { + .opalestate-submission-form .submission-next-btn { + float: right; + } +} +.opalestate-submission-form .btn-submit-cmb { + position: absolute; + bottom: 0px; + right: 0px; + padding: 19px 25px 17px 20px; +} +@media screen and (max-width: 767px) { + .opalestate-submission-form .btn-submit-cmb { + position: relative; + bottom: 0; + right: 0; + margin-top: 15px; + } +} +.opalestate-submission-form .btn-submit-cmb::before { + content: "\f138"; + font-family: Fontawesome; + margin-right: 18px; + padding-right: 20px; +} +.opalestate-submission-form .btn-submit-cmb::after { + content: ""; + width: 52px; + position: absolute; + top: 0; + left: 0; + height: 100%; + background-color: transparent; + -webkit-box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15); + box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15); +} +.opalestate-submission-form .submission-back-btn, .opalestate-submission-form .submission-next-btn, .opalestate-submission-form .submission-next-btn { + margin-top: 15px; +} +.opalestate-submission-form .cmb-repeatable-group .cmb-group-title { + font-size: 15px; +} +.opalestate-submission-form .cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row { + top: .4em; +} +.opalestate-submission-form .cmb-type-group .field-row-2 .cmb-row { + border-bottom: none; + margin-bottom: 0; + padding-bottom: 0; +} +.opalestate-submission-form .cmb-type-group .cmb-row { + padding-top: 15px; + padding-bottom: 15px; + margin-bottom: 15px; +} +.opalestate-submission-form .cmb-type-group .cmb-row.postbox { + padding-top: 0; + border-bottom: 1px solid #e9e9e9; +} +.opalestate-submission-form .cmb-type-group .cmb-th { + width: 100%; + padding: 0; + float: none; +} +.opalestate-submission-form .cmb-type-group .cmb-th + .cmb-td { + width: 100%; + float: none; + padding: 15px 0; +} + +/*-------------------------------------------------------------- + * Post Metaboxes +--------------------------------------------------------------*/ +#poststuff .cmb-group-title { + margin-left: -1em; + margin-right: -1em; + min-height: 1.5em; +} + +#poststuff .repeatable .cmb-group-title { + padding-left: 2.2em; +} + +.cmb2-postbox .cmb2-wrap, .cmb-type-group .cmb2-wrap { + margin: 0; +} +.cmb2-postbox .cmb2-wrap > .cmb-field-list > .cmb-row, .cmb-type-group .cmb2-wrap > .cmb-field-list > .cmb-row { + padding: 1.8em 0; +} +.cmb2-postbox .cmb2-wrap input[type=text].cmb2-oembed, .cmb-type-group .cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} +.cmb2-postbox .cmb-row, .cmb-type-group .cmb-row { + padding: 0 0 1.8em; + margin: 0 0 0.8em; +} +.cmb2-postbox .cmb-row .cmbhandle, .cmb-type-group .cmb-row .cmbhandle { + right: -1em; + position: relative; + color: #222222; +} +.cmb2-postbox .cmb-repeatable-grouping, .cmb-type-group .cmb-repeatable-grouping { + padding: 0 1em; + max-width: 100%; + min-width: 1px !important; +} +.cmb2-postbox .cmb-repeatable-group > .cmb-row, .cmb-type-group .cmb-repeatable-group > .cmb-row { + padding-bottom: 0; +} +.cmb2-postbox .cmb-th, .cmb-type-group .cmb-th { + width: 18%; + padding: 0 2% 0 0; +} +.cmb2-postbox .cmb-td, .cmb-type-group .cmb-td { + margin-bottom: 0; + padding: 0; + line-height: 1.3; +} +.cmb2-postbox .cmb-th + .cmb-td, .cmb-type-group .cmb-th + .cmb-td { + width: 80%; + float: right; +} +.cmb2-postbox .cmb-row:not(:last-of-type), +.cmb2-postbox .cmb-repeatable-group:not(:last-of-type), .cmb-type-group .cmb-row:not(:last-of-type), +.cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 1px solid #e9e9e9; +} +@media (max-width: 450px) { + .cmb2-postbox .cmb-row:not(:last-of-type), + .cmb2-postbox .cmb-repeatable-group:not(:last-of-type), .cmb-type-group .cmb-row:not(:last-of-type), + .cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 0; + } +} +.cmb2-postbox .cmb-repeat-group-field, +.cmb2-postbox .cmb-remove-field-row, .cmb-type-group .cmb-repeat-group-field, +.cmb-type-group .cmb-remove-field-row { + padding-top: 1.8em; +} + +/*-------------------------------------------------------------- + * Context Metaboxes +--------------------------------------------------------------*/ +/* Metabox collapse arrow indicators */ +.js .cmb2-postbox.context-box .toggle-indicator:before { + content: "\f142"; + display: inline-block; + font: normal 20px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} +.js .cmb2-postbox.context-box.closed .toggle-indicator:before { + content: "\f140"; +} + +.cmb2-postbox.context-box { + margin-bottom: 10px; +} +.cmb2-postbox.context-box.context-before_permalink-box { + margin-top: 10px; +} +.cmb2-postbox.context-box.context-after_title-box { + margin-top: 10px; +} +.cmb2-postbox.context-box.context-after_editor-box { + margin-top: 20px; + margin-bottom: 0; +} +.cmb2-postbox.context-box.context-form_top-box { + margin-top: 10px; +} +.cmb2-postbox.context-box.context-form_top-box .hndle { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} +.cmb2-postbox.context-box .hndle { + cursor: auto; +} + +.cmb2-context-wrap { + margin-top: 10px; +} +.cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-right: 300px; + width: auto; +} +.cmb2-context-wrap.cmb2-context-wrap-no-title .cmb2-metabox { + padding: 10px; +} +.cmb2-context-wrap .cmb-th { + padding: 0 2% 0 0; + width: 18%; +} +.cmb2-context-wrap .cmb-td { + width: 80%; + padding: 0; +} +.cmb2-context-wrap .cmb-row { + margin-bottom: 10px; +} +.cmb2-context-wrap .cmb-row:last-of-type { + margin-bottom: 0; +} + +/* one column on the post write/edit screen */ +@media only screen and (max-width: 850px) { + .cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-right: 0; + } +} +/*-------------------------------------------------------------- + * Options page +--------------------------------------------------------------*/ +.cmb2-options-page { + max-width: 1200px; +} +.cmb2-options-page.wrap > h2 { + margin-bottom: 1em; +} +.cmb2-options-page .cmb2-metabox > .cmb-row { + padding: 1em; + margin-top: -1px; + background: #ffffff; + border: 1px solid #e9e9e9; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.cmb2-options-page .cmb2-metabox > .cmb-row > .cmb-th { + padding: 0; + font-weight: initial; +} +.cmb2-options-page .cmb2-metabox > .cmb-row > .cmb-th + .cmb-td { + float: none; + padding: 0 0 0 1em; + margin-left: 200px; +} +@media (max-width: 450px) { + .cmb2-options-page .cmb2-metabox > .cmb-row > .cmb-th + .cmb-td { + padding: 0; + margin-left: 0; + } +} +.cmb2-options-page .cmb2-wrap .cmb-type-title { + margin-top: 1em; + padding: 0.6em 1em; + background-color: #fafafa; +} +.cmb2-options-page .cmb2-wrap .cmb-type-title .cmb2-metabox-title { + font-size: 12px; + margin-top: 0; + margin-bottom: 0; + text-transform: uppercase; +} +.cmb2-options-page .cmb2-wrap .cmb-type-title .cmb2-metabox-description { + padding-top: 0.25em; +} +.cmb2-options-page .cmb-repeatable-group .cmb-group-description .cmb-th { + padding: 0 0 0.8em 0; +} +.cmb2-options-page .cmb-repeatable-group .cmb-group-name { + font-size: 16px; + margin-top: 0; + margin-bottom: 0; +} +.cmb2-options-page .cmb-repeatable-group .cmb-th > .cmb2-metabox-description { + font-weight: 400; + padding-bottom: 0 !important; +} + +/*-------------------------------------------------------------- + * New-Term Page +--------------------------------------------------------------*/ +#addtag .cmb-th { + float: none; + width: auto; + padding: 20px 0 0; +} +#addtag .cmb-td { + padding: 0; +} +#addtag .cmb-th + .cmb-td { + float: none; +} +#addtag select { + max-width: 100%; +} +#addtag .cmb2-metabox { + padding-bottom: 20px; +} +#addtag .cmb-row li label { + display: inline; +} + +/*-------------------------------------------------------------- + * Misc. +--------------------------------------------------------------*/ +#poststuff .cmb-repeatable-group h2 { + margin: 0; +} + +.edit-tags-php .cmb2-metabox-title, +.profile-php .cmb2-metabox-title, +.user-edit-php .cmb2-metabox-title { + font-size: 1.4em; +} + +.cmb2-postbox .cmb-spinner, .cmb2-no-box-wrap .cmb-spinner { + float: left; + display: none; +} + +.cmb-spinner { + display: none; +} +.cmb-spinner.is-active { + display: block; +} + +/*-------------------------------------------------------------- + * Collapsible UI +--------------------------------------------------------------*/ +.cmb2-metabox .cmbhandle { + color: #757575; + float: right; + width: 27px; + height: 30px; + cursor: pointer; + right: -1em; + position: relative; +} +.cmb2-metabox .cmbhandle:before { + content: '\f142'; + right: 12px; + font: normal 20px/1 'dashicons'; + speak: none; + display: inline-block; + padding: 8px 10px; + top: 0; + position: relative; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} +.cmb2-metabox .postbox.closed .cmbhandle:before { + content: '\f140'; +} +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row { + -webkit-appearance: none !important; + background: none !important; + border: none !important; + position: absolute; + left: 0; + top: .5em; + line-height: 1em; + padding: 2px 6px 3px; + opacity: .5; +} +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]) { + cursor: pointer; + color: #a00; + opacity: 1; +} +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]):hover { + color: #f00; +} + +/* + * jQuery UI CSS Framework 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * WordPress Styles adopted from "jQuery UI Datepicker CSS for WordPress" + * https://github.com/stuttter/wp-datepicker-styling + * + */ +* html .cmb2-element.ui-helper-clearfix { + height: 1%; +} + +.cmb2-element.ui-datepicker, .cmb2-element .ui-datepicker { + padding: 0; + margin: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + background-color: #fff; + border: 1px solid #dfdfdf; + border-top: none; + -webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + min-width: 17em; + /* Default Color Scheme */ +} +.cmb2-element.ui-datepicker *, .cmb2-element .ui-datepicker * { + padding: 0; + font-family: "Open Sans", sans-serif; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.cmb2-element.ui-datepicker table, .cmb2-element .ui-datepicker table { + font-size: 13px; + margin: 0; + border: none; + border-collapse: collapse; +} +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, .cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background-image: none; + border: none; + color: #fff; + font-weight: normal; +} +.cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: transparent; + border-color: transparent; + cursor: pointer; +} +.cmb2-element.ui-datepicker .ui-datepicker-title, .cmb2-element .ui-datepicker .ui-datepicker-title { + margin: 0; + padding: 10px 0; + color: #fff; + font-size: 14px; + line-height: 14px; + text-align: center; +} +.cmb2-element.ui-datepicker .ui-datepicker-title select, .cmb2-element .ui-datepicker .ui-datepicker-title select { + margin-top: -8px; + margin-bottom: -8px; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-next, .cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-next { + position: relative; + top: 8px; + height: 34px; + width: 34px; +} +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-next, .cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-next { + border: none; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover, .cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-prev-hover { + left: 0; +} +.cmb2-element.ui-datepicker .ui-datepicker-next, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover, .cmb2-element .ui-datepicker .ui-datepicker-next, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover { + right: 0; +} +.cmb2-element.ui-datepicker .ui-datepicker-next span, +.cmb2-element.ui-datepicker .ui-datepicker-prev span, .cmb2-element .ui-datepicker .ui-datepicker-next span, +.cmb2-element .ui-datepicker .ui-datepicker-prev span { + display: none; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev, .cmb2-element .ui-datepicker .ui-datepicker-prev { + float: left; +} +.cmb2-element.ui-datepicker .ui-datepicker-next, .cmb2-element .ui-datepicker .ui-datepicker-next { + float: right; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.cmb2-element.ui-datepicker .ui-datepicker-next:before, .cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.cmb2-element .ui-datepicker .ui-datepicker-next:before { + font: normal 20px/34px 'dashicons'; + padding-left: 7px; + color: #fff; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: 34px; + height: 34px; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, .cmb2-element .ui-datepicker .ui-datepicker-prev:before { + content: '\f341'; +} +.cmb2-element.ui-datepicker .ui-datepicker-next:before, .cmb2-element .ui-datepicker .ui-datepicker-next:before { + content: '\f345'; +} +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover:before, .cmb2-element .ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover:before { + opacity: 0.7; +} +.cmb2-element.ui-datepicker select.ui-datepicker-month, +.cmb2-element.ui-datepicker select.ui-datepicker-year, .cmb2-element .ui-datepicker select.ui-datepicker-month, +.cmb2-element .ui-datepicker select.ui-datepicker-year { + width: 33%; + background: transparent; + border-color: transparent; + box-shadow: none; + color: #fff; + display: inline-block; +} +.cmb2-element.ui-datepicker select.ui-datepicker-month option, +.cmb2-element.ui-datepicker select.ui-datepicker-year option, .cmb2-element .ui-datepicker select.ui-datepicker-month option, +.cmb2-element .ui-datepicker select.ui-datepicker-year option { + color: #333; +} +.cmb2-element.ui-datepicker thead, .cmb2-element .ui-datepicker thead { + color: #fff; + font-weight: 600; +} +.cmb2-element.ui-datepicker thead th, .cmb2-element .ui-datepicker thead th { + font-weight: normal; +} +.cmb2-element.ui-datepicker th, .cmb2-element .ui-datepicker th { + padding: 10px; +} +.cmb2-element.ui-datepicker td, .cmb2-element .ui-datepicker td { + padding: 0; + border: 1px solid #f4f4f4; +} +.cmb2-element.ui-datepicker td.ui-datepicker-other-month, .cmb2-element .ui-datepicker td.ui-datepicker-other-month { + border: transparent; +} +.cmb2-element.ui-datepicker td.ui-datepicker-week-end, .cmb2-element .ui-datepicker td.ui-datepicker-week-end { + background-color: #f4f4f4; + border: 1px solid #f4f4f4; +} +.cmb2-element.ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today, .cmb2-element .ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today { + -webkit-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); +} +.cmb2-element.ui-datepicker td.ui-datepicker-today, .cmb2-element .ui-datepicker td.ui-datepicker-today { + background-color: #f0f0c0; +} +.cmb2-element.ui-datepicker td.ui-datepicker-current-day, .cmb2-element .ui-datepicker td.ui-datepicker-current-day { + background: #bbdd88; +} +.cmb2-element.ui-datepicker td .ui-state-default, .cmb2-element .ui-datepicker td .ui-state-default { + background: transparent; + border: none; + text-align: center; + text-decoration: none; + width: auto; + display: block; + padding: 5px 10px; + font-weight: normal; + color: #444; +} +.cmb2-element.ui-datepicker td.ui-state-disabled .ui-state-default, .cmb2-element .ui-datepicker td.ui-state-disabled .ui-state-default { + opacity: 0.5; +} +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, .cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} +.cmb2-element.ui-datepicker thead, .cmb2-element .ui-datepicker thead { + background: #32373c; +} +.cmb2-element.ui-datepicker td .ui-state-hover, .cmb2-element.ui-datepicker td .ui-state-active, .cmb2-element .ui-datepicker td .ui-state-hover, .cmb2-element .ui-datepicker td .ui-state-active { + background: #0073aa; + color: #fff; +} +.cmb2-element.ui-datepicker .ui-timepicker-div, .cmb2-element .ui-datepicker .ui-timepicker-div { + font-size: 14px; +} +.cmb2-element.ui-datepicker .ui-timepicker-div dl, .cmb2-element .ui-datepicker .ui-timepicker-div dl { + text-align: left; + padding: 0 .6em; +} +.cmb2-element.ui-datepicker .ui-timepicker-div dl dt, .cmb2-element .ui-datepicker .ui-timepicker-div dl dt { + float: left; + clear: left; + padding: 0 0 0 5px; +} +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd, .cmb2-element .ui-datepicker .ui-timepicker-div dl dd { + margin: 0 10px 10px 40%; +} +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd select, .cmb2-element .ui-datepicker .ui-timepicker-div dl dd select { + width: 100%; +} +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane { + padding: .6em; + text-align: left; +} +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, .cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary { + padding: 0 10px 1px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + margin: 0 .6em .4em .4em; +} + +.admin-color-fresh .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-fresh .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} +.admin-color-fresh .cmb2-element.ui-datepicker thead, .admin-color-fresh .cmb2-element .ui-datepicker thead { + background: #32373c; +} +.admin-color-fresh .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-fresh .cmb2-element .ui-datepicker td .ui-state-hover { + background: #0073aa; + color: #fff; +} + +.admin-color-blue .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-blue .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #52accc; +} +.admin-color-blue .cmb2-element.ui-datepicker thead, .admin-color-blue .cmb2-element .ui-datepicker thead { + background: #4796b3; +} +.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-blue .cmb2-element.ui-datepicker td .ui-state-active, .admin-color-blue .cmb2-element .ui-datepicker td .ui-state-hover, .admin-color-blue .cmb2-element .ui-datepicker td .ui-state-active { + background: #096484; + color: #fff; +} +.admin-color-blue .cmb2-element.ui-datepicker td.ui-datepicker-today, .admin-color-blue .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +.admin-color-coffee .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-coffee .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #59524c; +} +.admin-color-coffee .cmb2-element.ui-datepicker thead, .admin-color-coffee .cmb2-element .ui-datepicker thead { + background: #46403c; +} +.admin-color-coffee .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-coffee .cmb2-element .ui-datepicker td .ui-state-hover { + background: #c7a589; + color: #fff; +} + +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #523f6d; +} +.admin-color-ectoplasm .cmb2-element.ui-datepicker thead, .admin-color-ectoplasm .cmb2-element .ui-datepicker thead { + background: #413256; +} +.admin-color-ectoplasm .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-ectoplasm .cmb2-element .ui-datepicker td .ui-state-hover { + background: #a3b745; + color: #fff; +} + +.admin-color-midnight .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-midnight .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #363b3f; +} +.admin-color-midnight .cmb2-element.ui-datepicker thead, .admin-color-midnight .cmb2-element .ui-datepicker thead { + background: #26292c; +} +.admin-color-midnight .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-midnight .cmb2-element .ui-datepicker td .ui-state-hover { + background: #e14d43; + color: #fff; +} + +.admin-color-ocean .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-ocean .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #738e96; +} +.admin-color-ocean .cmb2-element.ui-datepicker thead, .admin-color-ocean .cmb2-element .ui-datepicker thead { + background: #627c83; +} +.admin-color-ocean .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-ocean .cmb2-element .ui-datepicker td .ui-state-hover { + background: #9ebaa0; + color: #fff; +} + +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, .admin-color-sunrise .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: #cf4944; +} +.admin-color-sunrise .cmb2-element.ui-datepicker th, .admin-color-sunrise .cmb2-element .ui-datepicker th { + border-color: #be3631; + background: #be3631; +} +.admin-color-sunrise .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-sunrise .cmb2-element .ui-datepicker td .ui-state-hover { + background: #dd823b; + color: #fff; +} + +.admin-color-light .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-light .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #e5e5e5; +} +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-year, .admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-year { + color: #555; +} +.admin-color-light .cmb2-element.ui-datepicker thead, .admin-color-light .cmb2-element .ui-datepicker thead { + background: #888; +} +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-next:before, .admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element .ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-next:before { + color: #555; +} +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-light .cmb2-element.ui-datepicker td .ui-state-active, .admin-color-light .cmb2-element .ui-datepicker td .ui-state-hover, .admin-color-light .cmb2-element .ui-datepicker td .ui-state-active { + background: #ccc; +} +.admin-color-light .cmb2-element.ui-datepicker td.ui-datepicker-today, .admin-color-light .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #56b274; +} +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker thead, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker thead { + background: #36533f; +} +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker td .ui-state-hover { + background: #446950; + color: #fff; +} + +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #4ca26a; +} +.admin-color-bbp-mint .cmb2-element.ui-datepicker thead, .admin-color-bbp-mint .cmb2-element .ui-datepicker thead { + background: #4f6d59; +} +.admin-color-bbp-mint .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-bbp-mint .cmb2-element .ui-datepicker td .ui-state-hover { + background: #5fb37c; + color: #fff; +} diff --git a/assets/font-awesome.min.css b/assets/font-awesome.min.css new file mode 100755 index 00000000..640a2fde --- /dev/null +++ b/assets/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('fonts/fontawesome-webfont.eot?v=4.6.3');src:url('fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/assets/hint.min.css b/assets/hint.min.css new file mode 100755 index 00000000..76edc4e8 --- /dev/null +++ b/assets/hint.min.css @@ -0,0 +1,5 @@ +/*! Hint.css - v2.6.0 - 2019-04-27 +* http://kushagragour.in/lab/hint/ +* Copyright (c) 2019 Kushagra Gour */ + +[class*=hint--]{position:relative;display:inline-block}[class*=hint--]:after,[class*=hint--]:before{position:absolute;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;-webkit-transition:.3s ease;-moz-transition:.3s ease;transition:.3s ease;-webkit-transition-delay:0s;-moz-transition-delay:0s;transition-delay:0s}[class*=hint--]:hover:after,[class*=hint--]:hover:before{visibility:visible;opacity:1;-webkit-transition-delay:.1s;-moz-transition-delay:.1s;transition-delay:.1s}[class*=hint--]:before{content:'';position:absolute;background:0 0;border:6px solid transparent;z-index:1000001}[class*=hint--]:after{background:#383838;color:#fff;padding:8px 10px;font-size:12px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:12px;white-space:nowrap;text-shadow:0 -1px 0 #000;box-shadow:4px 4px 8px rgba(0,0,0,.3)}[class*=hint--][aria-label]:after{content:attr(aria-label)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[aria-label='']:after,[aria-label='']:before,[data-hint='']:after,[data-hint='']:before{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#383838}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#383838}.hint--top:after,.hint--top:before{bottom:100%;left:50%}.hint--top:before{margin-bottom:-11px;left:calc(50% - 6px)}.hint--top:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translateX(-50%)}.hint--top:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}.hint--bottom:after,.hint--bottom:before{top:100%;left:50%}.hint--bottom:before{margin-top:-11px;left:calc(50% - 6px)}.hint--bottom:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translateX(-50%)}.hint--bottom:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}.hint--right:before{border-right-color:#383838;margin-left:-11px;margin-bottom:-6px}.hint--right:after{margin-bottom:-14px}.hint--right:after,.hint--right:before{left:100%;bottom:50%}.hint--right:hover:after,.hint--right:hover:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)}.hint--left:before{border-left-color:#383838;margin-right:-11px;margin-bottom:-6px}.hint--left:after{margin-bottom:-14px}.hint--left:after,.hint--left:before{right:100%;bottom:50%}.hint--left:hover:after,.hint--left:hover:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--top-left:after,.hint--top-left:before{bottom:100%;left:50%}.hint--top-left:before{margin-bottom:-11px;left:calc(50% - 6px)}.hint--top-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translateX(-100%);margin-left:12px}.hint--top-left:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--top-left:hover:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translateX(-100%) translateY(-8px)}.hint--top-right:after,.hint--top-right:before{bottom:100%;left:50%}.hint--top-right:before{margin-bottom:-11px;left:calc(50% - 6px)}.hint--top-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translateX(0);margin-left:-12px}.hint--top-right:hover:after,.hint--top-right:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--bottom-left:after,.hint--bottom-left:before{top:100%;left:50%}.hint--bottom-left:before{margin-top:-11px;left:calc(50% - 6px)}.hint--bottom-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translateX(-100%);margin-left:12px}.hint--bottom-left:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--bottom-left:hover:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translateX(-100%) translateY(8px)}.hint--bottom-right:after,.hint--bottom-right:before{top:100%;left:50%}.hint--bottom-right:before{margin-top:-11px;left:calc(50% - 6px)}.hint--bottom-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translateX(0);margin-left:-12px}.hint--bottom-right:hover:after,.hint--bottom-right:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--large:after,.hint--medium:after,.hint--small:after{white-space:normal;line-height:1.4em;word-wrap:break-word}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}.hint--error:after{background-color:#b34e4d;text-shadow:0 -1px 0 #592726}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{background-color:#c09854;text-shadow:0 -1px 0 #6c5328}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{background-color:#3986ac;text-shadow:0 -1px 0 #1a3c4d}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{background-color:#458746;text-shadow:0 -1px 0 #1a321a}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--top:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}.hint--always.hint--top-left:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--top-left:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translateX(-100%) translateY(-8px)}.hint--always.hint--top-right:after,.hint--always.hint--top-right:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--bottom:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--bottom:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}.hint--always.hint--bottom-left:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--bottom-left:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translateX(-100%) translateY(8px)}.hint--always.hint--bottom-right:after,.hint--always.hint--bottom-right:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--left:after,.hint--always.hint--left:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--always.hint--right:after,.hint--always.hint--right:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:after,.hint--no-animate:before{-webkit-transition-duration:0s;-moz-transition-duration:0s;transition-duration:0s}.hint--bounce:after,.hint--bounce:before{-webkit-transition:opacity .3s ease,visibility .3s ease,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s ease,visibility .3s ease,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s ease,visibility .3s ease,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:after,.hint--no-shadow:before{text-shadow:initial;box-shadow:initial} \ No newline at end of file diff --git a/assets/images/1.png b/assets/images/1.png new file mode 100755 index 0000000000000000000000000000000000000000..fe0b95919581c9b69576e39c149ef9af1d465507 GIT binary patch literal 2669 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 L752kRHq`zD=dvt= literal 0 HcmV?d00001 diff --git a/assets/images/13.png b/assets/images/13.png new file mode 100755 index 0000000000000000000000000000000000000000..6792b775f4e65c34137e5b41989ce491fbddc24e GIT binary patch literal 3392 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 literal 0 HcmV?d00001 diff --git a/assets/images/14.png b/assets/images/14.png new file mode 100755 index 0000000000000000000000000000000000000000..2e809f03c3c04a46359248be0082b6560b56c17c GIT binary patch literal 1814 zcmbVNc~BE)6psOsqas?6;z8G-tstAtu}MfY0+IkhZh}MxDVyB|R!BA`3k1drVnIa( zkz+uts9>cy9%xmpfd++z& z?Dp``fSI=QY#9v3Ohuq9l3v5jx3v}hES&x17`?bqaupRtCQ=!Q9%uMsq#6el8YBsi z#1SlWLp#2L!LUdtlqyOU5-dSU4I44ru#FlWjb<=bcpG&Hnu1e+8c!m$Qr6=OmskLS zNm((15Kf5B4^Jinv-EgWR;UuqN6El#!9a&fv32eGH_<>Iof1kXpd(5mA$Al$1p?eUpMl7ZUQ;vDPqID7s{j5z#?hHV4vZ%y~^%8>mS9 zUmEYUHYhW7I24H+$TU4l>yhX-1*U8F{y=6!nvEn(Ptc+usWK8x)8JZ4A(OJ`FKmp! zBx0UG3=1(em?#npL4*hMK?D=2LA5{#qZo|iIIY#BpLgMX#XRmR5zLdxc|tB%F7)My zxc&l>Kp+-~U|1%a!YZ@|3elqYRBVEdJ&EPM7c248;|N9Sl_Z%u)dk_nBt;sMNgd$l zH=#PPG=|V(WQM`rEYq8;Ww@S5$1#6BsR1VHEFs>(0rv8OVVIAAVu64U@-SEgiiKh? zkc;qPHI8Fy7{OVScJJP&;I|}sS?J(h5dV=)ysFXc^;XzNJ zP$BbG8han^lO{VxIOYvpi9Q`6nolkJ&M}ve=fwTXOH)rzW z9W3vKE!_0_d;!!t8sE)-`4@AgwKsQq#Oa8zr-m~7t0U*0w?+qKcS?*W0~satADZOF zk2@}xxSzOU`qnvKU6fWir~Zkvb*+sN?ECVUiz~+$x^6D2m~(W`==$|7H(h>seZ4ep zo&RBmQ$oA9#p^TWEf(qblH9PN#_byxywvTPZ~Arg>)be9&8SwpJ4A!auW%=hfD%j=4UBx^!NWdzgS5E)FJS1`3ud zFGr0oyNWgyQ_~~ejEw%h{AF3lESmw)%?En)Rpi#h*itw!#a@|X8&2~%z%1>)w#Z^l z>h6A`FO{8TQ@v#%Xhb$PxX75-+TeP*>u{;A2sPHmE1Eb&+cz;-f6Im7u?{&^bKmk} zt80qF;-d#u;3dy_U2DAtf}6sp)jJMu%(f~R4`@5KRX9Jb+RbP0P-pMM_O<*R33Hos zamxT8sG_l$LSNoYKu>@?opqOx0D#*r?4@#7z=&z7v)Ts>Ga>N+FFUelau zH2}H!+=;6dhZ_zsl{p^M>*!2_(|Y4%c2!k_9c>+~Pk+}oMz?9P<09vEd0k!$Qs!?A z2(sx~(CT)q{3pApp8TpEbx?EijV8z3TMpT#+e5pab%!Y!H8Y>gxY@s;QhvtTr{T12 z|IZb!ySOj!y8Dzd_Z2DbW*2Bx3(xeF>{8DybuWt}gb&a@#{RR5E?CFTD%!AYXgf3d zVM^hWjaJP>@8j6tn$O>N56GeZe(EZU&5Bac;wp2vc6Nl|sBdq@tHzP#2ghoewdVw5 z#nmGjoHc+A03M3p@?3l^v2!Q@xAf||cc>n0SuyK_{1cn@o_e-}`3Ye^4w@Lr-qqc~ SgX#Ose=3DMRCat-Lhe5X1Fl{G literal 0 HcmV?d00001 diff --git a/assets/images/15.png b/assets/images/15.png new file mode 100755 index 0000000000000000000000000000000000000000..b8684092b853cc16cf3aeef8d1076cf988d988a0 GIT binary patch literal 2688 zcmbVOX;f3!7DnMgAcBFQP(&IplPDRrysAwHX$c02mZkj|0ppn=hq6{)A z^Hi}sse*OJD2Q5cLIo5DY)eD|;b8?VB2{{^+V_5R^~bww-Fx;q``g3W``c^XjIa%fUcOLrBb95Q7-b?~4jQZyLIMyIAmPV?;UHg_ z^!0Ucg@J)#f;b{l85zuDL_-oBe-?vNNo26Kfx!xvO2&_l1Cz>+)|WCDXs z!hCuFIGS7-!wBd2eu@R}n1D#Blrix5#Kc5gq6ZF=$Kr`}Ivr0S;YlPcjKC_Aq)NUD zD^)mt_P_xZ(Q>g&DTbt&S&w`Hv|Y&r;7tF#ftE;3bmT zdwoPJl;Pli)A(DoA|go!;=@4&v|Szz_anyfvoTz|e-1PYgtK9U%EfR~`0*Sldb!kD?Q5a((iscxbfzQ3=y^ij){L+FLP|{N+Gd%By(yTz^|Pq!%OoZeL)lL_4H? zt(}`++36#4C8K|G+Hq#5@;Zy;!?W`5FZWBouf349uT;m23~*BaoWlkh$}BD*Y%)wX znzkXn8!u?|Fnxvq^^f_j$2bBVtcT{+PNH#amrLi<8rT0|UNfG>krozexmx)qFYltj zUi%#E+bN-Cxh~|KA+5Om!r+V5XFJCZu>D+6TR^>Ri{H6?ll1Gmbq$F7L+v*e{E(xU zbLYh77q^@Ty4C@&wDQ7rMWx5|J8)=Eb61J>>5bfm5##mlU1m`OCr+*T&-Ci4*9&Fc z*jpQW#wf;(yYS}G)I~+9$cOROx^VI# zYS8mX-FNIXvNSe?7+Wo%)~T5YYi+O5YA zbsW(77x_O#HR{0BuaYv?Bk~cU{r;?aqYm_q_ct{rtxs%kLmI=5$%Br&@BOmI;X*)M z?u())D^qWla*Kj(_Z-SHA-t0e$8JZ_ziG5JQ=%Q5ZY|NVRTW{}I_?a`KI!6z4VxSt z*iHKzjqp?R_=|3AF$M&pyla*(W6N8X^GFldP76;4Rb**h4$~_VGW?QyGmrZ=%{g3q zqf5*54{h^UJp=yGQyg}Mp}wQIQ7nW z@5onDz%|Cq@MY=VFxIe3A(D@16mNC1s(u8NV_2mK}$Vr0@`57X0j;$$GELAcrd_dvgu zq>DtI#y1&q?QSUyIz9iaFswrI{(EX)x+!#SX)L=1r<$`W?dhpxo3XMggF}g1E#92m zXjtDD%NVokLwnAQC_38SWD%k!-xjo0AAO^T2V=v6x?QXwc)iO++r; z@4>f~{65(f=IbI%EKmEPN#+=xU&Gg@^$Iin zY03ThlfJ%nmD}g0@Z=#iOW8KLgi$otxA)NPJN3f{7@S&IML+nPNhd9-zclSxrM7`N z_TH&;t;5u^Yskuv)KTNSeR@z1j%CiHHqj{AyVE{DrgZdq-7AZ!*|jX>3t`rl|IsgDF=Fj)K?H*hBMt8=NV-Yyq2X&9;WG<{pz+ZHIiqY z@0q|gFJ<2@F3w9oByh*fBY-Juvyqps~z4mZ_pL*Zf>c#CEb+rn3VoGay{K~2) z>8FE-vNq!prT|`Z>Rmxd`BtTgE_X4#8*jb!oGE3ugns@*cKI9L!sEO4jy>3?K42bG z5y4<0CXmi{<2DSzSFQMjy8@UqT`HI#Fin;PM*UVZ%`u*%X$o~h-rEUmIPl#xCvy}H zi7F~OlI`6oA1`lid@rMrkWF} z2QLQB?6X;pa%c&A?%e2!ENm)nxdioLM+WWddsRr!m(wo*^uyix;mIQ5oohdUb0VIn~jy!(uS~-21dx6Nqzr zcxK6HYUOTLq4<=3m-OhbqTv}g)#?iqZ3vz7`y5Mz)tdoAo_<PsGMrF9?jsL Qnf)gW;D&IHdq?g518TBjH~;_u literal 0 HcmV?d00001 diff --git a/assets/images/16.png b/assets/images/16.png new file mode 100755 index 0000000000000000000000000000000000000000..128cd55a3644e7cafd8d8affb5a54cdd13284981 GIT binary patch literal 2708 zcmbVOX;c&E8V&)GAPNMOP1_+Xp+NSHgdGBc62cN&6hS7*5F#WKlh8zDDG(Q|in%CA zRlpq!3e{f4jUXr@D#%jhR8eq2aRqPDvb7zk_TC>o{c-1<`QGpQ=6&AvdC!@mnCPYR z%^l5ADAfGO2yPrAV`g46Q)Jy?{q6)J9MoY6>UcO+tpSw~Dp(8)As|u)N}xCh6t7=* z9r8n=jK7u&64VL2D2@o05y2T9qE@Cr&?uB&pjH8j(jheJ>%ZQoDb4G^2<_!{IBXNK?QJE-cEFL2`8@*B^&` zA&RA94x7qg)0tu+A(h2u5q=OLdBVPRf){le)MVcYY|B&a?6~f4w?O&sS9R3<6 zNRCX95*d{aLXrW6GW{`<8!XWN{3AK>qiI zijv%xil}3>p8gA`8UFZjs^-o8bN>Gs3+Q00-e!20M>&?h(3a&}xU7zD*hnrR=kJtk zI_hc`X!RWiwr;HUB2Fw_wB?+cUvYh@;#lnHzsfK*MOR#sO-g&fxr4ZMp-zJygS}R6 zucDf@A?0np+=lXq41XS=XO(tuz}Qt;t+~HUTdWX!ki&G^Asg0xFE7k;%+t1js6Eji z78etK8|NDBzZl&x-wpwrEeSn-d~9hIa7wqJj=HYxd;I;5k`_VmgW%?=1L4UL1-?zU zg2fa`e0kHHgZF!M(MM|5V0|y^UFPj+a`2JjU&VcghU^-I<@&k4olOteN2g5AG>Znd zLTH;k#U+N_6}OexYuWDP;XYmajc@#HOT`sReYr=z!?OIV=RF5Z-3QUk#OgZR{v-Wy zIn1%s;RCqlOA6!8@CS9;=eKk$(}ag1&BkUKZ4=s|4JNVr)h{Hwn;5!B!*?34EXV@alI*1jzy<(fA^MKe{k;SCG6Oo zy{UeF=G}rV_UFY1c+=lMPMQ;o)s{zYY;4$_G3s%;=(di2t%vyjc=3g<-4Sn1r1JG! z>z#(n8}OdfwKfUvrcX3E?XNHEMPYUmyPWXdyflVs#b>lfYQ&SSjr>dH*CJ9VwbPyswEF;HxF49OITYYhqSthmG}{_ z5_9i&+8^&6x*1M6`P%O3r6=|F#oE@S*9V?)>|3JmrWeNqzD$j>%=lqB+36(iCXW6H zEZ0drHlQIJqpt0E%-w-p=Ha?cXRVCa^;}74a09aFDbp{uev6I8rloxKQ?qZ1+p)d9 zlW3P+iO!~ZHsmVOMnb}q_%++pPQ<<_Tgcbl+75$~QKuS8Tk)age$1dsmD8IITND8x z{as#g8Pq9+7mVH5N}4i?k;lE|Cl1yhbGc=Iww;?JbLf>M8fwEtt9tfdpU^WCEz8}e z>7P}bc;+vw!dBZ_>{!`gKX_0XVuZ*8Y%5~N}6C|rQ6QJ z3a>D=Zpph_k0ws*>M)jjAAB?P9cs=}XY}JXC0DY~?7FIFwm?V@k5{u~xz@5sq)|!opXV^>@P0cXGH#5R$M<-_Px4 z{km&!;p0jjoZUX{+Pxy+spnN=%`Aruwg(Q>m=$9?uy^NCFg}leHhTPf$KZyp{i&jC zPc@Iq-_z@By@RRg>#aN4;L)wYdDoB|pNKYH6l`OuuC}NQ`QJz1nWJDilO-&{(&w_;P7(Az!R@nGYk=A@&V%f+I}6%FkpK3DJE ze*ZMcP^-md>RzV2)_j|t3*WfWdUByor!NayRhS<0Y;OMoSiE7DCHHlUE}z-AI`3LX z7H8hw!0?=xSAE({X$Ap@VfM?7W%MCZleJHX( zqcbZbObYe9bDOgfH$=&wGrYi?$JuK)^f zHrMlWSAN_2JivOP8yRoX8nWuWXO2^{H(!ft*wMZh93-!&4FoBYmDtA3!8pw;o;g@D9s#F}u6Tfks8bO zZUd>*Q+rP5OgPIUnl?AoExqw_()rEK%7Q>?w}sDdoxFt=vckYQmgw=S!0-W5BeFah j?gS6Jjyxm(W|M+C9&yGt#6dJX^Pd5I7EXj9Mv`=d{P+`n+;D*m#z+pu~ zAKZFs2q{Ds049o7XUM^bjL=9yMv{Ob#QCnou23;y0}@cl!>T07QUz1xgL`k63GZjb zL>%_LiZaOu_h(SiAzW+#BnPon0u3)9(dbw@gWyS}(*e2%mQ3=b5=j&yg@h+lm;i|h zkg*>w9PCXljAw?k0zdeIPd>OrrBcQu64TPs2x$}oBu^lEG8haZiA*Gu@vsJ7kuFv8 zRCuXk@ka|RP$7_uWJ(bv#m-pd@u5_u4-Ss>&lDuGkdVI&OBEjq1(%Gd;>n1f1QJmq znaS(Dwn7;W{x^)j)mB8N%Rpi{sDM)C0+^5Z#UH_N?f%)(j3OKjGfXamN#P~4AVI1G zlq!Q*J~;RdK`0V38DuI0pb7c-cshfI=aB&lo+qU9@q8)`5C{Pf1Yxc|*!erWAA<@5 z84MPiO!M?))BH$u&p;}jN`>VBz@mS|21yl4o>TyS^euvYf53YEBbFH;2YE_J9tlCo zAG?5?2q_^&A|%5G1iWV*>%Lwj6+&r>r86}BnKcWPi#CJ8KshAAzOOS=^fxg8US0qI zPrg#aB7r{jh9^ib3Op~m+65Qa+SVnSm)THjEdZNi=s?`gXcVhJ6Um}|i9_4Zx{RAth3eCL zszu%-2dh(dl@Bj*gPye9yEE80*825uT3JEo!<45L4;zHxoy;i6yc67orQEagFfQ#B*X$*`+xU+z9ChN~lC685<1` ztl}~jnfcE0HUC$c`~@_gKHkZf3TU&j&W6UOM}{F^CdT@#x<>8P={R_rZuJ9jHrBLYZK>%d-{W!!N;PLo#m4pZ z+PR~1R@_6SP}H5ooC_tYO!cqow#oC-2*L(5-nb*y#=h8LRvae^d$Sf8Z2eS=eiv+? z<<{{q_Vus9D*PJH-Rl-Z!lrJ=OuRFOp-h3}tOE}eXlSg7y4n6Jd$Z}j z*ja7*etEBar~vRdGiG7gUn)ze-gG!AdGh$_R$0dJ+arzD+bN?CF?Jnwj~VCJSI2~( z%sK*dU~%onVR^T^L#btM{n>MIB_VFq9~pB_=ukJFY z*=dVjI9@FNBm3#OIBr4PF9|Vk46eQoW@l2$Cfg2?bY0xr`~8v64>UMam!mei|B>xP z%jAlPMV8-rYMOZidLTI=pm1=N4mD{^)jYFW54 zph;GW>8n1kR75R}_9n5<-MqK=_v)dlS;JP;gk<^JirLdGrpkoZxVE)oz#p_UJs}$brJU*)gwLb%?--Oow1#_~6E% zUn34jnPp@nlVhH@h9qL;?M>Hj1B3B%u?pT;KBD}n({%HStK|vbZo72G-=25D3)6KiY<^}~ zp~uSy#!UCEF5gR{4!Lw`9&C=XyVKD~+x7CRMdh2pi(gY-*!XZZG*1;>esx`I`Szec zGNx8dM#?w*I6H@joW8Qr1l{Ty1U{&2Z@ z7k6r2wE;aMmb^{+Le2U77U2ZCrf0#u!2a@1jS=zq{DgA~rysq~`3o0tMM2rb`*h>!XfB(Z5#13UO_{Zh^2g6EflK=n! literal 0 HcmV?d00001 diff --git a/assets/images/18.png b/assets/images/18.png new file mode 100755 index 0000000000000000000000000000000000000000..defbb7b97f9568a3f971169201bd687edde9c434 GIT binary patch literal 1867 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 UZ@Cv6Wcv>(!lL9yLQ>ZK11o>4zyJUM literal 0 HcmV?d00001 diff --git a/assets/images/2.png b/assets/images/2.png new file mode 100755 index 0000000000000000000000000000000000000000..9551de869ea3566b2297a80447ce39a12a7753dd GIT binary patch literal 2796 zcmbVOdpMN&9(Uw6A(xO#G7XAl=AHX6&BQQ9Qsxn;=?}#1es86s~{`Lg{=~3>XZuxXHVJ z0ZCd~OA>jEFiBWo0Ffi$BUpBUX98Er=9lww@vHN>Ri$IMU;uaB4lN44wRlt$*!2}7N zN``4p5L_OY=!wR8V)0xyJeuH%hqKUF44lO!u;FYR9?RikK@imB>a(4{;!_A7RGJSO zN%ceHQ7At=1xY~Ba0DFA6Gy;ese~_FdV*NOO5lKBeDgHEKXFmCzvU8rMIcKe5HSRT z_%Bru6f2Mj#IXV))Ytc8)}bz;yacWwN$k3qrcbw~f+Aib$fbz{eCWqG6M2830qfy` z#bPlmxF-&Wfup%t0^Aet=>bQvFjzJSa@klG2>Zuq`Ld;{$i?Z` zR?sZIHWQej=^&A&RqjW7zt_^zH=#5y$%5$a|ED~BD@|3;Q}NEXE? z$5XD>&?`$@itYta@7x2Q9md`x1wOs%n)-0YWr2|b48ghca~b^l=Gj@ z?=KWI{+RnBF)`_INy%I;u&*iLEM{!s<)34JjD5&g$Vhd>ro!w%)fr0z#ESdQ)@7ox z)Doo>TQ z$LEoqJVn<}w_aGhwd$S8?KrCVH6A!in5Zrrc@Q-hZ?!)j0`b^z3Pb38NIxwzR9jvnuW@#HSJX^uDd6`d5~&m zZIKn{1h))WKK0vcsbcPFjx|mDyzeb^3cHE+P`kgA?5O?RuJsMBXstr+=fi$^$or3( zqNvP?j3@UtrFBP`$!E@oBkA?U*B&cE)4JE2$?dPT^IiY_r+ue&=MV|;-4q?a#_IbV zZ^WkB zZt-=h$ckJYHjt5Mb)Ut-kgVUTru_{M{|-YddWoF`i{B{AtGvH=2nq zVjFE*{EsyLIHcBcFTx{#)V+}6JG#Zs%R4JGjQy?SEaTPr(xX7-0gRlpVct){(hfM= zXQ4C?Fzq#)GC<3%EBY!6rZ$WED2l6!P4I4x{X>4|s=U3thWvTsN2lNynL?}P``pe9 z)%7v{%$}6oY}{GsOViGsw#oY&4Nt9>Wwh4b>_N&&qr3W?qJ;qmOS%h$n{yxmmaI@U zC(6sELhnJq4WFKD>)i#bvuVdai(3p8G$2&w7=B_f- zcGC%MxXcu;CadWqz;Tzmr=^qrZ{!{FsWTI^vf^?7f*0+DK+VZ(O*YL-0>_&bUBh+J z7SciQ2c+l86EaVVu*f^0>r9hzHesk@Qg%3nvHPOO>MEW5T@T)8jJq8JN1-{jzHW8TZP%7@?M^HO(FFFvlbEuOl{0_(F(V^ zeQu@Xc%k!pA7PFEExA$eT)d-O6RJw*%ET@o+dV+f#Ra1cxy@7GRabPT7E)o*#vp3FY8JR@)!Mh+d^ zI*pQVopbGUCQU}4d?QESkrGg|Pk8mPjb;7HM>(!t&HKm7mEna_mA{*0Hk_Dz$-@p6 zdPCiFY|{RO+xwUcb)^L`n}&jn1J)2KYar;x7^S4QsT=>e$&x55S;1i6*zY*?^;ab$-R`OrAXyEYvD(j}PT-jW1lj{fYW`Ix4mrKfzkqnfquV#XJMN&Qev? zY9IA?tw^jl`6c0D%advcw~E_I=_=HXeDCX!sp*qvq&sDIb`=Nf&nn)Vae^>Ss@$V0@-~@L3+b9RS=orsd;I=_PIkwtAHK=OO{T9gxLTF0I2tp!WbMF+#pLO-e`r?Y*TJLQ@E zCFRCK2tC@lx3;Z@xMp1iv|I_VV%iJ@5gM~ek<3T(r#l+_rm0Miz`^$P7B~!vj)W*D zS9{H4EH6?@Q~Uo+*3{Jna?n_EYQ!q@DzCwl5>RR1Mc_v@8;#wQzhg2E;j72@uMI5@ zh%pK3Aspge9$)1G9>R?;^eBjwD|u?_uEXZ^NCXY2i44$W&i*H literal 0 HcmV?d00001 diff --git a/assets/images/3.png b/assets/images/3.png new file mode 100755 index 0000000000000000000000000000000000000000..6eeb89bb3ef37fbb921b40f3a5ef296a544824f3 GIT binary patch literal 3953 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 B$?X6D literal 0 HcmV?d00001 diff --git a/assets/images/4.png b/assets/images/4.png new file mode 100755 index 0000000000000000000000000000000000000000..870f66b73131b0558c88f7192ce58fe6795d912a GIT binary patch literal 3549 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

            (!ToJb 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 literal 0 HcmV?d00001 diff --git a/assets/images/7.png b/assets/images/7.png new file mode 100755 index 0000000000000000000000000000000000000000..48c6ae0f363b27e6910117cef589a623b70b2f27 GIT binary patch literal 2555 zcmbVOcT`h(77j_I2v`Er6bYdSEFpyy5)+Dq61ors6@i4jkN_zp0RlP*j7SkgdJ|zC zWpqVssLV)-iik2U3RYwwQid4?1YE@xkqruNIiC4r-#PEyU%B5c-@W&omlNRUp}pE@ zH3$UKrhC!?l`>%IRaaGh53ip+s}zP(w@_)2kRwfEiUE)dTgU?7bUrg02n3kylz~yXKHDWL*GtDJ1pKp# zG?t3^5>%*f0Nhn52HK@&0Vcp@H8!V_^g8gT_n7f7T`K@_m!o2T@>jCJ`_EZJ2IFr`84E^RP%4ygg(A4C>*uP&twMMLwlGOzy;P8sHJB4kLFo9Qg-Ch^6Mxl zH(!Sd5GW@|tQ-~bk*_%hW$8$bmFh(Qb3Q#B4R2{dfK{F=L0CvdeR&zkua0a+B!5U!|yft;p z>%EoTZ1S7IroPIp62I9oq-3bN<#o;E;NB@8bEEvKy58Qtjn_GrB7OAWXxm41TeUKk zMT?m8V)kTRTb((3-ZHW@-s3QIGsInG4z#%Dt^NUv>2SdqUjRv6N)iANTM;LJ%>|ssA>ymZ|uNNI|NxJ9mjF!o>z_3@4h}+EC1fP)@}G=82miq zwnm=l`C5vWZBs@zSE1t^PteG7fYH1RJs(4eJ6%qca>6T-;5~(>+yXb=*V?3*xhIFc zpZ2mq<8#_5-o6xWVY9Az*}ZuD#j0Ds?Y zsn`{1QZNpVb!L^qWX+4uYewJrMXsL46hwRX>vV1@8zrT)ih5M$i`Us2Iou#8ZCx0x z&h)7h?kuv6DCvAVqFEy^Pt#1VN}HUol+G76D}0+FGAhmA)n}jHv`@ys1-OPTI90Rv zzDap_S)PKoH`QP^z!YYm(1vQ|<|JZr58_J2LOs^Ta zcRRNwwnanuNS+p`9mX*xp3%rECdr|%-fvP!EzlL7!68utbGhz=^-$H~OKINC?KeAK z2C-EqxfbZlVL;0+pwJ`z(SXx4*(H`yW^tDl%nD&2xjSuAp6^^abJynB>UgKqmZu=~ zV4eIBhMjex&-PSS%SCPL1FyUF!3$~|o~cimI-`d`h52XrtL;j= z*SWiIw)B;yE$U^=)LhWkeY}w!`xJSgxuT0r^Jx$ClARzCpsnfWk{gc-m=Mv?S5U8h zF=_5v+FU~qp*nQN-|VtYWp-yGq!t{TAEG6-z=vf#{OMs^&(lv@3e$3pylIt%VYk!W zm-Nf`33)GgdJiCUeP2fI!4qvl(q8*^(0<5}ia)r#*Ucbi7#gBMx!a-F+SPwqf7r2n zOl|VA6O!a^7Q0D&u+z-ek?^h*KjhA{hCGsyf{zo)2qy#@_l$DwaTEj#U#z6 zBB*oA-Q%}@1V>||8xjlU$vdW>`s&zu_l7qG>j&E-Sg zg*K1e8etB#mKK^H^{N!!Z2h21xfSET^55Eaiua@DAGjPt{h)cnzO?h8F|5no3o1F4zfc~Mz(CuG`qVj%g&ds}zac2ZA7U+hUSY>T@ZSoGN3F@X?q!(9J|^W40}Vyl{ow#-tZ0mZ1o z%KtY|$C=LEWx=<%SH@Jea5+dd9Zo#xuQo2VlyMDP=1Um8Z{KA0fD8DRTDU(LP`pri zx9dP1>0{geQ>9lTO0wHB_uRbbQ#l(@Ey^FOz7qet^&Z}MS8mtu&2Ng#?mitdg@rH+ zw>)XNVe71(YWUt**1bx5;^aZwNSoQ)@F|OWRQsG5b1mUYcH&(JmRa%G`iYzgR>u(U za%-mL&{*!;30ziz!&>*p>vKlo5XRr&k6eQiZSt)Rwu4KZEdn$c;NX(~kq0y7+|6R9 zQ;>Nd^iydTbhCk<_R+E|Xn&8c%$z!r-BglCzjp_Zq_zf*_eO16TtHH?7=B%w-Z739 zolc+fSubm!;q-TS;6{02M@*(Zp}8ZT740__8;et-Pe&BeUky_bQ{Isp=M%@e`sIrs crrSXf(3)AiRu<=pWa)Q|?&e2p+!mSfFa3xcVE_OC literal 0 HcmV?d00001 diff --git a/assets/images/8.png b/assets/images/8.png new file mode 100755 index 0000000000000000000000000000000000000000..8ba6e15e69a28e93e484e7a3654872c4264bd47b GIT binary patch literal 1981 zcmbVNdr;GM9Pimt6pQc5JJ_aCUNc zqEIN#VWEl$at^nDqiN*0ZDL;~Ik^$a7$Oo|L!`ktN(n+R4GM%A-~==Rg^~2+%cw7f zLQU02#Sk&7#WF2s;J|hnj>TXi(G-erfW-uB6Hx-tpb2`TAM5wiXIOw9@nfk)DxS(D zM|Jwp3>=NjSQ4epNYqLZR)9a?Ymt!z29$sSiy_HqmRbB*L%cF_Z9nF+fFThg(U0}s zs2Ei^AjfbN5OKt8El&&qkd(t0K@bSd2LwF6h|3dlg*>)ECPR2!jGOYjM4a z&|^lx&IoI;6vB^1TKe7vgGr_OKx{M*2Z{_C*8-ckd=8ImFxdSXk~R|&=s#wBRN5Ss zZbG>cs2NMawPZfl%p3uevHP?lyC7+eY$>iMlL99xFl~wfH4x1Q8Jj8%RTE0g0WOkj8vh9!+uLAVYhFtZLb0do0J)&VcI z-iTmn=DGGXz4uyy;`&q+3BfS~FcfE*{v$Sk5(x-`LYOTTiG*wc0zz!5SSn%jVIinN zQA7j6C~Fvx{NMO-Nu#*-V)<9`j2w{_XR*1si&5&}Qsq>oY;)CdV`itNm=P|_jR!0pej<^T9EgyWq<5XvxK|4u667xqz0%wq5f+F<|l=i=jEHJ z%!~MzAA9qb=Y-0s;fEP2dQeVL=5dVKqw82ZxFz!rpRS7ra{?XzqpxKS6sXp{CAr^F(j^RawM zbOFs%5J9V;K5tCF@-nWu)=3|KqA$~Pbjd6|?fUBl#kI{owq6EXMt<&?v{Ui)%2 z`2L}F`GevBlG#KX4S4PF%&bnc~jN zre0<>^#suO_O-m8PvrKVJs97)bA9)3U4a5@+LN>0GB=6gZ9V7Yt_by&1CJ)VkLT}Y zhWZTDGdj%=7S5=c8PL7>YynRaeo-tQ||z=_Y{RrRIxcpFvi*f5IXkU^v^M{pxmn5M z`Qdc%V&F7&YU>-vj6dFmrTb3pOcCK%^ww=}E)1NJX=gC^6h18PZ^7R!R8|%!poGvj zwln!nAzrp@6f4iHe^rs)cB8e_Cwl#x3$G=KC4)6cr+VH4DD0-Ibhn4P(l)qC*`c-7 aQm7PYR8N8_Q{-&_p@u1!D5`?vzxW#@B>|5B literal 0 HcmV?d00001 diff --git a/assets/images/9.png b/assets/images/9.png new file mode 100755 index 0000000000000000000000000000000000000000..0d69dfda9c4ae62d3a73f4d1afc8d17cdd86dd06 GIT binary patch literal 2649 zcmbVOc{r478y{mUV<}6E$QUYORzjC)+865-q+`D5QuH zg;I!C5?Umsvb7h^*Ew_2sc(qB?~ktY$M;^>`##(KyYJs~Z`YgUztK}i%UBBp0_k{r zQ38~s|LnU+L;2mibo#7vSShB4i39mDVhK$MfLxh;Iso6 zP?$K(&zHpDa}l&z8HAK8P@+K~M`x*k#)t#NP&yFH<~hMWUTTFw*-R%`D9#V%CvXQ? zY_B9C5SX+vh>;Y>ATnXjWT>N*q*TBK#5Aas%i)PgQYYA)UXpS?yN!fF=S0MDPO$H! z!u3DgD1e9| zWDCS>J`Xypkw)hyh@D_crr)o?75Mr6P|Op}J4)#?q?9H=q7f)0mpgl}IcbqN0QfJB zpGu2@WC8#g0EqYrLWVLPF%}D8rSJaP(5#@64QZ2*tqcl{L*X+LxByS=O>u%LPY_Ht zlSIVeh*&(64v!%a@o*XjYX_$>33NCehsQFQSO5T&v6|QOGrX(4J;lSF=s}@k@Mts@ z?}{RzJ#YjZj))^*u@u4r)|)31(|8PE!8TiIdmc;uM=Z%*2++iQVGy6sS;zu^7GKO4 zvG@Y0yZciQ}kevuHJ%oHNbk5Ht_D?uq?d`ExtQ`$b#Nq7V z7$%kgC*q0ra5T*hO9ucZ9ZLgX^LXa}>p!HD6mm9M{wH}Bwv-t;JN;1#%Egaj0(i;_ z5-Lk&1asL61k#XsQ(S|jkKb*H;}`}T9*3X5pC2rTP|s%Sg`a^MO{KcIG{8<|p6DxF zVP?e|8O<2Uri|+Op^mV6DOg;7rsW>k9yrC&)@=>_zE@|XYg}JQnNglw)XsIk`?VZ9 zHuzN5aP0js@~?A44x&bfXGPmT5MK@thDjuir7z56;b3^lGJi;=`u$$;HkI=!#H<~) zrpxe+zfC1)x7S6hDm0~55o!_m9V|=R$>2$YNgIK+bg?vT_0@lkT3uPKGpt*qNl4L4 zFKA~pq@0dNDlkp%Y#Y^LwZ^pCbV*9A$JVyO0lJ$Px!28Fs%~%8VrUZM@O8O@tT0!g z6>;}>L?=TkPZ+o0u1z7^NdgPS#vrxseZ4G}|8O?aQF~Y;M1D5ErNC{cR*i~t*BMmB z^7yjp$lnINeX7P##hTaKE!whg9winGr14WPB|y1!wWwr`XB7{QL59J+kRFHCE!sQw zhBW8X^=?xkzPs?@Ws_U4=Y*ya(oV`uPvzIQd&qZBO*D!%iSUv=t+#5~GJV2uo4Hd_ zM@vzW-cHpT&_G&pnq~rma{|IqA4nyjV_J@?$WH3Zi*Il|W2Qpes@UzaW<-fr*0m#+ zw?S2HE1&E4^lm>`{W57IK4L|~CRNXEDg{%fiX~Fr3<)ka4nj}WOFL@s{nS0wKMz9g zwRyNdK;?)}6p?Bj>ATjU?Ll`}qws1!c>N=HpX!R%mL)|!@*Djl;nV9X_L=?iB?KP5 zX@@I$Q?j+e9g}ityjF9{*K@~T+?%L0G6-^1M~uw8wq5=2HB7HfYO(!V1{X&C47XNK znc)6}elw(SqE7S8 zV@njP%aD&>pdy9IlX~QF<5#R)$KN_-E$z`qM0<*^SrK4k(}Y;#HhuS#*5N3 zL&rzLhU_DZ{98QRgY&<=Hf)a7D(9_TeVpvJ1Yxb+rvXOAj zQqpUKmtjPxT~;O3^)RDcnDHv)kFwY6N&|LHH;(W90$Eh|_1fEeOT9j|xPV_@;&9JB z6S(dnTNK_Nlw9r6)n66!_S^*OFxdTKU&y;&vgNBKx~l@dUfFFolkI!>>UH|XRk(u@ z#TEOs2R8en#~l*Um#ealr06qipC8USbvjRR4bkyr*K?x;*Iy%}v|l6+Z?>^pIax1w zl=thM<-P2W_rXaSiZYFpFAqIcG4+aL%{G^D)$)C|ojHr8s+NgWpEeiemB?1BzA3!( z?E@p}jiJiT4Uy$=lQTGQP`)x6Z%yOeE~ZW!_K%Z4-%=&sEwe`iPkVB>7S`35lgNad zpQLrrw}@Qbc(nt6y(1v*Ow}RYr*|YWcG}9_Wvx$cJT1tUwxhaOGpgFjkUvvfS4`xO z*K-`6_j(@psX5UUvVNV9?$OWTE)SwO=r3>x0-fg6e`aUKK|@&SqF1}$Gnp|o=b6oW zas+3GRL3!Lr4R_I*ZY&yXJ literal 0 HcmV?d00001 diff --git a/assets/images/avatar-placeholder.jpg b/assets/images/avatar-placeholder.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a23176c70ab449fcdd43b5da799197a945563ae GIT binary patch literal 2637 zcmbW1c{tSj9>;%UW(&xb7RMbhG zW5-dUksjCmBcf4fQHCdkxZ{8s0OsTS9y~#K0TqBkArPn#48|`YEF>%p7lOk@4v2}0 z96%m`!$qY;k>V1Pl9Iv*X&EUA88Hb-iSM6)z`Py^R1gXkln{Z7Nc_*@HUUTh;4*L- z3{nL6kRUJ;#BBotfTKTJSS2+k`Yi2{5eFqjVl{ysIY8pq265F}LW zu=aU=aa#|VVyJ{pT;_9uBc@f&l6L(}CEaUb@q$89(lWAg%12dHkE!YDpENjSXk>Q5 z+yZTBWqrlo!O`ibpPfCuynTHA`~$)xBBOq}8GY;Sy@bT1`^hO;*^hE^^B(6H6cxWH zDJ^?h{#$iTE$MY#{hPNft!?ccon77U2L?Y44UdeDQR!2R>8~@hbMp&p>)$pux3*b3 zyWhD$0QfH~-uoBWe{dmrTzn7+7y|pw1>*aKcfm*q^sqL+*m+x+N2s`>PMm;*Y3B2) zX2B!6c1+1@Vf{i^!#vQK*5UwgQTg)<84>d&Wz{)@Su-E#VD`4*_r7gw-3DG z0uaW)p~>`2#_7fAJ73(XO7HQjS&xbQM6OQ7^Glj_L6o)xT4S!*?}`N zbWLB7dsC%PPbgL!q^iw2N+Zs=-Mn1Z_%tJMzYu>dNZp0mPDwUCJU;Q`c9(K(|FF|N zG;;b(iDgjlC)Fe1N~@-CtJI#Y$UbAKX8r~`#_01U|8`REy@C7--f?Pky}6w-sO(SI zDCal#Z6gX{51$+i#XeOa5jqmqa!D!)dQ*o6I;O3nLl6j^c!=j%SQzf+^2eDSACJeL z-z1e)dWLY1-kFrfmKS>G2fO6dTf+;zID>h_nb%dD_$4FlJ)=4N=C@zCKr!vz+f~QJ z{+5OWB}TTp@*V=;{dNxfckT^hJZjg^SaRW+JyE=*w?@5K^!*K$*(~vbTfn9M0dl%zE zvWbpa`tk=O)r_~@DbaW@Eh?Ea>srl3KhTm}a{EWp#i6q6T}mcVvY55txr*oypbzI2 zyjk(h!Ald2hicUJX&KUIW)_FcQ0;-XJyt0tq+vI=32AY6g;Uf&QT$DkLfM9_G92`U zsfMmCw$4Q{O)Xf-2vH1<8QBQn31!lrE5__d#^Zxokg7r ziEQ6jLHzzJUr3V^YDZ3*7@AnK9LWn@AU<@_)`m`zoj2t3)BN&weBxEHCjJx`aAvYn z3-?ZzG*a|%F!(wb2)Ht{td9F*i$X=TRkM7XooU6=pR211B47<_Vz3!#to^ITk{6k2 zS%$|~I+c^Bv$3zZz@ZowmDCvVO8ry@VzY`Qwffj(^tU`}L+J?hrRc|ml zf-=JV;}6X|)5>8Z`j{z$_6)HY`^LneTPr6M#hle`yw>R!XI*5K2w@lf*5$YWmEb(% z`ecH3n>MWDicb0&{b>hV`}ONOb%atj6&7+)xwfhoUVFu&xxbH|6W4{>ouORi{J_d& z2Qfdk-kNTTrsn3~h}7fV!C;PC~IE=PSs_P^>YF#4K|zvCf0=X`;Ek&)rPu-7~j3B#q)Dm$U#SWxWys#;KY<1pR&|pu=D>#~!xt~6G{C1ai7mlyq_1SypM#sCo zw?_*^+ii1Xmz6zdPt+&V)mz@3omz<<2ynE*1$Twu)ae=2j4jO2rJCreRoIyR!i07% z7qE#7KgwBeqqILOK^so{s>q|43isSx+~!}q3$2mn>d0}9BBveduPe74kUA!_5!xht z)8kI;jdz=@0@`$#dF;7oTB!DAB3*eO*SWlWwLTj{8eB`|kbh*m<*LN{rr7(Hm^v^* zNsrQhz1ug?ES#r{7FJ#FIRdq0K=YI50QrltO{`Qp{_YtMmBPxKzLrBX9gvaS&~B8% zDv~h#luk+Hh%hgZqmt;qE1(NyzEvzS(tpG^^5dO%37fA8Dom_FB_VGv2EUu<^o%wZ zwi~#O-89DRXY!Wm12ks1qA`?_dbD~^U9fgikshj*&(^i3wATGrK6^?I7sXW4VUH_Pya)F1k-`p-OG^L|CJp}5G5aVpK$4!nI8r(MXewZwOK31 z6_*ep(CAKvz?Oq}J2o2lJoUX41*ebQ%{w(Js-=C7f)#4$B@KA+q)M z%NwJaA86{TH%6QXJVACnSNJg+IApVMai3S*yt|osxKpcbJ36b@J}-YHvE8W!L%m#> zx^CPvzy-ei8bt&+15DC#WBu$>o|RfQ7vO`Zlvl=n7PWzk7_>UoSfUjI-dNt@0%S9% z&JCvoPNnz6$Ta>o7to!f45tm|S-}WWMWn3oq5J*Vvp>G`9q*5sJ2Uq_^UOVS=iEs&GtuK@7iNb*Ae;vJ zI=@07Fc1P^mVhxI&QN>f&L4InW=58}Jv}`H0wFIik4~o(iNv$W_~F@o@Ql~e>Zb*-ro{6DXXB0! z?59zztem;IVBc{f|8f%1{GT}ZeAO*ak%T#=2)Z$C#9fP)V4!g~E-C%I0Y5I#Lt2GT zXYg6MT~Ls{)whO+Bac=KroTKY=~!H?mB`$lnjx>;W&6SRpUsST=w&Zfh_fcY1ZG47 z=;weVFY=%+FvoxC&K?*;G9MsgS)^lGj3dFKSg;7egUUQyWuis%(V|ai0A^Z1KMamE zgd=kgArQ`*M~J2dVLKfjZ^)i}+-IM5aVCF|sC?lW{@^WD_l84n`8mZPMa#ywuHAI* zZpQ`2=ghe5oTdp?y?BxybztpOF)e#HWn9ti;VE*;CShM`Bg@a?bVQ!8Y!jJHn=qje z9}lX1kO_hIexy3YKjUl24eItU>v-!ZI^1MeVHybBy2tfOnVsgv-&}=vogOaemXaK= z;<)nl@z)kFm#ca}fwBrlja@7GL}!!d=}J5~=}?=|*wP8Hq3HJpFRcA5xn3!Lr>Uv2TbXFVJA@jQ^P?eDdqKNW6uHiTu?SuY zI3yrYFwLwg?I}UCtLO{4&9mDJn&=BZWSiFCEu(Gpm^&-$X`1n;Hw6RCV@D$L*Bqa5 zKP4)9Zr;$v8{z5A#aN?XDn_lGLl?@xJfcKta8^%WVBksdH_4?5GQB%zcPs|>(I7+Ex*Ct4}(sZXE7Ytom;=|oGBo@ zAM$fN228N5BC2AYq62`iDKQn4(yaPqg@=4lxJvdnrX50JG*8sX^LRln&m-zI;jk4xZKi^Dhj z#8!=Xk=a+@0+cX)GH~}->qc!i;|DWta)qqURK>{8%5ArdXC&MAd8p3qI{G#Kh&Zji zW#{!&&gMlMuPo zaj$SgQY)Tte^2$*8j)Iy0~g%yaOQILZ&y91cYL75Q(e$~*GN|6{B>Js-E2SWlXl)e z7Vjc2=)kOH!n|c~u#Y^u62->VXjIiTDtZ8=Pw}w8CB*YOY`_MMYw0@hy{%Ip7>&Y96uRQ2oI0fSm58~M8ZOz&EFtZ)Fnyfz5 zBVP9t<>tjX6ONYhohM`P-P*=X#^(G8!kRNU@{-?HHtS&|kI=+T&2fG6k5qILCl?Z0yYPe&hs~iy5L=@dPCyVsI#d)+NXWhU^nYtSQrD^bu zJ11)I9N>pGZ9U1$68l8D_BV;KjE~{BRbxwVgBRpRysBK=&Aq@GBE<#ml$K@IEPB6y z$;$}m$Qqq+F-DO6q=N2PJpDG)-zbFx2EXJYSpiP9ZmK*ml6@xv3|Z}Xt-^{56RkWj z)(_=VgQ1M~u7kNW+uH8^8W%c_s`rE7aY|F2VCB?bPSo5Yh*UB~N}Q9h3Rz0v(bbQ_ zKl1ef6HGpSVt7o~G#`Dnb$E9uV}4+hGy(oQh$uBJPV3_SlCkO_ih2{Fd5B7T+kK!lf_+|GO=XZ@9dbC z&bf|^uVpfS5~&-5Hu-!qQbQqp!WON{aSl*SW@&6^M^D6=un@j6>LMZH%R9POJE9Nc zf=-1bmkp{wHDwI9`)^^?>&vc=)n5o5i?Dp4WC*hAR8=b@KR0g93YNB2lI_Rpb4ona zg^S6R^>@~zZ&f8x_^=$-D_<7_jc)A;r8|tYxR2?yeoMBg4pW`XZrZjLRJ&v~iQSB& zx`?x00Yb^>oS|DC6;)>|rc=+H^XEWKHQ>c@VTfgZ;4uD4b~|oKnJPMQnfH9ovxQ34 z;Agb0U>NT|;&b^zKX-5`;9q`E@YUXve1)O-s6E%nphSzuqHAGCNX}wvM_llhPoP(J z&H>)@vIC`yda38_AeBcSe+)J6)P*9|PnYbl&mhOsb{u|~*ni@$NL;IHO>AWaSPG3g z0^0Wcz~HOf0t@h8GmS(4PPM{|8PNDzv)CNOL0`NbcBz1;b`KI4QaLoi3I@;h#B*K9Z zU+?j^e-5R}tjT?O63fk6?uQl^I3a+_5>H0LP!AO?F#Ymqxv)-L6un$crtQTQdHb8k z2Hu{Ujk#+-@zQ3WWIfol0ZXexcHNZZO|>{)qlxTexFu!0Hgv6P>HaQ*PY)nEvQ|Nm6qI>q2#|E8IbB&T%w3eCJHQ%V)x4HA~rIn1J*B+g66+e`Pr^*L?Ib^_}qOe%Aok5k^4h*V`d$=j*&13YjsrlRE<$pH{}< zf*o_Omp=ttY#nJgH9H+>dd#1I2a(H(8QGpFsV_ec>EnwETsDwtTmI`6&upc998X+sKC| zGkm!s@xG(6S6!E$YeSKGcOEEKp*JB!L?kK9EI);4jb+OJ?VDs>HwGxP4e2r=W-O#~ zph~#q8evV595{sdC6R{8zqA;=jAK@!5Hz{$jCL}f7YCbdPof$ z+m8}nW1pN-bXe{Gq@4QirvP&Q!0VT?p9DE{GraAq|DB=)K7BebFHfVNnPi%I<4K+ZhL($ zSvIxP{Yxvmyfl=RmAnn%fO<#@l#H866IFXKg3^Gdi-VcLTRn9L9J?mnbV=gU$m}9d zrI_9xzaIO{RMhHj*3@q9U&;xhkT#$yiPV?tZAd;+E3zq|Tp->*uY?JX((B3-W3xm^ zJPjl|RTd}f{M;%EY5U0I9qPaJM?Z~~mtBwM&1eo2aiK31s5(#)Q|JBfris+SRy!rY z;OoQWrw+&Fu+-_u1hew8u|6)nXa>b}`sh>BP?{aqDP z+`oj>iaQio;{~xSkafF3xlz{TG7_+@tt@voXp^(d1yR8-1$V^t`gA^v=n1w z(YI%J=zl3h&$x1TBn}j<731=<{*{KGqQIT3BDH^6|71KOM9?)>6KdTk5|r#uuR??v zJ@#0kvCs|CSL-$8l58CqAgXf+2pEL_&=usNo!>>4jVF+w@C8F-PhQ{=NTlvt`DX#w zRx)I{R=}=;v7hpj4#@kenzJ!nFUHv%j&I(5{qq?)~(MO|T5#Y8YC= zA6_jN2ATac#8gc4fjXM1n8#rwmqT-=D(#2iqw5F&@Ba??C0YI4o$uSY5@-8Fni@!- znBtc^WMnXN;*JhsO8N?G{CKMO1>Au2)&Jx9k9B8+3lDk0Ae4Sy)$BzJWTu31WKby& z+1zF2?@ONnL!=(*+Ef1w4orCxUja-8R@+5v-0=+=$;l0qaH9esZ{4ivz+#L|{ulSq zr@BFYJV&}p?rA?lt0?QNQ8gQxRflEg;MU58a;nS(dhkp5y04&zFWjJP+_Q|tZ5iX6 zTztgP#UB+CGg~5C8P-GKE*ug z`uZMsMMy+@p}!B+EOSP~aM+o>AN}GnDBf!=-5uF1zPbFS9cFVj!Sbd9)f$*8rk{~g z=NFgf$4)OczLAU?Z$r{oH!-CGCbhX^Hh=$XHk2GTMxR zc1gUlGDE=2*_Bb=#p51_LcfF=%8z$wg$YjmD)0!8VT#sLtGdB1`Y|!zgUzI z5tt0j+YFQ+$@){#2KcL68W7mzozK)IX_4#ppk77a+%qVy$%b_9c`@+_Ll}~{!Zn2& zK0Y9?rX35R;dl>;($>dU?IkJ#xb3xaSs zEuFR}7Z)v!MV=escCH)IkMwsTBA&eqQsvM!Byne2v61h=aZmy#PgWR3vM|0aurLW4vK&2!s0JiA$Iwtw(^@s1hYIO$knE*!XNmKc>mwM v)1bsTpwiEl$@SWj!*NWh79^H)vx_z(hBWOLVmY@{JU5~z5vA_Kfsenx@ literal 0 HcmV?d00001 diff --git a/assets/images/walk-score.png b/assets/images/walk-score.png new file mode 100644 index 0000000000000000000000000000000000000000..88fca7d864856179aa119bc9047b72314e1f63bd GIT binary patch literal 2179 zcmV-}2z>X6P)^hpFg!I9L_-uIDg>gDhmaT$1OCvc5DlgTp9tDOcvO6(r~zrH z5LYYEhPFs;+0v!k?sj)QxBaFZ#+ltM2I&t@ax$~`-kG`geCK@U+`C#V79%BZJU@nn zXspi1N81Y0Y}#6RQ{*SZwB&Jx%@Kh<3ehGl{6yOZauUH#@s($PyWULk8a=HSQm zC(O^)O91xcs-oD>ky~LL@GpQ}p4QvD_&1$sat(2YC3=wU1{Dv^nf_Om7(5+&JpeDhG#O8jNF*_@$1oj+1@I3};5XgEaClx&KO-9nWACP(xw9K_t#5vFk8yD8kk z!?hTV_qOMvK$9|?HHdrVUGEr-Wp=-b^#JaFW?h`bBAZ$7GqeR*Ctae^)`Jz)dvC+K z=A*9$?Y%)B!F8dCkQtRTh0kv30^LDtA$$pm+T$er0$J@*?)Q7wKQE~eo!zAaV;d&GR%48e z%3K(@>M|NG2iIEGW4PbJIs#7DE2Q0#;%A#a!jU@!6zz{o(I+U}-r^f|_g6I_4UYYc96SE8%Cseaq3%zBF|dY4WR09Hn9DQgInmnVv%aRB=V zK|?!{QxCHK!Fr^Vbb2P)hWy@Pkxy&8NsVY7YZe^u88D0#HWGc0xhdVxI#u)+BbT3H zZA2cQA^P<^uio)8*4Hj-k2K8TD8{LEzlwn96bAOB8MtOSIBF;7rchlj`F|Zv9d##3 z+j|d%PanR3aVS8I+n=SNuM`a$Il}JE(}tXjSQzzNQ3&ZdO}|!(NYvXV0%S$gO=wd_ zDMIv=f%Zp$N_!$kmMOCU_%m^@3Pa_|zp*YdH|z6m7>@wG=NzFl~G+NqFa~OLDf$n*N!*I-O0!dFheum zalc3hQdDZ#VrWyTVGW$ki>O|LJ~eg_>jvS}=>kO6KM-T8gySf1@5UU|yjDV$Bkw^W znuYleWxbhoCZ3;aajuZT`YP)~rU1VmJF7mnSkpK%H3vl+hEQw8NNOuBq2Q5i)ONh< zU_y)9DCNvRat6GsS_W4)BrvQFRv~}b4qzG>{3?-Sb2 zMx=y?1^t^z2!<>G*gnyxBIr3poF0Ae3CGY-Ocsi0{}5NjNFNF6%>l3xtY;at0Bles z*17~cjz=waD3VoFgl}hCXPF*OFkqW>1K1d7yUj+i$_k2nvXyLMXXhAqV}G)@xod>i z#uJ%KbFnyCDeHwz4h&cW`X)i!e$drHXip9=(y`yx!K+R3IW@Oe5IHXzwkByNIooP` zciLiXqBZF6$i)1WP67B^ES~X+Z#Ks}eVPqp2)_cRviuodVdQGApdp5F>%JcURe)x!ur4eHY)=hFmx*%ff2iK1H=9mDS0Xho6YZaw8fFAAeZdt6@El#>t3Xt+Z+3|99KJr`!oNJNj-(%RmtpIR# zJU2kBPp;W3?tPsbmkaZgYcVokzHoj!s5{Fd2djA$@pUXEIzMIrSDJXPDy|NQjeoLI zCblXO!+uh~&jS6FiM|FDCMpW*QO#D1Gv=e{+bxW^9sRon#cfBC<`YJbVH;z%ogz?T zJ+?nj3vfS#QRr~}Mo z4aSzM9Nc}-F<0v+Lav{DU?%ozBLv+&rY4zMJ@}$G&t>vR+pyCL;60+MtmLQ;7yzCl zD$t6dU zpm6{u3rgw9@Jvyp~>Q7PPLXKQo)EakbnRawPfU zDnw0og6+lSmRiG{{tszNa-6RRbH7wMkz~!&J?" + + "

            " + + "
            " + + "
            " + repo.full_name + "
            "; + markup += "
            "; + return markup; + } + + function formatRepoSelection (repo) { + return repo.full_name || repo.text; + } + + // Ajax user search + $('.opalestate-ajax-user-search').on('keyup', function () { + var user_search = $(this).val(); + var exclude = ''; + + if ($(this).data('exclude')) { + exclude = $(this).data('exclude'); + } + + $('.opalestate-ajax').show(); + data = { + action: 'opalestate_search_users', + user_name: user_search, + exclude: exclude + }; + + document.body.style.cursor = 'wait'; + + $.ajax({ + type: "POST", + data: data, + dataType: "json", + url: ajaxurl, + success: function (search_response) { + $('.opalestate-ajax').hide(); + $('.opalestate_user_search_results').removeClass('hidden'); + $('.opalestate_user_search_results span').html(''); + $(search_response.results).appendTo('.opalestate_user_search_results span'); + document.body.style.cursor = 'default'; + } + }); + }); + + $('body').on('click.opalestateSelectUser', '.opalestate_user_search_results span a', function (e) { + e.preventDefault(); + var login = $(this).data('login'); + $('.opalestate-ajax-user-search').val(login); + $('.opalestate_user_search_results').addClass('hidden'); + $('.opalestate_user_search_results span').html(''); + }); + + $('body').on('click.opalestateCancelUserSearch', '.opalestate_user_search_results a.opalestate-ajax-user-cancel', function (e) { + e.preventDefault(); + $('.opalestate-ajax-user-search').val(''); + $('.opalestate_user_search_results').addClass('hidden'); + $('.opalestate_user_search_results span').html(''); + }); + + /** + * + */ + function open_media( field ){ + + var media = wp.media({ + title: 'Choose an image', + button: { + text: 'Select' + }, + multiple: false + }); + + media.open(); + + media.on( 'select', function(){ + var selection = media.state().get('selection'); + + var attachment = selection.first().toJSON(); + + //var attach = wp.media.attachment( cmb.attach_id ); + // attach.fetch(); + // selection.set( attach ? [ attach ] : [] ); + $( 'input', field).val( attachment.id ); + + if( $(field.data('related')).length > 0 ){ + $(field.data('related')).attr('src', attachment.url ); + }else if( $( 'img' , field ).length > 0 ){ + $( 'img', field).attr('src', attachment.url ); + } + } ) + .on( 'open', function(){ + + } ); + + } + $( '.media-view-upload-button' ).click( function () { + var field = $( this ).parent(); + open_media( field ); + } ); + + $( '.media-view-remove-button' ).click( function () { + var field = $( this ).parent(); + $( 'input', field).val( '' ); + $( 'img', field).attr('src', $( 'img', field).data('placeholder') ); + } ); + /** + * + */ +}); diff --git a/assets/js/chart.min.js b/assets/js/chart.min.js new file mode 100755 index 00000000..c74a7914 --- /dev/null +++ b/assets/js/chart.min.js @@ -0,0 +1,7 @@ +/*! + * Chart.js v2.8.0 + * https://www.chartjs.org + * (c) 2019 Chart.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(function(){try{return require("moment")}catch(t){}}()):"function"==typeof define&&define.amd?define(["require"],function(t){return e(function(){try{return t("moment")}catch(t){}}())}):t.Chart=e(t.moment)}(this,function(t){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t;var e={rgb2hsl:i,rgb2hsv:n,rgb2hwb:a,rgb2cmyk:o,rgb2keyword:s,rgb2xyz:l,rgb2lab:d,rgb2lch:function(t){return x(d(t))},hsl2rgb:u,hsl2hsv:function(t){var e=t[0],i=t[1]/100,n=t[2]/100;if(0===n)return[0,0,0];return[e,100*(2*(i*=(n*=2)<=1?n:2-n)/(n+i)),100*((n+i)/2)]},hsl2hwb:function(t){return a(u(t))},hsl2cmyk:function(t){return o(u(t))},hsl2keyword:function(t){return s(u(t))},hsv2rgb:h,hsv2hsl:function(t){var e,i,n=t[0],a=t[1]/100,o=t[2]/100;return e=a*o,[n,100*(e=(e/=(i=(2-a)*o)<=1?i:2-i)||0),100*(i/=2)]},hsv2hwb:function(t){return a(h(t))},hsv2cmyk:function(t){return o(h(t))},hsv2keyword:function(t){return s(h(t))},hwb2rgb:c,hwb2hsl:function(t){return i(c(t))},hwb2hsv:function(t){return n(c(t))},hwb2cmyk:function(t){return o(c(t))},hwb2keyword:function(t){return s(c(t))},cmyk2rgb:f,cmyk2hsl:function(t){return i(f(t))},cmyk2hsv:function(t){return n(f(t))},cmyk2hwb:function(t){return a(f(t))},cmyk2keyword:function(t){return s(f(t))},keyword2rgb:w,keyword2hsl:function(t){return i(w(t))},keyword2hsv:function(t){return n(w(t))},keyword2hwb:function(t){return a(w(t))},keyword2cmyk:function(t){return o(w(t))},keyword2lab:function(t){return d(w(t))},keyword2xyz:function(t){return l(w(t))},xyz2rgb:p,xyz2lab:m,xyz2lch:function(t){return x(m(t))},lab2xyz:v,lab2rgb:y,lab2lch:x,lch2lab:k,lch2xyz:function(t){return v(k(t))},lch2rgb:function(t){return y(k(t))}};function i(t){var e,i,n=t[0]/255,a=t[1]/255,o=t[2]/255,r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r;return s==r?e=0:n==s?e=(a-o)/l:a==s?e=2+(o-n)/l:o==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),i=(r+s)/2,[e,100*(s==r?0:i<=.5?l/(s+r):l/(2-s-r)),100*i]}function n(t){var e,i,n=t[0],a=t[1],o=t[2],r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r;return i=0==s?0:l/s*1e3/10,s==r?e=0:n==s?e=(a-o)/l:a==s?e=2+(o-n)/l:o==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),[e,i,s/255*1e3/10]}function a(t){var e=t[0],n=t[1],a=t[2];return[i(t)[0],100*(1/255*Math.min(e,Math.min(n,a))),100*(a=1-1/255*Math.max(e,Math.max(n,a)))]}function o(t){var e,i=t[0]/255,n=t[1]/255,a=t[2]/255;return[100*((1-i-(e=Math.min(1-i,1-n,1-a)))/(1-e)||0),100*((1-n-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]}function s(t){return _[JSON.stringify(t)]}function l(t){var e=t[0]/255,i=t[1]/255,n=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)+.1805*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)),100*(.2126*e+.7152*i+.0722*n),100*(.0193*e+.1192*i+.9505*n)]}function d(t){var e=l(t),i=e[0],n=e[1],a=e[2];return n/=100,a/=108.883,i=(i/=95.047)>.008856?Math.pow(i,1/3):7.787*i+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(i-n),200*(n-(a=a>.008856?Math.pow(a,1/3):7.787*a+16/116))]}function u(t){var e,i,n,a,o,r=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return[o=255*l,o,o];e=2*l-(i=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var d=0;d<3;d++)(n=r+1/3*-(d-1))<0&&n++,n>1&&n--,o=6*n<1?e+6*(i-e)*n:2*n<1?i:3*n<2?e+(i-e)*(2/3-n)*6:e,a[d]=255*o;return a}function h(t){var e=t[0]/60,i=t[1]/100,n=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*n*(1-i),s=255*n*(1-i*o),l=255*n*(1-i*(1-o));n*=255;switch(a){case 0:return[n,l,r];case 1:return[s,n,r];case 2:return[r,n,l];case 3:return[r,s,n];case 4:return[l,r,n];case 5:return[n,r,s]}}function c(t){var e,i,n,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,d=s+l;switch(d>1&&(s/=d,l/=d),n=6*o-(e=Math.floor(6*o)),0!=(1&e)&&(n=1-n),a=s+n*((i=1-l)-s),e){default:case 6:case 0:r=i,g=a,b=s;break;case 1:r=a,g=i,b=s;break;case 2:r=s,g=i,b=a;break;case 3:r=s,g=a,b=i;break;case 4:r=a,g=s,b=i;break;case 5:r=i,g=s,b=a}return[255*r,255*g,255*b]}function f(t){var e=t[0]/100,i=t[1]/100,n=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a))]}function p(t){var e,i,n,a=t[0]/100,o=t[1]/100,r=t[2]/100;return i=-.9689*a+1.8758*o+.0415*r,n=.0557*a+-.204*o+1.057*r,e=(e=3.2406*a+-1.5372*o+-.4986*r)>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,[255*(e=Math.min(Math.max(0,e),1)),255*(i=Math.min(Math.max(0,i),1)),255*(n=Math.min(Math.max(0,n),1))]}function m(t){var e=t[0],i=t[1],n=t[2];return i/=100,n/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(e-i),200*(i-(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116))]}function v(t){var e,i,n,a,o=t[0],r=t[1],s=t[2];return o<=8?a=(i=100*o/903.3)/100*7.787+16/116:(i=100*Math.pow((o+16)/116,3),a=Math.pow(i/100,1/3)),[e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i,n=n/108.883<=.008859?n=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3)]}function x(t){var e,i=t[0],n=t[1],a=t[2];return(e=360*Math.atan2(a,n)/2/Math.PI)<0&&(e+=360),[i,Math.sqrt(n*n+a*a),e]}function y(t){return p(v(t))}function k(t){var e,i=t[0],n=t[1];return e=t[2]/360*2*Math.PI,[i,n*Math.cos(e),n*Math.sin(e)]}function w(t){return M[t]}var M={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},_={};for(var C in M)_[JSON.stringify(M[C])]=C;var S=function(){return new T};for(var P in e){S[P+"Raw"]=function(t){return function(i){return"number"==typeof i&&(i=Array.prototype.slice.call(arguments)),e[t](i)}}(P);var I=/(\w+)2(\w+)/.exec(P),A=I[1],D=I[2];(S[A]=S[A]||{})[D]=S[P]=function(t){return function(i){"number"==typeof i&&(i=Array.prototype.slice.call(arguments));var n=e[t](i);if("string"==typeof n||void 0===n)return n;for(var a=0;a=0&&e<1?H(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return N(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:N,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return W(t,e);var i=Math.round(t[0]/255*100),n=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+i+"%, "+n+"%, "+a+"%)"},percentaString:W,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return V(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:V,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return j[t.slice(0,3)]}};function O(t){if(t){var e=[0,0,0],i=1,n=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(n){a=(n=n[1])[3];for(var o=0;oi?(e+.05)/(i+.05):(i+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,i=(e[0]+t)%360;return e[0]=i<0?360+i:i,this.setValues("hsl",e),this},mix:function(t,e){var i=t,n=void 0===e?.5:e,a=2*n-1,o=this.alpha()-i.alpha(),r=((a*o==-1?a:(a+o)/(1+a*o))+1)/2,s=1-r;return this.rgb(r*this.red()+s*i.red(),r*this.green()+s*i.green(),r*this.blue()+s*i.blue()).alpha(this.alpha()*n+i.alpha()*(1-n))},toJSON:function(){return this.rgb()},clone:function(){var t,e,i=new Y,n=this.values,a=i.values;for(var o in n)n.hasOwnProperty(o)&&(t=n[o],"[object Array]"===(e={}.toString.call(t))?a[o]=t.slice(0):"[object Number]"===e?a[o]=t:console.error("unexpected color value:",t));return i}},Y.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},Y.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},Y.prototype.getValues=function(t){for(var e=this.values,i={},n=0;n=0;a--)e.call(i,t[a],a);else for(a=0;a=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i))},easeOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/i)+1)},easeInOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:2==(t/=.5)?1:(i||(i=.45),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),t<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-Z.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*Z.easeInBounce(2*t):.5*Z.easeOutBounce(2*t-1)+.5}},$={effects:Z};G.easingEffects=Z;var J=Math.PI,Q=J/180,tt=2*J,et=J/2,it=J/4,nt=2*J/3,at={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,i,n,a,o){if(o){var r=Math.min(o,a/2,n/2),s=e+r,l=i+r,d=e+n-r,u=i+a-r;t.moveTo(e,l),se.left-1e-6&&t.xe.top-1e-6&&t.y0&&this.requestAnimationFrame()},advance:function(){for(var t,e,i,n,a=this.animations,o=0;o=i?(ut.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(o,1)):++o}},xt=ut.options.resolve,yt=["push","pop","shift","splice","unshift"];function kt(t,e){var i=t._chartjs;if(i){var n=i.listeners,a=n.indexOf(e);-1!==a&&n.splice(a,1),n.length>0||(yt.forEach(function(e){delete t[e]}),delete t._chartjs)}}var wt=function(t,e){this.initialize(t,e)};ut.extend(wt.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){this.chart=t,this.index=e,this.linkScales(),this.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),i=t.getDataset();null!==e.xAxisID&&e.xAxisID in t.chart.scales||(e.xAxisID=i.xAxisID||t.chart.options.scales.xAxes[0].id),null!==e.yAxisID&&e.yAxisID in t.chart.scales||(e.yAxisID=i.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this.update(!0)},destroy:function(){this._data&&kt(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,i=this.getMeta(),n=this.getDataset().data||[],a=i.data;for(t=0,e=n.length;ti&&this.insertElements(i,n-i)},insertElements:function(t,e){for(var i=0;is;)a-=2*Math.PI;for(;a=r&&a<=s,d=o>=i.innerRadius&&o<=i.outerRadius;return l&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,i=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,i=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},draw:function(){var t,e=this._chart.ctx,i=this._view,n=i.startAngle,a=i.endAngle,o="inner"===i.borderAlign?.33:0;e.save(),e.beginPath(),e.arc(i.x,i.y,Math.max(i.outerRadius-o,0),n,a),e.arc(i.x,i.y,i.innerRadius,a,n,!0),e.closePath(),e.fillStyle=i.backgroundColor,e.fill(),i.borderWidth&&("inner"===i.borderAlign?(e.beginPath(),t=o/i.outerRadius,e.arc(i.x,i.y,i.outerRadius,n-t,a+t),i.innerRadius>o?(t=o/i.innerRadius,e.arc(i.x,i.y,i.innerRadius-o,a+t,n-t,!0)):e.arc(i.x,i.y,o,a+Math.PI/2,n-Math.PI/2),e.closePath(),e.clip(),e.beginPath(),e.arc(i.x,i.y,i.outerRadius,n,a),e.arc(i.x,i.y,i.innerRadius,a,n,!0),e.closePath(),e.lineWidth=2*i.borderWidth,e.lineJoin="round"):(e.lineWidth=i.borderWidth,e.lineJoin="bevel"),e.strokeStyle=i.borderColor,e.stroke()),e.restore()}}),Ct=ut.valueOrDefault,St=st.global.defaultColor;st._set("global",{elements:{line:{tension:.4,backgroundColor:St,borderWidth:3,borderColor:St,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var Pt=pt.extend({draw:function(){var t,e,i,n,a=this._view,o=this._chart.ctx,r=a.spanGaps,s=this._children.slice(),l=st.global,d=l.elements.line,u=-1;for(this._loop&&s.length&&s.push(s[0]),o.save(),o.lineCap=a.borderCapStyle||d.borderCapStyle,o.setLineDash&&o.setLineDash(a.borderDash||d.borderDash),o.lineDashOffset=Ct(a.borderDashOffset,d.borderDashOffset),o.lineJoin=a.borderJoinStyle||d.borderJoinStyle,o.lineWidth=Ct(a.borderWidth,d.borderWidth),o.strokeStyle=a.borderColor||l.defaultColor,o.beginPath(),u=-1,t=0;tt.x&&(e=Ot(e,"left","right")):t.basei?i:n,r:l.right||a<0?0:a>e?e:a,b:l.bottom||o<0?0:o>i?i:o,l:l.left||r<0?0:r>e?e:r}}function Bt(t,e,i){var n=null===e,a=null===i,o=!(!t||n&&a)&&Rt(t);return o&&(n||e>=o.left&&e<=o.right)&&(a||i>=o.top&&i<=o.bottom)}st._set("global",{elements:{rectangle:{backgroundColor:Ft,borderColor:Ft,borderSkipped:"bottom",borderWidth:0}}});var Nt=pt.extend({draw:function(){var t=this._chart.ctx,e=this._view,i=function(t){var e=Rt(t),i=e.right-e.left,n=e.bottom-e.top,a=zt(t,i/2,n/2);return{outer:{x:e.left,y:e.top,w:i,h:n},inner:{x:e.left+a.l,y:e.top+a.t,w:i-a.l-a.r,h:n-a.t-a.b}}}(e),n=i.outer,a=i.inner;t.fillStyle=e.backgroundColor,t.fillRect(n.x,n.y,n.w,n.h),n.w===a.w&&n.h===a.h||(t.save(),t.beginPath(),t.rect(n.x,n.y,n.w,n.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return Bt(this._view,t,e)},inLabelRange:function(t,e){var i=this._view;return Lt(i)?Bt(i,t,null):Bt(i,null,e)},inXRange:function(t){return Bt(this._view,t,null)},inYRange:function(t){return Bt(this._view,null,t)},getCenterPoint:function(){var t,e,i=this._view;return Lt(i)?(t=i.x,e=(i.y+i.base)/2):(t=(i.x+i.base)/2,e=i.y),{x:t,y:e}},getArea:function(){var t=this._view;return Lt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),Wt={},Vt=_t,Et=Pt,Ht=Tt,jt=Nt;Wt.Arc=Vt,Wt.Line=Et,Wt.Point=Ht,Wt.Rectangle=jt;var qt=ut.options.resolve;st._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}});var Yt=Mt.extend({dataElementType:Wt.Rectangle,initialize:function(){var t;Mt.prototype.initialize.apply(this,arguments),(t=this.getMeta()).stack=this.getDataset().stack,t.bar=!0},update:function(t){var e,i,n=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,i=n.length;e0?Math.min(r,n-i):r,i=n;return r}(i,l):-1,pixels:l,start:r,end:s,stackCount:n,scale:i}},calculateBarValuePixels:function(t,e){var i,n,a,o,r,s,l=this.chart,d=this.getMeta(),u=this._getValueScale(),h=u.isHorizontal(),c=l.data.datasets,f=+u.getRightValue(c[t].data[e]),g=u.options.minBarLength,p=u.options.stacked,m=d.stack,v=0;if(p||void 0===p&&void 0!==m)for(i=0;i=0&&a>0)&&(v+=a));return o=u.getPixelForValue(v),s=(r=u.getPixelForValue(v+f))-o,void 0!==g&&Math.abs(s)=0&&!h||f<0&&h?o-g:o+g),{size:s,base:o,head:r,center:r+s/2}},calculateBarIndexPixels:function(t,e,i){var n=i.scale.options,a="flex"===n.barThickness?function(t,e,i){var n,a=e.pixels,o=a[t],r=t>0?a[t-1]:null,s=t');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),o=e.datasets[0],r=a.data[n],s=r&&r.custom||{},l=t.options.elements.arc;return{text:i,fillStyle:Gt([s.backgroundColor,o.backgroundColor,l.backgroundColor],void 0,n),strokeStyle:Gt([s.borderColor,o.borderColor,l.borderColor],void 0,n),lineWidth:Gt([s.borderWidth,o.borderWidth,l.borderWidth],void 0,n),hidden:isNaN(o.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;i=Math.PI?-1:m<-Math.PI?1:0))+g,b={x:Math.cos(m),y:Math.sin(m)},x={x:Math.cos(v),y:Math.sin(v)},y=m<=0&&v>=0||m<=2*Math.PI&&2*Math.PI<=v,k=m<=.5*Math.PI&&.5*Math.PI<=v||m<=2.5*Math.PI&&2.5*Math.PI<=v,w=m<=-Math.PI&&-Math.PI<=v||m<=Math.PI&&Math.PI<=v,M=m<=.5*-Math.PI&&.5*-Math.PI<=v||m<=1.5*Math.PI&&1.5*Math.PI<=v,_=f/100,C={x:w?-1:Math.min(b.x*(b.x<0?1:_),x.x*(x.x<0?1:_)),y:M?-1:Math.min(b.y*(b.y<0?1:_),x.y*(x.y<0?1:_))},S={x:y?1:Math.max(b.x*(b.x>0?1:_),x.x*(x.x>0?1:_)),y:k?1:Math.max(b.y*(b.y>0?1:_),x.y*(x.y>0?1:_))},P={width:.5*(S.x-C.x),height:.5*(S.y-C.y)};d=Math.min(s/P.width,l/P.height),u={x:-.5*(S.x+C.x),y:-.5*(S.y+C.y)}}for(e=0,i=c.length;e0&&!isNaN(t)?2*Math.PI*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,i,n,a,o,r,s,l,d=0,u=this.chart;if(!t)for(e=0,i=u.data.datasets.length;e(d=s>d?s:d)?l:d);return d},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Zt(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=Zt(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=Zt(i.hoverBorderWidth,i.borderWidth)},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=this.getDataset(),s=t.custom||{},l=o.options.elements.arc,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h=["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"];for(i=0,n=h.length;i0&&ee(l[t-1]._model,s)&&(i.controlPointPreviousX=d(i.controlPointPreviousX,s.left,s.right),i.controlPointPreviousY=d(i.controlPointPreviousY,s.top,s.bottom)),t');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),o=e.datasets[0],r=a.data[n].custom||{},s=t.options.elements.arc;return{text:i,fillStyle:ae([r.backgroundColor,o.backgroundColor,s.backgroundColor],void 0,n),strokeStyle:ae([r.borderColor,o.borderColor,s.borderColor],void 0,n),lineWidth:ae([r.borderWidth,o.borderWidth,s.borderWidth],void 0,n),hidden:isNaN(o.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;i0&&(o=t.getDatasetMeta(o[0]._datasetIndex).data),o},"x-axis":function(t,e){return me(t,e,{intersect:!1})},point:function(t,e){return fe(t,he(e,t))},nearest:function(t,e,i){var n=he(e,t);i.axis=i.axis||"xy";var a=pe(i.axis);return ge(t,n,i.intersect,a)},x:function(t,e,i){var n=he(e,t),a=[],o=!1;return ce(t,function(t){t.inXRange(n.x)&&a.push(t),t.inRange(n.x,n.y)&&(o=!0)}),i.intersect&&!o&&(a=[]),a},y:function(t,e,i){var n=he(e,t),a=[],o=!1;return ce(t,function(t){t.inYRange(n.y)&&a.push(t),t.inRange(n.x,n.y)&&(o=!0)}),i.intersect&&!o&&(a=[]),a}}};function be(t,e){return ut.where(t,function(t){return t.position===e})}function xe(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,i){var n=e?i:t,a=e?t:i;return n.weight===a.weight?n._tmpIndex_-a._tmpIndex_:n.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}function ye(t,e){ut.each(t,function(t){e[t.position]+=t.isHorizontal()?t.height:t.width})}st._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var ke={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure:function(t,e,i){for(var n,a=["fullWidth","position","weight"],o=a.length,r=0;rdiv{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&we.default||we,_e="$chartjs",Ce="chartjs-size-monitor",Se="chartjs-render-monitor",Pe="chartjs-render-animation",Ie=["animationstart","webkitAnimationStart"],Ae={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function De(t,e){var i=ut.getStyle(t,e),n=i&&i.match(/^(\d+)(\.\d+)?px$/);return n?Number(n[1]):void 0}var Te=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function Fe(t,e,i){t.addEventListener(e,i,Te)}function Le(t,e,i){t.removeEventListener(e,i,Te)}function Re(t,e,i,n,a){return{type:t,chart:e,native:a||null,x:void 0!==i?i:null,y:void 0!==n?n:null}}function Oe(t){var e=document.createElement("div");return e.className=t||"",e}function ze(t,e,i){var n,a,o,r,s=t[_e]||(t[_e]={}),l=s.resizer=function(t){var e=Oe(Ce),i=Oe(Ce+"-expand"),n=Oe(Ce+"-shrink");i.appendChild(Oe()),n.appendChild(Oe()),e.appendChild(i),e.appendChild(n),e._reset=function(){i.scrollLeft=1e6,i.scrollTop=1e6,n.scrollLeft=1e6,n.scrollTop=1e6};var a=function(){e._reset(),t()};return Fe(i,"scroll",a.bind(i,"expand")),Fe(n,"scroll",a.bind(n,"shrink")),e}((n=function(){if(s.resizer){var n=i.options.maintainAspectRatio&&t.parentNode,a=n?n.clientWidth:0;e(Re("resize",i)),n&&n.clientWidth0){var o=t[0];o.label?i=o.label:o.xLabel?i=o.xLabel:a>0&&o.index-1?t.split("\n"):t}function Xe(t){var e=st.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,bodyFontColor:t.bodyFontColor,_bodyFontFamily:je(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:je(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:je(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:je(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:je(t.titleFontStyle,e.defaultFontStyle),titleFontSize:je(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:je(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:je(t.footerFontStyle,e.defaultFontStyle),footerFontSize:je(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Ke(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function Ge(t){return Ye([],Ue(t))}var Ze=pt.extend({initialize:function(){this._model=Xe(this._options),this._lastActive=[]},getTitle:function(){var t=this._options.callbacks,e=t.beforeTitle.apply(this,arguments),i=t.title.apply(this,arguments),n=t.afterTitle.apply(this,arguments),a=[];return a=Ye(a,Ue(e)),a=Ye(a,Ue(i)),a=Ye(a,Ue(n))},getBeforeBody:function(){return Ge(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var i=this,n=i._options.callbacks,a=[];return ut.each(t,function(t){var o={before:[],lines:[],after:[]};Ye(o.before,Ue(n.beforeLabel.call(i,t,e))),Ye(o.lines,n.label.call(i,t,e)),Ye(o.after,Ue(n.afterLabel.call(i,t,e))),a.push(o)}),a},getAfterBody:function(){return Ge(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this._options.callbacks,e=t.beforeFooter.apply(this,arguments),i=t.footer.apply(this,arguments),n=t.afterFooter.apply(this,arguments),a=[];return a=Ye(a,Ue(e)),a=Ye(a,Ue(i)),a=Ye(a,Ue(n))},update:function(t){var e,i,n,a,o,r,s,l,d,u,h=this,c=h._options,f=h._model,g=h._model=Xe(c),p=h._active,m=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},x={width:f.width,height:f.height},y={x:f.caretX,y:f.caretY};if(p.length){g.opacity=1;var k=[],w=[];y=qe[c.position].call(h,p,h._eventPosition);var M=[];for(e=0,i=p.length;en.width&&(a=n.width-e.width),a<0&&(a=0)),"top"===u?o+=h:o-="bottom"===u?e.height+h:e.height/2,"center"===u?"left"===d?a+=h:"right"===d&&(a-=h):"left"===d?a-=c:"right"===d&&(a+=c),{x:a,y:o}}(g,x,v=function(t,e){var i,n,a,o,r,s=t._model,l=t._chart,d=t._chart.chartArea,u="center",h="center";s.yl.height-e.height&&(h="bottom");var c=(d.left+d.right)/2,f=(d.top+d.bottom)/2;"center"===h?(i=function(t){return t<=c},n=function(t){return t>c}):(i=function(t){return t<=e.width/2},n=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},o=function(t){return t-e.width-s.caretSize-s.caretPadding<0},r=function(t){return t<=f?"top":"bottom"},i(s.x)?(u="left",a(s.x)&&(u="center",h=r(s.y))):n(s.x)&&(u="right",o(s.x)&&(u="center",h=r(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:u,yAlign:g.yAlign?g.yAlign:h}}(this,x),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=x.width,g.height=x.height,g.caretX=y.x,g.caretY=y.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var i=this._chart.ctx,n=this._view,a=this.getCaretPosition(t,e,n);i.lineTo(a.x1,a.y1),i.lineTo(a.x2,a.y2),i.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,i){var n,a,o,r,s,l,d=i.caretSize,u=i.cornerRadius,h=i.xAlign,c=i.yAlign,f=t.x,g=t.y,p=e.width,m=e.height;if("center"===c)s=g+m/2,"left"===h?(a=(n=f)-d,o=n,r=s+d,l=s-d):(a=(n=f+p)+d,o=n,r=s-d,l=s+d);else if("left"===h?(n=(a=f+u+d)-d,o=a+d):"right"===h?(n=(a=f+p-u-d)-d,o=a+d):(n=(a=i.caretX)-d,o=a+d),"top"===c)s=(r=g)-d,l=r;else{s=(r=g+m)+d,l=r;var v=o;o=n,n=v}return{x1:n,x2:a,x3:o,y1:r,y2:s,y3:l}},drawTitle:function(t,e,i){var n=e.title;if(n.length){t.x=Ke(e,e._titleAlign),i.textAlign=e._titleAlign,i.textBaseline="top";var a,o,r=e.titleFontSize,s=e.titleSpacing;for(i.fillStyle=e.titleFontColor,i.font=ut.fontString(r,e._titleFontStyle,e._titleFontFamily),a=0,o=n.length;a0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var i={width:e.width,height:e.height},n={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(t.save(),t.globalAlpha=a,this.drawBackground(n,e,t,i),n.y+=e.yPadding,this.drawTitle(n,e,t),this.drawBody(n,e,t),this.drawFooter(n,e,t),t.restore())}},handleEvent:function(t){var e,i=this,n=i._options;return i._lastActive=i._lastActive||[],"mouseout"===t.type?i._active=[]:i._active=i._chart.getElementsAtEventForMode(t,n.mode,n),(e=!ut.arrayEquals(i._active,i._lastActive))&&(i._lastActive=i._active,(n.enabled||n.custom)&&(i._eventPosition={x:t.x,y:t.y},i.update(!0),i.pivot())),e}}),$e=qe,Je=Ze;Je.positioners=$e;var Qe=ut.valueOrDefault;function ti(){return ut.merge({},[].slice.call(arguments),{merger:function(t,e,i,n){if("xAxes"===t||"yAxes"===t){var a,o,r,s=i[t].length;for(e[t]||(e[t]=[]),a=0;a=e[t].length&&e[t].push({}),!e[t][a].type||r.type&&r.type!==e[t][a].type?ut.merge(e[t][a],[He.getScaleDefaults(o),r]):ut.merge(e[t][a],r)}else ut._merger(t,e,i,n)}})}function ei(){return ut.merge({},[].slice.call(arguments),{merger:function(t,e,i,n){var a=e[t]||{},o=i[t];"scales"===t?e[t]=ti(a,o):"scale"===t?e[t]=ut.merge(a,[He.getScaleDefaults(o.type),o]):ut._merger(t,e,i,n)}})}function ii(t){return"top"===t||"bottom"===t}st._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var ni=function(t,e){return this.construct(t,e),this};ut.extend(ni.prototype,{construct:function(t,e){var i=this;e=function(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=ei(st.global,st[t.type],t.options||{}),t}(e);var n=Ve.acquireContext(t,e),a=n&&n.canvas,o=a&&a.height,r=a&&a.width;i.id=ut.uid(),i.ctx=n,i.canvas=a,i.config=e,i.width=r,i.height=o,i.aspectRatio=o?r/o:null,i.options=e.options,i._bufferedRender=!1,i.chart=i,i.controller=i,ni.instances[i.id]=i,Object.defineProperty(i,"data",{get:function(){return i.config.data},set:function(t){i.config.data=t}}),n&&a?(i.initialize(),i.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Ee.notify(t,"beforeInit"),ut.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.initToolTip(),Ee.notify(t,"afterInit"),t},clear:function(){return ut.canvas.clear(this),this},stop:function(){return bt.cancelAnimation(this),this},resize:function(t){var e=this,i=e.options,n=e.canvas,a=i.maintainAspectRatio&&e.aspectRatio||null,o=Math.max(0,Math.floor(ut.getMaximumWidth(n))),r=Math.max(0,Math.floor(a?o/a:ut.getMaximumHeight(n)));if((e.width!==o||e.height!==r)&&(n.width=e.width=o,n.height=e.height=r,n.style.width=o+"px",n.style.height=r+"px",ut.retinaScale(e,i.devicePixelRatio),!t)){var s={width:o,height:r};Ee.notify(e,"resize",[s]),i.onResize&&i.onResize(e,s),e.stop(),e.update({duration:i.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},i=t.scale;ut.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),ut.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),i&&(i.id=i.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,i=t.scales||{},n=[],a=Object.keys(i).reduce(function(t,e){return t[e]=!1,t},{});e.scales&&(n=n.concat((e.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(e.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),e.scale&&n.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),ut.each(n,function(e){var n=e.options,o=n.id,r=Qe(n.type,e.dtype);ii(n.position)!==ii(e.dposition)&&(n.position=e.dposition),a[o]=!0;var s=null;if(o in i&&i[o].type===r)(s=i[o]).options=n,s.ctx=t.ctx,s.chart=t;else{var l=He.getScaleConstructor(r);if(!l)return;s=new l({id:o,type:r,options:n,ctx:t.ctx,chart:t}),i[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)}),ut.each(a,function(t,e){t||delete i[e]}),t.scales=i,He.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t=this,e=[];return ut.each(t.data.datasets,function(i,n){var a=t.getDatasetMeta(n),o=i.type||t.config.type;if(a.type&&a.type!==o&&(t.destroyDatasetMeta(n),a=t.getDatasetMeta(n)),a.type=o,a.controller)a.controller.updateIndex(n),a.controller.linkScales();else{var r=ue[a.type];if(void 0===r)throw new Error('"'+a.type+'" is not a chart type.');a.controller=new r(t,n),e.push(a.controller)}},t),e},resetElements:function(){var t=this;ut.each(t.data.datasets,function(e,i){t.getDatasetMeta(i).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e,i,n=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),i=(e=n).options,ut.each(e.scales,function(t){ke.removeBox(e,t)}),i=ei(st.global,st[e.config.type],i),e.options=e.config.options=i,e.ensureScalesHaveIDs(),e.buildOrUpdateScales(),e.tooltip._options=i.tooltips,e.tooltip.initialize(),Ee._invalidate(n),!1!==Ee.notify(n,"beforeUpdate")){n.tooltip._data=n.data;var a=n.buildOrUpdateControllers();ut.each(n.data.datasets,function(t,e){n.getDatasetMeta(e).controller.buildOrUpdateElements()},n),n.updateLayout(),n.options.animation&&n.options.animation.duration&&ut.each(a,function(t){t.reset()}),n.updateDatasets(),n.tooltip.initialize(),n.lastActive=[],Ee.notify(n,"afterUpdate"),n._bufferedRender?n._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:n.render(t)}},updateLayout:function(){!1!==Ee.notify(this,"beforeLayout")&&(ke.update(this,this.width,this.height),Ee.notify(this,"afterScaleUpdate"),Ee.notify(this,"afterLayout"))},updateDatasets:function(){if(!1!==Ee.notify(this,"beforeDatasetsUpdate")){for(var t=0,e=this.data.datasets.length;t=0;--i)e.isDatasetVisible(i)&&e.drawDataset(i,t);Ee.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var i=this.getDatasetMeta(t),n={meta:i,index:t,easingValue:e};!1!==Ee.notify(this,"beforeDatasetDraw",[n])&&(i.controller.draw(e),Ee.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,i={tooltip:e,easingValue:t};!1!==Ee.notify(this,"beforeTooltipDraw",[i])&&(e.draw(),Ee.notify(this,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return ve.modes.single(this,t)},getElementsAtEvent:function(t){return ve.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return ve.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,i){var n=ve.modes[e];return"function"==typeof n?n(this,t,i):[]},getDatasetAtEvent:function(t){return ve.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var i=e._meta[this.id];return i||(i=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,i=this.data.datasets.length;e3?i[2]-i[1]:i[1]-i[0];Math.abs(n)>1&&t!==Math.floor(t)&&(n=t-Math.floor(t));var a=ut.log10(Math.abs(n)),o="";if(0!==t)if(Math.max(Math.abs(i[0]),Math.abs(i[i.length-1]))<1e-4){var r=ut.log10(Math.abs(t));o=t.toExponential(Math.floor(r)-Math.floor(a))}else{var s=-1*Math.floor(a);s=Math.max(Math.min(s,20),0),o=t.toFixed(s)}else o="0";return o},logarithmic:function(t,e,i){var n=t/Math.pow(10,Math.floor(ut.log10(t)));return 0===t?"0":1===n||2===n||5===n||0===e||e===i.length-1?t.toExponential():""}}},di=ut.valueOrDefault,ui=ut.valueAtIndexOrDefault;function hi(t){var e,i,n=[];for(e=0,i=t.length;ed&&ot.maxHeight){o--;break}o++,l=r*s}t.labelRotation=o},afterCalculateTickRotation:function(){ut.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){ut.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},i=hi(t._ticks),n=t.options,a=n.ticks,o=n.scaleLabel,r=n.gridLines,s=t._isVisible(),l=n.position,d=t.isHorizontal(),u=ut.options._parseFont,h=u(a),c=n.gridLines.tickMarkLength;if(e.width=d?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:s&&r.drawTicks?c:0,e.height=d?s&&r.drawTicks?c:0:t.maxHeight,o.display&&s){var f=u(o),g=ut.options.toPadding(o.padding),p=f.lineHeight+g.height;d?e.height+=p:e.width+=p}if(a.display&&s){var m=ut.longestText(t.ctx,h.string,i,t.longestTextCache),v=ut.numberOfLabelLines(i),b=.5*h.size,x=t.options.ticks.padding;if(t._maxLabelLines=v,t.longestLabelWidth=m,d){var y=ut.toRadians(t.labelRotation),k=Math.cos(y),w=Math.sin(y)*m+h.lineHeight*v+b;e.height=Math.min(t.maxHeight,e.height+w+x),t.ctx.font=h.string;var M,_,C=ci(t.ctx,i[0],h.string),S=ci(t.ctx,i[i.length-1],h.string),P=t.getPixelForTick(0)-t.left,I=t.right-t.getPixelForTick(i.length-1);0!==t.labelRotation?(M="bottom"===l?k*C:k*b,_="bottom"===l?k*b:k*S):(M=C/2,_=S/2),t.paddingLeft=Math.max(M-P,0)+3,t.paddingRight=Math.max(_-I,0)+3}else a.mirror?m=0:m+=x+b,e.width=Math.min(t.maxWidth,e.width+m),t.paddingTop=h.size/2,t.paddingBottom=h.size/2}t.handleMargins(),t.width=e.width,t.height=e.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){ut.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(ut.isNullOrUndef(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:ut.noop,getPixelForValue:ut.noop,getValueForPixel:ut.noop,getPixelForTick:function(t){var e=this,i=e.options.offset;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(i?0:1),1),a=n*t+e.paddingLeft;i&&(a+=n/2);var o=e.left+a;return o+=e.isFullWidth()?e.margins.left:0}var r=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(r/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,n=e.left+i;return n+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,i,n=this,a=n.isHorizontal(),o=n.options.ticks.minor,r=t.length,s=!1,l=o.maxTicksLimit,d=n._tickSize()*(r-1),u=a?n.width-(n.paddingLeft+n.paddingRight):n.height-(n.paddingTop+n.PaddingBottom),h=[];for(d>u&&(s=1+Math.floor(d/u)),r>l&&(s=Math.max(s,1+Math.floor(r/l))),e=0;e1&&e%s>0&&delete i.label,h.push(i);return h},_tickSize:function(){var t=this,e=t.isHorizontal(),i=t.options.ticks.minor,n=ut.toRadians(t.labelRotation),a=Math.abs(Math.cos(n)),o=Math.abs(Math.sin(n)),r=i.autoSkipPadding||0,s=t.longestLabelWidth+r||0,l=ut.options._parseFont(i),d=t._maxLabelLines*l.lineHeight+r||0;return e?d*a>s*o?s/a:d/o:d*o0&&n>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,o=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==o&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,i=e.stepSize,n=e.maxTicksLimit;return i?t=Math.ceil(this.max/i)-Math.floor(this.min/i)+1:(t=this._computeTickLimit(),n=n||11),n&&(t=Math.min(n,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:mi,buildTicks:function(){var t=this,e=t.options.ticks,i=t.getTickLimit(),n={maxTicks:i=Math.max(2,i),min:e.min,max:e.max,precision:e.precision,stepSize:ut.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var i,n,a,o,r=[],s=t.stepSize,l=s||1,d=t.maxTicks-1,u=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,p=ut.niceNum((g-f)/d/l)*l;if(p<1e-14&&vi(u)&&vi(h))return[f,g];(o=Math.ceil(g/p)-Math.floor(f/p))>d&&(p=ut.niceNum(o*p/d/l)*l),s||vi(c)?i=Math.pow(10,ut._decimalPlaces(p)):(i=Math.pow(10,c),p=Math.ceil(p*i)/i),n=Math.floor(f/p)*p,a=Math.ceil(g/p)*p,s&&(!vi(u)&&ut.almostWhole(u/p,p/1e3)&&(n=u),!vi(h)&&ut.almostWhole(h/p,p/1e3)&&(a=h)),o=(a-n)/p,o=ut.almostEquals(o,Math.round(o),p/1e3)?Math.round(o):Math.ceil(o),n=Math.round(n*i)/i,a=Math.round(a*i)/i,r.push(vi(u)?n:u);for(var m=1;mt.max&&(t.max=n))})});t.min=isFinite(t.min)&&!isNaN(t.min)?t.min:0,t.max=isFinite(t.max)&&!isNaN(t.max)?t.max:1,this.handleTickRangeOptions()},_computeTickLimit:function(){var t;return this.isHorizontal()?Math.ceil(this.width/40):(t=ut.options._parseFont(this.options.ticks),Math.ceil(this.height/t.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e=this,i=e.start,n=+e.getRightValue(t),a=e.end-i;return e.isHorizontal()?e.left+e.width/a*(n-i):e.bottom-e.height/a*(n-i)},getValueForPixel:function(t){var e=this,i=e.isHorizontal(),n=i?e.width:e.height,a=(i?t-e.left:e.bottom-t)/n;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}}),ki=xi;yi._defaults=ki;var wi=ut.valueOrDefault;var Mi={position:"left",ticks:{callback:li.formatters.logarithmic}};function _i(t,e){return ut.isFinite(t)&&t>=0?t:e}var Ci=fi.extend({determineDataLimits:function(){var t=this,e=t.options,i=t.chart,n=i.data.datasets,a=t.isHorizontal();function o(e){return a?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null,t.max=null,t.minNotZero=null;var r=e.stacked;if(void 0===r&&ut.each(n,function(t,e){if(!r){var n=i.getDatasetMeta(e);i.isDatasetVisible(e)&&o(n)&&void 0!==n.stack&&(r=!0)}}),e.stacked||r){var s={};ut.each(n,function(n,a){var r=i.getDatasetMeta(a),l=[r.type,void 0===e.stacked&&void 0===r.stack?a:"",r.stack].join(".");i.isDatasetVisible(a)&&o(r)&&(void 0===s[l]&&(s[l]=[]),ut.each(n.data,function(e,i){var n=s[l],a=+t.getRightValue(e);isNaN(a)||r.data[i].hidden||a<0||(n[i]=n[i]||0,n[i]+=a)}))}),ut.each(s,function(e){if(e.length>0){var i=ut.min(e),n=ut.max(e);t.min=null===t.min?i:Math.min(t.min,i),t.max=null===t.max?n:Math.max(t.max,n)}})}else ut.each(n,function(e,n){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&o(a)&&ut.each(e.data,function(e,i){var n=+t.getRightValue(e);isNaN(n)||a.data[i].hidden||n<0||(null===t.min?t.min=n:nt.max&&(t.max=n),0!==n&&(null===t.minNotZero||n0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(ut.log10(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,i=!t.isHorizontal(),n={min:_i(e.min),max:_i(e.max)},a=t.ticks=function(t,e){var i,n,a=[],o=wi(t.min,Math.pow(10,Math.floor(ut.log10(e.min)))),r=Math.floor(ut.log10(e.max)),s=Math.ceil(e.max/Math.pow(10,r));0===o?(i=Math.floor(ut.log10(e.minNotZero)),n=Math.floor(e.minNotZero/Math.pow(10,i)),a.push(o),o=n*Math.pow(10,i)):(i=Math.floor(ut.log10(o)),n=Math.floor(o/Math.pow(10,i)));var l=i<0?Math.pow(10,Math.abs(i)):1;do{a.push(o),10==++n&&(n=1,l=++i>=0?1:l),o=Math.round(n*Math.pow(10,i)*l)/l}while(ia?{start:e-i,end:e}:{start:e,end:e+i}}function Ri(t){return 0===t||180===t?"center":t<180?"left":"right"}function Oi(t,e,i,n){var a,o,r=i.y+n/2;if(ut.isArray(e))for(a=0,o=e.length;a270||t<90)&&(i.y-=e.h)}function Bi(t){return ut.isNumber(t)?t:0}var Ni=bi.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Fi(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,i=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;ut.each(e.data.datasets,function(a,o){if(e.isDatasetVisible(o)){var r=e.getDatasetMeta(o);ut.each(a.data,function(e,a){var o=+t.getRightValue(e);isNaN(o)||r.data[a].hidden||(i=Math.min(o,i),n=Math.max(o,n))})}}),t.min=i===Number.POSITIVE_INFINITY?0:i,t.max=n===Number.NEGATIVE_INFINITY?0:n,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Fi(this.options))},convertTicksToLabels:function(){var t=this;bi.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map(t.options.pointLabels.callback,t)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,i,n,a=ut.options._parseFont(t.options.pointLabels),o={l:0,r:t.width,t:0,b:t.height-t.paddingTop},r={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,d,u=Ti(t);for(e=0;eo.r&&(o.r=f.end,r.r=h),g.starto.b&&(o.b=g.end,r.b=h)}t.setReductions(t.drawingArea,o,r)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,i){var n=this,a=e.l/Math.sin(i.l),o=Math.max(e.r-n.width,0)/Math.sin(i.r),r=-e.t/Math.cos(i.t),s=-Math.max(e.b-(n.height-n.paddingTop),0)/Math.cos(i.b);a=Bi(a),o=Bi(o),r=Bi(r),s=Bi(s),n.drawingArea=Math.min(Math.floor(t-(a+o)/2),Math.floor(t-(r+s)/2)),n.setCenterPoint(a,o,r,s)},setCenterPoint:function(t,e,i,n){var a=this,o=a.width-e-a.drawingArea,r=t+a.drawingArea,s=i+a.drawingArea,l=a.height-a.paddingTop-n-a.drawingArea;a.xCenter=Math.floor((r+o)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){return t*(2*Math.PI/Ti(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(null===t)return 0;var i=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*i:(t-e.min)*i},getPointPosition:function(t,e){var i=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(i)*e+this.xCenter,y:Math.sin(i)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this.min,e=this.max;return this.getPointPositionForValue(0,this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0)},draw:function(){var t=this,e=t.options,i=e.gridLines,n=e.ticks;if(e.display){var a=t.ctx,o=this.getIndexAngle(0),r=ut.options._parseFont(n);(e.angleLines.display||e.pointLabels.display)&&function(t){var e=t.ctx,i=t.options,n=i.angleLines,a=i.gridLines,o=i.pointLabels,r=Pi(n.lineWidth,a.lineWidth),s=Pi(n.color,a.color),l=Fi(i);e.save(),e.lineWidth=r,e.strokeStyle=s,e.setLineDash&&(e.setLineDash(Ai([n.borderDash,a.borderDash,[]])),e.lineDashOffset=Ai([n.borderDashOffset,a.borderDashOffset,0]));var d=t.getDistanceFromCenterForValue(i.ticks.reverse?t.min:t.max),u=ut.options._parseFont(o);e.font=u.string,e.textBaseline="middle";for(var h=Ti(t)-1;h>=0;h--){if(n.display&&r&&s){var c=t.getPointPosition(h,d);e.beginPath(),e.moveTo(t.xCenter,t.yCenter),e.lineTo(c.x,c.y),e.stroke()}if(o.display){var f=0===h?l/2:0,g=t.getPointPosition(h,d+f+5),p=Ii(o.fontColor,h,st.global.defaultFontColor);e.fillStyle=p;var m=t.getIndexAngle(h),v=ut.toDegrees(m);e.textAlign=Ri(v),zi(v,t._pointLabelSizes[h],g),Oi(e,t.pointLabels[h]||"",g,u.lineHeight)}}e.restore()}(t),ut.each(t.ticks,function(e,s){if(s>0||n.reverse){var l=t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]);if(i.display&&0!==s&&function(t,e,i,n){var a,o=t.ctx,r=e.circular,s=Ti(t),l=Ii(e.color,n-1),d=Ii(e.lineWidth,n-1);if((r||s)&&l&&d){if(o.save(),o.strokeStyle=l,o.lineWidth=d,o.setLineDash&&(o.setLineDash(e.borderDash||[]),o.lineDashOffset=e.borderDashOffset||0),o.beginPath(),r)o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI);else{a=t.getPointPosition(0,i),o.moveTo(a.x,a.y);for(var u=1;u=0&&r<=s;){if(a=t[(n=r+s>>1)-1]||null,o=t[n],!a)return{lo:null,hi:o};if(o[e]i))return{lo:a,hi:o};s=n-1}}return{lo:o,hi:null}}(t,e,i),o=a.lo?a.hi?a.lo:t[t.length-2]:t[0],r=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=r[e]-o[e],l=s?(i-o[e])/s:0,d=(r[n]-o[n])*l;return o[n]+d}function Ki(t,e){var i=t._adapter,n=t.options.time,a=n.parser,o=a||n.format,r=e;return"function"==typeof a&&(r=a(r)),ut.isFinite(r)||(r="string"==typeof o?i.parse(r,o):i.parse(r)),null!==r?+r:(a||"function"!=typeof o||(r=o(e),ut.isFinite(r)||(r=i.parse(r))),r)}function Gi(t,e){if(ut.isNullOrUndef(e))return null;var i=t.options.time,n=Ki(t,t.getRightValue(e));return null===n?n:(i.round&&(n=+t._adapter.startOf(n,i.round)),n)}function Zi(t){for(var e=qi.indexOf(t)+1,i=qi.length;e=a&&i<=o&&d.push(i);return n.min=a,n.max=o,n._unit=s.unit||function(t,e,i,n,a){var o,r;for(o=qi.length-1;o>=qi.indexOf(i);o--)if(r=qi[o],ji[r].common&&t._adapter.diff(a,n,r)>=e.length)return r;return qi[i?qi.indexOf(i):0]}(n,d,s.minUnit,n.min,n.max),n._majorUnit=Zi(n._unit),n._table=function(t,e,i,n){if("linear"===n||!t.length)return[{time:e,pos:0},{time:i,pos:1}];var a,o,r,s,l,d=[],u=[e];for(a=0,o=t.length;ae&&s=0&&t0?r:1}}),Qi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};Ji._defaults=Qi;var tn={category:gi,linear:yi,logarithmic:Ci,radialLinear:Ni,time:Ji},en={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};si._date.override("function"==typeof t?{_id:"moment",formats:function(){return en},parse:function(e,i){return"string"==typeof e&&"string"==typeof i?e=t(e,i):e instanceof t||(e=t(e)),e.isValid()?e.valueOf():null},format:function(e,i){return t(e).format(i)},add:function(e,i,n){return t(e).add(i,n).valueOf()},diff:function(e,i,n){return t.duration(t(e).diff(t(i))).as(n)},startOf:function(e,i,n){return e=t(e),"isoWeek"===i?e.isoWeekday(n).valueOf():e.startOf(i).valueOf()},endOf:function(e,i){return t(e).endOf(i).valueOf()},_create:function(e){return t(e)}}:{}),st._set("global",{plugins:{filler:{propagate:!0}}});var nn={dataset:function(t){var e=t.fill,i=t.chart,n=i.getDatasetMeta(e),a=n&&i.isDatasetVisible(e)&&n.dataset._children||[],o=a.length||0;return o?function(t,e){return e=i)&&n;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function on(t){var e,i=t.el._model||{},n=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===i.scaleBottom?n.bottom:i.scaleBottom:"end"===a?o=void 0===i.scaleTop?n.top:i.scaleTop:void 0!==i.scaleZero?o=i.scaleZero:n.getBasePosition?o=n.getBasePosition():n.getBasePixel&&(o=n.getBasePixel()),null!=o){if(void 0!==o.x&&void 0!==o.y)return o;if(ut.isFinite(o))return{x:(e=n.isHorizontal())?o:null,y:e?null:o}}return null}function rn(t,e,i){var n,a=t[e].fill,o=[e];if(!i)return a;for(;!1!==a&&-1===o.indexOf(a);){if(!isFinite(a))return a;if(!(n=t[a]))return!1;if(n.visible)return a;o.push(a),a=n.fill}return!1}function sn(t){var e=t.fill,i="dataset";return!1===e?null:(isFinite(e)||(i="boundary"),nn[i](t))}function ln(t){return t&&!t.skip}function dn(t,e,i,n,a){var o;if(n&&a){for(t.moveTo(e[0].x,e[0].y),o=1;o0;--o)ut.canvas.lineTo(t,i[o],i[o-1],!0)}}var un={id:"filler",afterDatasetsUpdate:function(t,e){var i,n,a,o,r=(t.data.datasets||[]).length,s=e.propagate,l=[];for(n=0;ne?e:t.boxWidth}st._set("global",{legend:{display:!0,position:"top",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var i=e.datasetIndex,n=this.chart,a=n.getDatasetMeta(i);a.hidden=null===a.hidden?!n.data.datasets[i].hidden:null,n.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return ut.isArray(e.datasets)?e.datasets.map(function(e,i){return{text:e.label,fillStyle:ut.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(i),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:i}},this):[]}}},legendCallback:function(t){var e=[];e.push('
              ');for(var i=0;i'),t.data.datasets[i].label&&e.push(t.data.datasets[i].label),e.push("");return e.push("
            "),e.join("")}});var gn=pt.extend({initialize:function(t){ut.extend(this,t),this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1},beforeUpdate:hn,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:hn,beforeSetDimensions:hn,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:hn,beforeBuildLabels:hn,buildLabels:function(){var t=this,e=t.options.labels||{},i=ut.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(i=i.filter(function(i){return e.filter(i,t.chart.data)})),t.options.reverse&&i.reverse(),t.legendItems=i},afterBuildLabels:hn,beforeFit:hn,fit:function(){var t=this,e=t.options,i=e.labels,n=e.display,a=t.ctx,o=ut.options._parseFont(i),r=o.size,s=t.legendHitBoxes=[],l=t.minSize,d=t.isHorizontal();if(d?(l.width=t.maxWidth,l.height=n?10:0):(l.width=n?10:0,l.height=t.maxHeight),n)if(a.font=o.string,d){var u=t.lineWidths=[0],h=0;a.textAlign="left",a.textBaseline="top",ut.each(t.legendItems,function(t,e){var n=fn(i,r)+r/2+a.measureText(t.text).width;(0===e||u[u.length-1]+n+i.padding>l.width)&&(h+=r+i.padding,u[u.length-(e>0?0:1)]=i.padding),s[e]={left:0,top:0,width:n,height:r},u[u.length-1]+=n+i.padding}),l.height+=h}else{var c=i.padding,f=t.columnWidths=[],g=i.padding,p=0,m=0,v=r+c;ut.each(t.legendItems,function(t,e){var n=fn(i,r)+r/2+a.measureText(t.text).width;e>0&&m+v>l.height-c&&(g+=p+i.padding,f.push(p),p=0,m=0),p=Math.max(p,n),m+=v,s[e]={left:0,top:0,width:n,height:r}}),g+=p,f.push(p),l.width+=g}t.width=l.width,t.height=l.height},afterFit:hn,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,i=e.labels,n=st.global,a=n.defaultColor,o=n.elements.line,r=t.width,s=t.lineWidths;if(e.display){var l,d=t.ctx,u=cn(i.fontColor,n.defaultFontColor),h=ut.options._parseFont(i),c=h.size;d.textAlign="left",d.textBaseline="middle",d.lineWidth=.5,d.strokeStyle=u,d.fillStyle=u,d.font=h.string;var f=fn(i,c),g=t.legendHitBoxes,p=t.isHorizontal();l=p?{x:t.left+(r-s[0])/2+i.padding,y:t.top+i.padding,line:0}:{x:t.left+i.padding,y:t.top+i.padding,line:0};var m=c+i.padding;ut.each(t.legendItems,function(n,u){var h=d.measureText(n.text).width,v=f+c/2+h,b=l.x,x=l.y;p?u>0&&b+v+i.padding>t.left+t.minSize.width&&(x=l.y+=m,l.line++,b=l.x=t.left+(r-s[l.line])/2+i.padding):u>0&&x+m>t.top+t.minSize.height&&(b=l.x=b+t.columnWidths[l.line]+i.padding,x=l.y=t.top+i.padding,l.line++),function(t,i,n){if(!(isNaN(f)||f<=0)){d.save();var r=cn(n.lineWidth,o.borderWidth);if(d.fillStyle=cn(n.fillStyle,a),d.lineCap=cn(n.lineCap,o.borderCapStyle),d.lineDashOffset=cn(n.lineDashOffset,o.borderDashOffset),d.lineJoin=cn(n.lineJoin,o.borderJoinStyle),d.lineWidth=r,d.strokeStyle=cn(n.strokeStyle,a),d.setLineDash&&d.setLineDash(cn(n.lineDash,o.borderDash)),e.labels&&e.labels.usePointStyle){var s=f*Math.SQRT2/2,l=t+f/2,u=i+c/2;ut.canvas.drawPoint(d,n.pointStyle,s,l,u)}else 0!==r&&d.strokeRect(t,i,f,c),d.fillRect(t,i,f,c);d.restore()}}(b,x,n),g[u].left=b,g[u].top=x,function(t,e,i,n){var a=c/2,o=f+a+t,r=e+a;d.fillText(i.text,o,r),i.hidden&&(d.beginPath(),d.lineWidth=2,d.moveTo(o,r),d.lineTo(o+n,r),d.stroke())}(b,x,n,h),p?l.x+=v+i.padding:l.y+=m})}},_getLegendItemAt:function(t,e){var i,n,a,o=this;if(t>=o.left&&t<=o.right&&e>=o.top&&e<=o.bottom)for(a=o.legendHitBoxes,i=0;i=(n=a[i]).left&&t<=n.left+n.width&&e>=n.top&&e<=n.top+n.height)return o.legendItems[i];return null},handleEvent:function(t){var e,i=this,n=i.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!n.onHover&&!n.onLeave)return}else{if("click"!==a)return;if(!n.onClick)return}e=i._getLegendItemAt(t.x,t.y),"click"===a?e&&n.onClick&&n.onClick.call(i,t.native,e):(n.onLeave&&e!==i._hoveredItem&&(i._hoveredItem&&n.onLeave.call(i,t.native,i._hoveredItem),i._hoveredItem=e),n.onHover&&e&&n.onHover.call(i,t.native,e))}});function pn(t,e){var i=new gn({ctx:t.ctx,options:e,chart:t});ke.configure(t,i,e),ke.addBox(t,i),t.legend=i}var mn={id:"legend",_element:gn,beforeInit:function(t){var e=t.options.legend;e&&pn(t,e)},beforeUpdate:function(t){var e=t.options.legend,i=t.legend;e?(ut.mergeIf(e,st.global.legend),i?(ke.configure(t,i,e),i.options=e):pn(t,e)):i&&(ke.removeBox(t,i),delete t.legend)},afterEvent:function(t,e){var i=t.legend;i&&i.handleEvent(e)}},vn=ut.noop;st._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var bn=pt.extend({initialize:function(t){ut.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:vn,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:vn,beforeSetDimensions:vn,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:vn,beforeBuildLabels:vn,buildLabels:vn,afterBuildLabels:vn,beforeFit:vn,fit:function(){var t=this,e=t.options,i=e.display,n=t.minSize,a=ut.isArray(e.text)?e.text.length:1,o=ut.options._parseFont(e),r=i?a*o.lineHeight+2*e.padding:0;t.isHorizontal()?(n.width=t.maxWidth,n.height=r):(n.width=r,n.height=t.maxHeight),t.width=n.width,t.height=n.height},afterFit:vn,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,i=t.options;if(i.display){var n,a,o,r=ut.options._parseFont(i),s=r.lineHeight,l=s/2+i.padding,d=0,u=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=ut.valueOrDefault(i.fontColor,st.global.defaultFontColor),e.font=r.string,t.isHorizontal()?(a=h+(f-h)/2,o=u+l,n=f-h):(a="left"===i.position?h+l:f-l,o=u+(c-u)/2,n=c-u,d=Math.PI*("left"===i.position?-.5:.5)),e.save(),e.translate(a,o),e.rotate(d),e.textAlign="center",e.textBaseline="middle";var g=i.text;if(ut.isArray(g))for(var p=0,m=0;m=0;n--){var a=t[n];if(e(a))return a}},ut.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},ut.almostEquals=function(t,e,i){return Math.abs(t-e)t},ut.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},ut.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},ut.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},ut.log10=Math.log10?function(t){return Math.log10(t)}:function(t){var e=Math.log(t)*Math.LOG10E,i=Math.round(e);return t===Math.pow(10,i)?i:e},ut.toRadians=function(t){return t*(Math.PI/180)},ut.toDegrees=function(t){return t*(180/Math.PI)},ut._decimalPlaces=function(t){if(ut.isFinite(t)){for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i}},ut.getAngleFromPoint=function(t,e){var i=e.x-t.x,n=e.y-t.y,a=Math.sqrt(i*i+n*n),o=Math.atan2(n,i);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},ut.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},ut.aliasPixel=function(t){return t%2==0?0:.5},ut._alignPixel=function(t,e,i){var n=t.currentDevicePixelRatio,a=i/2;return Math.round((e-a)*n)/n+a},ut.splineCurve=function(t,e,i,n){var a=t.skip?e:t,o=e,r=i.skip?e:i,s=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),l=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),d=s/(s+l),u=l/(s+l),h=n*(d=isNaN(d)?0:d),c=n*(u=isNaN(u)?0:u);return{previous:{x:o.x-h*(r.x-a.x),y:o.y-h*(r.y-a.y)},next:{x:o.x+c*(r.x-a.x),y:o.y+c*(r.y-a.y)}}},ut.EPSILON=Number.EPSILON||1e-14,ut.splineCurveMonotone=function(t){var e,i,n,a,o,r,s,l,d,u=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),h=u.length;for(e=0;e0?u[e-1]:null,(a=e0?u[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},ut.previousItem=function(t,e,i){return i?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},ut.niceNum=function(t,e){var i=Math.floor(ut.log10(t)),n=t/Math.pow(10,i);return(e?n<1.5?1:n<3?2:n<7?5:10:n<=1?1:n<=2?2:n<=5?5:10)*Math.pow(10,i)},ut.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},ut.getRelativePosition=function(t,e){var i,n,a=t.originalEvent||t,o=t.target||t.srcElement,r=o.getBoundingClientRect(),s=a.touches;s&&s.length>0?(i=s[0].clientX,n=s[0].clientY):(i=a.clientX,n=a.clientY);var l=parseFloat(ut.getStyle(o,"padding-left")),d=parseFloat(ut.getStyle(o,"padding-top")),u=parseFloat(ut.getStyle(o,"padding-right")),h=parseFloat(ut.getStyle(o,"padding-bottom")),c=r.right-r.left-l-u,f=r.bottom-r.top-d-h;return{x:i=Math.round((i-r.left-l)/c*o.width/e.currentDevicePixelRatio),y:n=Math.round((n-r.top-d)/f*o.height/e.currentDevicePixelRatio)}},ut.getConstraintWidth=function(t){return i(t,"max-width","clientWidth")},ut.getConstraintHeight=function(t){return i(t,"max-height","clientHeight")},ut._calculatePadding=function(t,e,i){return(e=ut.getStyle(t,e)).indexOf("%")>-1?i*parseInt(e,10)/100:parseInt(e,10)},ut._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},ut.getMaximumWidth=function(t){var e=ut._getParentNode(t);if(!e)return t.clientWidth;var i=e.clientWidth,n=i-ut._calculatePadding(e,"padding-left",i)-ut._calculatePadding(e,"padding-right",i),a=ut.getConstraintWidth(t);return isNaN(a)?n:Math.min(n,a)},ut.getMaximumHeight=function(t){var e=ut._getParentNode(t);if(!e)return t.clientHeight;var i=e.clientHeight,n=i-ut._calculatePadding(e,"padding-top",i)-ut._calculatePadding(e,"padding-bottom",i),a=ut.getConstraintHeight(t);return isNaN(a)?n:Math.min(n,a)},ut.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},ut.retinaScale=function(t,e){var i=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==i){var n=t.canvas,a=t.height,o=t.width;n.height=a*i,n.width=o*i,t.ctx.scale(i,i),n.style.height||n.style.width||(n.style.height=a+"px",n.style.width=o+"px")}},ut.fontString=function(t,e,i){return e+" "+t+"px "+i},ut.longestText=function(t,e,i,n){var a=(n=n||{}).data=n.data||{},o=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(a=n.data={},o=n.garbageCollect=[],n.font=e),t.font=e;var r=0;ut.each(i,function(e){null!=e&&!0!==ut.isArray(e)?r=ut.measureText(t,a,o,r,e):ut.isArray(e)&&ut.each(e,function(e){null==e||ut.isArray(e)||(r=ut.measureText(t,a,o,r,e))})});var s=o.length/2;if(s>i.length){for(var l=0;ln&&(n=o),n},ut.numberOfLabelLines=function(t){var e=1;return ut.each(t,function(t){ut.isArray(t)&&t.length>e&&(e=t.length)}),e},ut.color=X?function(t){return t instanceof CanvasGradient&&(t=st.global.defaultColor),X(t)}:function(t){return console.error("Color.js not found!"),t},ut.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:ut.color(t).saturate(.5).darken(.1).rgbString()}}(),ai._adapters=si,ai.Animation=vt,ai.animationService=bt,ai.controllers=ue,ai.DatasetController=Mt,ai.defaults=st,ai.Element=pt,ai.elements=Wt,ai.Interaction=ve,ai.layouts=ke,ai.platform=Ve,ai.plugins=Ee,ai.Scale=fi,ai.scaleService=He,ai.Ticks=li,ai.Tooltip=Je,ai.helpers.each(tn,function(t,e){ai.scaleService.registerScaleType(e,t,t._defaults)}),yn)yn.hasOwnProperty(_n)&&ai.plugins.register(yn[_n]);ai.platform.initialize();var Cn=ai;return"undefined"!=typeof window&&(window.Chart=ai),ai.Chart=ai,ai.Legend=yn.legend._element,ai.Title=yn.title._element,ai.pluginService=ai.plugins,ai.PluginBase=ai.Element.extend({}),ai.canvasHelpers=ai.helpers.canvas,ai.layoutService=ai.layouts,ai.LinearScaleBase=bi,ai.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],function(t){ai[t]=function(e,i){return new ai(e,ai.helpers.merge(i||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}}),Cn}); diff --git a/assets/js/country-select.js b/assets/js/country-select.js new file mode 100755 index 00000000..7c170981 --- /dev/null +++ b/assets/js/country-select.js @@ -0,0 +1,113 @@ +jQuery( document ).ready( function ( $ ) { + + /** + * Country select. + */ + var $country_el = $( '.opalestate-submission-form #opalestate_ppt_location, [name="location"],' + + ' [name="opalestate_ofe_location"], [name="opalestate_agt_location"]' ), + $state_el = $( '.opalestate-submission-form #opalestate_ppt_state, [name="state"],' + + ' [name="opalestate_ofe_state"], [name="opalestate_agt_state"]' ), + $city_el = $( '.opalestate-submission-form #opalestate_ppt_city, [name="city"],' + + ' [name="opalestate_ofe_city"], [name="opalestate_agt_city"]' ); + + $country_el.each( function () { + if ( $( this ).val() != '' && $( this ).val() != '-1' ) { + opalestate_ajax_get_state_by_country( $( this ) ); + } + } ); + + $country_el.on( 'change', function () { + opalestate_ajax_get_state_by_country( $( this ) ); + } ); + + $state_el.on( 'change', function () { + opalestate_ajax_get_city_by_state( $( this ) ); + } ); + + function opalestate_ajax_get_state_by_country( $el ) { + var country = $el.val(); + var is_search = 0; + + if ( $el.closest( '.opalestate-search-form' ).length !== 0 ) { + is_search = 1; + } + + var opalAjaxUrl = opalestate_get_ajax_url(); + + $.ajax( { + type: 'POST', + url: opalAjaxUrl, + data: { + 'action': 'opalestate_ajax_get_state_by_country', + 'country': country, + 'is_search': is_search + }, + success: function ( data ) { + var old_selected = $state_el.val(); + var selected = is_search ? '-1' : ''; + if ( old_selected != '' && old_selected != '-1' ) { + $.each( $.parseJSON( data ), function( key, value ) { + if ( old_selected == value.id ) { + selected = value.id; + } + }); + } + + $state_el.empty(); + $state_el.select2( { + data: $.parseJSON( data ) + } ); + $state_el.val( selected ).trigger( 'change' ); + } + } ); + } + + function opalestate_ajax_get_city_by_state( $el ) { + var state = $el.val(); + var is_search = 0; + + if ( $el.closest( '.opalestate-search-form' ).length !== 0 ) { + is_search = 1; + } + + var opalAjaxUrl = opalestate_get_ajax_url(); + + $.ajax( { + type: 'POST', + url: opalAjaxUrl, + data: { + 'action': 'opalestate_ajax_get_city_by_state', + 'state': state, + 'is_search': is_search + }, + success: function ( data ) { + var old_selected = $city_el.val(); + var selected = is_search ? '-1' : ''; + if ( old_selected != '' && old_selected != '-1' ) { + $.each( $.parseJSON( data ), function( key, value ) { + if ( old_selected == value.id ) { + selected = value.id; + } + }); + } + + $city_el.empty(); + $city_el.select2( { + data: $.parseJSON( data ) + } ); + $city_el.val( selected ).trigger( 'change' ); + } + } ); + } + + function opalestate_get_ajax_url() { + var opalAjaxUrl = ''; + if ( typeof ajaxurl != 'undefined' ) { + opalAjaxUrl = ajaxurl; + } else { + opalAjaxUrl = opalesateJS.ajaxurl; + } + + return opalAjaxUrl; + } +} ); diff --git a/assets/js/frontend/dashboard.js b/assets/js/frontend/dashboard.js new file mode 100755 index 00000000..5aed9929 --- /dev/null +++ b/assets/js/frontend/dashboard.js @@ -0,0 +1,186 @@ +;(function ($, settings) { + "use strict"; + + if (window.Opalestate === undefined) { + window.Opalestate = {}; + } + + /** + * GooglemapSearch + */ + var AgencyUpdateProfile = Opalestate.AgencyUpdateProfile = function ( form ) { + + /** + * Create Google Map In Single Property Only + */ + function getFormData () { + + var formData = new FormData(); + + formData.append('section', 'general'); + $(".cmb2-uploader-files").each( function(){ + var file_btn = $( 'input.select-file', this ); + + var files = $(".uploader-item-preview", this ); + + var name = $(this).data( 'name' ); + var issingle = $( this ).data('single'); + $(files).each( function( i , element ){ + var file = $(this).prop( 'file'); + if( file ) { + if( issingle ){ + formData.append( name, file ); + } else { + formData.append( name+"["+i+"]", file ); + } + } + } ); + }); + + return formData; + } + + + function toggleSubmit ( _this ){ + if( $( _this ).attr('disabled') == "disabled" ){ + $( _this ).removeAttr( 'disabled' ); + $(_this).find('i').remove( ); + } else { + $( _this ).attr('disabled','disabled'); + $(_this).append( ' ' ); + } + + }; + + function makeAjax( formData, $submit_btn ) { + $.ajax({ + url : opalesateJS.ajaxurl, + data : formData, + type : 'POST', + processData: false, + contentType: false, + dataType: "json", + success : function( response ){ + if( response.status == true ){ + if( response.redirect ){ + window.location.href = response.redirect; + } + + var myToast = $.toast({ + heading: response.heading, + text: response.message, + icon: 'success', + position: 'bottom-right', + hideAfter: 5000, + showHideTransition: 'fade', + }); + } else { + toggleSubmit( $submit_btn ); + var myToast = $.toast({ + heading: response.heading, + text: response.message, + icon: 'error', + position: 'bottom-right', + hideAfter: 5000, + showHideTransition: 'fade' + }); + } + } + }); + } + + var init = function ( form ){ + $( form ).on( "submit", function(){ + + if( typeof(tinyMCE) != "undefined" ) { + tinyMCE.triggerSave(); + } + + toggleSubmit( $("button:submit" , form ) ) ; + + var formData = getFormData(); + var dataSubmit = $( form ).serializeArray(); + + $.each( dataSubmit, function ( key, input ) { + formData.append( input.name, input.value ); + }); + + makeAjax( formData, $("button:submit" , form ) ) + return false; + } ); + } + init( form ); + } + + + ///// + $(document).ready(function () { + /// update agency profile + if( $("#opalestate_ofe_front").length > 0 ){ + new AgencyUpdateProfile( $("#opalestate_ofe_front") ); + } + // update agent profile + if( $("#opalestate_agt_front").length > 0 ){ + new AgencyUpdateProfile( $("#opalestate_agt_front") ); + } + + if( $("#opalestate_user_front").length > 0 ){ + new AgencyUpdateProfile( $("#opalestate_user_front") ); + } + + if( $("#opalestate-add-team-form").length > 0 ){ + function formatRepo (repo) { + if ( repo.loading ) { + return repo.text; + } + var markup = "
            " + + "
            " + + "
            " + + "
            " + repo.full_name + "
            "; + markup += "
            "; + return markup; + } + + function formatRepoSelection (repo) { + return repo.full_name || repo.text; + } + function load_select2_member ( id, action ) { + $( id ).select2({ + width: '100%', + ajax: { + url: opalesateJS.ajaxurl+"?action="+action, + dataType: 'json', + delay: 250, + data: function (params) { + return { + q: params.term, // search term + page: params.page + }; + }, + processResults: function (data, params) { + params.page = params.page || 1; + + return { + results: data.items, + pagination: { + more: (params.page * 30) < data.total_count + } + }; + }, + cache: true + }, + placeholder: 'Search for a repository', + escapeMarkup: function (markup) { return markup; }, // let our custom formatter work + minimumInputLength: 1, + templateResult: formatRepo, + templateSelection: formatRepoSelection + }); + } + + load_select2_member( ".opalesate-find-user", 'opalestate_search_property_users'); + } + + } ); + +})(jQuery); + \ No newline at end of file diff --git a/assets/js/frontend/elementor.js b/assets/js/frontend/elementor.js new file mode 100755 index 00000000..505df7e8 --- /dev/null +++ b/assets/js/frontend/elementor.js @@ -0,0 +1,86 @@ +(function ($ ) { + "use strict"; + + var carouselSlick = function( $scope , $selector, elementorFrontend ) { + + + var slidesToShow = 0; + + var elementSettings = $scope.data('settings'); + + if( elementSettings === undefined ){ + var elementSettings = $scope.find(".elementor-opal-slick-slider").data('settings'); + } + // console.log( elementSettings ); + if( elementSettings === undefined ){ + return true; + } + + var slidesToShow =+ elementSettings.slides_to_show || 3, + isSingleSlide = 1 === slidesToShow, + breakpoints = elementorFrontend.config.breakpoints; + + var slickOptions = { + slidesToShow: slidesToShow, + autoplay: 'yes' === elementSettings.autoplay, + autoplaySpeed: elementSettings.autoplay_speed, + infinite: 'yes' === elementSettings.infinite, + pauseOnHover: 'yes' === elementSettings.pause_on_hover, + speed: elementSettings.speed, + arrows: -1 !== [ 'arrows', 'both' ].indexOf( elementSettings.navigation ), + dots: -1 !== [ 'dots', 'both' ].indexOf( elementSettings.navigation ), + rtl: 'rtl' === elementSettings.direction, + responsive: [ + { + breakpoint: breakpoints.lg, + settings: { + slidesToShow: +elementSettings.slides_to_show_tablet || ( isSingleSlide ? 1 : 2 ), + slidesToScroll: 1, + }, + }, + { + breakpoint: breakpoints.md, + settings: { + slidesToShow: +elementSettings.slides_to_show_mobile || 1, + slidesToScroll: 1, + }, + }, + ], + }; + + if ( isSingleSlide ) { + slickOptions.fade = 'fade' === elementSettings.effect; + } else { + slickOptions.slidesToScroll = +elementSettings.slides_to_scroll; + } + + var $carousel = $scope.find( $selector ); + // $carousel.removeClass('products'); + $carousel.slick( slickOptions ); + // $carousel.addClass('products'); + } + + /// // / / / / + $(window).on('elementor/frontend/init', function(){ + + elementorFrontend.hooks.addAction( 'frontend/element_ready/opalestate-agent-collection.default', function( $scope ) { + if( $scope.find(".elementor-opal-slick-slider") ) { + carouselSlick( $scope, '.elementor-slick-slider-row.row-items', elementorFrontend ); + } + } ); + + elementorFrontend.hooks.addAction( 'frontend/element_ready/opalestate-property-collection.default', function( $scope ) { + if( $scope.find(".elementor-opal-slick-slider") ) { + carouselSlick( $scope, '.elementor-slick-slider-row.row-items' , elementorFrontend ); + } + } ); + + elementorFrontend.hooks.addAction( 'frontend/element_ready/opalestate-category-list.default', function( $scope ) { + if( $scope.find(".elementor-opal-slick-slider") ) { + carouselSlick( $scope, '.elementor-slick-slider-row.row-items' , elementorFrontend ); + } + } ); + + }); + +})( jQuery ); diff --git a/assets/js/frontend/googlemaps.js b/assets/js/frontend/googlemaps.js new file mode 100755 index 00000000..54ce1fd0 --- /dev/null +++ b/assets/js/frontend/googlemaps.js @@ -0,0 +1,621 @@ +;(function ($, settings) { + "use strict"; + + if (window.Opalestate === undefined) { + window.Opalestate = {}; + } + + /** + * GooglemapSearch + */ + var GooglemapSingle = Opalestate.GooglemapSingle = function ( data , id ) { + + /** + * Create Google Map In Single Property Only + */ + var initializePropertyMap = function ( data , id ){ + + var propertyMarkerInfo = data; + var enable = true ; + var url = propertyMarkerInfo.icon; + var size = new google.maps.Size( 42, 57 ); + + + var allMarkers = []; + + var setMapOnAll = function (markers, map) { + for (var i = 0; i < markers.length; i++) { + markers[i].setMap( map ); + } + } + // retina + if( window.devicePixelRatio > 1.5 ) { + if ( propertyMarkerInfo.retinaIcon ) { + url = propertyMarkerInfo.retinaIcon; + size = new google.maps.Size( 83, 113 ); + } + } + + var propertyLocation = new google.maps.LatLng( propertyMarkerInfo.latitude, propertyMarkerInfo.longitude ); + var propertyMapOptions = { + center: propertyLocation, + zoom: 15, + mapTypeId: google.maps.MapTypeId.ROADMAP, + scrollwheel: false + }; + var propertyMap = new google.maps.Map( document.getElementById( id ), propertyMapOptions ); + + /** + * + */ + + var createMarker = function ( position, icon ) { + + var image = { + url: icon, + size: size, + scaledSize: new google.maps.Size( 32, 57 ), + origin: new google.maps.Point( 0, 0 ), + anchor: new google.maps.Point( 21, 56 ) + }; + + var _marker = new google.maps.Marker({ + map: propertyMap, + position: position, + icon: image + }); + return _marker; + } + + + var infowindow = new google.maps.InfoWindow(); + + createMarker( propertyLocation, url ); + + /** + * Places near with actived types + */ + if( enable ){ + var $navs = $("#"+id).parent().find( '.property-search-places' ); + $(' .btn-map-search', $navs ).unbind('click').bind( 'click', function(){ + var service = new google.maps.places.PlacesService( propertyMap ) ; + var type = $(this).data('type'); + var $this = $(this).parent(); + + var icon = { + url: opalesateJS.mapiconurl+$(this).data('icon'), + scaledSize: new google.maps.Size( 28, 28 ), + anchor: new google.maps.Point( 21, 16 ), + origin: new google.maps.Point( 0, 0 ) + }; + + if( !allMarkers[type] || allMarkers[type].length <= 0 ){ + var markers = [] ; + var bounds = propertyMap.getBounds(); + + var $this = $(this); + + service.nearbySearch({ + location: propertyLocation, + radius: 2000, + bounds: bounds, + type: type + }, callbackNearBy); + + function callbackNearBy(results, status) { + if (status === google.maps.places.PlacesServiceStatus.OK) { + for (var i = 0; i < results.length; i++) { + createMarkerNearBy(results[i]); + } + + $('.nearby-counter',$this).remove(); + $('span',$this).append( $(''+markers.length+'') ); + allMarkers[type] = markers; + } + } + + function abc(){ + if (status === google.maps.places.PlacesServiceStatus.OK) { + for (var i = 0; i < results.length; i++) { + var place = results[i]; + var marker = new google.maps.Marker({ + map: propertyMap, + position: place.geometry.location, + icon: icon, + visible: true + }); + + marker.setMap( propertyMap ); + + google.maps.event.addListener(marker, 'click', function() { + + infowindow.setContent( place.name ); + + infowindow.open(propertyMap, this); + }); + + markers.push( marker ); + } + $('.nearby-counter',$this).remove(); + $('span',$this).append( $(''+markers.length+'') ); + allMarkers[type] = markers; + //console.log( place ); + } + } + + function createMarkerNearBy(place) { + var placeLoc = place.geometry.location; + var marker = new google.maps.Marker({ + map: propertyMap, + position: place.geometry.location, + icon: icon, + visible: true + }); + + marker.setMap( propertyMap ); + + google.maps.event.addListener(marker, 'click', function() { + infowindow.setContent(place.name); + infowindow.open(propertyMap, this); + }); + + markers.push( marker ); + } + }else { + for( var i=0 ; i < allMarkers[type].length; i++ ){ + allMarkers[type][i].setMap( null ); + } + allMarkers[type] = []; + } + + $(this).toggleClass('active'); + } ); + } + } + initializePropertyMap( data , id ); + } + + var GoogleMapSearch = Opalestate.GooglemapSingle = function ( data ) { + var initializePropertiesMap = function ( properties ) { + // Properties Array + var mapOptions = { + zoom: 12, + maxZoom: 16, + scrollwheel: false, + mapTypeId: google.maps.MapTypeId.ROADMAP, + panControl: false, + zoomControl: true, + mapTypeControl: false, + scaleControl: false, + streetViewControl: true, + overviewMapControl: false, + zoomControlOptions: { + style: google.maps.ZoomControlStyle.SMALL, + position: google.maps.ControlPosition.RIGHT_TOP + }, + streetViewControlOptions: { + position: google.maps.ControlPosition.RIGHT_TOP + } + }; + + var map = new google.maps.Map( document.getElementById( "opalestate-map-preview" ), mapOptions ); + + var bounds = new google.maps.LatLngBounds(); + + // Loop to generate marker and infowindow based on properties array + var markers = new Array(); + + for ( var i=0; i < properties.length; i++ ) { + + // console.log( properties[i] ); + var url = properties[i].icon; + var size = new google.maps.Size( 42, 57 ); + if( window.devicePixelRatio > 1.5 ) { + if ( properties[i].retinaIcon ) { + url = properties[i].retinaIcon; + size = new google.maps.Size( 83, 113 ); + } + } + + var image = { + url: url, + size: size, + scaledSize: new google.maps.Size( 30, 51 ), + origin: new google.maps.Point( 0, 0 ), + anchor: new google.maps.Point( 21, 56 ) + }; + + markers[i] = new google.maps.Marker({ + position: new google.maps.LatLng( properties[i].lat, properties[i].lng ), + map: map, + icon: image, + title: properties[i].title, + animation: google.maps.Animation.DROP, + visible: true + }); + + bounds.extend( markers[i].getPosition() ); + + var boxText = document.createElement( "div" ); + var pricelabel = ''; + + if( properties[i].pricelabel ){ + pricelabel = ' / ' + properties[i].pricelabel; + } + + // console.log( properties[i] ); + boxText.className = 'map-info-preview media'; + + var meta = '
              '; + if( properties[i].metas ){ + for ( var x in properties[i].metas ){ + var m = properties[i].metas[x]; + meta += '
            • ' + m.value +'' + m.label + '
            • ' + } + } + meta += '
            '; + + boxText.innerHTML = '
            ' + + '' + properties[i].title + '' + + ''+ properties[i].status +'
            ' + + '
            ' + + '
            ' + properties[i].title + + '

            ' + properties[i].address + '

            ' + properties[i].pricehtml + pricelabel + + '

            '+meta+'
            '+'
            '; + + var myOptions = { + content: boxText, + disableAutoPan: true, + maxWidth: 0, + alignBottom: true, + pixelOffset: new google.maps.Size( -122, -48 ), + zIndex: null, + closeBoxMargin: "0 0 -16px -16px", + closeBoxURL: opalesateJS.mapiconurl+"close.png", + infoBoxClearance: new google.maps.Size( 1, 1 ), + isHidden: false, + pane: "floatPane", + enableEventPropagation: false + }; + + var ib = new InfoBox( myOptions ); + + attachInfoBoxToMarker( map, markers[i], ib, i ); + } + + var last = null ; + + $('body').delegate( '[data-related="map"]', 'mouseenter', function(){ + if( $(this).hasClass('map-active') ){ + return true; + } + + var i = $(this).data( 'id' ); + $( '[data-related="map"]' ).removeClass( 'map-active' ); + $(this).addClass( 'active' ); + map.setZoom( 65536 );// alert( scale ); + + if( markers[i] ){ + var marker = markers[i]; + google.maps.event.trigger( markers[i], 'click' ); + + var scale = Math.pow( 2, map.getZoom() ); + var offsety = ( (100/scale) || 0 ); + var projection = map.getProjection(); + var markerPosition = marker.getPosition(); + var markerScreenPosition = projection.fromLatLngToPoint( markerPosition ); + var pointHalfScreenAbove = new google.maps.Point( markerScreenPosition.x, markerScreenPosition.y - offsety ); + var aboveMarkerLatLng = projection.fromPointToLatLng( pointHalfScreenAbove ); + map.setZoom( scale ); + map.setCenter( aboveMarkerLatLng ); + + } + return false; + }); + + map.fitBounds(bounds); + + /* Marker Clusters */ + var markerClustererOptions = { + ignoreHidden: true, + maxZoom: 14, + styles: [{ + textColor: '#000000', + url: opalesateJS.mapiconurl+"cluster-icon.png", + height: 51, + width: 30 + }] + }; + + var markerClusterer = new MarkerClusterer( map, markers, markerClustererOptions ); + + + + function attachInfoBoxToMarker( map, marker, infoBox , i ){ + + google.maps.event.addListener( marker, 'click', function(){ + + if( $( '[data-related="map"]' ).filter('[data-id="'+i+'"]').length > 0 ){ + var $m = $( '[data-related="map"]' ).filter('[data-id="'+i+'"]'); + $( '[data-related="map"]' ).removeClass( 'map-active' ); + $m.addClass('map-active'); + } + + if( last != null ){ + last.close(); + } + + var scale = Math.pow( 2, map.getZoom() ); + var offsety = ( (100/scale) || 0 ); + var projection = map.getProjection(); + var markerPosition = marker.getPosition(); + var markerScreenPosition = projection.fromLatLngToPoint( markerPosition ); + var pointHalfScreenAbove = new google.maps.Point( markerScreenPosition.x, markerScreenPosition.y - offsety ); + var aboveMarkerLatLng = projection.fromPointToLatLng( pointHalfScreenAbove ); + map.setCenter( aboveMarkerLatLng ); + infoBox.open( map, marker ); + last = infoBox; + }); + } + } + initializePropertiesMap( data ); + } + + ///// + $(document).ready(function () { + + function initialize_property_street_view( data , id ){ + + var propertyMarkerInfo = data; + + var propertyLocation = new google.maps.LatLng( propertyMarkerInfo.latitude, propertyMarkerInfo.longitude ); + + /** + * Street View + */ + var panoramaOptions = { + position: propertyLocation, + pov: { + heading: 34, + pitch: 10 + } + }; + var panorama = new google.maps.StreetViewPanorama( document.getElementById( id ), panoramaOptions); + google.maps.event.trigger(panorama, 'resize'); + } + + $( ".property-preview-map").each( function(){ + new GooglemapSingle( $(this).data() , $(this).attr('id') ); + } ); + + $( ".tab-google-street-view-btn") .click( function(){ + $( ".property-preview-street-map").hide(); + $( ".property-preview-street-map").each( function(){ + + var d = $(this).data() ; + var i = $(this).attr('id') ; + + initialize_property_street_view( d , i ); + } ); + $( ".property-preview-street-map").show( 100 ); + } ); + /// + // auto set height for split google map + $( '.split-maps-container' ).each( function() { + $( "#opalestate-map-preview ").height( $(window).height() ); + } ); + }) + + + $(document).ready(function () { + + // search + // show google maps + // update google maps + var updatePreviewGoogleMap = function( url ) { + if( $('#opalestate-map-preview').length > 0 ) { + $.ajax({ + type: 'GET', + dataType: 'json', + url: opalesateJS.ajaxurl, + data: url, + success: function(data) { + new GoogleMapSearch( data ); + } + }); + } + }; + if( $('#opalestate-map-preview').length > 0 || $( '.opalesate-properties-results').length > 0 ) { + var currentLocation = location.search.substr(1)+"&action=opalestate_ajx_get_properties&paged="+$('#opalestate-map-preview').data('page'); + updatePreviewGoogleMap( currentLocation ); + } + // update results + function updatePropertiesResults( data ){ + $( '.opalesate-properties-results').append( $('
            ') ); + $.ajax({ + type: "GET", + url: opalesateJS.ajaxurl, + data: data+"&action=opalestate_render_get_properties" , + success: function( response ) { + if( response ){ + + $( '.opalesate-properties-results' ).html( response ); + } + $( '.opalesate-properties-results .opalestate-loading').remove(); + $('.opalestate-sortable select').select2( { + width: '100%', + minimumResultsForSearch: -1 + } ); + } + }); + } + + function updatePropertiesByParseringHtml( newurl ){ + $( '.opalesate-properties-results .opalesate-archive-bottom').append( $('
            ') ); + $.ajax({ + type: "GET", + url: newurl, + dataType : 'html', + cache: false, + success: function( data ) { + if( data ){ + $( '.opalesate-properties-results' ).html( $(data).find('.opalesate-properties-results').html() ); + $('.opalestate-sortable select').select2( { + width: '100%', + minimumResultsForSearch: -1 + } ); + } + // $( '.opalesate-properties-results .opalestate-loading').remove(); + } + }); + } + + + $('form.opalestate-search-form').submit( function ( ){ + if( $('#opalestate-map-preview').length > 0 ) { + if( $(".opalesate-properties-results") && $(".opalesate-properties-results").data('mode') == 'html' ) { + var $form = $(this); + if (history.pushState) { + var ps = $form.serialize(); + var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?'+ ps; + window.history.pushState({path:newurl},'',newurl); + updatePropertiesByParseringHtml( newurl ); + } + + } else { + updatePropertiesResults( $(this).serialize() ); + } + + return false; + } + return true; + } ); + + + $( '.ajax-search-form form.opalestate-search-form' ).each( function(){ + var $form = $(this); + $( '.ajax-change select', this ).change( function(){ + if (history.pushState) { + var ps = $form.serialize(); + var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?'+ ps; + window.history.pushState({path:newurl},'',newurl); + } + $form.submit(); + return false; + } ); + } ); + + // // Sortable Change // // + $("body").delegate( '#opalestate-sortable-form select', 'change', function(){ + + var ps = ''; + if( $('form.opalestate-search-form').length > 0 ) { + var $form =$('form.opalestate-search-form'); + var ps = $form.serialize()+"&opalsortable="+$(this).val()+"&display="+$(".display-mode a.active").data('mode'); + } + + if( $(".opalesate-properties-results") && ps ) { + if (history.pushState) { + var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?'+ ps; + window.history.pushState({path:newurl},'',newurl); + updatePropertiesByParseringHtml( newurl ); + } + } else { + $("#opalestate-sortable-form").submit(); + } + } ); + // display mode + $( "body" ).delegate( ".display-mode a", 'click', function() { + if( $(".opalesate-properties-results").length > 0 ){ + var newurl = $(this).attr('href'); + window.history.pushState({path:newurl},'',newurl); + updatePropertiesByParseringHtml( newurl ); + return false; + } + } ); + // check any estate search form is enabled ///////////////// + if( $('#opalestate-map-preview').length > 0 ) { + $( "body" ).delegate( "form.opalestate-search-form select", "change", function () { + var params = $( "form.opalestate-search-form" ).serialize(); + var url = "action=opalestate_ajx_get_properties&"+params; + + updatePreviewGoogleMap( url ); + $('form.opalestate-search-form').submit(); + return true; + } ); + + $( "body" ).delegate( "form.opalestate-search-form input", "change", function () { + + if( $(this).hasClass("ranger-geo_radius") ){ + return false; + } + + var params = $( "form.opalestate-search-form" ).serialize(); + var url = "action=opalestate_ajx_get_properties&"+params; + updatePreviewGoogleMap( url ); + $('form.opalestate-search-form').submit(); + } ); + } + /////////// /////// + + + } ); +})(jQuery); + +//// ////// +(function( $ ) { + 'use strict'; + + + $(document).ready(function () { + $( '.opalestate-search-opal-map' ).each( function() { + initializeMapAdressSearch( $(this) ); + }); + } ); + + + function initializeMapAdressSearch( mapInstance ) { + var searchInput = mapInstance.find( '.opal-map-search' ); + + // Search + var autocomplete = new google.maps.places.Autocomplete( searchInput[0] ); + // autocomplete.bindTo( 'bounds', map ); + var latitude = mapInstance.find( '.opal-map-latitude' ); + var longitude = mapInstance.find( '.opal-map-longitude' ); + + google.maps.event.addListener( autocomplete, 'place_changed', function() { + + var place = autocomplete.getPlace(); + + + if ( ! place.geometry ) { + return; + } + + if( place.geometry.location.lat() ){ + $(mapInstance).addClass("active"); + } else { + $(mapInstance).removeClass("active"); + } + + latitude.val( place.geometry.location.lat() ); + longitude.val( place.geometry.location.lng() ); + }); + + $( ".map-remove", mapInstance ).click( function() { + latitude.val( "" ); + longitude.val( "" ); + searchInput.val(""); + latitude.change(); + } ); + + $( searchInput ).keypress( function( event ) { + if ( 13 === event.keyCode ) { + event.preventDefault(); + } + }); + + + } + +})( jQuery ); \ No newline at end of file diff --git a/assets/js/frontend/property.js b/assets/js/frontend/property.js new file mode 100755 index 00000000..23d69a75 --- /dev/null +++ b/assets/js/frontend/property.js @@ -0,0 +1,263 @@ +/* global tinymce, wpCookies, autosaveL10n, switchEditors */ +// Back-compat +window.opalestate_messages = function() { + return true; +}; + +/** + * @summary Adds autosave to the window object on dom ready. + * + * @since 3.9.0 + * + * @param {jQuery} $ jQuery object. + * @param {window} The window object. + * + */ + +( function( $, window ) { + + /** + * @summary Auto saves the post. + * + * @since 3.9.0 + * + * @returns {Object} + * {{ + * getPostData: getPostData, + * getCompareString: getCompareString, + * disableButtons: disableButtons, + * enableButtons: enableButtons, + * local: ({hasStorage, getSavedPostData, save, suspend, resume}|*), + * server: ({tempBlockSave, triggerSave, postChanged, suspend, resume}|*)} + * } + * The object with all functions for autosave. + */ + + function opalestate_messages() { + + var $document = $( document ); + var $page = $( '#page-importer' ); + + /** + * + */ + function trigger_send_messages(){ + $( ".opalestate-message-form" ).on('submit', function(){ + make_ajax( $( this ).serialize(), this ); + return false; + } ); + } + + + function toggle_submit_button ( submit ){ + var _this = $('button[type="submit"]', submit ); + if( $( _this ).attr('disabled') == "disabled" ){ + $( _this ).removeAttr( 'disabled' ); + $(_this).find('i').remove( ); + } else { + $( _this ).attr('disabled','disabled'); + $(_this).append( '' ); + } + + }; + + function trigger_send_reply(){ + $( ".opalestate-form-reply" ).on( "submit" , function(){ + var message = $( 'textarea', this).val(); + if( message ) { + make_ajax_reply( $( this ).serialize(), this ); + } + + return false; + } ); + } + + function make_ajax_reply( data, _this ){ + + $( '.opalestate-message-notify', _this ).remove(); + $.ajax({ + type : 'POST', + dataType : 'json', + url : opalesateJS.ajaxurl, + data : 'action=send_email_contact_reply&' + data, + success: function( response ) { + if( response ) { + var _class = response.status ? 'success' : 'danger'; + // $( _this ).append('

            '+ response.msg +'

            '); + if( response.status ){ + $( 'textarea', _this ).val( "" ); + var myToast = $.toast({ + heading: response.heading, + text: response.msg, + icon: 'success', + position: 'bottom-right', + hideAfter: 3500, + showHideTransition: 'fade' + }); + if ( response.data ){ + var html = '
            '; + html += '
            '; + html += ''; + html += '
            '; + html += '
            '+response.data.created+'
            ' + response.data.message; + html += '
            '; + html += '
            '; + + $(".opalestate-read-message").append( html ); + } + } else { + + } + } + } + }); + } + + function load_message_reply(){ + + } + + function make_ajax ( data, _this ) { + $( '.opalestate-message-notify', _this ).remove(); + var action = $( _this ).data('action')? $( _this ).data('action') : 'send_email_contact'; + toggle_submit_button( _this ); + $.ajax({ + type : 'POST', + dataType : 'json', + url : opalesateJS.ajaxurl, + data : 'action='+action+'&' + data, + success: function( response ) { + if( response ) { + var _class = response.status ? 'success' : 'danger'; + $( _this ).append('

            '+ response.msg +'

            '); + if( response.status ){ + $( 'textarea', _this ).val( "" ); + } + toggle_submit_button( _this ); + } + } + }); + } + + function trigger_print_property() { + $( '.js-print-property' ).on( 'click', function ( e ) { + e.preventDefault(); + + var id = $( this ).data( 'id' ); + var newWindown = window.open( '', 'Print!', 'width=800 ,height=850' ); + + $.ajax( { + type: 'POST', + url: opalesateJS.ajaxurl, + data: { + 'action': 'opalestate_ajax_create_property_print', + 'id': id, + }, + success: function ( data ) { + newWindown.document.write( data ); + newWindown.document.close(); + newWindown.focus(); + + setTimeout( function () { + newWindown.print(); + }, 1000 ); + } + } ); + } ); + } + + function trigger_toggle_featured() { + /// ajax set featured + $( 'body' ).delegate( '.btn-toggle-featured', 'click', function () { + var $this = $( this ); + $.ajax( { + type: 'POST', + url: opalesateJS.ajaxurl, + data: 'property_id=' + $( this ).data( 'property-id' ) + '&action=opalestate_toggle_featured_property', // elements. + dataType: 'json', + success: function ( data ) { + if ( data.status ) { + $( '[data-id="property-toggle-featured-' + $this.data( 'property-id' ) + '"]' ) + .removeClass( 'hide' ); + $this.remove(); + } else { + alert( data.msg ); + } + } + } ); + return false; + } ); + } + + function trigger_view_gallery(){ + $( 'body' ).delegate( '.opalestate-ajax-gallery', 'click', function () { + var parent = $(this).parent(); + var open_gallery = function ( parent ){ + $(parent ).magnificPopup({ + type: 'image', + delegate: 'a.gallery-item', + gallery:{ + enabled:true + } + }); + $( 'a.gallery-item', parent ).trigger('click'); + } + if( $(".gallery-item", parent ).length <= 0 ){ + var items = []; + + $.ajax( { + type: 'POST', + url: opalesateJS.ajaxurl, + data: 'property_id=' + $( this ).data( 'id' ) + '&action=opalestate_gallery_property', // elements. + dataType: 'json', + success: function ( data ) { + if( data.gallery ){ + for( var image in data.gallery ){ + parent.append( '' ); + } + + } + open_gallery( parent ); + } + } ); + } else { + open_gallery( parent ); + } + + return false; + } ); + } + /** + * @summary Sets the autosave time out. + * + * Wait for TinyMCE to initialize plus 1 second. for any external css to finish loading, + * then save to the textarea before setting initialCompareString. + * This avoids any insignificant differences between the initial textarea content and the content + * extracted from the editor. + * + * @since 3.9.0 + * + * @returns {void} + */ + $document.on( '.opalestate-message-form', function( event, editor ) { + + }).ready( function() { + trigger_send_messages(); + trigger_send_reply(); + + trigger_print_property(); + trigger_toggle_featured(); + + trigger_view_gallery(); + }); + + return { + + }; + } + + /** @namespace wp */ + window.wp = window.wp || {}; + window.wp.opalestate_messages = opalestate_messages(); + +}( jQuery, window )); \ No newline at end of file diff --git a/assets/js/frontend/submission.js b/assets/js/frontend/submission.js new file mode 100755 index 00000000..0190dece --- /dev/null +++ b/assets/js/frontend/submission.js @@ -0,0 +1,245 @@ +jQuery( document ).ready( function ( $ ) { + 'use strict'; + + + var toggleSubmit = function ( _this ){ + if( $( _this ).attr('disabled') == "disabled" ){ + $( _this ).removeAttr( 'disabled' ); + $(_this).find('i').remove( ); + } else { + $( _this ).attr('disabled','disabled'); + $(_this).append( '' ); + } + + }; + + $( '.opalestate-submission-tab' ).each( function () { + var $submission_tab = $( this ); + var $submit_btn = $submission_tab.find( '[name=submit-cmb]' ); + var $next_btn = $( '.submission-next-btn' ); + var $back_btn = $( '.submission-back-btn' ); + var $tab_content = $submission_tab.find( '.opalestate-tab-content' ); + + $submission_tab.find( '.tab-item' ).first().addClass( 'active' ); + $tab_content.first().addClass( 'active' ); + if ( $tab_content.length != 1 ) { + $submit_btn.hide(); + } else { + $next_btn.hide(); + } + + $submit_btn.on( 'click', function ( e ) { + e.preventDefault(); + var empty_required_inputs = opalestate_get_empty_required_inputs( $submission_tab ); + if ( empty_required_inputs.length === 0 ) { + $submit_btn.parents( 'form' ).submit(); + } + } ); + + /* + $next_btn.click( function(){ + // $submit_btn.click(); + + return false; + }); + */ + var submitFormFiles = function ( name, files ) { + + var formData = new FormData(); + + formData.append('section', 'general'); +// formData.append('action', 'opalestate_submitted_property'); + + + $(".cmb2-uploader-files").each( function(){ + var file_btn = $( 'input.select-file', this ); + + var files = $(".uploader-item-preview", this ); + + var name = $(this).data( 'name' ); + var issingle = $( this ).data('single'); + $(files).each( function( i , element ){ + var file = $(this).prop( 'file'); + if( file ) { + if( issingle ){ + formData.append( name, file ); + } else { + formData.append( name+"["+i+"]", file ); + } + } + } ); + }); + + // console.log( formData ); + + var dataSubmit = $submit_btn.parents( 'form' ).serializeArray(); + + $.each( dataSubmit, function ( key, input ) { + formData.append( input.name, input.value ); + }); + + formData.append('action', 'opalestate_save_agency_data'); + toggleSubmit( $submit_btn ); + $.ajax({ + url : opalesateJS.ajaxurl, + data : formData, + type : 'POST', + processData: false, + contentType: false, + dataType: "json", + success : function( response ){ + if( response.status == true ){ + if( response.redirect ){ + window.location.href = response.redirect; + } + + var myToast = $.toast({ + heading: response.heading, + text: response.message, + icon: 'success', + position: 'bottom-right', + hideAfter: 5000, + showHideTransition: 'fade', + }); + } else { + toggleSubmit( $submit_btn ); + var myToast = $.toast({ + heading: response.heading, + text: response.message, + icon: 'error', + position: 'bottom-right', + hideAfter: 5000, + showHideTransition: 'fade' + }); + } + } + }); + } + + $submit_btn.parents( 'form' ).on('submit', function() { + submitFormFiles(); + return false; + } ); + + + // Clicking Next button + $next_btn.on( 'click', function ( e ) { + e.preventDefault(); + var $tab_content = $( this ).parents( '.opalestate-tab-content' ); + var empty_required_inputs = opalestate_get_empty_required_inputs( $tab_content ); + + if ( empty_required_inputs.length === 0 ) { + var $next_tab_content = $tab_content.next(); + if ( $next_tab_content.length != 0 ) { + $submission_tab.find( '.opalestate-tab-content' ).removeClass( 'active' ); + $submission_tab.find( '.tab-item.active' ) + .removeClass( 'active' ) + .addClass( 'validated' ) + .addClass( 'passed' ) + .next() + .addClass( 'active' ); + $tab_content.addClass( 'validated' ).addClass( 'passed' ); + $next_tab_content.addClass( 'active' ); + + $( 'html, body' ).animate( { + scrollTop: $next_tab_content.offset().top - 100 + }, 500 ); + + // Show Save button if is last tab. + if ( $next_tab_content.is( ':last-child' ) ) { + $next_btn.hide(); + $submit_btn.show(); + } + } + } + } ); + + // Clicking Back button + $back_btn.on( 'click', function ( e ) { + e.preventDefault(); + var $tab_content = $( this ).parents( '.opalestate-tab-content' ); + + $submission_tab.find( '.opalestate-tab-content' ).removeClass( 'active' ); + $submission_tab.find( '.tab-item.active' ) + .removeClass( 'active' ) + .removeClass( 'passed' ) + .prev() + .addClass( 'active' ); + $tab_content.removeClass( 'active' ); + + var $prev_tab_content = $tab_content.prev(); + + if ( $prev_tab_content.length != 0 ) { + $prev_tab_content.addClass( 'active' ).removeClass( 'passed' ); + $( 'html, body' ).animate( { + scrollTop: $prev_tab_content.offset().top - 100 + }, 500 ); + } + + $submit_btn.hide(); + $next_btn.show(); + } ); + + $( '.tab-item' ).on( 'click', function ( e ) { + e.preventDefault(); + var $el = $( this ); + var $prev_tab_item = $el.prev(); + if ( $el.hasClass( 'validated' ) || ($prev_tab_item.length != 0 && $prev_tab_item.hasClass( 'validated' ) && + $prev_tab_item.hasClass( 'passed' )) ) { + $submission_tab.find( '.opalestate-tab-content' ).removeClass( 'active' ); + $submission_tab.find( '.tab-item.active' ).removeClass( 'active' ); + var $tab_id = $el.attr( 'href' ); + var $prev_tab_content = $( $tab_id ).prev(); + var $next_tab_content = $( $tab_id ).next(); + + if ( $prev_tab_content.length != 0 ) { + $back_btn.show(); + } else { + $back_btn.hide(); + } + + if ( $next_tab_content.length != 0 ) { + $next_btn.show(); + $submit_btn.hide(); + } else { + $next_btn.hide(); + $submit_btn.show(); + } + + $el.addClass( 'active' ); + $( $tab_id ).addClass( 'active' ); + } + } ); + } ); + + function opalestate_get_empty_required_inputs( el_wrapper ) { + var empty_required_inputs = []; + el_wrapper.find( 'input' ).each( function () { + $( this ).removeClass( 'required' ); + $( this ).blur(); + + if ( $( this ).prop( 'required' ) ) { + if ( $( this ).val() == '' ) { + $( this ).addClass( 'required' ); + $( this ).focus(); + empty_required_inputs.push( $( this ) ); + } + } + } ); + + return empty_required_inputs; + } + + $( '.opalestate-tab-content input' ).each( function ( e ) { + if ( $( this ).prop( 'required' ) ) { + $( this ).on( 'input', function () { + if ( $( this ).val() == '' ) { + $( this ).addClass( 'required' ); + $( this ).focus(); + } else { + $( this ).removeClass( 'required' ); + } + } ); + } + } ); +} ); diff --git a/assets/js/frontend/uploader.js b/assets/js/frontend/uploader.js new file mode 100755 index 00000000..578e67b8 --- /dev/null +++ b/assets/js/frontend/uploader.js @@ -0,0 +1,193 @@ +/* global tinymce, wpCookies, autosaveL10n, switchEditors */ +// Back-compat +window.opalestate_uploader = function() { + return true; +}; + +/** + * @summary Adds autosave to the window object on dom ready. + * + * @since 3.9.0 + * + * @param {jQuery} $ jQuery object. + * @param {window} The window object. + * + */ + +( function( $, window ) { + + /** + * @summary Auto saves the post. + * + * @since 3.9.0 + * + * The object with all functions for autosave. + */ + + function opalestate_uploader() { + + $document = $( document ); + + function is_image_file( file ) { + const acceptedImageTypes = ['image/gif', 'image/jpeg', 'image/png']; + return file && acceptedImageTypes.includes(file['type']) + } + + function check_number_files( file , i ) { + if( is_image_file(file) ) { + if( i+1 > opalesateJS.mfile_image ){ + return false; + } + } else { + if( i+1 > opalesateJS.mfile_other ){ + return false; + } + } + return true; + } + + function check_filesize ( file , i ) { + + if( is_image_file(file) ) { + if( file.size > opalesateJS.size_image ){ + var myToast = $.toast({ + heading: file.name, + text: opalesateJS.error_upload_size, + icon: 'error', + position: 'bottom-right', + hideAfter: 3500, + showHideTransition: 'fade' + }); + return false; + } else { + return true; + } + } else { + return true; + } + + } + /** + * + */ + function trigger_button_upload(){ + + var handleUpload = function ( _container ){ + + var file_btn = $( 'input.select-file', _container ); + var allow_files = []; + // var all_selected = []; + var name = $(this).data( 'name' ); + var issingle = $(_container).data('single'); + var show_icon = $(_container).data( 'show-icon' ); + + var on_select_files = function ( files, _container ) { + + if ( window.File && window.FileList && window.FileReader ) { + $(files).each( function( i, file ){ + + if( check_number_files( file, i+$(".uploader-item-preview",_container).length ) == false ){ + return ; + } + if( check_filesize( file, i ) ) { + var picReader = new FileReader(); + picReader.addEventListener("load", function ( event ) { + var input = '
            '; + var picFile = event.target; + if ( picFile.result ) { + if( show_icon == 1 ) { + input += '
            '+ file.name +'
            '; + } else { + input += '
            '; + } + + } + input += '
            '; + var a = $(input) ; + if( issingle ){ + $( ".uploader-item-preview", _container ).remove(); + all_selected = []; + } + $( _container ).prepend( a ); + a.prop( 'file', file ); + } ); + picReader.readAsDataURL( file ); + } + } ); + } + }; + + file_btn.on("change", function( event ){ + on_select_files( event.target.files, _container, allow_files ); + + } ); + + $( _container ).on( "click", ".btn-close", function(){ + if( confirm(opalesateJS.confirmed ) ){ + if( $("input", $(this).parent().parent()).length ){ + var rinput = $(""); + $(_container).append( rinput ); + } + + $(this).parent().parent().remove(); + } + } ); + + $( ".button-placehold", _container ).click( function(){ + file_btn.trigger("click"); + } ); + } + + $(".cmb2-uploader-files").each( function(){ + handleUpload( this ) + } ); + + // fix for submittion form + window.CMB2 = window.CMB2 || {}; + window.CMB2.metabox().find('.cmb-repeatable-group').on( 'cmb2_add_row', function(i, row ) { + var _container = $( row ); + if( $(".cmb2-uploader-files", _container ).length ) { + $( ".uploader-item-preview", _container ).remove(); + $(".cmb2-uploader-files", _container ).each( function(){ + var name = $( 'input', this ).attr('name'); + $( this ).attr('data-name', name ); + $(this).data( 'name', name ); + handleUpload( this ); + }); + } + } ); + } + + function upload_attachments( name, files ) { + + alert( name ); + } + + /** + * @summary Sets the autosave time out. + * + * Wait for TinyMCE to initialize plus 1 second. for any external css to finish loading, + * then save to the textarea before setting initialCompareString. + * This avoids any insignificant differences between the initial textarea content and the content + * extracted from the editor. + * + * @since 3.9.0 + * + * @returns {void} + */ + $document.on( 'body', function( event, editor ) { + + }).ready( function() { + trigger_button_upload(); + }); + + return { + + }; + } + + /** @namespace wp */ + window.wp = window.wp || {}; + window.wp.opalestate_uploader = opalestate_uploader(); + +}( jQuery, window )); \ No newline at end of file diff --git a/assets/js/infobox.js b/assets/js/infobox.js new file mode 100755 index 00000000..546f1b0b --- /dev/null +++ b/assets/js/infobox.js @@ -0,0 +1,772 @@ +/** + * @name InfoBox + * @version 1.1.9 [October 2, 2011] + * @author Gary Little (inspired by proof-of-concept code from Pamela Fox of Google) + * @copyright Copyright 2010 Gary Little [gary at luxcentral.com] + * @fileoverview InfoBox extends the Google Maps JavaScript API V3 OverlayView class. + *

            + * An InfoBox behaves like a google.maps.InfoWindow, but it supports several + * additional properties for advanced styling. An InfoBox can also be used as a map label. + *

            + * An InfoBox also fires the same events as a google.maps.InfoWindow. + *

            + * Browsers tested: + *

            + * Mac -- Safari (4.0.4), Firefox (3.6), Opera (10.10), Chrome (4.0.249.43), OmniWeb (5.10.1) + *
            + * Win -- Safari, Firefox, Opera, Chrome (3.0.195.38), Internet Explorer (8.0.6001.18702) + *
            + * iPod Touch/iPhone -- Safari (3.1.2) + */ + +/*! + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*jslint browser:true */ +/*global google */ + +/** + * @name InfoBoxOptions + * @class This class represents the optional parameter passed to the {@link InfoBox} constructor. + * @property {string|Node} content The content of the InfoBox (plain text or an HTML DOM node). + * @property {boolean} disableAutoPan Disable auto-pan on open (default is false). + * @property {number} maxWidth The maximum width (in pixels) of the InfoBox. Set to 0 if no maximum. + * @property {Size} pixelOffset The offset (in pixels) from the top left corner of the InfoBox + * (or the bottom left corner if the alignBottom property is true) + * to the map pixel corresponding to position. + * @property {LatLng} position The geographic location at which to display the InfoBox. + * @property {number} zIndex The CSS z-index style value for the InfoBox. + * Note: This value overrides a zIndex setting specified in the boxStyle property. + * @property {string} boxClass The name of the CSS class defining the styles for the InfoBox container. + * The default name is infoBox. + * @property {Object} [boxStyle] An object literal whose properties define specific CSS + * style values to be applied to the InfoBox. Style values defined here override those that may + * be defined in the boxClass style sheet. If this property is changed after the + * InfoBox has been created, all previously set styles (except those defined in the style sheet) + * are removed from the InfoBox before the new style values are applied. + * @property {string} closeBoxMargin The CSS margin style value for the close box. + * The default is "2px" (a 2-pixel margin on all sides). + * @property {string} closeBoxURL The URL of the image representing the close box. + * Note: The default is the URL for Google's standard close box. + * Set this property to "" if no close box is required. + * @property {Size} infoBoxClearance Minimum offset (in pixels) from the InfoBox to the + * map edge after an auto-pan. + * @property {boolean} isHidden Hide the InfoBox on open (default is false). + * @property {boolean} alignBottom Align the bottom left corner of the InfoBox to the position + * location (default is false which means that the top left corner of the InfoBox is aligned). + * @property {string} pane The pane where the InfoBox is to appear (default is "floatPane"). + * Set the pane to "mapPane" if the InfoBox is being used as a map label. + * Valid pane names are the property names for the google.maps.MapPanes object. + * @property {boolean} enableEventPropagation Propagate mousedown, click, dblclick, + * and contextmenu events in the InfoBox (default is false to mimic the behavior + * of a google.maps.InfoWindow). Set this property to true if the InfoBox + * is being used as a map label. iPhone note: This property setting has no effect; events are + * always propagated. + */ + +/** + * Creates an InfoBox with the options specified in {@link InfoBoxOptions}. + * Call InfoBox.open to add the box to the map. + * @constructor + * @param {InfoBoxOptions} [opt_opts] + */ +function InfoBox(opt_opts) { + + opt_opts = opt_opts || {}; + + google.maps.OverlayView.apply(this, arguments); + + // Standard options (in common with google.maps.InfoWindow): + // + this.content_ = opt_opts.content || ""; + this.disableAutoPan_ = opt_opts.disableAutoPan || false; + this.maxWidth_ = opt_opts.maxWidth || 0; + this.pixelOffset_ = opt_opts.pixelOffset || new google.maps.Size(0, 0); + this.position_ = opt_opts.position || new google.maps.LatLng(0, 0); + this.zIndex_ = opt_opts.zIndex || null; + + // Additional options (unique to InfoBox): + // + this.boxClass_ = opt_opts.boxClass || "infoBox"; + this.boxStyle_ = opt_opts.boxStyle || {}; + this.closeBoxMargin_ = opt_opts.closeBoxMargin || "2px"; + this.closeBoxURL_ = opt_opts.closeBoxURL || "http://www.google.com/intl/en_us/mapfiles/close.gif"; + if (opt_opts.closeBoxURL === "") { + this.closeBoxURL_ = ""; + } + this.infoBoxClearance_ = opt_opts.infoBoxClearance || new google.maps.Size(1, 1); + this.isHidden_ = opt_opts.isHidden || false; + this.alignBottom_ = opt_opts.alignBottom || false; + this.pane_ = opt_opts.pane || "floatPane"; + this.enableEventPropagation_ = opt_opts.enableEventPropagation || false; + + this.div_ = null; + this.closeListener_ = null; + this.eventListener1_ = null; + this.eventListener2_ = null; + this.eventListener3_ = null; + this.moveListener_ = null; + this.contextListener_ = null; + this.fixedWidthSet_ = null; +} + +/* InfoBox extends OverlayView in the Google Maps API v3. + */ +InfoBox.prototype = new google.maps.OverlayView(); + +/** + * Creates the DIV representing the InfoBox. + * @private + */ +InfoBox.prototype.createInfoBoxDiv_ = function () { + + var bw; + var me = this; + + // This handler prevents an event in the InfoBox from being passed on to the map. + // + var cancelHandler = function (e) { + e.cancelBubble = true; + + if (e.stopPropagation) { + + e.stopPropagation(); + } + }; + + // This handler ignores the current event in the InfoBox and conditionally prevents + // the event from being passed on to the map. It is used for the contextmenu event. + // + var ignoreHandler = function (e) { + + e.returnValue = false; + + if (e.preventDefault) { + + e.preventDefault(); + } + + if (!me.enableEventPropagation_) { + + cancelHandler(e); + } + }; + + if (!this.div_) { + + this.div_ = document.createElement("div"); + + this.setBoxStyle_(); + + if (typeof this.content_.nodeType === "undefined") { + this.div_.innerHTML = this.getCloseBoxImg_() + this.content_; + } else { + this.div_.innerHTML = this.getCloseBoxImg_(); + this.div_.appendChild(this.content_); + } + + // Add the InfoBox DIV to the DOM + this.getPanes()[this.pane_].appendChild(this.div_); + + this.addClickHandler_(); + + if (this.div_.style.width) { + + this.fixedWidthSet_ = true; + + } else { + + if (this.maxWidth_ !== 0 && this.div_.offsetWidth > this.maxWidth_) { + + this.div_.style.width = this.maxWidth_; + this.div_.style.overflow = "auto"; + this.fixedWidthSet_ = true; + + } else { // The following code is needed to overcome problems with MSIE + + bw = this.getBoxWidths_(); + + this.div_.style.width = (this.div_.offsetWidth - bw.left - bw.right) + "px"; + this.fixedWidthSet_ = false; + } + } + + this.panBox_(this.disableAutoPan_); + + if (!this.enableEventPropagation_) { + + // Cancel event propagation. + // + this.eventListener1_ = google.maps.event.addDomListener(this.div_, "mousedown", cancelHandler); + this.eventListener2_ = google.maps.event.addDomListener(this.div_, "click", cancelHandler); + this.eventListener3_ = google.maps.event.addDomListener(this.div_, "dblclick", cancelHandler); + this.eventListener4_ = google.maps.event.addDomListener(this.div_, "mouseover", function (e) { + this.style.cursor = "default"; + }); + } + + this.contextListener_ = google.maps.event.addDomListener(this.div_, "contextmenu", ignoreHandler); + + /** + * This event is fired when the DIV containing the InfoBox's content is attached to the DOM. + * @name InfoBox#domready + * @event + */ + google.maps.event.trigger(this, "domready"); + } +}; + +/** + * Returns the HTML tag for the close box. + * @private + */ +InfoBox.prototype.getCloseBoxImg_ = function () { + + var img = ""; + + if (this.closeBoxURL_ !== "") { + + img = " mapWidth) { + xOffset = pixPosition.x + iwWidth + iwOffsetX + padX - mapWidth; + } + if (this.alignBottom_) { + if (pixPosition.y < (-iwOffsetY + padY + iwHeight)) { + yOffset = pixPosition.y + iwOffsetY - padY - iwHeight; + } else if ((pixPosition.y + iwOffsetY + padY) > mapHeight) { + yOffset = pixPosition.y + iwOffsetY + padY - mapHeight; + } + } else { + if (pixPosition.y < (-iwOffsetY + padY)) { + yOffset = pixPosition.y + iwOffsetY - padY; + } else if ((pixPosition.y + iwHeight + iwOffsetY + padY) > mapHeight) { + yOffset = pixPosition.y + iwHeight + iwOffsetY + padY - mapHeight; + } + } + + if (!(xOffset === 0 && yOffset === 0)) { + + // Move the map to the shifted center. + // + var c = map.getCenter(); + map.panBy(xOffset, yOffset); + } + } + } +}; + +/** + * Sets the style of the InfoBox by setting the style sheet and applying + * other specific styles requested. + * @private + */ +InfoBox.prototype.setBoxStyle_ = function () { + + var i, boxStyle; + + if (this.div_) { + + // Apply style values from the style sheet defined in the boxClass parameter: + this.div_.className = this.boxClass_; + + // Clear existing inline style values: + this.div_.style.cssText = ""; + + // Apply style values defined in the boxStyle parameter: + boxStyle = this.boxStyle_; + for (i in boxStyle) { + + if (boxStyle.hasOwnProperty(i)) { + + this.div_.style[i] = boxStyle[i]; + } + } + + // Fix up opacity style for benefit of MSIE: + // + if (typeof this.div_.style.opacity !== "undefined" && this.div_.style.opacity !== "") { + + this.div_.style.filter = "alpha(opacity=" + (this.div_.style.opacity * 100) + ")"; + } + + // Apply required styles: + // + this.div_.style.position = "absolute"; + this.div_.style.visibility = 'hidden'; + if (this.zIndex_ !== null) { + + this.div_.style.zIndex = this.zIndex_; + } + } +}; + +/** + * Get the widths of the borders of the InfoBox. + * @private + * @return {Object} widths object (top, bottom left, right) + */ +InfoBox.prototype.getBoxWidths_ = function () { + + var computedStyle; + var bw = {top: 0, bottom: 0, left: 0, right: 0}; + var box = this.div_; + + if (document.defaultView && document.defaultView.getComputedStyle) { + + computedStyle = box.ownerDocument.defaultView.getComputedStyle(box, ""); + + if (computedStyle) { + + // The computed styles are always in pixel units (good!) + bw.top = parseInt(computedStyle.borderTopWidth, 10) || 0; + bw.bottom = parseInt(computedStyle.borderBottomWidth, 10) || 0; + bw.left = parseInt(computedStyle.borderLeftWidth, 10) || 0; + bw.right = parseInt(computedStyle.borderRightWidth, 10) || 0; + } + + } else if (document.documentElement.currentStyle) { // MSIE + + if (box.currentStyle) { + + // The current styles may not be in pixel units, but assume they are (bad!) + bw.top = parseInt(box.currentStyle.borderTopWidth, 10) || 0; + bw.bottom = parseInt(box.currentStyle.borderBottomWidth, 10) || 0; + bw.left = parseInt(box.currentStyle.borderLeftWidth, 10) || 0; + bw.right = parseInt(box.currentStyle.borderRightWidth, 10) || 0; + } + } + + return bw; +}; + +/** + * Invoked when close is called. Do not call it directly. + */ +InfoBox.prototype.onRemove = function () { + + if (this.div_) { + + this.div_.parentNode.removeChild(this.div_); + this.div_ = null; + } +}; + +/** + * Draws the InfoBox based on the current map projection and zoom level. + */ +InfoBox.prototype.draw = function () { + + this.createInfoBoxDiv_(); + + var pixPosition = this.getProjection().fromLatLngToDivPixel(this.position_); + + this.div_.style.left = (pixPosition.x + this.pixelOffset_.width) + "px"; + + if (this.alignBottom_) { + this.div_.style.bottom = -(pixPosition.y + this.pixelOffset_.height) + "px"; + } else { + this.div_.style.top = (pixPosition.y + this.pixelOffset_.height) + "px"; + } + + if (this.isHidden_) { + + this.div_.style.visibility = 'hidden'; + + } else { + + this.div_.style.visibility = "visible"; + } +}; + +/** + * Sets the options for the InfoBox. Note that changes to the maxWidth, + * closeBoxMargin, closeBoxURL, and enableEventPropagation + * properties have no affect until the current InfoBox is closed and a new one + * is opened. + * @param {InfoBoxOptions} opt_opts + */ +InfoBox.prototype.setOptions = function (opt_opts) { + if (typeof opt_opts.boxClass !== "undefined") { // Must be first + + this.boxClass_ = opt_opts.boxClass; + this.setBoxStyle_(); + } + if (typeof opt_opts.boxStyle !== "undefined") { // Must be second + + this.boxStyle_ = opt_opts.boxStyle; + this.setBoxStyle_(); + } + if (typeof opt_opts.content !== "undefined") { + + this.setContent(opt_opts.content); + } + if (typeof opt_opts.disableAutoPan !== "undefined") { + + this.disableAutoPan_ = opt_opts.disableAutoPan; + } + if (typeof opt_opts.maxWidth !== "undefined") { + + this.maxWidth_ = opt_opts.maxWidth; + } + if (typeof opt_opts.pixelOffset !== "undefined") { + + this.pixelOffset_ = opt_opts.pixelOffset; + } + if (typeof opt_opts.alignBottom !== "undefined") { + + this.alignBottom_ = opt_opts.alignBottom; + } + if (typeof opt_opts.position !== "undefined") { + + this.setPosition(opt_opts.position); + } + if (typeof opt_opts.zIndex !== "undefined") { + + this.setZIndex(opt_opts.zIndex); + } + if (typeof opt_opts.closeBoxMargin !== "undefined") { + + this.closeBoxMargin_ = opt_opts.closeBoxMargin; + } + if (typeof opt_opts.closeBoxURL !== "undefined") { + + this.closeBoxURL_ = opt_opts.closeBoxURL; + } + if (typeof opt_opts.infoBoxClearance !== "undefined") { + + this.infoBoxClearance_ = opt_opts.infoBoxClearance; + } + if (typeof opt_opts.isHidden !== "undefined") { + + this.isHidden_ = opt_opts.isHidden; + } + if (typeof opt_opts.enableEventPropagation !== "undefined") { + + this.enableEventPropagation_ = opt_opts.enableEventPropagation; + } + + if (this.div_) { + + this.draw(); + } +}; + +/** + * Sets the content of the InfoBox. + * The content can be plain text or an HTML DOM node. + * @param {string|Node} content + */ +InfoBox.prototype.setContent = function (content) { + this.content_ = content; + + if (this.div_) { + + if (this.closeListener_) { + + google.maps.event.removeListener(this.closeListener_); + this.closeListener_ = null; + } + + // Odd code required to make things work with MSIE. + // + if (!this.fixedWidthSet_) { + + this.div_.style.width = ""; + } + + if (typeof content.nodeType === "undefined") { + this.div_.innerHTML = this.getCloseBoxImg_() + content; + } else { + this.div_.innerHTML = this.getCloseBoxImg_(); + this.div_.appendChild(content); + } + + // Perverse code required to make things work with MSIE. + // (Ensures the close box does, in fact, float to the right.) + // + if (!this.fixedWidthSet_) { + this.div_.style.width = this.div_.offsetWidth + "px"; + if (typeof content.nodeType === "undefined") { + this.div_.innerHTML = this.getCloseBoxImg_() + content; + } else { + this.div_.innerHTML = this.getCloseBoxImg_(); + this.div_.appendChild(content); + } + } + + this.addClickHandler_(); + } + + /** + * This event is fired when the content of the InfoBox changes. + * @name InfoBox#content_changed + * @event + */ + google.maps.event.trigger(this, "content_changed"); +}; + +/** + * Sets the geographic location of the InfoBox. + * @param {LatLng} latlng + */ +InfoBox.prototype.setPosition = function (latlng) { + + this.position_ = latlng; + + if (this.div_) { + + this.draw(); + } + + /** + * This event is fired when the position of the InfoBox changes. + * @name InfoBox#position_changed + * @event + */ + google.maps.event.trigger(this, "position_changed"); +}; + +/** + * Sets the zIndex style for the InfoBox. + * @param {number} index + */ +InfoBox.prototype.setZIndex = function (index) { + + this.zIndex_ = index; + + if (this.div_) { + + this.div_.style.zIndex = index; + } + + /** + * This event is fired when the zIndex of the InfoBox changes. + * @name InfoBox#zindex_changed + * @event + */ + google.maps.event.trigger(this, "zindex_changed"); +}; + +/** + * Returns the content of the InfoBox. + * @returns {string} + */ +InfoBox.prototype.getContent = function () { + + return this.content_; +}; + +/** + * Returns the geographic location of the InfoBox. + * @returns {LatLng} + */ +InfoBox.prototype.getPosition = function () { + + return this.position_; +}; + +/** + * Returns the zIndex for the InfoBox. + * @returns {number} + */ +InfoBox.prototype.getZIndex = function () { + + return this.zIndex_; +}; + +/** + * Shows the InfoBox. + */ +InfoBox.prototype.show = function () { + + this.isHidden_ = false; + if (this.div_) { + this.div_.style.visibility = "visible"; + } +}; + +/** + * Hides the InfoBox. + */ +InfoBox.prototype.hide = function () { + + this.isHidden_ = true; + if (this.div_) { + this.div_.style.visibility = "hidden"; + } +}; + +/** + * Adds the InfoBox to the specified map or Street View panorama. If anchor + * (usually a google.maps.Marker) is specified, the position + * of the InfoBox is set to the position of the anchor. If the + * anchor is dragged to a new location, the InfoBox moves as well. + * @param {Map|StreetViewPanorama} map + * @param {MVCObject} [anchor] + */ +InfoBox.prototype.open = function (map, anchor) { + + var me = this; + + if (anchor) { + + this.position_ = anchor.getPosition(); + this.moveListener_ = google.maps.event.addListener(anchor, "position_changed", function () { + me.setPosition(this.getPosition()); + }); + } + + this.setMap(map); + + if (this.div_) { + + this.panBox_(); + } +}; + +/** + * Removes the InfoBox from the map. + */ +InfoBox.prototype.close = function () { + + if (this.closeListener_) { + + google.maps.event.removeListener(this.closeListener_); + this.closeListener_ = null; + } + + if (this.eventListener1_) { + + google.maps.event.removeListener(this.eventListener1_); + google.maps.event.removeListener(this.eventListener2_); + google.maps.event.removeListener(this.eventListener3_); + google.maps.event.removeListener(this.eventListener4_); + this.eventListener1_ = null; + this.eventListener2_ = null; + this.eventListener3_ = null; + this.eventListener4_ = null; + } + + if (this.moveListener_) { + + google.maps.event.removeListener(this.moveListener_); + this.moveListener_ = null; + } + + if (this.contextListener_) { + + google.maps.event.removeListener(this.contextListener_); + this.contextListener_ = null; + } + + this.setMap(null); +}; \ No newline at end of file diff --git a/assets/js/jquery.fitvids.js b/assets/js/jquery.fitvids.js new file mode 100755 index 00000000..f8d6b977 --- /dev/null +++ b/assets/js/jquery.fitvids.js @@ -0,0 +1,83 @@ +/*global jQuery */ +/*jshint browser:true */ +/*! +* FitVids 1.1 +* +* Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com +* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/ +* Released under the WTFPL license - http://sam.zoy.org/wtfpl/ +* +*/ + +;(function( $ ){ + + 'use strict'; + + $.fn.fitVids = function( options ) { + var settings = { + customSelector: null, + ignore: null + }; + + if(!document.getElementById('fit-vids-style')) { + // appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js + var head = document.head || document.getElementsByTagName('head')[0]; + var css = '.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}'; + var div = document.createElement("div"); + div.innerHTML = '

            x

            '; + head.appendChild(div.childNodes[1]); + } + + if ( options ) { + $.extend( settings, options ); + } + + return this.each(function(){ + var selectors = [ + 'iframe[src*="player.vimeo.com"]', + 'iframe[src*="youtube.com"]', + 'iframe[src*="youtube-nocookie.com"]', + 'iframe[src*="kickstarter.com"][src*="video.html"]', + 'object', + 'embed' + ]; + + if (settings.customSelector) { + selectors.push(settings.customSelector); + } + + var ignoreList = '.fitvidsignore'; + + if(settings.ignore) { + ignoreList = ignoreList + ', ' + settings.ignore; + } + + var $allVideos = $(this).find(selectors.join(',')); + $allVideos = $allVideos.not('object object'); // SwfObj conflict patch + $allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video. + + $allVideos.each(function(count){ + var $this = $(this); + if($this.parents(ignoreList).length > 0) { + return; // Disable FitVids on this video. + } + if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; } + if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width')))) + { + $this.attr('height', 9); + $this.attr('width', 16); + } + var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(), + width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(), + aspectRatio = height / width; + if(!$this.attr('id')){ + var videoID = 'fitvid' + count; + $this.attr('id', videoID); + } + $this.wrap('
            ').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+'%'); + $this.removeAttr('height').removeAttr('width'); + }); + }); + }; +// Works with either jQuery or Zepto +})( window.jQuery || window.Zepto ); diff --git a/assets/js/markerclusterer.js b/assets/js/markerclusterer.js new file mode 100755 index 00000000..979333d8 --- /dev/null +++ b/assets/js/markerclusterer.js @@ -0,0 +1,1642 @@ +/** + * @name MarkerClustererPlus for Google Maps V3 + * @version 2.1.1 [November 4, 2013] + * @author Gary Little + * @fileoverview + * The library creates and manages per-zoom-level clusters for large amounts of markers. + *

            + * This is an enhanced V3 implementation of the + * V2 MarkerClusterer by Xiaoxi Wu. It is based on the + * V3 MarkerClusterer port by Luke Mahe. MarkerClustererPlus was created by Gary Little. + *

            + * v2.0 release: MarkerClustererPlus v2.0 is backward compatible with MarkerClusterer v1.0. It + * adds support for the ignoreHidden, title, batchSizeIE, + * and calculator properties as well as support for four more events. It also allows + * greater control over the styling of the text that appears on the cluster marker. The + * documentation has been significantly improved and the overall code has been simplified and + * polished. Very large numbers of markers can now be managed without causing Javascript timeout + * errors on Internet Explorer. Note that the name of the clusterclick event has been + * deprecated. The new name is click, so please change your application code now. + */ + +/** + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +/** + * @name ClusterIconStyle + * @class This class represents the object for values in the styles array passed + * to the {@link MarkerClusterer} constructor. The element in this array that is used to + * style the cluster icon is determined by calling the calculator function. + * + * @property {string} url The URL of the cluster icon image file. Required. + * @property {number} height The display height (in pixels) of the cluster icon. Required. + * @property {number} width The display width (in pixels) of the cluster icon. Required. + * @property {Array} [anchorText] The position (in pixels) from the center of the cluster icon to + * where the text label is to be centered and drawn. The format is [yoffset, xoffset] + * where yoffset increases as you go down from center and xoffset + * increases to the right of center. The default is [0, 0]. + * @property {Array} [anchorIcon] The anchor position (in pixels) of the cluster icon. This is the + * spot on the cluster icon that is to be aligned with the cluster position. The format is + * [yoffset, xoffset] where yoffset increases as you go down and + * xoffset increases to the right of the top-left corner of the icon. The default + * anchor position is the center of the cluster icon. + * @property {string} [textColor="black"] The color of the label text shown on the + * cluster icon. + * @property {number} [textSize=11] The size (in pixels) of the label text shown on the + * cluster icon. + * @property {string} [textDecoration="none"] The value of the CSS text-decoration + * property for the label text shown on the cluster icon. + * @property {string} [fontWeight="bold"] The value of the CSS font-weight + * property for the label text shown on the cluster icon. + * @property {string} [fontStyle="normal"] The value of the CSS font-style + * property for the label text shown on the cluster icon. + * @property {string} [fontFamily="Arial,sans-serif"] The value of the CSS font-family + * property for the label text shown on the cluster icon. + * @property {string} [backgroundPosition="0 0"] The position of the cluster icon image + * within the image defined by url. The format is "xpos ypos" + * (the same format as for the CSS background-position property). You must set + * this property appropriately when the image defined by url represents a sprite + * containing multiple images. Note that the position must be specified in px units. + */ +/** + * @name ClusterIconInfo + * @class This class is an object containing general information about a cluster icon. This is + * the object that a calculator function returns. + * + * @property {string} text The text of the label to be shown on the cluster icon. + * @property {number} index The index plus 1 of the element in the styles + * array to be used to style the cluster icon. + * @property {string} title The tooltip to display when the mouse moves over the cluster icon. + * If this value is undefined or "", title is set to the + * value of the title property passed to the MarkerClusterer. + */ +/** + * A cluster icon. + * + * @constructor + * @extends google.maps.OverlayView + * @param {Cluster} cluster The cluster with which the icon is to be associated. + * @param {Array} [styles] An array of {@link ClusterIconStyle} defining the cluster icons + * to use for various cluster sizes. + * @private + */ +function ClusterIcon(cluster, styles) { + cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView); + + this.cluster_ = cluster; + this.className_ = cluster.getMarkerClusterer().getClusterClass(); + this.styles_ = styles; + this.center_ = null; + this.div_ = null; + this.sums_ = null; + this.visible_ = false; + + this.setMap(cluster.getMap()); // Note: this causes onAdd to be called +} + + +/** + * Adds the icon to the DOM. + */ +ClusterIcon.prototype.onAdd = function () { + var cClusterIcon = this; + var cMouseDownInCluster; + var cDraggingMapByCluster; + + this.div_ = document.createElement("div"); + this.div_.className = this.className_; + if (this.visible_) { + this.show(); + } + + this.getPanes().overlayMouseTarget.appendChild(this.div_); + + // Fix for Issue 157 + this.boundsChangedListener_ = google.maps.event.addListener(this.getMap(), "bounds_changed", function () { + cDraggingMapByCluster = cMouseDownInCluster; + }); + + google.maps.event.addDomListener(this.div_, "mousedown", function () { + cMouseDownInCluster = true; + cDraggingMapByCluster = false; + }); + + google.maps.event.addDomListener(this.div_, "click", function (e) { + cMouseDownInCluster = false; + if (!cDraggingMapByCluster) { + var theBounds; + var mz; + var mc = cClusterIcon.cluster_.getMarkerClusterer(); + /** + * This event is fired when a cluster marker is clicked. + * @name MarkerClusterer#click + * @param {Cluster} c The cluster that was clicked. + * @event + */ + google.maps.event.trigger(mc, "click", cClusterIcon.cluster_); + google.maps.event.trigger(mc, "clusterclick", cClusterIcon.cluster_); // deprecated name + + // The default click handler follows. Disable it by setting + // the zoomOnClick property to false. + if (mc.getZoomOnClick()) { + // Zoom into the cluster. + mz = mc.getMaxZoom(); + theBounds = cClusterIcon.cluster_.getBounds(); + mc.getMap().fitBounds(theBounds); + // There is a fix for Issue 170 here: + setTimeout(function () { + mc.getMap().fitBounds(theBounds); + // Don't zoom beyond the max zoom level + if (mz !== null && (mc.getMap().getZoom() > mz)) { + mc.getMap().setZoom(mz + 1); + } + }, 100); + } + + // Prevent event propagation to the map: + e.cancelBubble = true; + if (e.stopPropagation) { + e.stopPropagation(); + } + } + }); + + google.maps.event.addDomListener(this.div_, "mouseover", function () { + var mc = cClusterIcon.cluster_.getMarkerClusterer(); + /** + * This event is fired when the mouse moves over a cluster marker. + * @name MarkerClusterer#mouseover + * @param {Cluster} c The cluster that the mouse moved over. + * @event + */ + google.maps.event.trigger(mc, "mouseover", cClusterIcon.cluster_); + }); + + google.maps.event.addDomListener(this.div_, "mouseout", function () { + var mc = cClusterIcon.cluster_.getMarkerClusterer(); + /** + * This event is fired when the mouse moves out of a cluster marker. + * @name MarkerClusterer#mouseout + * @param {Cluster} c The cluster that the mouse moved out of. + * @event + */ + google.maps.event.trigger(mc, "mouseout", cClusterIcon.cluster_); + }); +}; + + +/** + * Removes the icon from the DOM. + */ +ClusterIcon.prototype.onRemove = function () { + if (this.div_ && this.div_.parentNode) { + this.hide(); + google.maps.event.removeListener(this.boundsChangedListener_); + google.maps.event.clearInstanceListeners(this.div_); + this.div_.parentNode.removeChild(this.div_); + this.div_ = null; + } +}; + + +/** + * Draws the icon. + */ +ClusterIcon.prototype.draw = function () { + if (this.visible_) { + var pos = this.getPosFromLatLng_(this.center_); + this.div_.style.top = pos.y + "px"; + this.div_.style.left = pos.x + "px"; + } +}; + + +/** + * Hides the icon. + */ +ClusterIcon.prototype.hide = function () { + if (this.div_) { + this.div_.style.display = "none"; + } + this.visible_ = false; +}; + + +/** + * Positions and shows the icon. + */ +ClusterIcon.prototype.show = function () { + if (this.div_) { + var img = ""; + // NOTE: values must be specified in px units + var bp = this.backgroundPosition_.split(" "); + var spriteH = parseInt(bp[0].trim(), 10); + var spriteV = parseInt(bp[1].trim(), 10); + var pos = this.getPosFromLatLng_(this.center_); + this.div_.style.cssText = this.createCss(pos); + img = ""; + this.div_.innerHTML = img + "

            " + this.sums_.text + "
            "; + if (typeof this.sums_.title === "undefined" || this.sums_.title === "") { + this.div_.title = this.cluster_.getMarkerClusterer().getTitle(); + } else { + this.div_.title = this.sums_.title; + } + this.div_.style.display = ""; + } + this.visible_ = true; +}; + + +/** + * Sets the icon styles to the appropriate element in the styles array. + * + * @param {ClusterIconInfo} sums The icon label text and styles index. + */ +ClusterIcon.prototype.useStyle = function (sums) { + this.sums_ = sums; + var index = Math.max(0, sums.index - 1); + index = Math.min(this.styles_.length - 1, index); + var style = this.styles_[index]; + this.url_ = style.url; + this.height_ = style.height; + this.width_ = style.width; + this.anchorText_ = style.anchorText || [0, 0]; + this.anchorIcon_ = style.anchorIcon || [parseInt(this.height_ / 2, 10), parseInt(this.width_ / 2, 10)]; + this.textColor_ = style.textColor || "black"; + this.textSize_ = style.textSize || 11; + this.textDecoration_ = style.textDecoration || "none"; + this.fontWeight_ = style.fontWeight || "bold"; + this.fontStyle_ = style.fontStyle || "normal"; + this.fontFamily_ = style.fontFamily || "Arial,sans-serif"; + this.backgroundPosition_ = style.backgroundPosition || "0 0"; +}; + + +/** + * Sets the position at which to center the icon. + * + * @param {google.maps.LatLng} center The latlng to set as the center. + */ +ClusterIcon.prototype.setCenter = function (center) { + this.center_ = center; +}; + + +/** + * Creates the cssText style parameter based on the position of the icon. + * + * @param {google.maps.Point} pos The position of the icon. + * @return {string} The CSS style text. + */ +ClusterIcon.prototype.createCss = function (pos) { + var style = []; + style.push("cursor: pointer;"); + style.push("position: absolute; top: " + pos.y + "px; left: " + pos.x + "px;"); + style.push("width: " + this.width_ + "px; height: " + this.height_ + "px;"); + return style.join(""); +}; + + +/** + * Returns the position at which to place the DIV depending on the latlng. + * + * @param {google.maps.LatLng} latlng The position in latlng. + * @return {google.maps.Point} The position in pixels. + */ +ClusterIcon.prototype.getPosFromLatLng_ = function (latlng) { + var pos = this.getProjection().fromLatLngToDivPixel(latlng); + pos.x -= this.anchorIcon_[1]; + pos.y -= this.anchorIcon_[0]; + pos.x = parseInt(pos.x, 10); + pos.y = parseInt(pos.y, 10); + return pos; +}; + + +/** + * Creates a single cluster that manages a group of proximate markers. + * Used internally, do not call this constructor directly. + * @constructor + * @param {MarkerClusterer} mc The MarkerClusterer object with which this + * cluster is associated. + */ +function Cluster(mc) { + this.markerClusterer_ = mc; + this.map_ = mc.getMap(); + this.gridSize_ = mc.getGridSize(); + this.minClusterSize_ = mc.getMinimumClusterSize(); + this.averageCenter_ = mc.getAverageCenter(); + this.markers_ = []; + this.center_ = null; + this.bounds_ = null; + this.clusterIcon_ = new ClusterIcon(this, mc.getStyles()); +} + + +/** + * Returns the number of markers managed by the cluster. You can call this from + * a click, mouseover, or mouseout event handler + * for the MarkerClusterer object. + * + * @return {number} The number of markers in the cluster. + */ +Cluster.prototype.getSize = function () { + return this.markers_.length; +}; + + +/** + * Returns the array of markers managed by the cluster. You can call this from + * a click, mouseover, or mouseout event handler + * for the MarkerClusterer object. + * + * @return {Array} The array of markers in the cluster. + */ +Cluster.prototype.getMarkers = function () { + return this.markers_; +}; + + +/** + * Returns the center of the cluster. You can call this from + * a click, mouseover, or mouseout event handler + * for the MarkerClusterer object. + * + * @return {google.maps.LatLng} The center of the cluster. + */ +Cluster.prototype.getCenter = function () { + return this.center_; +}; + + +/** + * Returns the map with which the cluster is associated. + * + * @return {google.maps.Map} The map. + * @ignore + */ +Cluster.prototype.getMap = function () { + return this.map_; +}; + + +/** + * Returns the MarkerClusterer object with which the cluster is associated. + * + * @return {MarkerClusterer} The associated marker clusterer. + * @ignore + */ +Cluster.prototype.getMarkerClusterer = function () { + return this.markerClusterer_; +}; + + +/** + * Returns the bounds of the cluster. + * + * @return {google.maps.LatLngBounds} the cluster bounds. + * @ignore + */ +Cluster.prototype.getBounds = function () { + var i; + var bounds = new google.maps.LatLngBounds(this.center_, this.center_); + var markers = this.getMarkers(); + for (i = 0; i < markers.length; i++) { + bounds.extend(markers[i].getPosition()); + } + return bounds; +}; + + +/** + * Removes the cluster from the map. + * + * @ignore + */ +Cluster.prototype.remove = function () { + this.clusterIcon_.setMap(null); + this.markers_ = []; + delete this.markers_; +}; + + +/** + * Adds a marker to the cluster. + * + * @param {google.maps.Marker} marker The marker to be added. + * @return {boolean} True if the marker was added. + * @ignore + */ +Cluster.prototype.addMarker = function (marker) { + var i; + var mCount; + var mz; + + if (this.isMarkerAlreadyAdded_(marker)) { + return false; + } + + if (!this.center_) { + this.center_ = marker.getPosition(); + this.calculateBounds_(); + } else { + if (this.averageCenter_) { + var l = this.markers_.length + 1; + var lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l; + var lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l; + this.center_ = new google.maps.LatLng(lat, lng); + this.calculateBounds_(); + } + } + + marker.isAdded = true; + this.markers_.push(marker); + + mCount = this.markers_.length; + mz = this.markerClusterer_.getMaxZoom(); + if (mz !== null && this.map_.getZoom() > mz) { + // Zoomed in past max zoom, so show the marker. + if (marker.getMap() !== this.map_) { + marker.setMap(this.map_); + } + } else if (mCount < this.minClusterSize_) { + // Min cluster size not reached so show the marker. + if (marker.getMap() !== this.map_) { + marker.setMap(this.map_); + } + } else if (mCount === this.minClusterSize_) { + // Hide the markers that were showing. + for (i = 0; i < mCount; i++) { + this.markers_[i].setMap(null); + } + } else { + marker.setMap(null); + } + + this.updateIcon_(); + return true; +}; + + +/** + * Determines if a marker lies within the cluster's bounds. + * + * @param {google.maps.Marker} marker The marker to check. + * @return {boolean} True if the marker lies in the bounds. + * @ignore + */ +Cluster.prototype.isMarkerInClusterBounds = function (marker) { + return this.bounds_.contains(marker.getPosition()); +}; + + +/** + * Calculates the extended bounds of the cluster with the grid. + */ +Cluster.prototype.calculateBounds_ = function () { + var bounds = new google.maps.LatLngBounds(this.center_, this.center_); + this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds); +}; + + +/** + * Updates the cluster icon. + */ +Cluster.prototype.updateIcon_ = function () { + var mCount = this.markers_.length; + var mz = this.markerClusterer_.getMaxZoom(); + + if (mz !== null && this.map_.getZoom() > mz) { + this.clusterIcon_.hide(); + return; + } + + if (mCount < this.minClusterSize_) { + // Min cluster size not yet reached. + this.clusterIcon_.hide(); + return; + } + + var numStyles = this.markerClusterer_.getStyles().length; + var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles); + this.clusterIcon_.setCenter(this.center_); + this.clusterIcon_.useStyle(sums); + this.clusterIcon_.show(); +}; + + +/** + * Determines if a marker has already been added to the cluster. + * + * @param {google.maps.Marker} marker The marker to check. + * @return {boolean} True if the marker has already been added. + */ +Cluster.prototype.isMarkerAlreadyAdded_ = function (marker) { + var i; + if (this.markers_.indexOf) { + return this.markers_.indexOf(marker) !== -1; + } else { + for (i = 0; i < this.markers_.length; i++) { + if (marker === this.markers_[i]) { + return true; + } + } + } + return false; +}; + + +/** + * @name MarkerClustererOptions + * @class This class represents the optional parameter passed to + * the {@link MarkerClusterer} constructor. + * @property {number} [gridSize=60] The grid size of a cluster in pixels. The grid is a square. + * @property {number} [maxZoom=null] The maximum zoom level at which clustering is enabled or + * null if clustering is to be enabled at all zoom levels. + * @property {boolean} [zoomOnClick=true] Whether to zoom the map when a cluster marker is + * clicked. You may want to set this to false if you have installed a handler + * for the click event and it deals with zooming on its own. + * @property {boolean} [averageCenter=false] Whether the position of a cluster marker should be + * the average position of all markers in the cluster. If set to false, the + * cluster marker is positioned at the location of the first marker added to the cluster. + * @property {number} [minimumClusterSize=2] The minimum number of markers needed in a cluster + * before the markers are hidden and a cluster marker appears. + * @property {boolean} [ignoreHidden=false] Whether to ignore hidden markers in clusters. You + * may want to set this to true to ensure that hidden markers are not included + * in the marker count that appears on a cluster marker (this count is the value of the + * text property of the result returned by the default calculator). + * If set to true and you change the visibility of a marker being clustered, be + * sure to also call MarkerClusterer.repaint(). + * @property {string} [title=""] The tooltip to display when the mouse moves over a cluster + * marker. (Alternatively, you can use a custom calculator function to specify a + * different tooltip for each cluster marker.) + * @property {function} [calculator=MarkerClusterer.CALCULATOR] The function used to determine + * the text to be displayed on a cluster marker and the index indicating which style to use + * for the cluster marker. The input parameters for the function are (1) the array of markers + * represented by a cluster marker and (2) the number of cluster icon styles. It returns a + * {@link ClusterIconInfo} object. The default calculator returns a + * text property which is the number of markers in the cluster and an + * index property which is one higher than the lowest integer such that + * 10^i exceeds the number of markers in the cluster, or the size of the styles + * array, whichever is less. The styles array element used has an index of + * index minus 1. For example, the default calculator returns a + * text value of "125" and an index of 3 + * for a cluster icon representing 125 markers so the element used in the styles + * array is 2. A calculator may also return a title + * property that contains the text of the tooltip to be used for the cluster marker. If + * title is not defined, the tooltip is set to the value of the title + * property for the MarkerClusterer. + * @property {string} [clusterClass="cluster"] The name of the CSS class defining general styles + * for the cluster markers. Use this class to define CSS styles that are not set up by the code + * that processes the styles array. + * @property {Array} [styles] An array of {@link ClusterIconStyle} elements defining the styles + * of the cluster markers to be used. The element to be used to style a given cluster marker + * is determined by the function defined by the calculator property. + * The default is an array of {@link ClusterIconStyle} elements whose properties are derived + * from the values for imagePath, imageExtension, and + * imageSizes. + * @property {boolean} [enableRetinaIcons=false] Whether to allow the use of cluster icons that + * have sizes that are some multiple (typically double) of their actual display size. Icons such + * as these look better when viewed on high-resolution monitors such as Apple's Retina displays. + * Note: if this property is true, sprites cannot be used as cluster icons. + * @property {number} [batchSize=MarkerClusterer.BATCH_SIZE] Set this property to the + * number of markers to be processed in a single batch when using a browser other than + * Internet Explorer (for Internet Explorer, use the batchSizeIE property instead). + * @property {number} [batchSizeIE=MarkerClusterer.BATCH_SIZE_IE] When Internet Explorer is + * being used, markers are processed in several batches with a small delay inserted between + * each batch in an attempt to avoid Javascript timeout errors. Set this property to the + * number of markers to be processed in a single batch; select as high a number as you can + * without causing a timeout error in the browser. This number might need to be as low as 100 + * if 15,000 markers are being managed, for example. + * @property {string} [imagePath=MarkerClusterer.IMAGE_PATH] + * The full URL of the root name of the group of image files to use for cluster icons. + * The complete file name is of the form imagePathn.imageExtension + * where n is the image file number (1, 2, etc.). + * @property {string} [imageExtension=MarkerClusterer.IMAGE_EXTENSION] + * The extension name for the cluster icon image files (e.g., "png" or + * "jpg"). + * @property {Array} [imageSizes=MarkerClusterer.IMAGE_SIZES] + * An array of numbers containing the widths of the group of + * imagePathn.imageExtension image files. + * (The images are assumed to be square.) + */ +/** + * Creates a MarkerClusterer object with the options specified in {@link MarkerClustererOptions}. + * @constructor + * @extends google.maps.OverlayView + * @param {google.maps.Map} map The Google map to attach to. + * @param {Array.} [opt_markers] The markers to be added to the cluster. + * @param {MarkerClustererOptions} [opt_options] The optional parameters. + */ +function MarkerClusterer(map, opt_markers, opt_options) { + // MarkerClusterer implements google.maps.OverlayView interface. We use the + // extend function to extend MarkerClusterer with google.maps.OverlayView + // because it might not always be available when the code is defined so we + // look for it at the last possible moment. If it doesn't exist now then + // there is no point going ahead :) + this.extend(MarkerClusterer, google.maps.OverlayView); + + opt_markers = opt_markers || []; + opt_options = opt_options || {}; + + this.markers_ = []; + this.clusters_ = []; + this.listeners_ = []; + this.activeMap_ = null; + this.ready_ = false; + + this.gridSize_ = opt_options.gridSize || 60; + this.minClusterSize_ = opt_options.minimumClusterSize || 2; + this.maxZoom_ = opt_options.maxZoom || null; + this.styles_ = opt_options.styles || []; + this.title_ = opt_options.title || ""; + this.zoomOnClick_ = true; + if (opt_options.zoomOnClick !== undefined) { + this.zoomOnClick_ = opt_options.zoomOnClick; + } + this.averageCenter_ = false; + if (opt_options.averageCenter !== undefined) { + this.averageCenter_ = opt_options.averageCenter; + } + this.ignoreHidden_ = false; + if (opt_options.ignoreHidden !== undefined) { + this.ignoreHidden_ = opt_options.ignoreHidden; + } + this.enableRetinaIcons_ = false; + if (opt_options.enableRetinaIcons !== undefined) { + this.enableRetinaIcons_ = opt_options.enableRetinaIcons; + } + this.imagePath_ = opt_options.imagePath || MarkerClusterer.IMAGE_PATH; + this.imageExtension_ = opt_options.imageExtension || MarkerClusterer.IMAGE_EXTENSION; + this.imageSizes_ = opt_options.imageSizes || MarkerClusterer.IMAGE_SIZES; + this.calculator_ = opt_options.calculator || MarkerClusterer.CALCULATOR; + this.batchSize_ = opt_options.batchSize || MarkerClusterer.BATCH_SIZE; + this.batchSizeIE_ = opt_options.batchSizeIE || MarkerClusterer.BATCH_SIZE_IE; + this.clusterClass_ = opt_options.clusterClass || "cluster"; + + if (navigator.userAgent.toLowerCase().indexOf("msie") !== -1) { + // Try to avoid IE timeout when processing a huge number of markers: + this.batchSize_ = this.batchSizeIE_; + } + + this.setupStyles_(); + + this.addMarkers(opt_markers, true); + this.setMap(map); // Note: this causes onAdd to be called +} + + +/** + * Implementation of the onAdd interface method. + * @ignore + */ +MarkerClusterer.prototype.onAdd = function () { + var cMarkerClusterer = this; + + this.activeMap_ = this.getMap(); + this.ready_ = true; + + this.repaint(); + + // Add the map event listeners + this.listeners_ = [ + google.maps.event.addListener(this.getMap(), "zoom_changed", function () { + cMarkerClusterer.resetViewport_(false); + // Workaround for this Google bug: when map is at level 0 and "-" of + // zoom slider is clicked, a "zoom_changed" event is fired even though + // the map doesn't zoom out any further. In this situation, no "idle" + // event is triggered so the cluster markers that have been removed + // do not get redrawn. Same goes for a zoom in at maxZoom. + if (this.getZoom() === (this.get("minZoom") || 0) || this.getZoom() === this.get("maxZoom")) { + google.maps.event.trigger(this, "idle"); + } + }), + google.maps.event.addListener(this.getMap(), "idle", function () { + cMarkerClusterer.redraw_(); + }) + ]; +}; + + +/** + * Implementation of the onRemove interface method. + * Removes map event listeners and all cluster icons from the DOM. + * All managed markers are also put back on the map. + * @ignore + */ +MarkerClusterer.prototype.onRemove = function () { + var i; + + // Put all the managed markers back on the map: + for (i = 0; i < this.markers_.length; i++) { + if (this.markers_[i].getMap() !== this.activeMap_) { + this.markers_[i].setMap(this.activeMap_); + } + } + + // Remove all clusters: + for (i = 0; i < this.clusters_.length; i++) { + this.clusters_[i].remove(); + } + this.clusters_ = []; + + // Remove map event listeners: + for (i = 0; i < this.listeners_.length; i++) { + google.maps.event.removeListener(this.listeners_[i]); + } + this.listeners_ = []; + + this.activeMap_ = null; + this.ready_ = false; +}; + + +/** + * Implementation of the draw interface method. + * @ignore + */ +MarkerClusterer.prototype.draw = function () {}; + + +/** + * Sets up the styles object. + */ +MarkerClusterer.prototype.setupStyles_ = function () { + var i, size; + if (this.styles_.length > 0) { + return; + } + + for (i = 0; i < this.imageSizes_.length; i++) { + size = this.imageSizes_[i]; + this.styles_.push({ + url: this.imagePath_ + (i + 1) + "." + this.imageExtension_, + height: size, + width: size + }); + } +}; + + +/** + * Fits the map to the bounds of the markers managed by the clusterer. + */ +MarkerClusterer.prototype.fitMapToMarkers = function () { + var i; + var markers = this.getMarkers(); + var bounds = new google.maps.LatLngBounds(); + for (i = 0; i < markers.length; i++) { + bounds.extend(markers[i].getPosition()); + } + + this.getMap().fitBounds(bounds); +}; + + +/** + * Returns the value of the gridSize property. + * + * @return {number} The grid size. + */ +MarkerClusterer.prototype.getGridSize = function () { + return this.gridSize_; +}; + + +/** + * Sets the value of the gridSize property. + * + * @param {number} gridSize The grid size. + */ +MarkerClusterer.prototype.setGridSize = function (gridSize) { + this.gridSize_ = gridSize; +}; + + +/** + * Returns the value of the minimumClusterSize property. + * + * @return {number} The minimum cluster size. + */ +MarkerClusterer.prototype.getMinimumClusterSize = function () { + return this.minClusterSize_; +}; + +/** + * Sets the value of the minimumClusterSize property. + * + * @param {number} minimumClusterSize The minimum cluster size. + */ +MarkerClusterer.prototype.setMinimumClusterSize = function (minimumClusterSize) { + this.minClusterSize_ = minimumClusterSize; +}; + + +/** + * Returns the value of the maxZoom property. + * + * @return {number} The maximum zoom level. + */ +MarkerClusterer.prototype.getMaxZoom = function () { + return this.maxZoom_; +}; + + +/** + * Sets the value of the maxZoom property. + * + * @param {number} maxZoom The maximum zoom level. + */ +MarkerClusterer.prototype.setMaxZoom = function (maxZoom) { + this.maxZoom_ = maxZoom; +}; + + +/** + * Returns the value of the styles property. + * + * @return {Array} The array of styles defining the cluster markers to be used. + */ +MarkerClusterer.prototype.getStyles = function () { + return this.styles_; +}; + + +/** + * Sets the value of the styles property. + * + * @param {Array.} styles The array of styles to use. + */ +MarkerClusterer.prototype.setStyles = function (styles) { + this.styles_ = styles; +}; + + +/** + * Returns the value of the title property. + * + * @return {string} The content of the title text. + */ +MarkerClusterer.prototype.getTitle = function () { + return this.title_; +}; + + +/** + * Sets the value of the title property. + * + * @param {string} title The value of the title property. + */ +MarkerClusterer.prototype.setTitle = function (title) { + this.title_ = title; +}; + + +/** + * Returns the value of the zoomOnClick property. + * + * @return {boolean} True if zoomOnClick property is set. + */ +MarkerClusterer.prototype.getZoomOnClick = function () { + return this.zoomOnClick_; +}; + + +/** + * Sets the value of the zoomOnClick property. + * + * @param {boolean} zoomOnClick The value of the zoomOnClick property. + */ +MarkerClusterer.prototype.setZoomOnClick = function (zoomOnClick) { + this.zoomOnClick_ = zoomOnClick; +}; + + +/** + * Returns the value of the averageCenter property. + * + * @return {boolean} True if averageCenter property is set. + */ +MarkerClusterer.prototype.getAverageCenter = function () { + return this.averageCenter_; +}; + + +/** + * Sets the value of the averageCenter property. + * + * @param {boolean} averageCenter The value of the averageCenter property. + */ +MarkerClusterer.prototype.setAverageCenter = function (averageCenter) { + this.averageCenter_ = averageCenter; +}; + + +/** + * Returns the value of the ignoreHidden property. + * + * @return {boolean} True if ignoreHidden property is set. + */ +MarkerClusterer.prototype.getIgnoreHidden = function () { + return this.ignoreHidden_; +}; + + +/** + * Sets the value of the ignoreHidden property. + * + * @param {boolean} ignoreHidden The value of the ignoreHidden property. + */ +MarkerClusterer.prototype.setIgnoreHidden = function (ignoreHidden) { + this.ignoreHidden_ = ignoreHidden; +}; + + +/** + * Returns the value of the enableRetinaIcons property. + * + * @return {boolean} True if enableRetinaIcons property is set. + */ +MarkerClusterer.prototype.getEnableRetinaIcons = function () { + return this.enableRetinaIcons_; +}; + + +/** + * Sets the value of the enableRetinaIcons property. + * + * @param {boolean} enableRetinaIcons The value of the enableRetinaIcons property. + */ +MarkerClusterer.prototype.setEnableRetinaIcons = function (enableRetinaIcons) { + this.enableRetinaIcons_ = enableRetinaIcons; +}; + + +/** + * Returns the value of the imageExtension property. + * + * @return {string} The value of the imageExtension property. + */ +MarkerClusterer.prototype.getImageExtension = function () { + return this.imageExtension_; +}; + + +/** + * Sets the value of the imageExtension property. + * + * @param {string} imageExtension The value of the imageExtension property. + */ +MarkerClusterer.prototype.setImageExtension = function (imageExtension) { + this.imageExtension_ = imageExtension; +}; + + +/** + * Returns the value of the imagePath property. + * + * @return {string} The value of the imagePath property. + */ +MarkerClusterer.prototype.getImagePath = function () { + return this.imagePath_; +}; + + +/** + * Sets the value of the imagePath property. + * + * @param {string} imagePath The value of the imagePath property. + */ +MarkerClusterer.prototype.setImagePath = function (imagePath) { + this.imagePath_ = imagePath; +}; + + +/** + * Returns the value of the imageSizes property. + * + * @return {Array} The value of the imageSizes property. + */ +MarkerClusterer.prototype.getImageSizes = function () { + return this.imageSizes_; +}; + + +/** + * Sets the value of the imageSizes property. + * + * @param {Array} imageSizes The value of the imageSizes property. + */ +MarkerClusterer.prototype.setImageSizes = function (imageSizes) { + this.imageSizes_ = imageSizes; +}; + + +/** + * Returns the value of the calculator property. + * + * @return {function} the value of the calculator property. + */ +MarkerClusterer.prototype.getCalculator = function () { + return this.calculator_; +}; + + +/** + * Sets the value of the calculator property. + * + * @param {function(Array., number)} calculator The value + * of the calculator property. + */ +MarkerClusterer.prototype.setCalculator = function (calculator) { + this.calculator_ = calculator; +}; + + +/** + * Returns the value of the batchSizeIE property. + * + * @return {number} the value of the batchSizeIE property. + */ +MarkerClusterer.prototype.getBatchSizeIE = function () { + return this.batchSizeIE_; +}; + + +/** + * Sets the value of the batchSizeIE property. + * + * @param {number} batchSizeIE The value of the batchSizeIE property. + */ +MarkerClusterer.prototype.setBatchSizeIE = function (batchSizeIE) { + this.batchSizeIE_ = batchSizeIE; +}; + + +/** + * Returns the value of the clusterClass property. + * + * @return {string} the value of the clusterClass property. + */ +MarkerClusterer.prototype.getClusterClass = function () { + return this.clusterClass_; +}; + + +/** + * Sets the value of the clusterClass property. + * + * @param {string} clusterClass The value of the clusterClass property. + */ +MarkerClusterer.prototype.setClusterClass = function (clusterClass) { + this.clusterClass_ = clusterClass; +}; + + +/** + * Returns the array of markers managed by the clusterer. + * + * @return {Array} The array of markers managed by the clusterer. + */ +MarkerClusterer.prototype.getMarkers = function () { + return this.markers_; +}; + + +/** + * Returns the number of markers managed by the clusterer. + * + * @return {number} The number of markers. + */ +MarkerClusterer.prototype.getTotalMarkers = function () { + return this.markers_.length; +}; + + +/** + * Returns the current array of clusters formed by the clusterer. + * + * @return {Array} The array of clusters formed by the clusterer. + */ +MarkerClusterer.prototype.getClusters = function () { + return this.clusters_; +}; + + +/** + * Returns the number of clusters formed by the clusterer. + * + * @return {number} The number of clusters formed by the clusterer. + */ +MarkerClusterer.prototype.getTotalClusters = function () { + return this.clusters_.length; +}; + + +/** + * Adds a marker to the clusterer. The clusters are redrawn unless + * opt_nodraw is set to true. + * + * @param {google.maps.Marker} marker The marker to add. + * @param {boolean} [opt_nodraw] Set to true to prevent redrawing. + */ +MarkerClusterer.prototype.addMarker = function (marker, opt_nodraw) { + this.pushMarkerTo_(marker); + if (!opt_nodraw) { + this.redraw_(); + } +}; + + +/** + * Adds an array of markers to the clusterer. The clusters are redrawn unless + * opt_nodraw is set to true. + * + * @param {Array.} markers The markers to add. + * @param {boolean} [opt_nodraw] Set to true to prevent redrawing. + */ +MarkerClusterer.prototype.addMarkers = function (markers, opt_nodraw) { + var key; + for (key in markers) { + if (markers.hasOwnProperty(key)) { + this.pushMarkerTo_(markers[key]); + } + } + if (!opt_nodraw) { + this.redraw_(); + } +}; + + +/** + * Pushes a marker to the clusterer. + * + * @param {google.maps.Marker} marker The marker to add. + */ +MarkerClusterer.prototype.pushMarkerTo_ = function (marker) { + // If the marker is draggable add a listener so we can update the clusters on the dragend: + if (marker.getDraggable()) { + var cMarkerClusterer = this; + google.maps.event.addListener(marker, "dragend", function () { + if (cMarkerClusterer.ready_) { + this.isAdded = false; + cMarkerClusterer.repaint(); + } + }); + } + marker.isAdded = false; + this.markers_.push(marker); +}; + + +/** + * Removes a marker from the cluster. The clusters are redrawn unless + * opt_nodraw is set to true. Returns true if the + * marker was removed from the clusterer. + * + * @param {google.maps.Marker} marker The marker to remove. + * @param {boolean} [opt_nodraw] Set to true to prevent redrawing. + * @return {boolean} True if the marker was removed from the clusterer. + */ +MarkerClusterer.prototype.removeMarker = function (marker, opt_nodraw) { + var removed = this.removeMarker_(marker); + + if (!opt_nodraw && removed) { + this.repaint(); + } + + return removed; +}; + + +/** + * Removes an array of markers from the cluster. The clusters are redrawn unless + * opt_nodraw is set to true. Returns true if markers + * were removed from the clusterer. + * + * @param {Array.} markers The markers to remove. + * @param {boolean} [opt_nodraw] Set to true to prevent redrawing. + * @return {boolean} True if markers were removed from the clusterer. + */ +MarkerClusterer.prototype.removeMarkers = function (markers, opt_nodraw) { + var i, r; + var removed = false; + + for (i = 0; i < markers.length; i++) { + r = this.removeMarker_(markers[i]); + removed = removed || r; + } + + if (!opt_nodraw && removed) { + this.repaint(); + } + + return removed; +}; + + +/** + * Removes a marker and returns true if removed, false if not. + * + * @param {google.maps.Marker} marker The marker to remove + * @return {boolean} Whether the marker was removed or not + */ +MarkerClusterer.prototype.removeMarker_ = function (marker) { + var i; + var index = -1; + if (this.markers_.indexOf) { + index = this.markers_.indexOf(marker); + } else { + for (i = 0; i < this.markers_.length; i++) { + if (marker === this.markers_[i]) { + index = i; + break; + } + } + } + + if (index === -1) { + // Marker is not in our list of markers, so do nothing: + return false; + } + + marker.setMap(null); + this.markers_.splice(index, 1); // Remove the marker from the list of managed markers + return true; +}; + + +/** + * Removes all clusters and markers from the map and also removes all markers + * managed by the clusterer. + */ +MarkerClusterer.prototype.clearMarkers = function () { + this.resetViewport_(true); + this.markers_ = []; +}; + + +/** + * Recalculates and redraws all the marker clusters from scratch. + * Call this after changing any properties. + */ +MarkerClusterer.prototype.repaint = function () { + var oldClusters = this.clusters_.slice(); + this.clusters_ = []; + this.resetViewport_(false); + this.redraw_(); + + // Remove the old clusters. + // Do it in a timeout to prevent blinking effect. + setTimeout(function () { + var i; + for (i = 0; i < oldClusters.length; i++) { + oldClusters[i].remove(); + } + }, 0); +}; + + +/** + * Returns the current bounds extended by the grid size. + * + * @param {google.maps.LatLngBounds} bounds The bounds to extend. + * @return {google.maps.LatLngBounds} The extended bounds. + * @ignore + */ +MarkerClusterer.prototype.getExtendedBounds = function (bounds) { + var projection = this.getProjection(); + + // Turn the bounds into latlng. + var tr = new google.maps.LatLng(bounds.getNorthEast().lat(), + bounds.getNorthEast().lng()); + var bl = new google.maps.LatLng(bounds.getSouthWest().lat(), + bounds.getSouthWest().lng()); + + // Convert the points to pixels and the extend out by the grid size. + var trPix = projection.fromLatLngToDivPixel(tr); + trPix.x += this.gridSize_; + trPix.y -= this.gridSize_; + + var blPix = projection.fromLatLngToDivPixel(bl); + blPix.x -= this.gridSize_; + blPix.y += this.gridSize_; + + // Convert the pixel points back to LatLng + var ne = projection.fromDivPixelToLatLng(trPix); + var sw = projection.fromDivPixelToLatLng(blPix); + + // Extend the bounds to contain the new bounds. + bounds.extend(ne); + bounds.extend(sw); + + return bounds; +}; + + +/** + * Redraws all the clusters. + */ +MarkerClusterer.prototype.redraw_ = function () { + this.createClusters_(0); +}; + + +/** + * Removes all clusters from the map. The markers are also removed from the map + * if opt_hide is set to true. + * + * @param {boolean} [opt_hide] Set to true to also remove the markers + * from the map. + */ +MarkerClusterer.prototype.resetViewport_ = function (opt_hide) { + var i, marker; + // Remove all the clusters + for (i = 0; i < this.clusters_.length; i++) { + this.clusters_[i].remove(); + } + this.clusters_ = []; + + // Reset the markers to not be added and to be removed from the map. + for (i = 0; i < this.markers_.length; i++) { + marker = this.markers_[i]; + marker.isAdded = false; + if (opt_hide) { + marker.setMap(null); + } + } +}; + + +/** + * Calculates the distance between two latlng locations in km. + * + * @param {google.maps.LatLng} p1 The first lat lng point. + * @param {google.maps.LatLng} p2 The second lat lng point. + * @return {number} The distance between the two points in km. + * @see http://www.movable-type.co.uk/scripts/latlong.html +*/ +MarkerClusterer.prototype.distanceBetweenPoints_ = function (p1, p2) { + var R = 6371; // Radius of the Earth in km + var dLat = (p2.lat() - p1.lat()) * Math.PI / 180; + var dLon = (p2.lng() - p1.lng()) * Math.PI / 180; + var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) * + Math.sin(dLon / 2) * Math.sin(dLon / 2); + var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + var d = R * c; + return d; +}; + + +/** + * Determines if a marker is contained in a bounds. + * + * @param {google.maps.Marker} marker The marker to check. + * @param {google.maps.LatLngBounds} bounds The bounds to check against. + * @return {boolean} True if the marker is in the bounds. + */ +MarkerClusterer.prototype.isMarkerInBounds_ = function (marker, bounds) { + return bounds.contains(marker.getPosition()); +}; + + +/** + * Adds a marker to a cluster, or creates a new cluster. + * + * @param {google.maps.Marker} marker The marker to add. + */ +MarkerClusterer.prototype.addToClosestCluster_ = function (marker) { + var i, d, cluster, center; + var distance = 40000; // Some large number + var clusterToAddTo = null; + for (i = 0; i < this.clusters_.length; i++) { + cluster = this.clusters_[i]; + center = cluster.getCenter(); + if (center) { + d = this.distanceBetweenPoints_(center, marker.getPosition()); + if (d < distance) { + distance = d; + clusterToAddTo = cluster; + } + } + } + + if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) { + clusterToAddTo.addMarker(marker); + } else { + cluster = new Cluster(this); + cluster.addMarker(marker); + this.clusters_.push(cluster); + } +}; + + +/** + * Creates the clusters. This is done in batches to avoid timeout errors + * in some browsers when there is a huge number of markers. + * + * @param {number} iFirst The index of the first marker in the batch of + * markers to be added to clusters. + */ +MarkerClusterer.prototype.createClusters_ = function (iFirst) { + var i, marker; + var mapBounds; + var cMarkerClusterer = this; + if (!this.ready_) { + return; + } + + // Cancel previous batch processing if we're working on the first batch: + if (iFirst === 0) { + /** + * This event is fired when the MarkerClusterer begins + * clustering markers. + * @name MarkerClusterer#clusteringbegin + * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered. + * @event + */ + google.maps.event.trigger(this, "clusteringbegin", this); + + if (typeof this.timerRefStatic !== "undefined") { + clearTimeout(this.timerRefStatic); + delete this.timerRefStatic; + } + } + + // Get our current map view bounds. + // Create a new bounds object so we don't affect the map. + // + // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug: + if (this.getMap().getZoom() > 3) { + mapBounds = new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(), + this.getMap().getBounds().getNorthEast()); + } else { + mapBounds = new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472, -178.48388434375), new google.maps.LatLng(-85.08136444384544, 178.00048865625)); + } + var bounds = this.getExtendedBounds(mapBounds); + + var iLast = Math.min(iFirst + this.batchSize_, this.markers_.length); + + for (i = iFirst; i < iLast; i++) { + marker = this.markers_[i]; + if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) { + if (!this.ignoreHidden_ || (this.ignoreHidden_ && marker.getVisible())) { + this.addToClosestCluster_(marker); + } + } + } + + if (iLast < this.markers_.length) { + this.timerRefStatic = setTimeout(function () { + cMarkerClusterer.createClusters_(iLast); + }, 0); + } else { + delete this.timerRefStatic; + + /** + * This event is fired when the MarkerClusterer stops + * clustering markers. + * @name MarkerClusterer#clusteringend + * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered. + * @event + */ + google.maps.event.trigger(this, "clusteringend", this); + } +}; + + +/** + * Extends an object's prototype by another's. + * + * @param {Object} obj1 The object to be extended. + * @param {Object} obj2 The object to extend with. + * @return {Object} The new extended object. + * @ignore + */ +MarkerClusterer.prototype.extend = function (obj1, obj2) { + return (function (object) { + var property; + for (property in object.prototype) { + this.prototype[property] = object.prototype[property]; + } + return this; + }).apply(obj1, [obj2]); +}; + + +/** + * The default function for determining the label text and style + * for a cluster icon. + * + * @param {Array.} markers The array of markers represented by the cluster. + * @param {number} numStyles The number of marker styles available. + * @return {ClusterIconInfo} The information resource for the cluster. + * @constant + * @ignore + */ +MarkerClusterer.CALCULATOR = function (markers, numStyles) { + var index = 0; + var title = ""; + var count = markers.length.toString(); + + var dv = count; + while (dv !== 0) { + dv = parseInt(dv / 10, 10); + index++; + } + + index = Math.min(index, numStyles); + return { + text: count, + index: index, + title: title + }; +}; + + +/** + * The number of markers to process in one batch. + * + * @type {number} + * @constant + */ +MarkerClusterer.BATCH_SIZE = 2000; + + +/** + * The number of markers to process in one batch (IE only). + * + * @type {number} + * @constant + */ +MarkerClusterer.BATCH_SIZE_IE = 500; + + +/** + * The default root name for the marker cluster images. + * + * @type {string} + * @constant + */ +MarkerClusterer.IMAGE_PATH = "http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclustererplus/images/m"; + + +/** + * The default extension name for the marker cluster images. + * + * @type {string} + * @constant + */ +MarkerClusterer.IMAGE_EXTENSION = "png"; + + +/** + * The default array of sizes for the marker cluster images. + * + * @type {Array.} + * @constant + */ +MarkerClusterer.IMAGE_SIZES = [53, 56, 66, 78, 90]; + +if (typeof String.prototype.trim !== 'function') { + /** + * IE hack since trim() doesn't exist in all browsers + * @return {string} The string with removed whitespace + */ + String.prototype.trim = function() { + return this.replace(/^\s+|\s+$/g, ''); + } +} \ No newline at end of file diff --git a/assets/js/mortgage.js b/assets/js/mortgage.js new file mode 100755 index 00000000..f1a9c3dc --- /dev/null +++ b/assets/js/mortgage.js @@ -0,0 +1,51 @@ +(function ($) { + 'use strict' + $(document).ready(function ($) { + if (typeof opalestate_mortgage !== 'undefined') { + var currency = opalestate_mortgage.currency + var loan_amount_text = opalestate_mortgage.loan_amount_text + var your_payment_text = opalestate_mortgage.your_payment_text + + $('.opalestate-mortgage-form input').change(function (e) { + e.preventDefault() + var $el = $(this), + $widget = $el.closest('.opalestate-mortgage-widget-wrap') + + var sale_price = $widget.find('input[name="sale_price"]').val() + var precent_down = $widget.find('input[name="deposit"]').val() + var years = parseInt($widget.find('input[name="years"]').val(), 10) + var interest_rate = parseFloat($widget.find('input[name="interest_rate"]').val(), 10) / 100 + + var interest_rate_month = interest_rate / 12 + var number_of_payments_month = years * 12 + + var loan_amount = sale_price - precent_down + var monthly_payment = parseFloat( + (loan_amount * interest_rate_month) / (1 - Math.pow(1 + interest_rate_month, -number_of_payments_month))) + .toFixed(2) + + if (monthly_payment === 'NaN') { + monthly_payment = 0 + } + + var total = parseFloat(precent_down) + parseFloat(monthly_payment * number_of_payments_month) + var price_percent = loan_amount / total * 100 + var deposit_percent = precent_down / total * 100 + + $widget.find('.opalestate-monthly-value').html(currency + monthly_payment) + + $widget.find('.opalestate-loan-amount-value').html(currency + loan_amount) + + $widget.find('.opalestate-mortgage-chart-svg').html( + '' + + '' + + '' + + '' + + '' + + '' + ) + }) + } + }) +})(jQuery) diff --git a/assets/js/nouislider.min.js b/assets/js/nouislider.min.js new file mode 100755 index 00000000..62506275 --- /dev/null +++ b/assets/js/nouislider.min.js @@ -0,0 +1,340 @@ +(function(){ + + 'use strict'; + +var +/** @const */ FormatOptions = [ + 'decimals', + 'thousand', + 'mark', + 'prefix', + 'postfix', + 'encoder', + 'decoder', + 'negativeBefore', + 'negative', + 'edit', + 'undo' +]; + +// General + + // Reverse a string + function strReverse ( a ) { + return a.split('').reverse().join(''); + } + + // Check if a string starts with a specified prefix. + function strStartsWith ( input, match ) { + return input.substring(0, match.length) === match; + } + + // Check is a string ends in a specified postfix. + function strEndsWith ( input, match ) { + return input.slice(-1 * match.length) === match; + } + + // Throw an error if formatting options are incompatible. + function throwEqualError( F, a, b ) { + if ( (F[a] || F[b]) && (F[a] === F[b]) ) { + throw new Error(a); + } + } + + // Check if a number is finite and not NaN + function isValidNumber ( input ) { + return typeof input === 'number' && isFinite( input ); + } + + // Provide rounding-accurate toFixed method. + function toFixed ( value, decimals ) { + var scale = Math.pow(10, decimals); + return ( Math.round(value * scale) / scale).toFixed( decimals ); + } + + +// Formatting + + // Accept a number as input, output formatted string. + function formatTo ( decimals, thousand, mark, prefix, postfix, encoder, decoder, negativeBefore, negative, edit, undo, input ) { + + var originalInput = input, inputIsNegative, inputPieces, inputBase, inputDecimals = '', output = ''; + + // Apply user encoder to the input. + // Expected outcome: number. + if ( encoder ) { + input = encoder(input); + } + + // Stop if no valid number was provided, the number is infinite or NaN. + if ( !isValidNumber(input) ) { + return false; + } + + // Rounding away decimals might cause a value of -0 + // when using very small ranges. Remove those cases. + if ( decimals !== false && parseFloat(input.toFixed(decimals)) === 0 ) { + input = 0; + } + + // Formatting is done on absolute numbers, + // decorated by an optional negative symbol. + if ( input < 0 ) { + inputIsNegative = true; + input = Math.abs(input); + } + + // Reduce the number of decimals to the specified option. + if ( decimals !== false ) { + input = toFixed( input, decimals ); + } + + // Transform the number into a string, so it can be split. + input = input.toString(); + + // Break the number on the decimal separator. + if ( input.indexOf('.') !== -1 ) { + inputPieces = input.split('.'); + + inputBase = inputPieces[0]; + + if ( mark ) { + inputDecimals = mark + inputPieces[1]; + } + + } else { + + // If it isn't split, the entire number will do. + inputBase = input; + } + + // Group numbers in sets of three. + if ( thousand ) { + inputBase = strReverse(inputBase).match(/.{1,3}/g); + inputBase = strReverse(inputBase.join( strReverse( thousand ) )); + } + + // If the number is negative, prefix with negation symbol. + if ( inputIsNegative && negativeBefore ) { + output += negativeBefore; + } + + // Prefix the number + if ( prefix ) { + output += prefix; + } + + // Normal negative option comes after the prefix. Defaults to '-'. + if ( inputIsNegative && negative ) { + output += negative; + } + + // Append the actual number. + output += inputBase; + output += inputDecimals; + + // Apply the postfix. + if ( postfix ) { + output += postfix; + } + + // Run the output through a user-specified post-formatter. + if ( edit ) { + output = edit ( output, originalInput ); + } + + // All done. + return output; + } + + // Accept a sting as input, output decoded number. + function formatFrom ( decimals, thousand, mark, prefix, postfix, encoder, decoder, negativeBefore, negative, edit, undo, input ) { + + var originalInput = input, inputIsNegative, output = ''; + + // User defined pre-decoder. Result must be a non empty string. + if ( undo ) { + input = undo(input); + } + + // Test the input. Can't be empty. + if ( !input || typeof input !== 'string' ) { + return false; + } + + // If the string starts with the negativeBefore value: remove it. + // Remember is was there, the number is negative. + if ( negativeBefore && strStartsWith(input, negativeBefore) ) { + input = input.replace(negativeBefore, ''); + inputIsNegative = true; + } + + // Repeat the same procedure for the prefix. + if ( prefix && strStartsWith(input, prefix) ) { + input = input.replace(prefix, ''); + } + + // And again for negative. + if ( negative && strStartsWith(input, negative) ) { + input = input.replace(negative, ''); + inputIsNegative = true; + } + + // Remove the postfix. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice + if ( postfix && strEndsWith(input, postfix) ) { + input = input.slice(0, -1 * postfix.length); + } + + // Remove the thousand grouping. + if ( thousand ) { + input = input.split(thousand).join(''); + } + + // Set the decimal separator back to period. + if ( mark ) { + input = input.replace(mark, '.'); + } + + // Prepend the negative symbol. + if ( inputIsNegative ) { + output += '-'; + } + + // Add the number + output += input; + + // Trim all non-numeric characters (allow '.' and '-'); + output = output.replace(/[^0-9\.\-.]/g, ''); + + // The value contains no parse-able number. + if ( output === '' ) { + return false; + } + + // Covert to number. + output = Number(output); + + // Run the user-specified post-decoder. + if ( decoder ) { + output = decoder(output); + } + + // Check is the output is valid, otherwise: return false. + if ( !isValidNumber(output) ) { + return false; + } + + return output; + } + + +// Framework + + // Validate formatting options + function validate ( inputOptions ) { + + var i, optionName, optionValue, + filteredOptions = {}; + + for ( i = 0; i < FormatOptions.length; i+=1 ) { + + optionName = FormatOptions[i]; + optionValue = inputOptions[optionName]; + + if ( optionValue === undefined ) { + + // Only default if negativeBefore isn't set. + if ( optionName === 'negative' && !filteredOptions.negativeBefore ) { + filteredOptions[optionName] = '-'; + // Don't set a default for mark when 'thousand' is set. + } else if ( optionName === 'mark' && filteredOptions.thousand !== '.' ) { + filteredOptions[optionName] = '.'; + } else { + filteredOptions[optionName] = false; + } + + // Floating points in JS are stable up to 7 decimals. + } else if ( optionName === 'decimals' ) { + if ( optionValue >= 0 && optionValue < 8 ) { + filteredOptions[optionName] = optionValue; + } else { + throw new Error(optionName); + } + + // These options, when provided, must be functions. + } else if ( optionName === 'encoder' || optionName === 'decoder' || optionName === 'edit' || optionName === 'undo' ) { + if ( typeof optionValue === 'function' ) { + filteredOptions[optionName] = optionValue; + } else { + throw new Error(optionName); + } + + // Other options are strings. + } else { + + if ( typeof optionValue === 'string' ) { + filteredOptions[optionName] = optionValue; + } else { + throw new Error(optionName); + } + } + } + + // Some values can't be extracted from a + // string if certain combinations are present. + throwEqualError(filteredOptions, 'mark', 'thousand'); + throwEqualError(filteredOptions, 'prefix', 'negative'); + throwEqualError(filteredOptions, 'prefix', 'negativeBefore'); + + return filteredOptions; + } + + // Pass all options as function arguments + function passAll ( options, method, input ) { + var i, args = []; + + // Add all options in order of FormatOptions + for ( i = 0; i < FormatOptions.length; i+=1 ) { + args.push(options[FormatOptions[i]]); + } + + // Append the input, then call the method, presenting all + // options as arguments. + args.push(input); + return method.apply('', args); + } + + /** @constructor */ + function wNumb ( options ) { + + if ( !(this instanceof wNumb) ) { + return new wNumb ( options ); + } + + if ( typeof options !== "object" ) { + return; + } + + options = validate(options); + + // Call 'formatTo' with proper arguments. + this.to = function ( input ) { + return passAll(options, formatTo, input); + }; + + // Call 'formatFrom' with proper arguments. + this.from = function ( input ) { + return passAll(options, formatFrom, input); + }; + } + + /** @export */ + window.wNumb = wNumb; + +}()); + + +/*! nouislider - 9.0.0 - 2019-09-29 21:44:02 */ + +!function(a){"function"==typeof define&&define.amd?define([],a):"object"==typeof exports?module.exports=a():window.noUiSlider=a()}(function(){"use strict";function a(a,b){var c=document.createElement("div");return j(c,b),a.appendChild(c),c}function b(a){return a.filter(function(a){return!this[a]&&(this[a]=!0)},{})}function c(a,b){return Math.round(a/b)*b}function d(a,b){var c=a.getBoundingClientRect(),d=a.ownerDocument,e=d.documentElement,f=m();return/webkit.*Chrome.*Mobile/i.test(navigator.userAgent)&&(f.x=0),b?c.top+f.y-e.clientTop:c.left+f.x-e.clientLeft}function e(a){return"number"==typeof a&&!isNaN(a)&&isFinite(a)}function f(a,b,c){c>0&&(j(a,b),setTimeout(function(){k(a,b)},c))}function g(a){return Math.max(Math.min(a,100),0)}function h(a){return Array.isArray(a)?a:[a]}function i(a){a=String(a);var b=a.split(".");return b.length>1?b[1].length:0}function j(a,b){a.classList?a.classList.add(b):a.className+=" "+b}function k(a,b){a.classList?a.classList.remove(b):a.className=a.className.replace(new RegExp("(^|\\b)"+b.split(" ").join("|")+"(\\b|$)","gi")," ")}function l(a,b){return a.classList?a.classList.contains(b):new RegExp("\\b"+b+"\\b").test(a.className)}function m(){var a=void 0!==window.pageXOffset,b="CSS1Compat"===(document.compatMode||""),c=a?window.pageXOffset:b?document.documentElement.scrollLeft:document.body.scrollLeft,d=a?window.pageYOffset:b?document.documentElement.scrollTop:document.body.scrollTop;return{x:c,y:d}}function n(){return window.navigator.pointerEnabled?{start:"pointerdown",move:"pointermove",end:"pointerup"}:window.navigator.msPointerEnabled?{start:"MSPointerDown",move:"MSPointerMove",end:"MSPointerUp"}:{start:"mousedown touchstart",move:"mousemove touchmove",end:"mouseup touchend"}}function o(a,b){return 100/(b-a)}function p(a,b){return 100*b/(a[1]-a[0])}function q(a,b){return p(a,a[0]<0?b+Math.abs(a[0]):b-a[0])}function r(a,b){return b*(a[1]-a[0])/100+a[0]}function s(a,b){for(var c=1;a>=b[c];)c+=1;return c}function t(a,b,c){if(c>=a.slice(-1)[0])return 100;var d,e,f,g,h=s(c,a);return d=a[h-1],e=a[h],f=b[h-1],g=b[h],f+q([d,e],c)/o(f,g)}function u(a,b,c){if(c>=100)return a.slice(-1)[0];var d,e,f,g,h=s(c,b);return d=a[h-1],e=a[h],f=b[h-1],g=b[h],r([d,e],(c-f)*o(f,g))}function v(a,b,d,e){if(100===e)return e;var f,g,h=s(e,a);return d?(f=a[h-1],g=a[h],e-f>(g-f)/2?g:f):b[h-1]?a[h-1]+c(e-a[h-1],b[h-1]):e}function w(a,b,c){var d;if("number"==typeof b&&(b=[b]),"[object Array]"!==Object.prototype.toString.call(b))throw new Error("noUiSlider: 'range' contains invalid value.");if(d="min"===a?0:"max"===a?100:parseFloat(a),!e(d)||!e(b[0]))throw new Error("noUiSlider: 'range' value isn't numeric.");c.xPct.push(d),c.xVal.push(b[0]),d?c.xSteps.push(!isNaN(b[1])&&b[1]):isNaN(b[1])||(c.xSteps[0]=b[1]),c.xHighestCompleteStep.push(0)}function x(a,b,c){if(!b)return!0;c.xSteps[a]=p([c.xVal[a],c.xVal[a+1]],b)/o(c.xPct[a],c.xPct[a+1]);var d=(c.xVal[a+1]-c.xVal[a])/c.xNumSteps[a],e=Math.ceil(Number(d.toFixed(3))-1),f=c.xVal[a]+c.xNumSteps[a]*e;c.xHighestCompleteStep[a]=f}function y(a,b,c,d){this.xPct=[],this.xVal=[],this.xSteps=[d||!1],this.xNumSteps=[!1],this.xHighestCompleteStep=[],this.snap=b,this.direction=c;var e,f=[];for(e in a)a.hasOwnProperty(e)&&f.push([a[e],e]);for(f.length&&"object"==typeof f[0][0]?f.sort(function(a,b){return a[0][0]-b[0][0]}):f.sort(function(a,b){return a[0]-b[0]}),e=0;e=0,d=b.indexOf("drag")>=0,e=b.indexOf("fixed")>=0,f=b.indexOf("snap")>=0,g=b.indexOf("hover")>=0;if(e){if(2!==a.handles)throw new Error("noUiSlider: 'fixed' behaviour must be used with 2 handles");H(a,a.start[1]-a.start[0])}a.events={tap:c||f,drag:d,fixed:e,snap:f,hover:g}}function L(a,b){if(b!==!1)if(b===!0){a.tooltips=[];for(var c=0;c-1?1:"steps"===c?2:0,!g&&i&&(q=0),l===v&&j||(f[n.toFixed(5)]=[l,q]),k=n}}),f}function w(a,b,c){function d(a,b){var c=b===e.cssClasses.value,d=c?m:n,f=c?k:l;return b+" "+d[e.ort]+" "+f[a]}function f(a,b,c){return'class="'+d(c[1],b)+'" style="'+e.style+": "+a+'%"'}function g(a,d){d[1]=d[1]&&b?b(d[0],d[1]):d[1],i+="
            ",d[1]&&(i+="
            "+c.to(d[0])+"
            ")}var h=document.createElement("div"),i="",k=[e.cssClasses.valueNormal,e.cssClasses.valueLarge,e.cssClasses.valueSub],l=[e.cssClasses.markerNormal,e.cssClasses.markerLarge,e.cssClasses.markerSub],m=[e.cssClasses.valueHorizontal,e.cssClasses.valueVertical],n=[e.cssClasses.markerHorizontal,e.cssClasses.markerVertical];return j(h,e.cssClasses.pips),j(h,0===e.ort?e.cssClasses.pipsHorizontal:e.cssClasses.pipsVertical),Object.keys(a).forEach(function(b){g(b,a[b])}),h.innerHTML=i,h}function x(a){var b=a.mode,c=a.density||1,d=a.filter||!1,e=a.values||!1,f=a.stepped||!1,g=u(b,e,f),h=v(c,b,g),i=a.format||{to:Math.round};return fa.appendChild(w(h,d,i))}function y(){var a=aa.getBoundingClientRect(),b="offset"+["Width","Height"][e.ort];return 0===e.ort?a.width||aa[b]:a.height||aa[b]}function z(a,b,c,d){var f=function(b){return!fa.hasAttribute("disabled")&&(!l(fa,e.cssClasses.tap)&&(b=A(b,d.pageOffset),!(a===ea.start&&void 0!==b.buttons&&b.buttons>1)&&((!d.hover||!b.buttons)&&(b.calcPoint=b.points[e.ort],void c(b,d)))))},g=[];return a.split(" ").forEach(function(a){b.addEventListener(a,f,!1),g.push([a,f])}),g}function A(a,b){a.preventDefault();var c,d,e=0===a.type.indexOf("touch"),f=0===a.type.indexOf("mouse"),g=0===a.type.indexOf("pointer"),h=a;if(0===a.type.indexOf("MSPointer")&&(g=!0),e){if(h.touches.length>1)return!1;c=a.changedTouches[0].pageX,d=a.changedTouches[0].pageY}return b=b||m(),(f||g)&&(c=a.clientX+b.x,d=a.clientY+b.y),h.pageOffset=b,h.points=[c,d],h.cursor=f||g,h}function B(a){var b=a-d(aa,e.ort),c=100*b/y();return e.dir?100-c:c}function C(a){var b=100,c=!1;return ba.forEach(function(d,e){if(!d.hasAttribute("disabled")){var f=Math.abs(ga[e]-a);f1?d.forEach(function(a,c){var d=M(e,a,e[a]+b,f[c],g[c]);d===!1?b=0:(b=d-e[a],e[a]=d)}):f=g=[!0];var h=!1;d.forEach(function(a,d){h=R(a,c[a]+b,f[d],g[d])||h}),h&&d.forEach(function(a){E("update",a),E("slide",a)})}function E(a,b,c){Object.keys(ka).forEach(function(d){var f=d.split(".")[0];a===f&&ka[d].forEach(function(a){a.call(da,ja.map(e.format.to),b,ja.slice(),c||!1,ga.slice())})})}function F(a,b){"mouseout"===a.type&&"HTML"===a.target.nodeName&&null===a.relatedTarget&&H(a,b)}function G(a,b){if(navigator.appVersion.indexOf("MSIE 9")===-1&&0===a.buttons&&0!==b.buttonsProperty)return H(a,b);var c=(e.dir?-1:1)*(a.calcPoint-b.startCalcPoint),d=100*c/b.baseSize;D(c>0,d,b.locations,b.handleNumbers)}function H(a,b){var c=aa.querySelector("."+e.cssClasses.active);null!==c&&k(c,e.cssClasses.active),a.cursor&&(document.body.style.cursor="",document.body.removeEventListener("selectstart",document.body.noUiListener)),document.documentElement.noUiListeners.forEach(function(a){document.documentElement.removeEventListener(a[0],a[1])}),k(fa,e.cssClasses.drag),P(),b.handleNumbers.forEach(function(a){E("set",a),E("change",a),E("end",a)})}function I(a,b){if(1===b.handleNumbers.length){var c=ba[b.handleNumbers[0]];if(c.hasAttribute("disabled"))return!1;j(c.children[0],e.cssClasses.active)}a.preventDefault(),a.stopPropagation();var d=z(ea.move,document.documentElement,G,{startCalcPoint:a.calcPoint,baseSize:y(),pageOffset:a.pageOffset,handleNumbers:b.handleNumbers,buttonsProperty:a.buttons,locations:ga.slice()}),f=z(ea.end,document.documentElement,H,{handleNumbers:b.handleNumbers}),g=z("mouseout",document.documentElement,F,{handleNumbers:b.handleNumbers});if(document.documentElement.noUiListeners=d.concat(f,g),a.cursor){document.body.style.cursor=getComputedStyle(a.target).cursor,ba.length>1&&j(fa,e.cssClasses.drag);var h=function(){return!1};document.body.noUiListener=h,document.body.addEventListener("selectstart",h,!1)}b.handleNumbers.forEach(function(a){E("start",a)})}function J(a){a.stopPropagation();var b=B(a.calcPoint),c=C(b);return c!==!1&&(e.events.snap||f(fa,e.cssClasses.tap,e.animationDuration),R(c,b,!0,!0),P(),E("slide",c,!0),E("set",c,!0),E("change",c,!0),E("update",c,!0),void(e.events.snap&&I(a,{handleNumbers:[c]})))}function K(a){var b=B(a.calcPoint),c=ia.getStep(b),d=ia.fromStepping(c);Object.keys(ka).forEach(function(a){"hover"===a.split(".")[0]&&ka[a].forEach(function(a){a.call(da,d)})})}function L(a){a.fixed||ba.forEach(function(a,b){z(ea.start,a.children[0],I,{handleNumbers:[b]})}),a.tap&&z(ea.start,aa,J,{}),a.hover&&z(ea.move,aa,K,{hover:!0}),a.drag&&ca.forEach(function(b,c){if(b!==!1&&0!==c&&c!==ca.length-1){var d=ba[c-1],f=ba[c],g=[b];j(b,e.cssClasses.draggable),a.fixed&&(g.push(d.children[0]),g.push(f.children[0])),g.forEach(function(a){z(ea.start,a,I,{handles:[d,f],handleNumbers:[c-1,c]})})}})}function M(a,b,c,d,f){return ba.length>1&&(d&&b>0&&(c=Math.max(c,a[b-1]+e.margin)),f&&b1&&e.limit&&(d&&b>0&&(c=Math.min(c,a[b-1]+e.limit)),f&&b50?-1:1,c=3+(ba.length+b*a);ba[a].childNodes[0].style.zIndex=c})}function R(a,b,c,d){return b=M(ga,a,b,c,d),b!==!1&&(O(a,b),!0)}function S(a){if(ca[a]){var b=0,c=100;0!==a&&(b=ga[a-1]),a!==ca.length-1&&(c=ga[a]),ca[a].style[e.style]=N(b),ca[a].style[e.styleOposite]=N(100-c)}}function T(a,b){null!==a&&a!==!1&&("number"==typeof a&&(a=String(a)),a=e.format.from(a),a===!1||isNaN(a)||R(b,ia.toStepping(a),!1,!1))}function U(a,b){var c=h(a),d=void 0===ga[0];b=void 0===b||!!b,c.forEach(T),e.animate&&!d&&f(fa,e.cssClasses.tap,e.animationDuration),ha.forEach(function(a){R(a,ga[a],!0,!1)}),P(),ha.forEach(function(a){E("update",a),null!==c[a]&&b&&E("set",a)})}function V(a){U(e.start,a)}function W(){var a=ja.map(e.format.to);return 1===a.length?a[0]:a}function X(){for(var a in e.cssClasses)e.cssClasses.hasOwnProperty(a)&&k(fa,e.cssClasses[a]);for(;fa.firstChild;)fa.removeChild(fa.firstChild);delete fa.noUiSlider}function Y(){return ga.map(function(a,b){var c=ia.getNearbySteps(a),d=ja[b],e=c.thisStep.step,f=null;e!==!1&&d+e>c.stepAfter.startValue&&(e=c.stepAfter.startValue-d),f=d>c.thisStep.startValue?c.thisStep.step:c.stepBefore.step!==!1&&d-c.stepBefore.highestStep,100===a?e=null:0===a&&(f=null);var g=ia.countStepDecimals();return null!==e&&e!==!1&&(e=Number(e.toFixed(g))),null!==f&&f!==!1&&(f=Number(f.toFixed(g))),[f,e]})}function Z(a,b){ka[a]=ka[a]||[],ka[a].push(b),"update"===a.split(".")[0]&&ba.forEach(function(a,b){E("update",b)})}function $(a){var b=a&&a.split(".")[0],c=b&&a.substring(b.length);Object.keys(ka).forEach(function(a){var d=a.split(".")[0],e=a.substring(d.length);b&&b!==d||c&&c!==e||delete ka[a]})}function _(a,b){var c=W(),d=["margin","limit","range","animate","snap","step","format"];d.forEach(function(b){void 0!==a[b]&&(i[b]=a[b])});var f=Q(i);d.forEach(function(b){void 0!==a[b]&&(e[b]=f[b])}),f.spectrum.direction=ia.direction,ia=f.spectrum,e.margin=f.margin,e.limit=f.limit,ga=[],U(a.start||c,b)}var aa,ba,ca,da,ea=n(),fa=c,ga=[],ha=[],ia=e.spectrum,ja=[],ka={};if(fa.noUiSlider)throw new Error("Slider was already initialized.");return r(fa),q(e.connect,aa),da={destroy:X,steps:Y,on:Z,off:$,get:W,set:U,reset:V,__moveHandles:function(a,b,c){D(a,b,ga,c)},options:i,updateOptions:_,target:fa,pips:x},L(e.events),U(e.start),e.pips&&x(e.pips),e.tooltips&&t(),da}function S(a,b){if(!a.nodeName)throw new Error("noUiSlider.create requires a single element.");var c=Q(b,a),d=R(a,c,b);return a.noUiSlider=d,d}y.prototype.getMargin=function(a){var b=this.xNumSteps[0];if(b&&a%b)throw new Error("noUiSlider: 'limit' and 'margin' must be divisible by step.");return 2===this.xPct.length&&p(this.xVal,a)},y.prototype.toStepping=function(a){return a=t(this.xVal,this.xPct,a)},y.prototype.fromStepping=function(a){return u(this.xVal,this.xPct,a)},y.prototype.getStep=function(a){return a=v(this.xPct,this.xSteps,this.snap,a)},y.prototype.getNearbySteps=function(a){var b=s(a,this.xPct);return{stepBefore:{startValue:this.xVal[b-2],step:this.xNumSteps[b-2],highestStep:this.xHighestCompleteStep[b-2]},thisStep:{startValue:this.xVal[b-1],step:this.xNumSteps[b-1],highestStep:this.xHighestCompleteStep[b-1]},stepAfter:{startValue:this.xVal[b-0],step:this.xNumSteps[b-0],highestStep:this.xHighestCompleteStep[b-0]}}},y.prototype.countStepDecimals=function(){var a=this.xNumSteps.map(i);return Math.max.apply(null,a)},y.prototype.convert=function(a){return this.getStep(this.toStepping(a))};var T={to:function(a){return void 0!==a&&a.toFixed(2)},from:Number};return{create:S}}); \ No newline at end of file diff --git a/assets/js/opalestate.js b/assets/js/opalestate.js new file mode 100755 index 00000000..843e68f8 --- /dev/null +++ b/assets/js/opalestate.js @@ -0,0 +1,573 @@ +jQuery( document ).ready( function ( $ ) { + + /** + * + */ + $( '#show-user-sidebar-btn' ).click( function () { + $( 'body' ).toggleClass( 'active' ); + } ); + + $( '.more-options-label, .form-item--types .group-item, .cmb2-checkbox-list.cmb2-list li' ).each( function () { + $( this ).append( '' ); + } ); + + $( '.opalestate-tooltip' ).each( function () { + if ( $( this ).tooltipster ) { + $( this ).tooltipster( { + side: [ 'bottom', 'top', 'right', 'left' ] + } ); + } + } ); + + /***/ + + // Social login. + $( '.js-opal-google-login' ).on( 'click', function ( e ) { + e.preventDefault(); + $.ajax( { + type: 'POST', + url: opalesateJS.ajaxurl, + data: { + 'action': 'opalestate_ajax_redirect_google_login_link' + }, + success: function ( results ) { + window.location.href = results.data; + }, + error: function ( errorThrown ) { + // TODO: + } + } ); + } ); + + $( '.js-opal-facebook-login' ).on( 'click', function ( e ) { + e.preventDefault(); + $.ajax( { + type: 'POST', + url: opalesateJS.ajaxurl, + data: { + 'action': 'opalestate_ajax_redirect_facebook_login_link' + }, + success: function ( results ) { + window.location.href = results.data; + }, + error: function ( errorThrown ) { + // TODO: + } + } ); + } ); + + if ( $( '.opalestate-swiper-play' ).length > 0 ) { + var play_swiper_sliders = function () { + if ( $( '.opalestate-swiper-play' ).length > 0 ) { + $( '.opalestate-swiper-play' ).each( function () { + var option = $( this ).data( 'swiper' ); + + if ( option ) { + option = $.extend( { + navigation: { + nextEl: '.swiper-button-next', + prevEl: '.swiper-button-prev' + }, + slidesPerView: 3, + spaceBetween: 30, + loop: true, + pagination: { + el: '.swiper-pagination', + clickable: true, + }, + breakpoints: { + 1024: { + slidesPerView: 2, + spaceBetween: 30 + }, + 768: { + slidesPerView: 1, + spaceBetween: 10 + }, + 640: { + slidesPerView: 1, + spaceBetween: 10 + }, + 320: { + slidesPerView: 1, + spaceBetween: 10 + } + } + }, option ); + + if ( option.thumbnails_nav ) { + var ioption = $( option.thumbnails_nav ).data( 'swiper' ); + + ioption.breakpoint = { + 1024: { + slidesPerView: 2, + spaceBetween: 30 + }, + 768: { + slidesPerView: 1, + spaceBetween: 10 + }, + 640: { + slidesPerView: 1, + spaceBetween: 10 + }, + 320: { + slidesPerView: 1, + spaceBetween: 10 + } + }; + + var iswiper = new Swiper( option.thumbnails_nav, ioption ); + + option.thumbs = { + swiper: iswiper + }; + + } + + var swiper = new Swiper( this, option ); + } + } ); + } + }; + play_swiper_sliders(); + $( document ).ajaxComplete( function () { + play_swiper_sliders(); + } ); + } + + //////// + $( '.opalestate-scroll-elements a' ).on( 'click', function ( e ) { + e.preventDefault(); + if ( $( $( this ).attr( 'href' ) ).length ) { + $( '.opalestate-scroll-elements a' ).removeClass( 'active' ); + $( this ).addClass( 'active' ); + + $( 'html, body' ).animate( { + scrollTop: $( $( this ).attr( 'href' ) ).offset().top - 80, + }, + 500, + 'linear' + ); + } + } ); + var header = $( '.keep-top-bars' ); + $( window ).scroll( function () { + var scroll = $( window ).scrollTop(); + if ( scroll >= window.innerHeight ) { + header.addClass( 'floating-keep-top' ); + } else { + header.removeClass( 'floating-keep-top' ); + } + } ); + + //// + + //// + $( '.opalestate-gallery' ).each( function () { // the containers for all your galleries + $( this ).magnificPopup( { + delegate: 'a', // the selector for gallery item + type: 'image', + gallery: { + enabled: true + } + } ); + var $_this = this; + $( '.show-first-photo' ).click( function () { + $( 'a', $_this ).first().click(); + } ); + $( '.show-last-photo' ).click( function () { + $( 'a', $_this ).last().click(); + } ); + } ); + + ////// + $( '.opalestate_rating' ).each( function () { + $( this ) + .hide() + .before( + '

            \ + \ + 1\ + 2\ + 3\ + 4\ + 5\ + \ +

            ' + ); + } ); + + $( 'body' ) + // Star ratings for comments + .on( 'click', '.comment-form-rating p.opalestate-stars a', function () { + var $star = $( this ), + $rating = $( this ).closest( '.comment-form-rating' ).find( '.opalestate_rating' ), + $container = $( this ).closest( '.stars' ); + + $rating.val( $star.text() ); + $star.siblings( 'a' ).removeClass( 'active' ); + $star.addClass( 'active' ); + $container.addClass( 'selected' ); + + return false; + } ) + .on( 'click', '#respond #submit', function () { + var $rating = $( this ).closest( '#respond' ).find( '.opalestate_rating' ); + var rating = $rating.val(); + + if ( $rating.length > 0 && !rating ) { + window.alert( 'Require rating!' ); + + return false; + } + } ); + + // sticky //// + $( '.opalestate-sticky-column' ).stick_in_parent(); + + //// + $( '.input-group-number' ).each( function () { + var _input = $( 'input', this ); + if ( parseInt( _input.val() ) <= 0 ) { + _input.val( 1 ); + } + $( '.btn-actions > span', this ).click( function () { + + var _check = function () { + return parseInt( _input.val() ) <= 0 ? 1 : parseInt( _input.val() ); + }; + + if ( $( this ).hasClass( 'btn-plus' ) ) { + _val = _check() + 1; + } else { + _val = _check() - 1; + } + + _input.val( _val ); + _input.change(); + } ); + + } ); + + $( 'select.form-control , .cmb2-wrap select, .form-row select' ).select2( { + width: '100%', + minimumResultsForSearch: -1 + } ); + + function opalCollapse() { + $( '.opal-collapse-button' ).on( 'click', function () { + var $el = $( this ), + data = $el.data( 'collapse' ), + $el_data = $( data ), + speed = 250; + + if ( $el.data( 'speed' ) && $el.data( 'speed' ) > 0 ) { + speed = $el.data( 'speed' ); + } + + if ( $el_data.is( ':visible' ) ) { + $el_data.slideUp( speed ); + $el.removeClass( 'show' ); + $el_data.removeClass( 'show' ); + } else { + $el.addClass( 'show' ); + $el_data.addClass( 'show' ); + $el_data.slideDown( speed ); + } + + return false; + } ); + } + + opalCollapse(); + + /************************/ + + $( '.opalestate-tab .tab-item' ).click( function ( event ) { + event.preventDefault(); + $( this ).parent().find( ' .tab-item' ).removeClass( 'active' ); + $( this ).addClass( 'active' ); + + $( $( this ).attr( 'href' ) ).parent().children( '.opalestate-tab-content' ).removeClass( 'active' ); + $( $( this ).attr( 'href' ) ).addClass( 'active' ); + } ); + + $( '.opalestate-tab' ).each( function () { + $( this ).find( '.tab-item' ).first().click(); + } ); + + /** + * Click to show body popup + */ + $( 'body' ).delegate( '.opalestate-popup .popup-head', 'click', function () { + var $this = $( this ).parent( '.opalestate-popup' ); + $( '.popup-head', $this ).click( function () { + $( '.opalestate-popup.active' ).removeClass( 'active' ); + $this.toggleClass( 'active' ); + } ); + $( '.popup-close', $this ).click( function () { + $( '.opalestate-popup' ).removeClass( 'active' ); + } ); + } ); + + /** + * Login form + **/ + $( 'body' ).delegate( '.opalestate-mfp-popup form.opalestate-login-form', 'submit', function () { + + var $form = $( this ); + $.ajax( { + type: 'POST', + url: opalesateJS.ajaxurl, + dataType: 'json', + data: $( this ).serialize() + '&ajax=1&action=opalestate_login_form', // serializes the form's elements. + success: function ( data ) { + if ( data.status == true ) { + if ( data.redirect ) { + window.location.href = data.redirect; + } + } + if ( data.message ) { + $form.find( '.opalestate-notice' ).remove(); + $form.prepend( data.message ); + } + + } + } ); + return false; + } ); + + /** + * Login form + **/ + $( 'body' ).delegate( '.opalestate-mfp-popup form.opalestate-register-form', 'submit', function () { + + var $form = $( this ); + $.ajax( { + type: 'POST', + url: opalesateJS.ajaxurl, + dataType: 'json', + data: $( this ).serialize() + '&ajax=1&action=opalestate_register_form', // serializes the form's elements. + success: function ( data ) { + if ( data.status == true ) { + if ( data.redirect ) { + window.location.href = data.redirect; + } + } + if ( data.message ) { + $form.find( '.opalestate-notice' ).remove(); + $form.prepend( data.message ); + } + + } + } ); + return false; + } ); + /** + * AJAX ACTION + */ + + $( '#opalestate_user_frontchangepass' ).submit( function ( e ) { + var $this = $( this ); + $( '.alert', $this ).remove(); + $.ajax( { + type: 'POST', + url: opalesateJS.ajaxurl, + dataType: 'json', + data: $( this ).serialize() + '&action=opalestate_save_changepass', // serializes the form's elements. + success: function ( data ) { + if ( data.status == false ) { + $this.find( '.form-table' ) + .prepend( $( '

            ' + data.message + '

            ' ) ); + } else { + $this.find( '.form-table' ).prepend( $( '

            ' + data.message + '

            ' ) ); + $( 'input[type="text"]', $this ).val( '' ); + setTimeout( function () { + $( '.alert', $this ).remove(); + }, 1000 ); + } + } + } ); + + e.preventDefault(); // avoid to execute the actual submit of the form. + } ); + + $( 'body' ).delegate( '.opalestate-popup-button', 'click', function () { + var $target = $( this ).data( 'target' ); + $.magnificPopup.open( { + items: { + src: $target + } + } ); + return false; + } ); + + // open login form + $( document ).on( 'opalestate:login', function () { + if ( $( '#opalestate-user-form-popup' ) ) { + $.magnificPopup.open( { + items: { + src: '#opalestate-user-form-popup' + }, + mainClass: 'mfp-with-zoom', // this class is for CSS animation below + zoom: { + enabled: true + } + } ); + } + } ); + + $( 'body' ).delegate( '.opalestate-need-login', 'click', function () { + $( document ).trigger( 'opalestate:login', [ true ] ); + return false; + } ); + //// ajax favorite + $( 'body' ).delegate( '.property-toggle-favorite', 'click', function () { + var $this = $( this ); + if ( $( this ).hasClass( 'opalestate-need-login' ) ) { + return; + } + $.ajax( { + type: 'POST', + url: opalesateJS.ajaxurl, + data: 'property_id=' + $( this ).data( 'property-id' ) + '&action=opalestate_toggle_status', // serializes + // the form's + // elements. + success: function ( data ) { + if ( data ) { + $this.replaceWith( $( data ) ); + } + } + } ); + } ); + + if ( $( '.opalestate-datepicker' ).length > 0 ) { + $( '.opalestate-datepicker' ).datepicker( { minDate: 0 } ); + } + // + + /** + * + */ + $( '.list-property-status li' ).click( function () { + $( '.opalestate-search-form [name=status]' ).val( $( this ).data( 'id' ) ); + $( '.list-property-status li' ).removeClass( 'active' ); + $( this ).addClass( 'active' ); + } ); + if ( $( '.opalestate-search-form [name=status]' ).val() > 0 ) { + var id = $( '.opalestate-search-form [name=status]' ).val(); + $( '.list-property-status li' ).removeClass( 'active' ); + $( '.list-property-status [data-id=' + id + ']' ).addClass( 'active' ); + } + + /*-----------------------------------------------------------------------------------*/ + $( '.opal-slide-ranger' ).each( function () { + var _this = this; + var unit = $( this ).data( 'unit' ); + var decimals = $( this ).data( 'decimals' ); + var min = $( '.slide-ranger-bar', this ).data( 'min' ); + var max = $( '.slide-ranger-bar', this ).data( 'max' ); + var mode = $( '.slide-ranger-bar', this ).data( 'mode' ); + var start = $( '.slide-ranger-bar', this ).data( 'start' ); + + var imin = $( '.slide-ranger-min-input', this ).val(); + var imax = $( '.slide-ranger-max-input', this ).val(); + var slider = $( '.slide-ranger-bar', this ).get( 0 ); + var unit_pos = $( this ).data( 'unitpos' ); + + var config_format = { + decimals: decimals, + thousand: ',', + }; + + if ( unit_pos == 'prefix' ) { + config_format.prefix = ' ' + unit + ' '; + } else { + config_format.postfix = ' ' + unit + ' '; + } + + var nummm = wNumb( config_format ); + var istart = [ imin, imax ]; + if ( mode && mode == 1 && start ) { + istart = [ start ]; + } + + noUiSlider.create( slider, { + range: { + 'min': [ min ], + 'max': [ max ] + }, + connect: true, + start: istart, + format: nummm, + direction: opalesateJS.rtl == 'true' ? 'rtl' : 'ltr', + + } ); + slider.noUiSlider.on( 'update', function ( values, handle ) { + var val = values[ handle ]; + if ( handle == 0 ) { + $( '.slide-ranger-min-label', _this ).text( val ); + $( '.slide-ranger-min-input', _this ).val( nummm.from( val ) ); + } else { + $( '.slide-ranger-max-label', _this ).text( val ); + $( '.slide-ranger-max-input', _this ).val( nummm.from( val ) ); + } + } ); + + slider.noUiSlider.on( 'end', function ( values, handle ) { + var val = values[ handle ]; + if ( handle == 0 ) { + $( '.slide-ranger-min-input', _this ).change(); + } else { + $( '.slide-ranger-max-input', _this ).change(); + } + } ); + + } ); + + //////***Search Search **/ + $( 'body' ).delegate( '#opalestate-save-search-form', 'submit', function () { + var params = window.location.search.substring( 1 ); + $.ajax( { + type: 'POST', + dataType: 'json', + url: opalesateJS.ajaxurl, + data: 'params=' + encodeURIComponent( params ) + '&' + $( this ).serialize() + + '&action=opalestate_ajx_save_search', + success: function ( data ) { + $( '#opalestate-save-search-form .alert' ).remove(); + $( '#opalestate-save-search-form input' ).val( '' ); + $( '#opalestate-save-search-form' ) + .append( '
            ' + + data.message + '
            ' ); + $( '#opalestate-save-search-form .alert' ).delay( 5000 ).queue( function () { + $( '#opalestate-save-search-form .alert' ).remove(); + } ); + } + } ); + return false; + } ); + + $( '.ajax-load-properties' ).delegate( '.pagination li', 'click', function () { + var $content = $( this ).parents( '.ajax-load-properties' ); + $.ajax( { + type: 'POST', + url: opalesateJS.ajaxurl, + data: location.search.substr( 1 ) + '&action=get_agent_property&paged=' + $( this ).data( 'paged' ) + + '&id=' + $content.data( 'id' ), + success: function ( data ) { + if ( data ) { + $content.html( data ); + } + } + } ); + return false; + } ); + + if ( $( '.opalestate-sticky' ).length > 0 ) { + $( '.opalestate-sticky' ).each( function () { + $( this ).stick_in_parent( $( this ).data() ); + } ); + } +} ); diff --git a/assets/map/apartment-icon.png b/assets/map/apartment-icon.png new file mode 100755 index 0000000000000000000000000000000000000000..ffb825e9c62ca793ca119ed11c87482359cbf159 GIT binary patch literal 1398 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%0D+TrRuc^a%zfDYnRNH!PQ9|e&Z$( zSuYrrijOssE0#HR_5uo5>x4rutLA#lRlNk}KMR!ex5TD5W;8lPK}7j4L5Tz}ss$%TPGM&p_KA$ey*+R<&%#KTM$Tlx`d| ziKsxt7`%-6MhBey_Be&L`?V$6`Qe!4vH>UGnSK=3P4Lu6dztl2qH6-mF2D>pdrg_TLj{$}>>#m#}{Lt3jBGHVN9QWJ`%BNHr+(?ep?9E}Nl#wt!nVl4J?mv!x@7OPK@5{*-|@P{pL<8tg~{vaJuA;* z9ju$|KT(Hm4eFdWN_{X%n*dar29&>Y))(3{>Mg~S@*YpaC*4mh6uEvC5yna0=%R3=QJ!SBiCzHwlKbV z9P3t*pp*s4K4m>|rMFImu?H;z^;+1z>zZ(Wua4OSVv{JD6XAI#Ze||?<~Bk&@5*U| z@@c2j&Z#h-EE^2UKQcIVx+*NO6lPR&Kgy>y8zqdNgzGi;^=3PeH^xhEW+IWOQDcIukjNcul7+E# zn{ku1T|1%e`p;UQ_k7>ClrYxAI((BS=R5uSz0Z5j`*Yr7C>Dz(BVPrMRbhAr*a!3g zTLGu`ItKg&i~@e(r{mspOEP*5tAu=V8QDSpz`ci{WR$#f1CZZ&IVB zoz^1@nJMyz1}K&f@-z$_gb^e6H2~zybQx%P#MVvwJ@1l9u~H?HE2QZ{@H6@+^(Rjw zz@E~bP)f*|>02iESi9)yrjr$uv#<`<uv)er`YEXVaD1>HCT&UmEdld?YNZJmt$u`+iU8>p?STOuX`^!?li9GH1bJ2^%5 zWxfv>y@+<1fD5K3>FTX-D6@Q;S;|f;qP>YO#dTWnL zZ|hFyVcJvw8trX-{ej%E8|lnkke8X8ci<3LI4&~PM)#T@|9bOt3TLm26+iCmr>Vq6 z>T(_w@4lXSMT{23NiRHl=Ds>OwcXYo6iSbCRXxN8`1l1^xN^ee-YOr}Tegxvtdd-g zekt6*JCVpo#Jrre+56Z4e)O>c-Ku{&q_&VF*`(O$SnB}gmQxhX{!LA`PVsCuw@K+J z;o8M%$QeL2rY6b4lA?Jb`}b^%BHQht#ur~u0W_X+7$mvBw90pgenXC|aRPUIKFIIpIW`kWfa z4yqX;BPCqdI0%P0tW0 zHJ%TxSq-0Re!JqJV-B@tqck@@3JwwOXot9U8vXbDLyvluLo`7{%&n*4X&^rl_fsS@ z{m{rGXwjI1xin6-A%P_U3zUcW{!J0qSczx7W;16?|z4jilyR}UkII{x#Y;IP3dZFd7qXU4K=1_@}VuS zH*Z@Pc{Dpi!)VL3l}EI;{EE!Q#EaoOK5Go{(srkhdbT`=6m?0aT9`(0F`0-B>ptgg z@7Mhr`CHp-L5r|F9Na`1uimN9zO-~L`Apb5<~bZ{;bx*?c&Y~sMB6A0(=l$(@Oh~ fT7fGo{|PVvp<3rR6bQ}r00000NkvXXu0mjfK&)OX literal 0 HcmV?d00001 diff --git a/assets/map/libraries.png b/assets/map/libraries.png new file mode 100755 index 0000000000000000000000000000000000000000..1f8d6d0895e81172afb11acb944ab6d11c84185a GIT binary patch literal 1119 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 p-d^Ru#p)Vk$=0|3BV8Z|a literal 0 HcmV?d00001 diff --git a/assets/map/pharmacy.png b/assets/map/pharmacy.png new file mode 100755 index 0000000000000000000000000000000000000000..086e8cc630742358cf2f7c6f66e7b3da5f06e7b1 GIT binary patch literal 1134 zcmV-!1d;oRP)4>x{gCj~A z9Kzrf=ap`Z7!*+x-Dz;b1&O*46B95l#Fa57CPs}K7no=aPB<(iaiOR&C_)^dAff?5 zQ3{sQ7V5dLzqDv+e_Qk>C$G(a|DOBr^zKu*-ENX2UFG}6VOa;P0_Fo|z$88H0a}1p zKs9hTvE)pj9KDKA27ovf%VA&}5KHpp7f=C|!w^eE27p+Hr3}~)Xt0&k$!VlX%O>^o zR8mbyB&E(E_72%?H29;7oS&P?VR=K&Hs%z19l%M}14Hbx4FGu>mg~aR3I*x1myu!l z8jvQ*`uxG}PO?3{Pxks}utVtQ&}@MbO(6{c`9dsJz$7L#uHQ~EQ&K1rakYOW>#a-h zPAC8U3ao_@wWAsU@^maufJBXXE*bN8kwUAZXv95WCu`+7a4h z4sgO5^9xC77)N6*tTS#yAu$K!pu{=sff7Ki%UT+7!pRZ!)D&V4{s|lsA?iF{6o<7P zKVv8EDHHV_ETQ@vUXa_~A2{ARJ?S$S2hAO>i0-pTSsOR2DIDlr?r_{>f|0XW?_42A zV{Onq&X#v%+O%u*bU|oRAsDD)=T}*9}brti|uh`c;|!9 z*j`S;W>0-~(f<-ZE(?3$HL%3_r5S@pTJYEz;>d05^^H9bD+2BbCCnvB9ed!Bs9#G% z$QMlodxH}2Gu{)jpIGX>KdadT_c*N1wnja>CRjIAPd8IS@rkJ2@BAdj0q*BjN|aQO z7$7m2*lHg9^Z0u>#1K@$+}_i$oI_);t07lM>pvrRwYL&;Fqg#XIgVjTBbHO-9wO`Q z%j9+pj5#^$wBET)%)wj|=U)?1{owZwvfjLaV7bPy?p#7A>t+uBiD>kpG&K{`(N0om zw9$Wg<#}>6Hv}9?1C8a2q{>KC#ZM+<-VTbHoE%xqJK7M^i{3BqlE(6vaxNwrSZ)AW zq)?J>-f}W5!^LELf;^A^{3f#9{`#pm=Ir(YZ`|cx&G^VV1{8}k1H+_d<}5Kx#Na$< zW4y!bkgZRUy1ulCtC^$qgZDZI0wTWWA2<+lI>0Nd@94k1@8_y7O^07*qoM6N<$g1Gny A!vFvP literal 0 HcmV?d00001 diff --git a/assets/map/school.png b/assets/map/school.png new file mode 100755 index 0000000000000000000000000000000000000000..b955cbfd7e88a4f007ded31e7f407874dcba69ac GIT binary patch literal 1182 zcmV;P1Y!G$P)Y*wtu#Rp^M7`lM(fgL~y@T=Dm zU};5`qSt0-0EjnXI1Bs?tP^W85A*=tFl4AG13>J;Z~-_4IQU;fg;PQS zm(=?mQsFKWXPHf#o6KZoCZ3V^k(7*t6EZfF%&SQOe^3t$Nmw=jT0Vdw*DNqDfOQa1P;QjCnxrsU4RwB{Yi z1aJsOJX_WPkT+v^1k?lrPU&i`5{Ghgv64b~di$qjG^~YX68KKyx zypXgW?%lH9Elt%f@w!%CNT|v!V-Xff+0U8V`Bdk#uSh!ZF)s1+;_}8J!H5Tg5zUxj zrBhn#Jch>TxZ3%aJ3uNu#s<8dPMVS%8ADm`wHq3s<7(zxAD^7d6rFt`pN1~1s<6}gl|X}~ZI;ECmNtXza#_L73%dSkvs zX8sSMRtf*&(+8C}hA~sbotrDr8@LVUxG|@**)R17ftl#I{-y`+0l$t+C8XnEa1 zmBq}311$j{w>^`YoVywG>Tt~*Zo0;(8YVJJ<7#E4%entuu4Q9l z^_Ad6Vg~iFFJT*HBwRJ-6-}xa9Y+tj^I6pmr2EHXG7(L!*+E3zQ)`#CB?awd578=H31LX@_=@z6eAy_X|&~^S3arQ@~2iVCYv$b1h(;F z(zaop>}f0)zr}_n66eKaPM)J#QR?aTT9gR7B33vS8SZnXmP@}3oCA5R*vsiw)jnUKAwOy6=TdKgB$|nH^0I#&%31~Lm(*OVf07*qoM6N<$g5HiO!2kdN literal 0 HcmV?d00001 diff --git a/assets/map/supermarket.png b/assets/map/supermarket.png new file mode 100755 index 0000000000000000000000000000000000000000..5d2a4dedcb265e1b5e2255fc47e7e21054cbebc6 GIT binary patch literal 1252 zcmV%nz*|(V zIg(#Ls?*tBeYX4Q1%l>mNuspO_&TyD3Sy4i$8;~gt_8jqzgL8~n%hw4sf+&f81)@b zLP4Uxz6;Z=Y7mST^x%RX-5ZfA3@AEi|yTm!p{)rmB zeooZ$%(=bie-Y&>V-EzZ_}HEv4W;Y0G(7aEL3dQ1GhNWbi;~8EMvl3lq=XG9FkJJo zu+8?9+pNTs)a0V02%MI5sb+dn!6?iytJ-VJITm5tqb+M zead%*%aM~XQL={mN0n|i;GR*RPwX?-N+vckeO%&>=Ty$`aNT7C8jUu2Qzp#rmRcPN z7QMWpdscU}*31dc2E=e(WdrK@Q|o!>^5Q(O;_C!9loQuUTF*tfj&mmc3k2J*$rK)| z?A*s4aM@mWiRC2B(Pm!DK^}ZG+()+__t2)TMP~}0yWHS9cc#-FSwL2Zx`Wb)JN7X*zk2;v6s$HT~BrslGa5j8VfStc!KB zZsr&;5ycxy^JWMt`w>HF%Fs_<|5JooFC-XBV~i+Om67#f9>(&uNi@1}aASGb9gO8W z`>d09s|)fgly5uLl-sQIUskyR^J$iir_7myY*{T( zi^c*0L=+*l)rZ!SHdGs58msl$>Whg9FZG78iBY^fSkt#AzSc_``ao)H+JaA7F;r>S z1r)4=3Iei}MRy6z&iMUjW^fU9XXJ8{FK1@w?D_ul-_HLF!!XFrm~8qq9n)vPM?eLz z3dpiPj{^S!cY$W$=cMXipSjsrI0*pacQ73Sb^%Ms-FOaM1WrMa?l}nn;uK8Z0JT6e zmXh$UA;q@=^J)^QZxN{(=3;G(j7T3D{|87PZo%xwk8=;~U|}r1xAR{mJimk^8f0zJL&2jsk$Z64O;6hY3Bazb27cOmi7V zsFR|BGg2Uo0bmP+xD!_ZkQZXQ0W1^QRiv&t0yU@6yoMGg&3}T7U@N~30h?kqF(m-V zQ!Vle;Vmb%qMk@mX+egrk#_f>pXea1wU!-o60fBkqV_Ql0!d2l z$ByLDhYh4Z`W~yZUkRNcDLLE7Q?@UD%x9JmbLjoQCE@h|uvbj{QNzL9kIzfgjTg-L zj(37*y`;75u{NuG<#d0^*;8Im%ChwdLsa|oD}Lf+mB$*`${CK6Od@jm=aGO(QdB$h zW6p=xntu>O@de<}7Tz*;NY1KTS%7NkC&+NlacxGAl3x?wJ=#t=`=swZikcBo%~7yU zN|sgPEWlWRgm1IMtrc>KtBkP;9s)~^a36`}H=NV@Kw})|3zGid4=&BvXFtkJh$GPkBh)VA zGokts|7?GeRzRMT{nImK&rf6wUzclyx7Z<^+wI4{S%4;B4_7kEitUN*mG=SZ!8@d6 zub)ApOxBQ&5aczET6{WXs%B2bSuzz1k*dCb!7&@ocW~*Z-P|poI29|nkw#?!iCaDhWat#VcNQKMS$KBr z84X}>a4?s}Iin)-8)00z{(4zPEu7vpxhL<<95X7SS&LHNyC_NzBlc3~eR9oz5+Qm! zaZws0L=~oAq!4NOsBjLT+$x-#&BwZ6($n_Ihpe)^)lFkkgsA~Qm7*ZFYtWeNK#1nK z47GlE`xQ9cHQVN__Rnp*yKT+5Avg|j%2T;R65e&BEJbUUh1M)37Y&=$n@)_9G5&;% zQM6`HxixFEJ0f=a0Km`G_2&_s(*OVf07*qoM6N<$f(>Xu-v9sr literal 0 HcmV?d00001 diff --git a/assets/mortgage.css b/assets/mortgage.css new file mode 100755 index 00000000..65917a3a --- /dev/null +++ b/assets/mortgage.css @@ -0,0 +1,105 @@ +.opalestate-mortgage-label { + width: 100%; + font-weight: 500; +} + +.opalestate-mortgage-chart-container { + overflow: hidden; +} + +.opalestate-mortgage-chart-container:after { + content: ""; + display: block; + clear: both; +} + +.opalestate-mortgage-chart-label { + font-size: 18px; +} + +.opalestate-mortgage-chart-container { + margin-bottom: 15px; +} + +.opalestate-mortgage-chart { + float: left; + width: 50%; +} + +.opalestate-mortgage-chart-svg { + margin-bottom: 15px; + position: relative; +} + +.opalestate-mortgage-chart-desc { + float: left; + width: 50%; +} + +.opalestate-mortgage-chart-notice ul { + padding: 0; + margin: 0; +} + +.opalestate-mortgage-chart-notice ul li { + font-size: 12px; + line-height: normal; + position: relative; + margin-bottom: 6px; + padding-left: 20px; + list-style: none; +} + +.opalestate-mortgage-chart-notice ul li span { + position: absolute; + top: 3px; + left: 0; + width: 8px; + height: 8px; + border-radius: 50%; + color: #7e7e7e; + font-weight: 400; +} + +.opalestate-mortgage-output { + font-size: 18px; + font-weight: 500; + color: #0a1938; +} + +.opalestate-mortgage-output-item { + margin-bottom: 6px; +} +.opalestate-monthly-value{ + color: #2f73e9; +} +.opalestate-mortgage-output label { + display: block; + font-size: 18px; + margin-bottom: 4px; + line-height: 1; +} + +.opalestate-mortgage-output small { + font-size: 15px; + text-transform: capitalize; +} + +.pie { + width: 120px; + background: #f06; + border-radius: 50%; +} + +.pie circle { + fill: none; + stroke: #02ce76; + stroke-width: 32; + animation: rotate 1.5s ease-in; +} + +@keyframes rotate { + to { + x + } +} diff --git a/assets/opalestate.css b/assets/opalestate.css new file mode 100755 index 00000000..22c41269 --- /dev/null +++ b/assets/opalestate.css @@ -0,0 +1,4598 @@ +/* +Theme Name: FullHouse +Theme URI: http://demovenustheme.com/wordpress/opalestate/ +Author: Opal Team +Author URI: https://wordpress.org/ +Description: In 2019, our default theme lets you create a responsive magazine website with a sleek, modern design. Feature your favorite homepage content in either a grid or a slider. Use the three widget areas to customize your website, and change your content's layout with a full-width page template and a contributor page to show off your authors. Creating a magazine website with WordPress has never been easier. +Version: 1.0 +License: GNU General Public License v2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html +Tags: black, green, white, light, dark, two-columns, three-columns, left-sidebar, right-sidebar, fixed-layout, responsive-layout, custom-background, custom-header, custom-menu, editor-style, featured-images, flexible-header, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready, accessibility-ready +Text Domain: opalestate + +This theme, like WordPress, is licensed under the GPL. +Use it to make something cool, have fun, and share what you've learned with others. +*/ +@media (min-width: 768px) { + .opal-row, .row { + margin-left: -15px; + margin-right: -15px; + } + .opal-row .col-sm-1, .opal-row .col-sm-2, .opal-row .col-sm-3, .opal-row .col-sm-4, .opal-row .col-sm-5, .opal-row .col-sm-6, .opal-row .col-sm-7, .opal-row .col-sm-8, .opal-row .col-sm-9, .opal-row .col-sm-10, .opal-row .col-sm-11, .opal-row .col-sm-12, .row .col-sm-1, .row .col-sm-2, .row .col-sm-3, .row .col-sm-4, .row .col-sm-5, .row .col-sm-6, .row .col-sm-7, .row .col-sm-8, .row .col-sm-9, .row .col-sm-10, .row .col-sm-11, .row .col-sm-12 { + float: left; + } + .opal-row .col-sm-1, .row .col-sm-1 { + width: 8.33333%; + } + .opal-row .col-sm-2, .row .col-sm-2 { + width: 16.66667%; + } + .opal-row .col-sm-3, .row .col-sm-3 { + width: 25%; + } + .opal-row .col-sm-4, .row .col-sm-4 { + width: 33.33333%; + } + .opal-row .col-sm-5, .row .col-sm-5 { + width: 41.66667%; + } + .opal-row .col-sm-6, .row .col-sm-6 { + width: 50%; + } + .opal-row .col-sm-7, .row .col-sm-7 { + width: 58.33333%; + } + .opal-row .col-sm-8, .row .col-sm-8 { + width: 66.66667%; + } + .opal-row .col-sm-9, .row .col-sm-9 { + width: 75%; + } + .opal-row .col-sm-10, .row .col-sm-10 { + width: 83.33333%; + } + .opal-row .col-sm-11, .row .col-sm-11 { + width: 91.66667%; + } + .opal-row .col-sm-12, .row .col-sm-12 { + width: 100%; + } + .opal-row .col-sm-1, .opal-row .col-sm-2, .opal-row .col-sm-3, .opal-row .col-sm-4, .opal-row .col-sm-5, .opal-row .col-sm-6, .opal-row .col-sm-7, .opal-row .col-sm-8, .opal-row .col-sm-9, .opal-row .col-sm-10, .opal-row .col-sm-11, .opal-row .col-sm-12, .row .col-sm-1, .row .col-sm-2, .row .col-sm-3, .row .col-sm-4, .row .col-sm-5, .row .col-sm-6, .row .col-sm-7, .row .col-sm-8, .row .col-sm-9, .row .col-sm-10, .row .col-sm-11, .row .col-sm-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; + } + .opal-row:before, .opal-row:after, .row:before, .row:after { + content: " "; + display: table; + } + .opal-row:after, .row:after { + clear: both; + } +} +@media (min-width: 992px) { + .opal-row .col-md-1, .opal-row .col-md-2, .opal-row .col-md-3, .opal-row .col-md-4, .opal-row .col-md-5, .opal-row .col-md-6, .opal-row .col-md-7, .opal-row .col-md-8, .opal-row .col-md-9, .opal-row .col-md-10, .opal-row .col-md-11, .opal-row .col-md-12, .row .col-md-1, .row .col-md-2, .row .col-md-3, .row .col-md-4, .row .col-md-5, .row .col-md-6, .row .col-md-7, .row .col-md-8, .row .col-md-9, .row .col-md-10, .row .col-md-11, .row .col-md-12 { + float: left; + } + .opal-row .col-md-1, .row .col-md-1 { + width: 8.33333%; + } + .opal-row .col-md-2, .row .col-md-2 { + width: 16.66667%; + } + .opal-row .col-md-3, .row .col-md-3 { + width: 25%; + } + .opal-row .col-md-4, .row .col-md-4 { + width: 33.33333%; + } + .opal-row .col-md-5, .row .col-md-5 { + width: 41.66667%; + } + .opal-row .col-md-6, .row .col-md-6 { + width: 50%; + } + .opal-row .col-md-7, .row .col-md-7 { + width: 58.33333%; + } + .opal-row .col-md-8, .row .col-md-8 { + width: 66.66667%; + } + .opal-row .col-md-9, .row .col-md-9 { + width: 75%; + } + .opal-row .col-md-10, .row .col-md-10 { + width: 83.33333%; + } + .opal-row .col-md-11, .row .col-md-11 { + width: 91.66667%; + } + .opal-row .col-md-12, .row .col-md-12 { + width: 100%; + } + .opal-row .col-md-1, .opal-row .col-md-2, .opal-row .col-md-3, .opal-row .col-md-4, .opal-row .col-md-5, .opal-row .col-md-6, .opal-row .col-md-7, .opal-row .col-md-8, .opal-row .col-md-9, .opal-row .col-md-10, .opal-row .col-md-11, .opal-row .col-md-12, .row .col-md-1, .row .col-md-2, .row .col-md-3, .row .col-md-4, .row .col-md-5, .row .col-md-6, .row .col-md-7, .row .col-md-8, .row .col-md-9, .row .col-md-10, .row .col-md-11, .row .col-md-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; + } +} +@media (min-width: 1200px) { + .opal-row .col-lg-1, .opal-row .col-lg-2, .opal-row .col-lg-3, .opal-row .col-lg-4, .opal-row .col-lg-5, .opal-row .col-lg-6, .opal-row .col-lg-7, .opal-row .col-lg-8, .opal-row .col-lg-9, .opal-row .col-lg-10, .opal-row .col-lg-11, .opal-row .col-lg-12, .row .col-lg-1, .row .col-lg-2, .row .col-lg-3, .row .col-lg-4, .row .col-lg-5, .row .col-lg-6, .row .col-lg-7, .row .col-lg-8, .row .col-lg-9, .row .col-lg-10, .row .col-lg-11, .row .col-lg-12 { + float: left; + } + .opal-row .col-lg-1, .row .col-lg-1 { + width: 8.33333%; + } + .opal-row .col-lg-2, .row .col-lg-2 { + width: 16.66667%; + } + .opal-row .col-lg-3, .row .col-lg-3 { + width: 25%; + } + .opal-row .col-lg-4, .row .col-lg-4 { + width: 33.33333%; + } + .opal-row .col-lg-5, .row .col-lg-5 { + width: 41.66667%; + } + .opal-row .col-lg-6, .row .col-lg-6 { + width: 50%; + } + .opal-row .col-lg-7, .row .col-lg-7 { + width: 58.33333%; + } + .opal-row .col-lg-8, .row .col-lg-8 { + width: 66.66667%; + } + .opal-row .col-lg-9, .row .col-lg-9 { + width: 75%; + } + .opal-row .col-lg-10, .row .col-lg-10 { + width: 83.33333%; + } + .opal-row .col-lg-11, .row .col-lg-11 { + width: 91.66667%; + } + .opal-row .col-lg-12, .row .col-lg-12 { + width: 100%; + } + .opal-row .col-lg-1, .opal-row .col-lg-2, .opal-row .col-lg-3, .opal-row .col-lg-4, .opal-row .col-lg-5, .opal-row .col-lg-6, .opal-row .col-lg-7, .opal-row .col-lg-8, .opal-row .col-lg-9, .opal-row .col-lg-10, .opal-row .col-lg-11, .opal-row .col-lg-12, .row .col-lg-1, .row .col-lg-2, .row .col-lg-3, .row .col-lg-4, .row .col-lg-5, .row .col-lg-6, .row .col-lg-7, .row .col-lg-8, .row .col-lg-9, .row .col-lg-10, .row .col-lg-11, .row .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; + } +} + +/* + * Global variables + */ +/* main color which will be used for all main block styles... */ +/** + * Import component variables + */ +/** elements mixins **/ +/** +* Transition-timing-function property@mixin +*/ +/*background RGBA +============================================*/ +/*inline-block +============================================*/ +/****/ +/****/ +/****/ +/** elements mixins **/ +/** +* Transition-timing-function property@mixin +*/ +/*background RGBA +============================================*/ +/*inline-block +============================================*/ +/****/ +/****/ +/** list **/ +.property-date { + display: inline-block; +} + +.entry-summary-tabs { + margin-top: 62px; +} + +.property-meta { + flex-basis: 100%; +} + +.property-types-list, +.property-categories-list { + display: inline-block; + margin-right: 5px; +} + +.property-address { + display: inline-block; + margin-top: 12px; + margin-right: 15px; +} +.property-address .property-view-map i { + color: #7e7e7e; +} +.property-address .property-view-map a { + margin-right: 4px; +} + +.box-inner-summary { + padding: 30px; +} +@media screen and (max-width: 767px) { + .box-inner-summary { + padding: 30px 0; + } +} + +.opalestate-box { + padding-bottom: 30px; +} +@media screen and (min-width: 768px) { + .opalestate-box { + padding: 30px; + border: 1px solid #ebebeb; + } +} +.opalestate-box .opalestate_property:last-of-type { + margin-bottom: 0; +} + +.opalestate-sidebar-box { + margin-bottom: 30px; +} +@media screen and (min-width: 768px) { + .opalestate-sidebar-box { + padding: 30px; + border: 1px solid #ebebeb; + } +} +@media screen and (max-width: 768px) { + .opalestate-sidebar-box { + margin-top: 30px; + } +} + +.property-information ul.list-info { + padding: 0; + margin-bottom: 0; +} +.property-information ul.list-info li { + list-style: none; +} +.property-information ul.list-info li h6 { + margin-bottom: 0; + flex: 1; + color: #7e7e7e; +} +.property-information ul.list-info li a { + color: inherit; +} +.property-information ul.list-info li:not(:last-child) div[class*="property-label-"] { + border-bottom: 1px solid #ebebeb; +} +.property-information ul.list-info div[class*="property-label-"] { + padding: 4px 0; + overflow: hidden; + display: flex; + align-items: center; +} +.property-information ul.list-info div[class*="property-label-"] h6 { + line-height: 1; +} +.property-information ul.list-info div[class*="property-label-"] i { + width: 15px; + margin-right: 15px; +} + +.property-amenities .list-group-item-text, .property-facilities .list-group-item-text { + line-height: 23px; + margin-top: 21px; +} +.property-amenities .list-group-item-text i, .property-facilities .list-group-item-text i { + margin-right: 2px; +} +.property-amenities .list-group-item-text div[class*="col-"], .property-facilities .list-group-item-text div[class*="col-"] { + line-height: 40px; +} +.property-amenities .list-group-item-text div.active i, .property-facilities .list-group-item-text div.active i { + color: #02ce76; +} + +.property-amenities img { + width: 15px; + margin-right: 5px; +} + +.property-attachments i { + font-size: 36px; + margin-right: 15px; + float: left; +} +.property-attachments a { + vertical-align: top; + line-height: 1; + display: block; + text-transform: capitalize; + padding-bottom: 5px; +} +.property-attachments .list-group-item-text { + margin-top: 36px; +} + +.google-map-tabs { + position: relative; +} +.google-map-tabs .opalestate-tab-head { + margin: 0; + background: transparent; +} +.google-map-tabs .tab-item { + border: none; + padding: 5px 10px; + margin-right: 10px; + color: #FFF; + background-color: #02ce76; + font-weight: 400; +} +.google-map-tabs .tab-item.active, .google-map-tabs .tab-item:hover { + background-color: #2f73e9; + color: #FFF; +} +.google-map-tabs .opalestate-tab-wrap { + position: absolute; + top: 10px; + right: 50px; + z-index: 2; +} + +#property-search-places { + bottom: 25px; + left: 10px; + position: absolute; + z-index: 1; +} +#property-search-places .btn-map-search { + cursor: pointer; + background-color: #FFF; + text-align: center; + width: 40px; + height: 40px; + position: relative; +} +#property-search-places .btn-map-search i { + display: block; + line-height: 40px; +} +#property-search-places .btn-map-search i.fa-hospital-o { + color: #b3e180; +} +#property-search-places .btn-map-search i.fa-plus-square { + color: #ec8f73; +} +#property-search-places .btn-map-search i.fa-graduation-cap { + color: #8fbfe4; +} +#property-search-places .btn-map-search i.fa-shopping-basket { + color: #9d4cfa; +} +#property-search-places .btn-map-search i.fa-subway { + color: #fabd47; +} +#property-search-places .btn-map-search i.fa-bank { + color: #6eadfb; +} +#property-search-places .btn-map-search em { + background: #2f73e9; + margin-left: 10px; + font-size: 10px; + color: #FFF; + padding: 1px 3px; +} +#property-search-places .btn-map-search span { + width: 0; + display: block; + visibility: hidden; + -webkit-transition: 0.35s; + -o-transition: 0.35s; + transition: 0.35s; + position: absolute; + left: 50%; + top: 0; + background-color: #FFF; + line-height: 40px; + padding: 0 10px; + z-index: -1; + opacity: 0; + filter: alpha(opacity=0); + font-size: 12px; +} +#property-search-places .btn-map-search:hover span, #property-search-places .btn-map-search.active span { + visibility: visible; + width: 200px; + left: 100%; + z-index: 1; + opacity: 1; + filter: alpha(opacity=100); +} + +@media screen and (min-width: 992px) { + .agent-sidebar { + margin-top: -286px; + } +} + +.single-agent { + margin-top: 30px; +} + +.agent-address-map { + border-top: none; +} + +.agency-preview { + display: none; +} + +@media screen and (max-width: 1024px) { + .property-agency-contact { + margin-top: 30px; + } +} +.property-agency-contact p { + margin-bottom: 0; +} +.property-agency-contact .entry-title { + margin-bottom: 6px; +} +.property-agency-contact .opalestate-social-icons { + margin: 0 0 0 15px; +} +.property-agency-contact .opalestate-social-icons [class^="opalestate-social-"] { + margin: 4px 0 0; +} +.property-agency-contact .agency-top-meta { + display: flex; + flex-wrap: wrap; + padding-bottom: 12px; + margin-bottom: 20px; + position: relative; +} +.property-agency-contact .agency-top-meta::before, .property-agency-contact .agency-excerpt::before { + content: ""; + width: calc( 100% + 30px); + height: 1px; + background-color: #ebebeb; + bottom: 0; + position: absolute; + right: -30px; +} +@media screen and (max-width: 1024px) { + .property-agency-contact .agency-top-meta::before, .property-agency-contact .agency-excerpt::before { + width: 100%; + left: 0; + right: auto; + } +} +.property-agency-contact .agency-top-info { + flex: 1; +} +.property-agency-contact .agency-excerpt { + padding-bottom: 20px; + margin-bottom: 13px; + position: relative; +} + +/** + * Single property + */ +.opalestate-box-content { + margin: 30px 0 0; +} +@media screen and (min-width: 768px) { + .opalestate-box-content { + margin: 60px 0 0; + } +} + +.opalestate-rows .opal-row { + display: flex; + flex-flow: wrap; +} + +.outbox-title { + margin-bottom: 15px; + display: inline-block; + line-height: 1; +} + +.property-single-info { + display: flex; + flex-wrap: wrap; + align-items: flex-end; + justify-content: space-between; + margin-top: 40px; + margin-bottom: 50px; +} + +.group-items { + display: flex; + align-items: center; + flex-wrap: wrap; +} +@media screen and (min-width: 768px) { + .group-items { + flex: 1; + } +} +.group-items .entry-title { + margin-bottom: 0; +} +.group-items .property-status { + position: relative; + display: flex; + top: 0; + left: 0; +} +.group-items .property-status li { + line-height: 14px; +} +.group-items .property-status span { + margin-bottom: 0; +} + +.swiper-container [class*="swiper-button-"] { + display: block; + color: #02ce76; + width: 62px; + height: 62px; + text-align: center; + background-color: rgba(255, 255, 255, 0.8); + transition: all .5s ease-in-out; + background-size: 10px 20px; + opacity: 0; +} +.swiper-container [class*="swiper-button-"]:hover { + background-color: #FFF; +} +.swiper-container .swiper-button-next { + right: -62px; +} +.swiper-container .swiper-button-prev { + left: -62px; +} +.swiper-container:hover [class*="swiper-button-"] { + opacity: 1; +} +.swiper-container:hover .swiper-button-next { + right: 20px; +} +.swiper-container:hover .swiper-button-prev { + left: 20px; +} + +.swiper-pagination { + display: none !important; +} + +.opalestate-single-property.opalestate_property { + border: none; +} +.opalestate-single-property .owl-thumb-wrapper { + padding-top: 10px; +} +.opalestate-single-property .owl-thumb-wrapper .owl-item:not(:last-of-type) { + padding-right: 10px; +} +@media screen and (min-width: 768px) { + .opalestate-single-property .entry-summary { + border: 1px solid #ebebeb; + padding-bottom: 40px; + } +} +.opalestate-single-property .property-meta-list { + border-bottom: 1px solid #ebebeb; + padding: 30px 30px 0; +} +@media screen and (max-width: 767px) { + .opalestate-single-property .property-meta-list { + padding: 30px 0 0; + border: none; + } +} +.opalestate-single-property .property-meta-list i { + color: #02ce76; +} +.opalestate-single-property .property-meta-list li:not(:last-child) { + margin-right: 30px; +} +@media screen and (min-width: 768px) { + .opalestate-single-property .entry-content { + padding: 30px 30px 0; + } +} +.opalestate-single-property .box-heading { + line-height: 1; + margin-bottom: 16px; +} + +.opalestate-single-property--print .table-responsive table tr td:last-child, .opalestate-single-property--print .table-responsive table tr th:last-child { + display: none; +} +.opalestate-single-property--print .opalestate-tab-head { + display: none; +} +.opalestate-single-property--print .opalestate-tab-content, .opalestate-single-property--print .plan-name { + display: block; +} + +.opalestate-single-property--version-2 .entry-summary { + border: none; + padding-bottom: 0; +} +.opalestate-single-property--version-2 .single-property-sidebar .opalestate-box-content:first-of-type { + margin-top: 0; +} + +.opalestate-tab-content .opalestate-box-content:first-of-type { + margin-top: 28px; +} + +@media screen and (min-width: 768px) { + .property-tab-content { + border: 1px solid #ebebeb; + } +} + +.opalestate-single-property--version-3 .property-single-info { + margin-bottom: 0; + display: block; +} +.opalestate-single-property--version-3 .single-price-content .property-price { + text-align: left; + margin-bottom: 7px; +} +.opalestate-single-property--version-3 .single-price-content .property-price span { + display: inline; +} + +.opalestate-single-property--version-5 .property-single-info { + margin-bottom: 0; + display: block; +} +.opalestate-single-property--version-5 .single-price-content .property-price { + text-align: left; + margin-bottom: 7px; +} +.opalestate-single-property--version-5 .single-price-content .property-price span { + display: inline; +} + +.opalestate-yelp-bussines_wrapper:not(:last-of-type) { + margin-bottom: 30px; +} + +.opalestate-yelp-unit { + display: flex; + flex-wrap: wrap; +} +.opalestate-yelp-unit:not(:last-of-type) { + margin-bottom: 30px; +} + +.opalestate-yelp-title { + line-height: 1; + padding-bottom: 20px; + border-bottom: 1px solid #ebebeb; + margin-bottom: 30px; +} + +.opalestate-yelp-icon { + display: none; + width: 15px; + margin-right: 15px; +} + +.opalestate-yelp-category { + display: inline-block; + margin-bottom: 0; + line-height: 1; +} + +.opalestate-yelp-unit__name { + line-height: 1; + margin-bottom: 9px; + margin-right: 15px; +} + +.opalestate-yelp-unit-distance { + display: none; + line-height: 1; + margin: 10px 0; +} + +.opalestate-yelp-unit__info { + flex: 1; +} + +.opalestate-yelp-unit__address { + line-height: 1; +} + +.opalestate-yelp-unit__avatar { + width: 50px; + height: 50px; + margin-right: 20px; +} +.opalestate-yelp-unit__avatar img { + width: 100%; + height: 100%; +} + +.opalestate-yelp-unit__ratings .opalestate-rating__stars { + margin-left: auto; +} +.opalestate-yelp-unit__ratings .opalestate-rating__stars span::before { + color: #d32323; +} + +.walkscores-logo { + float: right; + line-height: 24px; + margin-bottom: 15px; +} + +.walk_details { + display: flex; + align-items: center; + flex-wrap: wrap; +} +.walk_details:not(:last-of-type) { + margin-bottom: 30px; +} + +.text-holder { + flex: 1; +} +.text-holder h6 { + margin-bottom: 0; +} + +.number-holder { + margin-right: 10px; +} + +.scores-label { + margin-bottom: 0; + line-height: 24px; + width: 60px; + height: 60px; + text-align: center; + border-radius: 50%; + border: 2px solid #2f73e9; + color: #2f73e9; +} + +.walk-more-details { + text-transform: capitalize; +} + +.single-price-content .property-price { + padding-top: 17px; +} +.single-price-content .property-price span { + line-height: 1; +} +@media screen and (min-width: 768px) { + .single-price-content .property-price { + text-align: right; + } + .single-price-content .property-price .property-regular-price, .single-price-content .property-price .property-saleprice { + font-size: 36px; + } + .single-price-content .property-price .property-regular-price.has-saleprice { + font-size: 24px; + } + .single-price-content .property-price .property-before-price-label, .single-price-content .property-price .property-price-label { + display: block; + } +} +.single-price-content .property-price .property-price-label { + margin-top: 12px; +} +.single-price-content .property-price .property-before-price-label { + margin-bottom: 12px; +} +.single-price-content .call-to-price { + font-size: 18px; + font-weight: 500; + color: #0a1938; +} + +.property-meta-top { + line-height: 52px; +} +.property-meta-top .property-meta-top__list { + margin-bottom: 0; + align-items: center; +} +.property-meta-top .property-meta-top__list .property-meta-top__button { + width: 52px; + text-align: center; + margin-right: 0; +} +.property-meta-top .list-inline__print span { + display: none; +} +@media screen and (max-width: 767px) { + .property-meta-top .list-inline__sku { + flex-basis: 100%; + } +} +@media screen and (min-width: 768px) { + .property-meta-top { + border-bottom: 1px solid #ebebeb; + padding-left: 30px; + } + .property-meta-top .property-meta-top__list { + justify-content: flex-end; + } + .property-meta-top .property-meta-top__list li:first-child:not(.property-meta-top__button) { + flex: 1; + } + .property-meta-top .property-meta-top__button { + border-left: 1px solid #ebebeb; + } +} + +.property-sku { + font-weight: 500; + color: #0a1938; +} + +.opalestate-reviews { + padding-top: 0; + padding-bottom: 0; +} +.opalestate-reviews .comment-form-comment { + margin-bottom: 10px; +} +.opalestate-reviews #respond { + padding: 0; +} + +.opalestate-rating-percent__item { + display: flex; + flex-wrap: wrap; + margin: 11px 0; +} +.opalestate-rating-percent__item:last-of-type { + margin-bottom: 0; +} +.opalestate-rating-percent__item:first-of-type { + margin-top: 0; +} + +.opalestate-rating-percent__label { + line-height: 1; + margin-right: 15px; + margin-bottom: 0; +} + +.opalestate-process-bar { + display: flex; + height: 5px; + overflow: hidden; + font-size: 13px; + background-color: #eeeeee; + flex: 1; +} + +.opalestate-process-bar__item { + text-align: center; + background-color: #2f73e9; +} + +.opalestate-process-text { + display: block; + line-height: 1; + margin-left: 17px; + width: 34px; +} + +.opalestate-rating-header { + display: flex; + flex-wrap: wrap; + font-size: 13px; + font-weight: 500; + margin-bottom: 58px; +} +@media screen and (min-width: 768px) { + .opalestate-rating-header { + border-bottom: 1px solid #ebebeb; + } +} +.opalestate-rating-header > div { + padding-bottom: 26px; +} +@media screen and (max-width: 767px) { + .opalestate-rating-header > div { + flex-basis: 100%; + padding: 30px 0 0; + border: none; + } +} + +.opalestate-rating-percent { + padding-right: 30px; + flex-basis: 38%; + border-right: 1px solid #ebebeb; + padding-top: 30px; +} + +.opalestate-overall { + padding-left: 30px; + flex-basis: 62%; + padding-top: 25px; +} + +.opalestate-overall__info { + display: flex; + flex-wrap: wrap; + margin-bottom: 21px; +} + +.opalestate-overall__point { + margin-right: 40px; +} +.opalestate-overall__point .point-number { + margin-bottom: 0; + line-height: 1; + color: #2f73e9; +} + +.opalestate-overall__star { + display: flex; + flex-wrap: wrap; + align-items: center; + flex: 1; +} +.opalestate-overall__star .opalestate-overall__heading { + flex-basis: 100%; + margin-bottom: 11px; +} +.opalestate-overall__star .opalestate-rating, .opalestate-overall__star .opalestate-overall__rating-count { + margin-right: 5px; +} + +.opalestate-overall-features { + display: flex; + flex-wrap: wrap; +} + +.opalestate-overall-features__item { + line-height: 1; +} +.opalestate-overall-features__item:not(:last-of-type) { + margin-right: 53px; +} + +.opalestate-overall-features__label { + margin-bottom: 0; + text-transform: uppercase; + margin-bottom: 11px; +} + +.opalestate-overall-features__percent { + color: #0a1938; +} + +.commentlist { + padding: 0; + margin-bottom: 28px; + margin-top: 58px; +} +.commentlist > li { + padding-bottom: 22px; + display: block; +} +.commentlist > li:not(:last-of-type) { + margin-bottom: 30px; + border-bottom: 1px solid #ebebeb; +} + +.opalestate-noreviews { + margin-bottom: 25px; +} + +.comment_container { + display: flex; + flex-wrap: wrap; + align-items: flex-start; +} +.comment_container p { + margin-bottom: 0; +} +.comment_container .avatar { + width: 50px; + border-radius: 50%; + margin-right: 28px; +} +.comment_container .comment-text { + flex: 1; +} +.comment_container .meta { + margin-bottom: 15px; + line-height: 1; +} +.comment_container .opalestate-rating { + display: inline-block; +} + +.opalestate-review__ratings { + margin-bottom: 31px; +} + +.opalestate-review__author { + font-weight: 500; + color: #0a1938; +} + +.comment-form-rating { + display: inline-block; +} +@media screen and (min-width: 480px) { + .comment-form-rating { + width: 33.3333%; + } +} + +.property-360-virtual-session iframe { + width: 100%; + min-height: 500px; + display: block; +} + +.property-video-session iframe { + display: block; + height: auto; +} +@media screen and (min-width: 768px) { + .property-video-session iframe { + width: 100%; + min-height: 400px; + } +} + +/* + * Preview layout + */ +.property-preview-custom-size { + position: relative; + overflow: hidden; + height: 580px; +} +.property-preview-custom-size .property-preview-map, .property-preview-custom-size .opalestate-tab-content, .property-preview-custom-size iframe { + height: 100%; + width: 100%; + border: none; +} + +.property-preview .swiper-pagination-images { + margin-top: 10px; +} + +.property-preview-street-map { + height: 100%; +} + +.property-abs-info { + position: absolute; + padding: 15px; + bottom: 10%; + left: 9%; + background: #FFF; + z-index: 99; +} + +.gallery-metro-preview { + display: flex; + height: 100%; +} +.gallery-metro-preview a { + display: block; + width: 100%; + height: 100%; + background-size: cover; + background-repeat: no-repeat; + background-position: center center; +} +.gallery-metro-preview .no-image { + background-color: #2f73e9; +} +.gallery-metro-preview span { + display: block; + background-color: #000; + width: 100%; + height: 100%; + opacity: 0.7; + filter: alpha(opacity=70); + color: #FFF; + position: relative; +} +.gallery-metro-preview .metro-big { + width: 50%; +} +.gallery-metro-preview .metro-group-small { + width: 50%; + display: flex; + flex-wrap: wrap; +} +.gallery-metro-preview .metro-small { + width: 33%; + height: auto; + text-align: center; +} + +.opalestate-swiper-wrap { + position: relative; +} + +.swiper-slide .thumb-nav { + width: 100%; + height: 100px; + background-size: cover; + background-repeat: no-repeat; + background-position: center center; +} + +.property-mark-pics-preview .property-heading-top { + position: absolute; + bottom: 0; + left: 50%; + transform: translateX(-50%); +} +.property-mark-pics-preview .property-single-info { + margin-bottom: 46px; +} +.property-mark-pics-preview .property-thumbnail { + position: relative; +} +.property-mark-pics-preview .property-thumbnail::before { + content: ""; + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.4); + transition: all .5s ease-in-out; +} +.property-mark-pics-preview .entry-title, .property-mark-pics-preview a, .property-mark-pics-preview .property-single-info, .property-mark-pics-preview .property-price > span:first-child { + color: #FFF; +} + +.property-apartments-session { + padding-top: 6px; +} + +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +.table-responsive table { + table-layout: unset; + text-align: center; + margin-bottom: 0; +} +.table-responsive table th { + padding: 14px 3px; + border-style: solid; + border-color: #ebebeb; + border-width: 0 0 1px 0; + font-weight: 500; +} +.table-responsive table td { + border: none; + padding: 12px 3px 10px; +} +.table-responsive table tbody tr:nth-of-type(2n+2) { + background-color: #f8f8f8; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + border: 1px solid #ebebeb; + position: relative; + z-index: 30; + } + .table-responsive table { + width: 730px; + } +} + +.agency-box-top .agency-grid-style .agency-info { + border-bottom: none; +} + +.opalestate_single_agency { + padding-bottom: 30px; +} + +.archive .opalestate-head { + margin-bottom: 80px; +} + +.opalestate-head { + position: relative; + background-color: #02ce76; + display: flex; + align-items: center; + min-height: 640px; +} +.opalestate-head .opalestate-heading { + color: #FFF; + text-align: center; +} +.opalestate-head .opalestate-heading p { + margin-bottom: 50px; +} +.opalestate-head .opalestate-heading a { + color: #FFF; +} +.opalestate-head .opalestate-heading a:hover { + color: #2f73e9; +} +.opalestate-head .opalestate-head-title { + color: #FFF; + margin-bottom: 19px; +} +.opalestate-head .search-agent-title { + display: none; +} +.opalestate-head .opalestate-head-form { + padding: 0 30px; + margin-bottom: 21px; +} + +.opalestate-single-agent { + min-height: 500px; + align-items: flex-end; +} +.opalestate-single-agent .opalestate-heading { + text-align: left; +} +.opalestate-single-agent .opalestate-heading > span { + margin-bottom: 13px; + display: inline-block; +} +.opalestate-single-agent .opalestate-head-title { + margin-bottom: 29px; +} + +.opalesate-archive-top { + margin-bottom: 60px; + padding: 12px 0; + border-style: solid; + border-width: 1px 0 1px; + border-color: #ebebeb; + position: relative; +} +.opalesate-archive-top .opalestate-results { + line-height: 45px; +} +.opalesate-archive-top .opalestate-sortable { + display: inline-block; +} +.opalesate-archive-top .opalestate-sortable .form-control, .opalesate-archive-top .opalestate-sortable .select2-selection--single { + padding-top: 8px; +} + +.opalesate-archive-bottom { + position: relative; +} + +.display-mode { + display: inline-block; +} +.display-mode .btn:not(:disabled):not(.disabled) { + padding: 0; + background-color: transparent; + color: #7e7e7e; + margin-left: 10px; + font-size: 18px; +} +.display-mode .btn:not(:disabled):not(.disabled).active, .display-mode .btn:not(:disabled):not(.disabled):hover { + background-color: transparent; + color: #02ce76; +} + +.page-template-user-management header, .page-template-user-management footer, .page-template-user-management #colophon { + display: none; +} +.page-template-user-management article header { + display: block !important; +} + +.button-actions { + position: absolute; + top: 0; + right: 0; + color: #FFF; + z-index: 1; + display: flex; +} +.button-actions a { + background-color: #2f73e9; + color: #FFF; +} +.button-actions a:hover { + cursor: pointer; + background-color: #02ce76; + color: #FFF; +} + +.my-properties .property-status { + position: relative; + top: 0; + left: 0; +} +.my-properties .property-meta-list { + padding: 0; +} +.my-properties .my-properties-bottom { + display: none; +} +.my-properties .abs-col-item { + padding-top: 10px; +} +.my-properties .entry-title { + margin: 0; +} + +.search-agents-wrap .opalestate-search-agents-form { + padding-bottom: 30px; +} + +.agent-grid-style { + margin-bottom: 30px; + background-color: #FFF; +} +.agent-grid-style .agent-body { + border-style: solid; + border-width: 0 1px 1px 1px; + border-color: #ebebeb; + padding: 30px 30px 15px; +} +.agent-grid-style .agent-job { + line-height: 1; + padding-bottom: 14px; + border-bottom: 1px solid #ebebeb; +} +.agent-grid-style .trusted-label { + position: absolute; + right: 20px; + background-color: #FFF; + border-radius: 50%; + bottom: 0; + transform: translateY(50%); + border: 1px solid #ebebeb; + width: 48px; + line-height: 48px; +} + +.agent-list-style { + padding: 30px; + border: 1px solid #ebebeb; + margin-bottom: 30px; +} +.agent-list-style .team-info { + margin: 15px 0 0; +} + +.maps-container-fixed { + position: relative; + width: 100%; +} +@media (min-width: 1024px) { + .maps-container-fixed { + position: fixed; + z-index: 0; + width: 50%; + top: 0; + min-height: 600px; + } +} + +/** Shortcodes **/ +.opalestate-search-properties .search-properies-form { + margin-top: 30px; +} + +.opalestate-my-account-form { + position: relative; + background: #FFF; + padding: 30px; + width: auto; + max-width: 550px; + margin: 20px auto; +} +.opalestate-my-account-form .submit a { + display: block; + margin-top: 10px; +} +.opalestate-my-account-form .opalestate-button { + padding: 17px 35px 14px 35px; + width: 100%; +} +.opalestate-my-account-form h3 { + display: none; +} + +.opalesate-properties-results { + min-height: 800px; +} + +.membership-packages { + padding-top: 40px; + padding-bottom: 50px; +} + +.pricing.pricing-v3 { + border: 1px solid #ebebeb; + border-radius: 5px; + padding: 0; + margin-bottom: 30px; + overflow: hidden; +} +.pricing.pricing-v3 .pricing-header { + text-align: center; + background: #2f73e9; + color: #FFF; + position: relative; + padding: 15px 0px 0px; +} +.pricing.pricing-v3 .plan-price { + color: #FFF; + line-height: 2.3rem; + margin-top: 15px; +} +.pricing.pricing-v3 .plan-price p { + display: inline-block; +} +.pricing.pricing-v3 .pricing-body { + padding: 15px 30px; +} +.pricing.pricing-v3 .plan-figure { + font-size: 36px; + color: #FFF; + display: block; + font-weight: bold; +} +.pricing.pricing-v3 .plain-info > div { + padding: 10px 0; + font-size: 14px; +} +.pricing.pricing-v3 .plain-info .item-info { + border-bottom: 1px solid #ebebeb; + padding-bottom: 15px; + margin-bottom: 15px; + color: #0a1938; + font-weight: 500; + text-transform: uppercase; +} +.pricing.pricing-v3 .plain-info .item-info:last-child { + margin-bottom: 0; +} +.pricing.pricing-v3 .plain-info i { + margin-right: 10px; +} +.pricing.pricing-v3 .membership-form-wrapper { + color: #FFF; +} +.pricing.pricing-v3 .membership-add-to-purchase { + width: 100%; + border: 0; + text-align: center; + background-color: #999; + line-height: 42px; + text-transform: capitalize; +} +.pricing.pricing-v3 .membership-add-to-purchase:hover { + background-color: gray; +} +.pricing.pricing-v3 .pricing-footer { + padding: 0 30px 30px; + text-align: center; +} +.pricing.pricing-v3 .plan-title { + color: #FFF; + font-size: 18px; + margin: 0; + border: none; + font-weight: 500; + letter-spacing: -0.5px; + position: relative; +} + +.package-hightlighted .plan-subtitle { + background-color: #02ce76; + color: #000; + font-size: 12px; + text-transform: uppercase; + letter-spacing: 2px; + position: absolute; + bottom: -10px; + display: block !important; + margin: 0 auto; + max-width: 150px; + left: 0; + right: 0; + font-weight: 500; +} +.package-hightlighted .pricing.pricing-v3 .membership-add-to-purchase { + background-color: #02ce76; +} +.package-hightlighted .pricing.pricing-v3 .membership-add-to-purchase:hover { + background-color: #2f73e9; +} + +.site-header-account .account-label { + margin-left: 5px; +} +.site-header-account .opalestate-popup .popup-body { + padding: 0; + box-shadow: none; + background-color: transparent; +} +.site-header-account .btn { + margin-bottom: 15px; +} +.site-header-account .opalestate-social-login__buttons a { + padding: 0 10px; +} +.site-header-account .opalestate-social-login__buttons i { + margin-right: 10px; + padding-right: 10px; +} + +.mfp-with-zoom .mfp-container, +.mfp-with-zoom.mfp-bg { + opacity: 0; + -webkit-backface-visibility: hidden; + /* ideally, transition speed should match zoom duration */ + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} + +.mfp-with-zoom .white-popup { + top: 20px; + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} + +.mfp-with-zoom.mfp-ready .white-popup { + top: 0; +} + +.mfp-with-zoom.mfp-ready .mfp-container { + opacity: 1; +} + +.mfp-with-zoom.mfp-ready.mfp-bg { + opacity: 0.8; +} + +.mfp-with-zoom.mfp-removing .mfp-container, +.mfp-with-zoom.mfp-removing.mfp-bg { + opacity: 0; +} + +.white-popup { + position: relative; + background: #FFF; + padding: 30px; + width: auto; + max-width: 500px; + margin: 20px auto; +} +.white-popup .mfp-close { + top: 15px; +} +.white-popup .submit a { + display: block; + margin-top: 10px; +} +.white-popup .opalestate-button { + padding: 17px 35px 14px 35px; + width: 100%; +} + +.opalestate-social-login__buttons { + list-style: none; + padding: 0; + margin: 0; +} +.opalestate-social-login__buttons a { + display: block; + padding: 0 15px; + color: #FFF; +} +.opalestate-social-login__buttons a:hover { + color: #FFF; +} +.opalestate-social-login__buttons li:not(:last-child) { + margin-bottom: 15px; +} +.opalestate-social-login__buttons i { + margin-right: 15px; + padding: 16px 15px 14px 0; + position: relative; + text-align: center; + width: 35px; +} +.opalestate-social-login__buttons i::after { + content: ""; + position: absolute; + top: 0; + right: 0; + height: 100%; + border-left: 1px solid rgba(0, 0, 0, 0.1); + border-right: 1px solid rgba(255, 255, 255, 0.1); +} + +.opalestate-social-login-facebook-btn { + background-color: #3C5A99; +} + +.opalestate-social-login-google-btn { + background-color: #d34836; +} + +.sk-folding-cube { + margin: 20px auto; + width: 40px; + height: 40px; + position: relative; + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); +} + +.sk-folding-cube .sk-cube { + float: left; + width: 50%; + height: 50%; + position: relative; + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} + +.sk-folding-cube .sk-cube:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #ef114c; + -webkit-animation: sk-foldCubeAngle 2.4s infinite linear both; + animation: sk-foldCubeAngle 2.4s infinite linear both; + -webkit-transform-origin: 100% 100%; + -ms-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +.sk-folding-cube .sk-cube2 { + -webkit-transform: scale(1.1) rotateZ(90deg); + transform: scale(1.1) rotateZ(90deg); +} + +.sk-folding-cube .sk-cube3 { + -webkit-transform: scale(1.1) rotateZ(180deg); + transform: scale(1.1) rotateZ(180deg); +} + +.sk-folding-cube .sk-cube4 { + -webkit-transform: scale(1.1) rotateZ(270deg); + transform: scale(1.1) rotateZ(270deg); +} + +.sk-folding-cube .sk-cube2:before { + -webkit-animation-delay: 0.3s; + animation-delay: 0.3s; +} + +.sk-folding-cube .sk-cube3:before { + -webkit-animation-delay: 0.6s; + animation-delay: 0.6s; +} + +.sk-folding-cube .sk-cube4:before { + -webkit-animation-delay: 0.9s; + animation-delay: 0.9s; +} + +@-webkit-keyframes sk-foldCubeAngle { + 0%, 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} +@keyframes sk-foldCubeAngle { + 0%, 10% { + -webkit-transform: perspective(140px) rotateX(-180deg); + transform: perspective(140px) rotateX(-180deg); + opacity: 0; + } + 25%, 75% { + -webkit-transform: perspective(140px) rotateX(0deg); + transform: perspective(140px) rotateX(0deg); + opacity: 1; + } + 90%, 100% { + -webkit-transform: perspective(140px) rotateY(180deg); + transform: perspective(140px) rotateY(180deg); + opacity: 0; + } +} +.cmb2-element .ui-datepicker { + width: 350px !important; +} +.cmb2-element .ui-datepicker .ui-datepicker-month, .cmb2-element .ui-datepicker .ui-datepicker-year { + display: inline-block; +} + +.noUi-target, .noUi-target * { + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-touch-action: none; + -ms-user-select: none; + -moz-user-select: none; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.noUi-target { + position: relative; + direction: ltr; +} + +.noUi-base { + width: 100%; + height: 100%; + position: relative; + border-radius: 3px; +} + +.noUi-origin { + position: absolute; + right: 0; + top: 0; + left: 0; + bottom: 0; +} + +.noUi-handle { + position: relative; + z-index: 1; +} + +.noUi-stacking .noUi-handle { + z-index: 10; +} + +.noUi-state-tap .noUi-origin { + -webkit-transition: left .3s, top .3s; + transition: left 0.3s, top 0.3s; +} + +.noUi-state-drag * { + cursor: inherit !important; +} + +.noUi-base { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.noUi-horizontal { + height: 6px; + border-radius: 3px; +} +.noUi-horizontal .noUi-base .noUi-origin .noUi-handle { + margin-left: -18px; +} +.rtl .noUi-horizontal .noUi-base .noUi-origin .noUi-handle { + margin-right: -18px; + margin-left: inherit; +} +.noUi-horizontal .noUi-base .noUi-origin:first-child .noUi-handle { + margin-left: 0px; +} +.rtl .noUi-horizontal .noUi-base .noUi-origin:first-child .noUi-handle { + margin-right: 0px; + margin-left: inherit; +} + +.noUi-horizontal[data-mode="1"] .noUi-base { + background: #2f73e9; +} +.noUi-horizontal[data-mode="1"] .noUi-base .noUi-origin { + background: #e9e9f6; +} +.noUi-horizontal[data-mode="1"] .noUi-base .noUi-origin:first-child .noUi-handle { + margin-left: -9px; +} +.rtl .noUi-horizontal[data-mode="1"] .noUi-base .noUi-origin:first-child .noUi-handle { + margin-right: -9px; + margin-left: inherit; +} + +.noUi-horizontal[data-mode="2"] .noUi-base { + background: #e9e9f6; +} +.noUi-horizontal[data-mode="2"] .noUi-base .noUi-origin { + background: transparent; +} + +.noUi-horizontal .noUi-handle { + height: 18px; + width: 18px; + left: 0px; + top: -6px; +} +.noUi-horizontal .noUi-handle.noUi-handle-upper { + margin-left: -18px; +} +.rtl .noUi-horizontal .noUi-handle.noUi-handle-upper { + margin-right: -18px; + margin-left: inherit; +} + +.noUi-vertical { + width: 18px; +} + +.noUi-vertical .noUi-handle { + width: 28px; + height: 34px; + left: -6px; + top: -17px; +} + +.noUi-background { + background: #dadada; + border-radius: 3px; +} + +.noUi-connect { + background: #2f73e9; + border-radius: 3px; + height: 100%; + position: absolute; +} + +.noUi-dragable { + cursor: w-resize; +} + +.noUi-vertical .noUi-dragable { + cursor: n-resize; +} + +.noUi-handle { + border-radius: 50%; + background: #FFF; + cursor: default; + border: 1px solid rgba(0, 0, 0, 0.1); +} + +.noUi-active { + box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #DDD, 0 3px 6px -3px #BBB; +} + +[disabled] .noUi-connect, [disabled].noUi-connect { + background: #B8B8B8; +} + +[disabled] .noUi-handle { + cursor: not-allowed; +} + +.opalestate-rating-detail-container { + display: none; +} + +.opalestate-tooltip { + display: inline-block; + line-height: 1; +} + +.opalestate-rating-detail { + padding: 0; + margin: 0; + list-style: none; + text-align: center; + line-height: 2; +} +.opalestate-rating-detail li { + padding: 5px 0; +} +.opalestate-rating-detail li label { + margin-bottom: 0; +} +.opalestate-rating-detail li:not(:last-child) { + border-bottom: 1px solid #ebebeb; +} + +body .tooltipster-sidetip .tooltipster-box { + border: none; + border-radius: 5px; + background: white; + box-shadow: 0px 2px 8px 4px rgba(0, 0, 0, 0.12); +} +body .tooltipster-sidetip.tooltipster-bottom .tooltipster-box { + margin-top: 6px; +} +body .tooltipster-sidetip.tooltipster-left .tooltipster-box { + margin-right: 6px; +} +body .tooltipster-sidetip.tooltipster-right .tooltipster-box { + margin-left: 6px; +} +body .tooltipster-sidetip.tooltipster-top .tooltipster-box { + margin-bottom: 6px; +} +body .tooltipster-sidetip .tooltipster-content { + color: #7e7e7e; + background-color: #FFF; +} +body .tooltipster-sidetip .tooltipster-arrow { + height: 6px; + margin-left: -6px; + width: 12px; +} +body .tooltipster-sidetip.tooltipster-left .tooltipster-arrow, +body .tooltipster-sidetip.tooltipster-right .tooltipster-arrow { + height: 12px; + margin-left: 0; + margin-top: -6px; + width: 6px; +} +body .tooltipster-sidetip .tooltipster-arrow-background { + display: none; +} +body .tooltipster-sidetip .tooltipster-arrow-border { + border: 6px solid transparent; +} +body .tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-border { + border-bottom-color: white; +} +body .tooltipster-sidetip.tooltipster-left .tooltipster-arrow-border { + border-left-color: white; +} +body .tooltipster-sidetip.tooltipster-right .tooltipster-arrow-border { + border-right-color: white; +} +body .tooltipster-sidetip.tooltipster-top .tooltipster-arrow-border { + border-top-color: white; +} +body .tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-uncropped { + top: -6px; +} +body .tooltipster-sidetip.tooltipster-right .tooltipster-arrow-uncropped { + left: -6px; +} + +/***/ +/** + * jQuery toast plugin created by Kamran Ahmed copyright MIT license 2014 + */ +.jq-toast-wrap { + display: block; + position: fixed; + width: 350px; + pointer-events: none !important; + margin: 0; + padding: 0; + letter-spacing: normal; + z-index: 9000 !important; +} + +.jq-toast-wrap * { + margin: 0; + padding: 0; +} + +.jq-toast-wrap.bottom-left { + bottom: 20px; + left: 20px; +} + +.jq-toast-wrap.bottom-right { + bottom: 20px; + right: 40px; +} + +.jq-toast-wrap.top-left { + top: 20px; + left: 20px; +} + +.jq-toast-wrap.top-right { + top: 20px; + right: 40px; +} + +.jq-toast-single { + display: block; + width: 100%; + padding: 10px; + margin: 0px 0px 5px; + border-radius: 4px; + font-size: 12px; + line-height: 17px; + position: relative; + pointer-events: all !important; + background-color: #444444; + color: white; +} + +.jq-toast-single h2 { + font-size: 14px; + margin: 0px 0px 7px; + background: none; + color: inherit; + line-height: inherit; + letter-spacing: normal; +} + +.jq-toast-single a { + color: #eee; + text-decoration: none; + font-weight: bold; + border-bottom: 1px solid white; + padding-bottom: 3px; + font-size: 12px; +} + +.jq-toast-single ul { + margin: 0px 0px 0px 15px; + background: none; + padding: 0px; +} + +.jq-toast-single ul li { + list-style-type: disc !important; + line-height: 17px; + background: none; + margin: 0; + padding: 0; + letter-spacing: normal; +} + +.close-jq-toast-single { + position: absolute; + top: 3px; + right: 7px; + font-size: 14px; + cursor: pointer; +} + +.jq-toast-loader { + display: block; + position: absolute; + top: -2px; + height: 5px; + width: 0%; + left: 0; + border-radius: 5px; + background: red; +} + +.jq-toast-loaded { + width: 100%; +} + +.jq-has-icon { + padding: 10px 10px 10px 50px; + background-repeat: no-repeat; + background-position: 10px; +} + +.jq-icon-info { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII="); + background-color: #31708f; + color: #d9edf7; + border-color: #bce8f1; +} + +.jq-icon-warning { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII="); + background-color: #8a6d3b; + color: #fcf8e3; + border-color: #faebcc; +} + +.jq-icon-error { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII="); + background-color: #a94442; + color: #f2dede; + border-color: #ebccd1; +} + +.jq-icon-success { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg=="); + color: #dff0d8; + background-color: #3c763d; + border-color: #d6e9c6; +} + +/* + * + */ +.opalestate-search-form:not([class*="opalestate-search-form--vertical"]) { + background-color: #FFF; + padding: 15px 30px; +} +.opalestate-search-form:not([class*="opalestate-search-form--vertical"]).opalestate-search-agents-form { + border: 1px solid #ebebeb; + margin-bottom: 30px; +} +.opalestate-search-form .btn-search, .opalestate-search-form .status-item, .opalestate-search-form .opalestate-collapse-btn { + margin-top: 45px; +} +.opalestate-search-form.hidden-labels .opalestate-label { + display: none; +} +.opalestate-search-form.hidden-labels .input-search-city .opalestate-popup { + top: 20%; +} +.opalestate-search-form.hidden-labels .select2-container, .opalestate-search-form.hidden-labels .btn-search, .opalestate-search-form.hidden-labels .form-control, .opalestate-search-form.hidden-labels .opal-collapse-button, .opalestate-search-form.hidden-labels .input-group-number { + margin: 15px 0; +} +.opalestate-search-form.hidden-labels .opal-slide-ranger .slide-ranger-label { + display: block; + line-height: 2; +} +.opalestate-search-form.hidden-labels .map-remove { + top: 10px; +} +.opalestate-search-form .opalestate-label { + font-weight: 500; + display: block; + color: #0a1938; + line-height: 1; + margin-top: 15px; + margin-bottom: 15px; +} +.opalestate-search-form h6 { + margin: 0; +} +.opalestate-search-form .searchbox-top { + border-bottom: solid 1px #ebebeb; + margin-bottom: 15px; + text-transform: uppercase; +} +.opalestate-search-form .select2-container, .opalestate-search-form .btn-search, .opalestate-search-form .form-control, .opalestate-search-form .list-property-status, .opalestate-search-form .opal-collapse-button, .opalestate-search-form .input-group-number { + margin-bottom: 15px; +} +.opalestate-search-form .opal-slide-ranger { + padding: 8px 0; +} +.opalestate-search-form .opal-slide-ranger .slide-ranger-label { + display: block; + line-height: 1; +} +.opalestate-search-form .list-property-status .status-item { + cursor: pointer; + text-align: center; + flex: 1; + padding: 9px 0 6px; + color: #FFF; + background-color: #02ce76; + transition: all ease-in-out 0.5s; +} +.opalestate-search-form .list-property-status .status-item:hover, .opalestate-search-form .list-property-status .status-item.active { + background-color: #2f73e9; +} +.opalestate-search-form .btn-search { + width: 100%; + text-align: center; +} +.opalestate-search-form .btn-search i { + margin-right: 5px; +} +@media screen and (max-width: 768px) { + .opalestate-search-form .opal-slide-ranger { + margin: 15px 0; + } +} + +.opalestate-archive-agency .opalestate-search-form:not([class*="opalestate-search-form--vertical"]), +.opalestate-archive-search-block .opalestate-search-form:not([class*="opalestate-search-form--vertical"]), +.post-type-archive-opalestate_agent .opalestate-search-form:not([class*="opalestate-search-form--vertical"]) { + margin: 0 -30px; +} + +.map-remove { + display: none; + position: absolute; + right: 50px; + top: 40px; +} + +.opalestate-search-opal-map.active .map-remove { + display: block; +} +.opalestate-search-opal-map.active .map-remove:focus, .opalestate-search-opal-map.active .map-remove:hover { + cursor: pointer; +} +.opalestate-search-opal-map.active input[value=""] + .map-remove { + display: none; +} + +[class*="opalestate-search-form--vertical"] .btn-search { + margin-top: 15px; +} +[class*="opalestate-search-form--vertical"] .opalestate-label { + margin-top: 10px; + margin-bottom: 10px; +} + +.search-more-options { + position: relative; + margin: 15px 0 5px; + line-height: 1; +} + +a.opal-collapse-button { + display: block; + font-weight: 600; +} +a.opal-collapse-button:before { + font-family: "Font Awesome 5 Free"; + content: '\f0fe'; + padding-right: 5px; + color: #2f73e9; + transition: all 0.5s ease; +} +a.opal-collapse-button.show { + color: #2f73e9; +} +a.opal-collapse-button.show:before { + content: '\f146'; +} + +.more-options-container { + margin-top: 15px; +} + +.more-options-items { + display: inline-block; + width: 100%; +} + +.opal-collapse-container { + width: 100%; + display: none; +} + +button.opal-collapse-button { + transition: all 0.5s; + width: 100%; +} +button.opal-collapse-button i::before { + display: block; + transition: all 0.5s; +} +button.opal-collapse-button:hover, button.opal-collapse-button.show { + outline: none; +} +button.opal-collapse-button:focus { + outline: none; +} +button.opal-collapse-button.show i::before { + transform: rotate(180deg); +} + +.more-options-item { + width: 25%; + float: left; + margin-bottom: 15px; +} +@media (max-width: 767px) { + .more-options-item { + width: 100%; + } +} + +.input-search-city { + position: relative; +} +.input-search-city .opalestate-popup { + position: absolute; + top: 40px; + right: 16px; +} + +.form-item--types .group-item { + display: block; + position: relative; + padding-left: 0px; + margin-bottom: 15px; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + line-height: 1; +} +.form-item--types .group-item .custom-checkbox-label { + z-index: -1; +} +.form-item--types .group-item input[type="checkbox"] { + position: absolute; + opacity: 0; + cursor: pointer; +} +.form-item--types .group-item input[type="checkbox"]:checked ~ .custom-checkbox-label { + background-color: #2f73e9; +} +.form-item--types .group-item input[type="checkbox"]:checked ~ .custom-checkbox-label::after { + display: block; +} +.form-item--types .group-item:hover input ~ .custom-checkbox-label { + background-color: #ccc; +} + +.opalestate-search-form--vertical .more-options-item { + float: none; + width: 100%; +} + +.more-options-label { + display: inline-block; + position: relative; + padding-left: 23px; + margin-bottom: 0px; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.more-options-label input[type="checkbox"] { + position: absolute; + opacity: 0; + cursor: pointer; +} +.more-options-label input[type="checkbox"]:checked ~ .custom-checkbox-label { + background-color: #02ce76; +} +.more-options-label input[type="checkbox"]:checked ~ .custom-checkbox-label::after { + display: block; +} +.more-options-label:hover input ~ .custom-checkbox-label { + background-color: #ccc; +} + +.custom-checkbox-label { + position: absolute; + top: 0; + left: 0; + height: 15px; + width: 15px; + background-color: #eee; +} +.custom-checkbox-label::after { + content: ""; + position: absolute; + display: none; + left: 5px; + top: 2px; + width: 5px; + height: 8px; + border: solid #FFF; + border-width: 0 2px 2px 0; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); +} + +.search-status-bar--2 .list-property-status { + padding: 0; + margin: 0; +} +.search-status-bar--2 .list-property-status .status-item { + font-size: 100%; + padding: 8px 35px 5px 35px; + color: #0a1938; + border-width: 1px 0 1px; + margin-right: 0; + margin-top: 15px; + border-style: solid; + border-color: transparent; + position: relative; + font-weight: 500; + flex: unset; + background-color: transparent; +} +.search-status-bar--2 .list-property-status .status-item:last-child { + margin-right: 0; +} +@media screen and (max-width: 767px) { + .search-status-bar--2 .list-property-status .status-item { + margin-right: 30px; + } +} +.search-status-bar--2 .list-property-status .status-item.active, .search-status-bar--2 .list-property-status .status-item:hover { + background-color: transparent; + color: #2f73e9; + border-color: #2f73e9; +} +.search-status-bar--2 .list-property-status .status-item.active::after { + content: ""; + border-top: 8px solid; + border-right: 9px solid transparent; + border-left: 9px solid transparent; + border-bottom: 0; + position: absolute; + top: 100%; + left: 50%; + transform: translateX(-50%); +} + +.opalestate-search-form--vertical .select2-container, .opalestate-search-form--vertical .input-group-number { + margin-top: 0; +} +.opalestate-search-form--vertical .opalestate-label { + display: inline-block; +} + +.opalestate-search-form--vertical-2 { + padding-top: 0; + padding-bottom: 0; +} +.opalestate-search-form--vertical-2 .opalestate-label { + display: none; +} +.opalestate-search-form--vertical-2 .input-group-number { + margin-top: 15px; +} +.opalestate-search-form--vertical-2 h6 { + margin-bottom: 5px; +} +.opalestate-search-form--vertical-2 .input-search-city .opalestate-popup { + top: 20%; +} +.opalestate-search-form--vertical-2 .opal-form-content .form-item:not(:last-of-type) { + border-bottom: 1px solid #ebebeb; + padding-bottom: 15px; + margin-bottom: 30px; +} +.opalestate-search-form--vertical-2 .more-options-items .more-options-item { + width: 100%; +} + +.input-group-number { + display: inline-flex; + align-items: center; + border: 1px solid #ebebeb; + padding: 0.65rem 1rem; + height: 50px; + width: 100%; + position: relative; + background-color: #FFF; +} +.input-group-number i[class*="icon-property-"] { + margin-right: 1rem; +} +.input-group-number .form-control { + padding: 0; + margin: 0; + height: auto; + border: none; + flex: 1; + background-color: transparent; +} +.input-group-number .form-control:focus { + background-color: transparent; +} +.input-group-number .btn-actions { + position: absolute; + right: 0; + top: 0; + line-height: 50px; +} +.input-group-number .btn-actions span { + padding-left: 1rem; + padding-right: 1rem; + border-left: 1px solid #ebebeb; +} +.input-group-number .btn-actions span:hover { + color: #02ce76; + cursor: pointer; +} + +.opalestate-search-form--advanced-6 { + display: flex; +} +.opalestate-search-form--advanced-6 .opalestate-search-form__item:not(:first-child) { + flex: 1; +} +.opalestate-search-form--advanced-6 .opalestate-search-form__item:first-child { + flex-basis: 12%; +} +.opalestate-search-form--advanced-6 .opalestate-search-form__item:first-child .select2-selection--single { + padding-left: 10px; + border-right: 0; +} +.opalestate-search-form--advanced-6 .opalestate-search-form__item:first-child .select2-selection--single .select2-selection__rendered { + padding: 0; +} +.opalestate-search-form--advanced-6 .btn-search { + width: 128px; +} + +.search-agent-title { + margin-bottom: 0; +} + +.select2-container.select2-container--default .select2-selection--single { + display: block; + width: 100%; + height: 50px; + padding: 0.65rem 1rem; + font-size: 15px; + line-height: 50px; + color: #555555; + background-color: #fff; + border: 1px solid #ebebeb; + background-clip: padding-box; + border-radius: 0; +} +.select2-container.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 50px; + width: 40px; +} +.select2-container .select2-dropdown { + border-color: #ebebeb; +} + +.property-options { + position: absolute; + bottom: 10px; + right: 10px; +} +.property-options .opalestate-ajax-gallery { + width: 35px; + line-height: 35px; + text-align: center; + display: inline-block; + color: #FFF; + background-color: #02ce76; + border-radius: 50%; +} +.property-options .opalestate-ajax-gallery:hover { + background-color: #2f73e9; +} + +.author-avatar img { + border-radius: 50%; +} + +.opalestate_property { + margin-bottom: 30px; + background-color: #FFF; + border: solid 1px #ebebeb; + position: relative; +} +.opalestate_property.opalestate-single-property, .opalestate_property[class*="property-featured"] { + border: none; + margin-bottom: 0; + background: transparent; +} +.opalestate_property header { + position: relative; +} + +.property-box-image { + overflow: hidden; + position: relative; +} +.property-box-image a::after { + content: ""; + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.3); + top: 0; + left: 0; +} + +.property-price .property-regular-price, .property-price .property-saleprice { + font-size: 18px; + letter-spacing: -0.5px; + font-weight: 500; + color: #2f73e9; +} +.property-price .property-regular-price.has-saleprice { + font-size: 15px; + opacity: 0.8; +} + +/** ----list---- **/ +.property-list { + display: flex; + flex-wrap: wrap; +} +.property-list header { + flex-basis: 35.065%; +} +.property-list .property-box-image { + height: 100%; +} +.property-list .property-box-image img { + height: 100%; +} +.property-list .entry-title { + margin: 7px 0 0px; +} +.property-list .property-address { + margin: 6px 0 23px; +} +.property-list .abs-col-item { + flex: 1; + padding-left: 30px; + position: relative; + display: flex; + flex-wrap: wrap; +} +.property-list .property-meta-list { + align-self: flex-end; + flex-basis: 100%; + padding: 15px 0 0; + margin-top: 15px; + border-top: 1px solid #ebebeb; +} +.property-list .property-meta-list li { + margin-bottom: 15px; +} +.property-list .property-meta-list li:not(:last-child) { + margin-right: 30px; +} +.property-list .entry-summary { + flex-basis: 25%; + padding: 0 30px; +} +.property-list .property-meta-bottom { + display: flex; + position: absolute; + top: 10px; + right: 10px; +} +.property-list .property-meta-bottom .property-toggle-favorite { + display: block; + width: 22px; + line-height: 22px; + border-radius: 50%; + color: #FFF; + text-align: center; + cursor: pointer; + font-size: 12px; + background-color: rgba(0, 0, 0, 0.3); +} +.property-list .property-meta-bottom .property-toggle-favorite:hover { + background-color: #2f73e9; +} +.property-list .author-avatar { + width: 22px; +} +.property-list .author-link { + display: block; + line-height: 1; +} +.property-list .author-name { + display: none; +} +.property-list .meta-item:not(:last-of-type) { + margin-right: 5px; +} +.property-list .property-group-label { + top: 10px; + left: 10px; +} +@media screen and (max-width: 992px) { + .property-list { + padding: 15px; + } + .property-list header { + flex-basis: 100%; + } + .property-list .abs-col-item { + padding: 15px 0 0; + } + .property-list .entry-summary { + flex-basis: 33.3333%; + padding-top: 15px; + padding-right: 0; + } +} +@media screen and (max-width: 767px) { + .property-list .entry-summary { + flex-basis: 100%; + padding: 15px 0 0; + } +} + +.property-list-style-v1 header { + padding-bottom: 0; +} +.property-list-style-v1 .property-list { + padding: 10px; +} + +@media screen and (min-width: 768px) { + .container-cols-3 .abs-col-item { + border-right: 1px solid #ebebeb; + } +} + +.property-list-style-v2 .property-list { + padding: 0; +} +.property-list-style-v2 .abs-col-item { + padding: 0 30px; + border: none; +} +.property-list-style-v2 .entry-content { + width: 100%; +} +.property-list-style-v2 .entry-title { + margin: 16px 0 0px; +} +.property-list-style-v2 .property-address { + margin: 6px 0 0px; +} +.property-list-style-v2 .property-meta-list { + padding: 0; + margin-top: 9px; +} +.property-list-style-v2 .property-meta-list li { + margin-top: 19px; + margin-bottom: 8px; +} +.property-list-style-v2 .property-meta-list li:not(:last-child) { + margin-right: 30px; +} +.property-list-style-v2 .property-meta-list .label-property { + display: none; +} + +ul.property-meta-list { + padding: 30px 20px 0; + margin: 0; +} +ul.property-meta-list li { + line-height: 1; + margin-bottom: 30px; +} +ul.property-meta-list i { + margin-right: 5px; + width: 20px; + display: inline-block; + font-style: unset; +} + +i[class*="icon-property-"] { + font-family: FontAwesome; +} + +.icon-property-areasize:before { + content: "\f047"; +} + +.icon-property-bedrooms:before { + content: "\f236"; +} + +.icon-property-bathrooms:before { + content: "\f2cd"; +} + +.icon-property-parking:before { + content: "\f1b9"; +} + +.icon-property-builtyear:before { + content: "\f073"; +} + +.icon-property-plotsize:before { + content: "\f278"; +} + +.icon-property-orientation:before { + content: "\f14e"; +} + +.icon-property-livingrooms:before { + content: "\f26c"; +} + +.icon-property-kitchens:before { + content: "\f0f5"; +} + +.icon-property-amountrooms:before { + content: "\f1ad"; +} + +/** Grid **/ +.property-grid .entry-content { + padding: 0 20px 15px; +} +.property-grid .entry-title { + margin: 0 0 6px; +} +.property-grid .property-address { + margin: 0; +} +.property-grid .property-address span.property-view-map { + color: #7e7e7e; +} +.property-grid .property-meta-list.list-inline li { + flex-basis: 50%; + margin-right: 0; +} +.property-grid .property-price .property-regular-price, .property-grid .property-price .property-saleprice { + letter-spacing: -0.5px; + color: #2f73e9; +} +@media screen and (min-width: 768px) { + .property-grid .property-price .property-regular-price, .property-grid .property-price .property-saleprice { + font-size: 24px; + } +} +.property-grid .property-price .property-regular-price.has-saleprice { + font-size: 15px; +} +.property-grid .entry-content-bottom { + display: flex; + align-items: center; + border-top: 1px solid #ebebeb; +} +.property-grid .entry-content-bottom > *:not(:first-child) { + position: relative; + padding: 11px 0; + border-left: 1px solid #ebebeb; +} +.property-grid .entry-content-bottom > *:first-child { + margin-left: 20px; + flex: 1; +} +.property-grid .property-toggle-favorite { + width: 52px; + text-align: center; +} +@media screen and (max-width: 767px) { + .property-grid .entry-content { + padding: 30px 15px 15px; + } + .property-grid .property-meta-list { + padding: 23px 15px 17px 15px; + } + .property-grid .property-meta-bottom { + margin-left: 15px; + } + .property-grid .property-group-label { + left: 15px; + } +} + +.property-grid .author-link, .property-featured .author-link { + line-height: 1; + display: flex; + align-items: center; +} +.property-grid .author-link:hover, .property-featured .author-link:hover { + color: #2f73e9; +} +.property-grid .author-avatar, .property-featured .author-avatar { + width: 35px; + margin-right: 8px; +} +.property-grid .author-name, .property-featured .author-name { + font-size: 13px; + font-weight: 500; +} + +/** Grid Layout 1**/ +.property-grid-v1 .author-link { + position: absolute; + bottom: 10px; + left: 20px; + color: #FFF; +} + +/** Grid Layout 2**/ +.property-grid-v2 .property-group-label { + top: 10px; +} +.property-grid-v2 .author-name { + display: none; +} +.property-grid-v2 .property-meta-list.list-inline li { + flex-basis: unset; +} +.property-grid-v2 .property-meta-list.list-inline li:not(:last-child) { + margin-right: 25px; +} +.property-grid-v2 .entry-content-bottom .author-link { + padding: 0; + width: 52px; + justify-content: center; +} +.property-grid-v2 .author-avatar { + margin: 0; + width: 30px; + padding: 11px 0; +} + +/** Grid Layout 3**/ +.property-grid-v3 .property-meta-bottom { + position: absolute; + bottom: 15px; + padding-left: 15px; + width: 100%; +} +.property-grid-v3 .entry-title { + margin: 17px 0 6px; +} +.property-grid-v3 header { + padding: 5px 5px 0; +} +.property-grid-v3 .entry-summary { + margin-bottom: 20px; +} +.property-grid-v3 .property-price { + color: #FFF; + line-height: 1; +} +.property-grid-v3 .property-price .property-regular-price, .property-grid-v3 .property-price .property-saleprice { + color: #FFF; + font-size: 18px; +} +.property-grid-v3 .property-price .property-price-label { + font-size: 13px; +} +.property-grid-v3 .property-price .property-regular-price.has-saleprice { + font-size: 15px; +} +.property-grid-v3 .entry-content { + padding: 0 20px; +} +.property-grid-v3 .property-meta-list.list-inline { + padding: 0; +} +.property-grid-v3 .property-meta-list.list-inline .info-meta .label-property { + display: none; +} +.property-grid-v3 .property-meta-list.list-inline li { + flex-basis: unset; +} +.property-grid-v3 .property-meta-list.list-inline li:not(:last-child) { + margin-right: 30px; +} +.property-grid-v3 .entry-content-bottom { + border: none; + padding: 10px 20px; + background-color: #f4f4f4; +} +.property-grid-v3 .entry-content-bottom > *:not(:first-child) { + border: none; + padding: 0; + width: 30px; + background-color: rgba(126, 126, 126, 0.2); + border-radius: 3px; + color: #fff; +} +.property-grid-v3 .entry-content-bottom > *:not(:first-child):hover { + background-color: #2f73e9; +} +.property-grid-v3 .entry-content-bottom > *:first-child { + margin-left: 0; +} +.property-grid-v3 .author-avatar { + width: 30px; +} + +.property-mark-hover-item .property-grid__header { + min-height: 245px; +} +.property-mark-hover-item .list-inline { + padding: 0; +} +.property-mark-hover-item header::before { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-image: -webkit-gradient(linear, left top, left bottom, from(transparent), to(rgba(0, 0, 0, 0.95))); + background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.95)); + z-index: 1; +} +.property-mark-hover-item .property-price-wrapper, .property-mark-hover-item .property-areasize { + display: inline-block; + margin-right: 30px; +} +.property-mark-hover-item .entry-content { + position: absolute; + bottom: 0; + left: 0; + z-index: 2; + padding: 0 15px 15px; + color: #FFF; +} +.property-mark-hover-item .entry-title { + color: inherit; +} +.property-mark-hover-item .entry-title a { + color: inherit; +} +.property-mark-hover-item .property-price .property-regular-price, .property-mark-hover-item .property-price .property-saleprice { + font-size: 18px; + color: inherit; +} + +/** Featured Property **/ +.property-featured { + display: flex; + flex-wrap: wrap; +} +.property-featured .featured-info { + background-color: #0a1938; + color: #FFF; + flex-basis: 50%; + padding: 52px 75px 49px 100px; +} +@media screen and (max-width: 992px) { + .property-featured .featured-info { + flex-basis: 100%; + } +} +@media screen and (max-width: 1024px) { + .property-featured .featured-info { + padding: 30px; + } +} +.property-featured .author-link { + position: absolute; + bottom: 10px; + left: 15px; + color: #FFF; +} +.property-featured .property-view-map { + color: #FFF; +} +.property-featured .property-view-map i { + color: #FFF; +} +.property-featured .property-view-map a { + color: #FFF; +} +.property-featured header { + flex-basis: 100%; +} +@media screen and (min-width: 992px) { + .property-featured header { + flex-basis: 50%; + } +} +.property-featured ul.property-meta-list { + padding: 0; +} +.property-featured ul.property-meta-list > li { + margin-right: 0; + width: 50%; +} +.property-featured ul.property-meta-list i { + color: #02ce76; + width: auto; +} +.property-featured ul.property-meta-list .icon-box { + font-size: 30px; + width: auto; +} +.property-featured ul.property-meta-list .info-meta span { + display: block; + margin-bottom: 5px; +} +.property-featured .entry-title { + margin-top: 14px; + margin-bottom: 8px; +} +.property-featured .entry-title a { + color: #FFF; +} +.property-featured .entry-title a:hover { + color: #2f73e9; +} +.property-featured .property-address { + margin: 0 0 20px; +} +.property-featured .property-description { + margin-bottom: 30px; +} +.property-featured .property-price .property-regular-price, .property-featured .property-price .property-saleprice { + font-size: 24px; + color: #FFF; +} +.property-featured .property-price .property-regular-price.has-saleprice { + font-size: 18px; +} +.property-featured .property-toggle-favorite { + display: none; + width: 22px; + line-height: 22px; + border-radius: 3px; + color: #FFF; + text-align: center; + cursor: pointer; + font-size: 12px; + background-color: #0a1938; + position: absolute; + right: 10px; + top: 10px; +} +.property-featured .property-toggle-favorite:hover { + background-color: #2f73e9; +} +@media (min-width: 1200px) { + .property-featured .featured-info { + margin-top: 50px; + } + .property-featured header { + flex-basis: calc(50% + 50px); + margin-bottom: 50px; + margin-left: -50px; + } +} + +header:hover .property-bg-thumbnail a { + transform: scale(1.1); +} + +.property-bg-thumbnail { + height: 100%; + overflow: hidden; +} +.property-bg-thumbnail a { + background-repeat: no-repeat; + background-size: cover; + position: relative; + display: block; + height: 100%; + min-height: 340px; + transform: scale(1); + transition: opacity 0.5s ease, transform 1s cubic-bezier(0, 0, 0.44, 1.18), -webkit-transform 1s cubic-bezier(0, 0, 0.44, 1.18); + background-position: center center; +} +.property-bg-thumbnail a::before { + content: ""; + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.3); + top: 0; + left: 0; +} + +.opalestate-pagination { + text-align: center; + margin: 30px 0; +} +.opalestate-pagination ul { + margin: 0 auto; +} +.opalestate-pagination ul li { + list-style: none; + display: inline-block; +} +.opalestate-pagination ul li .page-numbers { + padding: 5px 15px; + display: block; +} +.opalestate-pagination ul li .page-numbers:hover, .opalestate-pagination ul li .page-numbers.current { + background: #02ce76; + color: #FFF; +} + +.opalestate_agency { + margin-bottom: 30px; +} + +.trusted-label { + font-size: 23px; + color: #2f73e9; + text-align: center; + line-height: 1; +} + +.team-header .trusted-label { + position: absolute; + right: 20px; + background-color: #FFF; + border-radius: 50%; + bottom: 0; + transform: translateY(50%); + border: 1px solid #ebebeb; + width: 48px; + line-height: 48px; +} + +.agency-box-title { + display: inline-block; + margin-right: 10px; + line-height: 1; +} + +.agency-address { + margin-bottom: 0; +} + +.agency-box-meta [class*="agency-box-"] i { + width: 15px; + margin-right: 12px; + display: inline-block; +} +.agency-box-meta a { + color: inherit; +} +.agency-box-meta a:hover { + color: #2f73e9; +} + +.agency-grid-style .agency-body-content { + background-color: #f8f8f8; +} +.agency-grid-style .agency-logo { + width: 80px; + height: 80px; + border-radius: 5px; + overflow: hidden; + margin-right: 30px; +} +.agency-grid-style .agency-info { + padding: 30px; + display: flex; + flex-wrap: wrap; + border-bottom: 1px solid #ebebeb; +} +.agency-grid-style .agency-content { + flex: 1; +} +.agency-grid-style .agency-box-meta { + padding: 30px; +} +.agency-grid-style .agency-box-meta [class*="agency-box-"] { + line-height: 1; +} +.agency-grid-style .agency-box-meta [class*="agency-box-"]:not(:last-of-type) { + margin-bottom: 13px; +} +.agency-grid-style .agency-box-title { + margin-bottom: 9px; + margin-right: 0; + display: block; +} +.agency-grid-style .agency-address { + font-size: 13px; +} + +.agency-list-style .agency-inner { + display: flex; + flex-wrap: wrap; + padding: 30px 0; + border: 1px solid #ebebeb; +} +.agency-list-style .agent-box-image { + height: 100%; +} +.agency-list-style .agent-box-image img { + height: 100%; +} +.agency-list-style .agency-header { + margin: 0 30px; +} +.agency-list-style .agency-body-content { + flex: 1; + padding: 30px 0 0; +} +.agency-list-style .agency-logo { + width: 48px; + height: 48px; + border-radius: 50%; + border: 1px solid #ebebeb; + overflow: hidden; + position: absolute; + bottom: 0; + right: 30px; + transform: translateY(50%); +} +.agency-list-style .agency-info { + position: relative; + padding: 0 30px 18px; + border-bottom: 1px solid #ebebeb; + margin-bottom: 17px; +} +@media screen and (max-width: 767px) { + .agency-list-style .agency-box-meta { + padding: 0 30px; + } +} +.agency-list-style .agency-box-title { + margin-bottom: 0px; +} +@media screen and (min-width: 768px) { + .agency-list-style .agency-body-content { + padding: 0 0 0 10px; + } + .agency-list-style .agency-header { + max-width: 240px; + } + .agency-list-style .agency-info { + padding: 0 0 18px; + } +} + +.floating-keep-top { + position: fixed; + top: 0; + width: 100%; + background: #FFF; + z-index: 999; + transition: all 1s ease-in-out; +} + +.admin-bar .floating-keep-top { + top: 32px; +} + +.hide { + display: none !important; +} + +.highlight-text { + font-weight: 500; +} + +ul.property-status { + padding: 0; + margin: 0; + display: inline-block; +} +ul.property-status li { + list-style: none; + display: inline-block; +} +ul.property-status li:not(:last-child) { + margin-right: 5px; +} + +.keep-top-bars { + top: -70px; + transition: all 1s ease-in-out; + border-bottom: 1px solid #ebebeb; +} +.keep-top-bars ul { + margin: 0; + align-items: center; +} +.keep-top-bars ul:not(.opalestate-scroll-elements) { + padding: 10px 0; +} +.keep-top-bars ul li:not(:last-child) { + margin-right: 50px; +} +.keep-top-bars.floating-keep-top { + border-bottom: none; + box-shadow: 0px 2px 8px 4px rgba(0, 0, 0, 0.12); +} +.keep-top-bars .single-property-buttons { + flex: 1; + text-align: right; +} +.keep-top-bars .single-property-buttons a { + position: relative; + margin-left: 20px; + text-transform: capitalize; +} +.keep-top-bars .single-property-buttons a i { + margin-right: 18px; + padding-right: 20px; +} +.keep-top-bars .single-property-buttons a::before { + content: ""; + width: 52px; + position: absolute; + top: 0; + left: 0; + height: 100%; + background-color: transparent; + box-shadow: 0px 2px 8px 4px rgba(0, 0, 0, 0.12); +} + +.opalestate-scroll-elements a:not(.btn-primary) { + display: block; + padding: 21px 0 17px; + border-bottom: 3px solid transparent; + color: inherit; + transition: all .5s ease-in-out; +} +.opalestate-scroll-elements a:not(.btn-primary):focus, .opalestate-scroll-elements a:not(.btn-primary):hover { + border-color: #2f73e9; + color: inherit; +} + +.opalestate-rating__stars { + position: relative; + overflow: hidden; + height: 15px; + font-size: 15px; + width: calc(15px*5 - 5px); + line-height: 1; +} +.opalestate-rating__stars::before { + font-family: 'FontAwesome'; + font-size: inherit; + text-rendering: auto; + content: "\f005\f005\f005\f005\f005"; + opacity: 0.5; + position: absolute; + top: 0; + left: 0; +} +.opalestate-rating__stars span { + position: relative; + overflow: hidden; + display: block; + height: 100%; + color: transparent; + padding-top: 20px; +} +.opalestate-rating__stars span::before { + font-family: 'FontAwesome'; + font-size: inherit; + text-rendering: auto; + content: "\f005\f005\f005\f005\f005"; + color: #f6be15; + position: absolute; + top: 0; + left: 0; + width: calc(15px*5); +} + +p.stars a { + position: relative; + height: 1em; + width: 1em; + text-indent: -999em; + display: inline-block; + text-decoration: none; +} +p.stars a::before { + display: block; + position: absolute; + top: 0; + left: 0; + width: 1em; + height: 1em; + line-height: 1; + font-family: "FontAwesome"; + content: "\f006"; + text-indent: 0; +} +p.stars a:hover ~ a::before { + content: "\f006"; +} +p.stars:hover a::before { + content: '\f005'; +} +p.stars.selected a.active::before { + content: '\f005'; +} +p.stars.selected a.active ~ a::before { + content: '\f006'; +} +p.stars.selected a:not(.active)::before { + content: '\f005'; +} + +.opalestate-mortgage-chart-svg { + display: inline-block; + overflow: hidden; + margin-bottom: 0; +} +.opalestate-mortgage-chart-svg::after { + content: ""; + position: absolute; + width: 60px; + height: 60px; + transform: translate(-50%, -50%); + border-radius: 50%; + top: 50%; + left: 50%; + background-color: #fff; +} + +.opalestate-loan-amount { + display: none; +} + +.opal-form-group { + margin-top: 16px; +} +.opal-form-group label { + margin-bottom: 0; + cursor: pointer; + display: block; + padding-left: 25px; +} + +/** +* SOCIAL ICONS +**/ +.opalestate-social-icons { + margin: 15px -30px 0 -30px; + border-top: 1px solid #ebebeb; + padding: 0 30px; +} +.opalestate-social-icons [class^="opalestate-social-"] { + font-size: 13px; + color: #7e7e7e; + display: inline-block; + margin: 10px 5px 0 0; + overflow: hidden; + text-decoration: none; + text-align: center; + vertical-align: top; + line-height: 32px; + width: 34px; + height: 34px; + background: #ebebeb; + transition: all 0.2s ease-out 0s; + border-radius: 50%; +} +.opalestate-social-icons [class^="opalestate-social-"]:last-of-type { + margin-right: 0; +} +.opalestate-social-icons [class^="opalestate-social-"]:hover { + border-color: #2f73e9; + color: #2f73e9; +} +.opalestate-social-icons .opalestate-social-white { + background: #FFFFFF; + color: #7e7e7e; + border: 1px solid #ebebeb; +} +.opalestate-social-icons .opalestate-social-outline { + background: transparent; + color: #000; + border: 1px solid #000; +} +.opalestate-social-icons .opalestate-social-outline-light { + background: transparent; + color: #FFF; + border: 1px solid #FFFFFF; +} +.opalestate-social-icons .opalestate-social-outline-light:hover { + background: #FFF; + color: #000; + border-color: #000; +} +.opalestate-social-icons:first-child [class*="opalestate-social-"] { + margin-top: 0; +} +.opalestate-social-icons:last-child [class*="opalestate-social-"] { + margin-bottom: 0; +} +.opalestate-social-icons.opalestate-sicolor [class*="opalestate-social-"] { + color: #FFFFFF; +} + +/** + * Tabs + */ +.opalestate-tab-head { + background-color: #2f73e9; +} + +.tab-item { + color: #FFF; + border-bottom: 3px solid transparent; + transition: all .5s ease-in-out; + padding: 14px 18px 15px; + font-weight: 500; +} +.tab-item.active, .tab-item:hover { + border-color: #02ce76; + color: #FFF; +} + +.opalestate-tab-content { + display: none; + clear: both; +} +.opalestate-tab-content.active { + display: block; +} + +.opalmembership-login-form-wrapper { + text-align: center; +} + +.list-tabs { + margin-bottom: 15px; + background-color: #FFF; + padding: 0; +} +.list-tabs ul { + padding: 0; + margin: 0; +} +.list-tabs ul li { + text-transform: uppercase; + display: inline-block; + position: relative; +} +.list-tabs ul li a { + display: block; + padding: 5px 20px; +} +.list-tabs ul li.active a, .list-tabs ul li:hover a { + color: #FFF; + background-color: #2f73e9; +} + +/** + * end Tabs + */ +.property-group-label, +.agency-label { + position: absolute; + z-index: 1; + top: 15px; + left: 20px; + line-height: 1; +} + +.property-group-status { + position: absolute; + z-index: 1; + top: 15px; + right: 20px; + line-height: 1; +} + +.property-group-status + .property-meta-bottom { + top: 45px; + right: 20px; + z-index: 9; +} + +.agency-header { + position: relative; +} + +.label { + display: inline-block; + padding: 3px 10px; + line-height: 14px; + font-size: 10px; + font-weight: 500; + margin-bottom: 0; + text-transform: uppercase; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + color: #FFF; +} + +.property-label, +.property-status-item { + margin: 0; + padding: 0; + list-style: none; + line-height: 14px; +} +.property-label.property-status-for-rent, .property-label.property-status-for-sale, +.property-status-item.property-status-for-rent, +.property-status-item.property-status-for-sale { + background-color: #2f73e9; +} +.property-label .property-label-item:not(last-child), +.property-status-item .property-label-item:not(last-child) { + margin-right: 5px; +} + +.property-label-rented { + background-color: #2048f6; + color: #FFF; +} + +.property-label-sold { + background-color: #fee882; + color: #FFF; +} + +.label-featured { + background-color: #02ce76; + color: #FFF; + margin-bottom: 5px; +} + +.single .label-featured { + margin-bottom: 0; + margin-right: 5px; +} + +.label-danger { + background-color: #2f73e9; + color: #FFF; +} + +.property-meta-list > li { + vertical-align: middle; +} +.property-meta-list .icon-box { + display: inline-block; +} +.property-meta-list .info-meta { + display: inline-block; +} + +.map-info-preview { + position: relative; + padding: 30px; + background-color: #FFFFFF; + margin-bottom: 15px; + max-width: 300px; + box-shadow: 0px 2px 8px 4px rgba(0, 0, 0, 0.12); +} +.map-info-preview:before { + position: absolute; + width: 0; + height: 0; + content: ''; + z-index: 2; + border-top: 25px solid #FFF; + border-left: 20px solid transparent; + border-right: 20px solid transparent; + transform: translateX(-50%); + left: 50%; + bottom: -14px; + margin-left: -34px; +} +.map-info-preview a img { + max-width: 240px; + width: 240px; +} +.map-info-preview .media-top { + position: relative; +} +.map-info-preview .property-status { + top: 10px; + left: 10px; + position: absolute; + line-height: 1; +} +.map-info-preview .label-property { + visibility: hidden; +} +.map-info-preview .info-container .prop-title { + text-transform: uppercase; + margin: 15px 0 8px; +} +.map-info-preview .info-container p { + line-height: 22px; +} +.map-info-preview .property-meta-list.list-inline { + border-top: 1px solid #ebebeb; + padding: 0; + display: flex; + flex-wrap: wrap; +} +.map-info-preview .property-meta-list.list-inline > li { + flex-basis: 50%; + padding: 0; + margin: 15px 0 0; +} +.map-info-preview .property-meta-list.list-inline > li i { + width: 20px; +} +.map-info-preview .arrow-down { + border-style: solid; + border-width: 10px 10px 0; + bottom: -13px; + height: 0; + left: 112px; + position: absolute; + width: 0; + border-color: #2f73e9; + display: none; +} + +.opalestate-map-preview-wrap .gm-style img { + max-width: inherit !important; +} + +.infoBox > img { + position: absolute !important; + z-index: 99; + right: -5px; + top: -10px; +} + +.opalestate-popup { + position: relative; +} +.opalestate-popup .popup-head { + position: relative; +} +.opalestate-popup .popup-head > span { + cursor: pointer; +} +.opalestate-popup .popup-head .notify { + background-color: #00bcd4; + padding: 1px 6px; + border-radius: 50%; + position: absolute; + top: -10px; + right: 0px; + font-size: 8px; + color: #FFF; +} +.opalestate-popup .popup-head .notify.active { + top: auto; + bottom: -10px; + padding: 5px; + background-color: #2f73e9; +} +.opalestate-popup .popup-body { + display: none; + position: absolute; + z-index: 999; + min-width: 450px; + top: 30px; + margin: 0 0 0 -194px; + padding: 30px; + background-color: #FFF; + box-shadow: 0px 2px 8px 4px rgba(0, 0, 0, 0.12); +} +.opalestate-popup .popup-body h6 { + margin-bottom: 15px; +} +.opalestate-popup .popup-body label { + text-transform: uppercase; +} +.opalestate-popup .popup-body button { + margin-top: 20px; +} +.opalestate-popup .popup-body .account-dashboard-content { + padding: 30px; + background-color: #FFF; + box-shadow: 0px 2px 8px 4px rgba(0, 0, 0, 0.12); + position: relative; +} +.opalestate-popup .popup-body .account-dashboard-content:before { + position: absolute; + width: 0; + height: 0; + content: ''; + z-index: 2; + border-bottom: 25px solid #FFF; + border-left: 20px solid transparent; + border-right: 20px solid transparent; + transform: translateX(-50%); + left: 50%; + top: -14px; +} +.opalestate-popup.active .popup-body { + display: block; +} +.opalestate-popup.hover-align-right:hover .popup-body { + display: block; + right: 0; + padding-top: 30px; + min-width: 250px; +} +.opalestate-popup.hover-align-right:hover .popup-body .account-dashboard-content:before { + right: -15px; + left: auto; +} +.opalestate-popup .popup-close { + position: absolute; + top: 10px; + right: 15px; + color: #2f73e9; + cursor: hand; + cursor: pointer; +} +.rtl .opalestate-popup .popup-close { + left: 15px; + right: auto; +} + +.pagination li { + display: block; + min-width: 40px; + text-align: center; + padding: 5px 15px; + font-weight: 500; + color: #7e7e7e; +} +.pagination li.current, .pagination li:hover { + background-color: #2f73e9; +} +.pagination li.current a, .pagination li:hover a { + color: #FFF; +} +.pagination .nav-links { + display: flex; + flex-wrap: wrap; +} + +.opalestate-dropdown { + position: relative; +} +.opalestate-dropdown .dropdown-body { + position: absolute; + display: none; + background: red; + min-width: 250px; + right: 0; + top: 50px; +} +.opalestate-dropdown:hover .dropdown-body { + display: block; +} + +.agent-box-list .inner { + display: flex; + border-bottom: solid 1px #ebebeb; + padding-bottom: 30px; +} +.agent-box-list .inner .agent-preview { + width: 80px; + margin-right: 15px; +} +.agent-box-list .inner .agent-preview img { + border-radius: 50%; +} +.agent-box-list .opalestate-social-icons { + padding-top: 15px; +} + +.single-property-sidebar .agent-box-list .inner { + border-bottom: 0; +} +.single-property-sidebar .agent-box-list .opalestate-social-icons { + border-bottom: 1px solid #ebebeb; + padding-bottom: 15px; + padding-top: 5px; +} + +.agent-box-image { + overflow: hidden; +} + +.property-agent-info .team-header { + text-align: center; + border: 1px solid #ebebeb; +} + +.property-agent-contact .agent-preview { + margin-bottom: 0; +} +.property-agent-contact .team-header { + margin-bottom: 30px; +} + +.team-header { + position: relative; +} +.team-header .agent-label { + position: absolute; + text-transform: uppercase; + padding: 0 10px; + color: #FFF; + margin: 0; + font-size: 10px; + font-weight: 500; +} +.team-header .agent-label li { + list-style: none; +} +.team-header .agent-featured .agent-label { + top: 0; + left: 0; + background-color: #2f73e9; +} +.team-header .agent-levels .agent-label { + bottom: 0; + left: 0; + background-color: #02ce76; +} + +.agent-box-title { + border-bottom: 1px solid #ebebeb; + padding-bottom: 20px; +} + +.agent-preview { + margin-bottom: 30px; + position: relative; +} +.agent-preview .agent-avatar { + position: absolute; + bottom: 10px; + left: 10px; + width: 35px; + border-radius: 50%; +} + +.agent-box-job { + display: none; +} + +.agent-box-meta { + color: #bbb; +} +.agent-box-meta div[class*="agent-box-"] { + line-height: 1; + padding: 8px 1px; +} +.agent-box-meta div[class*="agent-box-"]:first-of-type { + padding-top: 0; +} +.agent-box-meta div[class*="agent-box-"]:last-of-type { + padding-bottom: 0; +} +.agent-box-meta div[class*="agent-box-"] i { + width: 15px; + margin-right: 6px; +} +.agent-box-meta a { + color: inherit; +} +.agent-box-meta h4 { + padding-top: 0; +} + +.gallery-summery-style { + display: flex; + flex-wrap: wrap; +} +.gallery-summery-style a { + display: block; + width: 20%; + height: 120px; + background-size: cover; + background-repeat: no-repeat; +} + +.my-featured-section .opalestate_property { + margin-right: 1px; +} + +.property-floorplans-session .opalestate-tab-head, .tabl-simple-style .opalestate-tab-head { + line-height: 1; + border-bottom: 1px solid #ebebeb; + margin-bottom: 16px; + margin-top: 0; + background-color: transparent; +} +.property-floorplans-session .tab-item, .tabl-simple-style .tab-item { + background-color: transparent; + padding: 0; + color: #0a1938; + display: inline-block; + padding-bottom: 19px; + font-weight: 500; + border-bottom: 3px solid transparent; + margin-bottom: -2px; +} +.property-floorplans-session .tab-item:not(:last-of-type), .tabl-simple-style .tab-item:not(:last-of-type) { + margin-right: 28px; +} +.property-floorplans-session .tab-item.active, .property-floorplans-session .tab-item:hover, .tabl-simple-style .tab-item.active, .tabl-simple-style .tab-item:hover { + background-color: transparent; + color: #0a1938; + border-color: #02ce76; +} + +.plan-name, .plan-content { + display: none; +} + +.plan-image { + padding: 24px; +} + +.property-category { + position: relative; + overflow: hidden; +} +.property-category .static-content { + padding: 30px; + position: absolute; + top: 0; + width: 100%; + height: 100%; + display: flex; + flex-wrap: wrap; + align-items: center; +} +.property-category .static-content a { + color: #FFF; +} +.property-category .property-category-count { + color: #02ce76; +} +.property-category .property-category-title { + margin-bottom: 10px; +} +.property-category .property-category-info { + flex-basis: 100%; +} +.property-category .category-overlay { + position: absolute; + top: 0; + width: 100%; + height: 100%; + display: block; + z-index: 2; +} +.property-category:hover .property-category-bg { + transform: scale(1.1); +} +.property-category:hover .property-category-bg::before { + background-color: rgba(0, 0, 0, 0.5); +} + +.property-category-bg { + background-repeat: no-repeat; + background-size: cover; + position: relative; + display: block; + height: 100%; + min-height: 340px; + transform: scale(1); + transition: opacity 0.5s ease, transform 1s cubic-bezier(0, 0, 0.44, 1.18), -webkit-transform 1s cubic-bezier(0, 0, 0.44, 1.18); + background-position: center center; +} +.property-category-bg::before { + content: ""; + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.35); + top: 0; + left: 0; +} + +.property-city { + position: relative; + overflow: hidden; +} +.property-city .static-content { + padding: 30px; + position: absolute; + top: 0; + width: 100%; + height: 100%; + display: flex; + flex-wrap: wrap; + align-items: center; +} +.property-city .static-content a { + color: #FFF; +} +.property-city .property-city-count { + color: #02ce76; +} +.property-city .property-city-title { + margin-bottom: 10px; +} +.property-city .property-city-info { + flex-basis: 100%; +} +.property-city .city-overlay { + position: absolute; + top: 0; + width: 100%; + height: 100%; + display: block; + z-index: 2; +} +.property-city:hover .property-city-bg { + transform: scale(1.1); +} +.property-city:hover .property-city-bg::before { + background-color: rgba(0, 0, 0, 0.5); +} + +.property-city-bg { + background-repeat: no-repeat; + background-size: cover; + position: relative; + display: block; + height: 100%; + min-height: 340px; + transform: scale(1); + transition: opacity 0.5s ease, transform 1s cubic-bezier(0, 0, 0.44, 1.18), -webkit-transform 1s cubic-bezier(0, 0, 0.44, 1.18); + background-position: center center; +} +.property-city-bg::before { + content: ""; + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.35); + top: 0; + left: 0; +} + +#opalestate-map-preview .cluster img + div { + line-height: 30px !important; +} + +.opalestate-note { + font-size: 90%; + color: #888; +} + +.list-inline { + list-style: none; + display: flex; + flex-wrap: wrap; +} +.list-inline li:not(:last-child) { + margin-right: 30px; +} + +@keyframes spinner-border { + to { + transform: rotate(360deg); + } +} +.property-toggle-favorite { + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; + cursor: pointer; +} +.property-toggle-favorite:hover { + color: #2f73e9; +} + +header#masthead { + position: relative; +} + +.pull-right { + float: right !important; +} + +@media screen and (min-width: 1200px) { + .ajax-map-search-split .split-maps-container { + padding-left: 0; + } +} +.ajax-map-search-split .opalestate-search-form { + margin: 0; + padding: 15px 0; +} + +.split-maps-container { + left: 0; + right: auto; + top: 0; + z-index: 0; +} +@media screen and (min-width: 1200px) { + .split-maps-container { + position: fixed !important; + } +} + +@media screen and (min-width: 1200px) { + .split-search-container { + padding-right: 30px; + } +} + +.opalestate-loading { + position: absolute; + opacity: 0.9; + filter: alpha(opacity=90); + background-color: #fff; + top: 0; + right: 0; + width: 100%; + height: 100%; + text-align: center; +} +.opalestate-loading::before { + content: ""; + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: .25em solid #000; + border-right-color: transparent; + border-radius: 50%; + animation: spinner-border .75s linear infinite; +} + +.opalestate-admin-box { + margin-bottom: 30px; +} +.opalestate-admin-box h3 { + border-bottom: 1px #ebebeb solid; + padding-bottom: 15px; + padding-top: 30px; + font-size: 150%; +} + +/** CMD BOX 2 */ +.select2-search-member { + display: flex; +} +.select2-search-member .member-meta { + margin-left: 12px; + font-weight: 500; +} + +.cmb2-wrap .field-row-2 .cmb-row { + display: inline-block; + width: 50%; +} + +@media screen and (min-width: 768px) { + .cmb2-wrap .field-row-2 .cmb-row:nth-child(even) > div { + padding-left: 12px; + } +} + +.cmb2-wrap .cmb-td { + padding: 4px 0; +} + +.bg-info { + background-color: #0288d1 !important; +} + +.bg-warning { + background-color: #ffca28 !important; +} + +.alert.alert-success { + background: #0F93FA; +} + +.alert.alert-danger { + background: #f55753; +} + +.alert.alert-warning { + background: #ffca28; +} + +/** + * + * Dashboard Page + */ +@media (max-width: 767px) { + .user-dasboard-sidebar { + display: none; + } + + body.active { + margin-left: 251px !important; + } + body.active .user-dasboard-sidebar { + display: block; + } + + .page-template-user-management { + margin-left: 0 !important; + } + + #show-user-sidebar-btn { + display: block !important; + } +} +.navbar-left { + display: flex; +} + +.opalestate-user-greeting .popup-head { + float: right; +} +.opalestate-user-greeting .popup-head a { + color: #FFF; + text-align: right; + position: relative; +} +.opalestate-user-greeting .popup-head a img { + width: 40px; + border-radius: 50%; +} +.opalestate-user-greeting .popup-head a i { + padding: 12px; + border-radius: 50%; + background: rgba(0, 0, 0, 0.06); +} +.opalestate-user-greeting ul { + padding: 0; + margin: 0; + list-style: none; +} + +.dashboard-navbar { + background-color: #FFF; + padding: 9px 30px; + border-bottom: 1px solid #ebebeb; +} +.dashboard-navbar ul { + margin-bottom: 0; +} + +.card-item { + background-color: #FFF; + border: solid 1px #ebebeb; + padding: 15px; +} +.card-item i { + background: rgba(0, 0, 0, 0.18); + padding: 15px; + border-radius: 50%; +} +.card-item h5 { + font-size: 200%; + text-align: center; +} +.card-item span { + font-weight: 700; +} + +@media screen and (min-width: 768px) { + .page-template-user-management .opalestate-box { + margin-right: 15px; + } +} +.page-template-user-management.logged-in { + margin-left: 251px; +} +.page-template-user-management #content { + padding-left: 30px; + padding-right: 30px; +} +.page-template-user-management #show-user-sidebar-btn { + display: none; + margin-right: 15px; +} +.page-template-user-management .opalestate-panel-myaccount { + padding-top: 45px; + padding-bottom: 45px; +} + +.admin-bar .opalestate-user-management .user-dasboard-sidebar { + padding-top: 32px; +} + +.opalmembership-dashboard .btn-link { + background-color: #02ce76; + color: #FFF; +} +.opalmembership-dashboard .btn-link:hover { + background-color: #2f73e9; +} + +.opalestate-user-management { + min-height: 600px; +} +.opalestate-user-management .property-submission-form .opalestate-box { + margin-right: 0; +} +.opalestate-user-management .user-dasboard-sidebar { + background-color: #0a1938; + min-height: 900px; + position: fixed; + left: 0; + width: 250px; + height: 100%; + z-index: 100; + top: 0px; +} +.opalestate-user-management .user-dasboard-sidebar .user-dasboard-sidebar-inner { + padding-top: 20px; +} +.opalestate-user-management .navbar-brand { + padding: 32px 15px; +} +.opalestate-user-management .account-links { + list-style: none; + padding: 0; + margin: 0; +} +.opalestate-user-management .account-links a { + padding: 8px 20px; + width: 100%; + display: block; + font-weight: 500; + color: #7e7e7e; +} +.opalestate-user-management .account-links a i { + margin-right: 6px; + color: #7e7e7e; +} +.opalestate-user-management .account-links a:hover { + background-color: #2f73e9; +} +.opalestate-user-management .site-main { + padding-top: 15px; +} + +.opalestate-my-reviews .commentlist { + margin: 0; +} +.opalestate-my-reviews .meta { + margin-bottom: 10px; +} +.opalestate-my-reviews .opalestate-review__ratings { + margin-bottom: 0; +} + +.opalestate-my-reviews-item_property-name { + margin-bottom: 5px; +} + +.opalestate-my-reviews-item_property-view { + font-size: 12px; + font-style: italic; +} + +.my-property-list .entry-content { + width: 100%; +} diff --git a/assets/scss/admin.scss b/assets/scss/admin.scss new file mode 100755 index 00000000..26e323a1 --- /dev/null +++ b/assets/scss/admin.scss @@ -0,0 +1,200 @@ +.post-type-opalestate_property .post-state{ + background:#ef114c; + font-size: 10px; + font-weight: normal; + padding: 3px 6px; + color:#FFF; + border-radius: 5px 5px 5px; +} +.fixed .column-featured, +.fixed .column-sku{ + width: 10%; +} +.fixed .column-address{ + width: 20%; +} +.type-download { + float: left; + margin: 0 1em 1em 0 !important; + padding: 0; + vertical-align: top; + width: 280px; + text-decoration: none; + color: inherit; + border: 2px solid #ddd; + display: block; + + overflow: hidden; + background: #f5f5f5; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + -webkit-transition-property: border, background, color; + transition-property: border, background, color; + -webkit-transition-duration: .05s; + transition-duration: .05s; + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + position: relative; + background: #FFF; +} +.type-download:hover{ + border-color: #0073aa; +} +.type-download h4{ + margin: 6px 0px; +} +.type-download a{ + font-size: 18px; + font-weight: bold; + outline: 0 none; + text-decoration: none; +} +.type-download .feed-content{ + color: #72777c; +} +.type-download img{ + max-width: 100%; +} +.type-download .feed-content{ + padding: 15px 20px; +} +.type-download .feed-bottom { + background: #ddd; + padding: 15px 8px; +} +.type-download:hover .feed-bottom{ + background: #0073aa; +} + +.vc_element-icon.icon-wpb-estates-1{ + background-image:url(images/1.png); +} + +.vc_element-icon.icon-wpb-estates-2{ + background-image:url(images/2.png); +} + +.vc_element-icon.icon-wpb-estates-3{ + background-image:url(images/3.png); +} + +.vc_element-icon.icon-wpb-estates-4{ + background-image:url(images/4.png); +} + +.vc_element-icon.icon-wpb-estates-5{ + background-image:url(images/5.png); +} + +.vc_element-icon.icon-wpb-estates-6{ + background-image:url(images/6.png); +} + +.vc_element-icon.icon-wpb-estates-7{ + background-image:url(images/7.png); +} + +.vc_element-icon.icon-wpb-estates-8{ + background-image:url(images/8.png); +} + +.vc_element-icon.icon-wpb-estates-9{ + background-image:url(images/9.png); +} + +.vc_element-icon.icon-wpb-estates-10{ + background-image:url(images/10.png); +} + +.vc_element-icon.icon-wpb-estates-11{ + background-image:url(images/11.png); +} + +.vc_element-icon.icon-wpb-estates-12{ + background-image:url(images/12.png); +} + +.vc_element-icon.icon-wpb-estates-13{ + background-image:url(images/13.png); +} + +.vc_element-icon.icon-wpb-estates-14{ + background-image:url(images/14.png); +} + +.vc_element-icon.icon-wpb-estates-15{ + background-image:url(images/15.png); +} + +.vc_element-icon.icon-wpb-estates-16{ + background-image:url(images/16.png); +} + +.vc_element-icon.icon-wpb-estates-17{ + background-image:url(images/17.png); +} + +.vc_element-icon.icon-wpb-estates-18{ + background-image:url(images/18.png); +} + +.vc_element-icon.icon-wpb-estates-19{ + background-image:url(images/19.png); +} + +/** CMD BOX 2 */ +.cmb2-wrap .field-row-2 .cmb-row { + display: inline-block; + width: 50%; +} + +.cmb2-wrap .field-row-2 .cmb-row:nth-child(even) > div { + padding-left: 12px; +} +.cmb2-wrap .cmb-td { + padding: 4px 0; +} + +.cmb2-wrap .cmb-th { + padding: 0px 10px 10px 0 +} + +/***/ +.form-settings-wrap { + display:flex; + .cmb2-wrap { + min-height:300px; + } + .subtab-settings-navs { + width:220px; + background:#2f73e9; + min-height:300px; + + ul { + padding:0; + margin:0; + li { + padding:0; + margin:0; + a{ + display:block; + padding:12px 6px; + background:#2f73e9; + text-align:right; + text-decoration:none; + color:#FFF; + font-weight:bold; + &.active { + background-color:#f1f1f1; + color:#000; + } + } + } + } + + } + .form-settings-form { + padding-left:20px; + padding-right:20px; + } +} diff --git a/assets/scss/bootstrap/_grid.scss b/assets/scss/bootstrap/_grid.scss new file mode 100755 index 00000000..10cf4a92 --- /dev/null +++ b/assets/scss/bootstrap/_grid.scss @@ -0,0 +1,31 @@ + .opal-row, .row { + // Large grid + // + // Columns, offsets, pushes, and pulls for the large desktop device range. + + + // Medium grid + // + // Columns, offsets, pushes, and pulls for the desktop device range. + + @media (min-width: $screen-sm-min) { + @include make-grid(sm); + @include make-grid-columns(sm); + @include make-row; + } + @media (min-width: $screen-md-min) { + @include make-grid(md); + @include make-grid-columns(md); + } + @media (min-width: $screen-lg-min) { + @include make-grid(lg); + @include make-grid-columns(lg); + } + +} + + +@mixin list-unstyled { + padding-left: 0; + list-style: none; +} \ No newline at end of file diff --git a/assets/scss/bootstrap/_mixins.scss b/assets/scss/bootstrap/_mixins.scss new file mode 100755 index 00000000..a1de4395 --- /dev/null +++ b/assets/scss/bootstrap/_mixins.scss @@ -0,0 +1,7 @@ +@import "mixins/opacity"; +@import "mixins/size"; +@import "mixins/vendor-prefixes"; +// Layout +@import "mixins/clearfix"; +@import "mixins/grid-framework"; +@import "mixins/grid"; \ No newline at end of file diff --git a/assets/scss/bootstrap/_unlities.scss b/assets/scss/bootstrap/_unlities.scss new file mode 100755 index 00000000..8c99c716 --- /dev/null +++ b/assets/scss/bootstrap/_unlities.scss @@ -0,0 +1,55 @@ +// +// Utility classes +// -------------------------------------------------- + + +// Floats +// ------------------------- + +.clearfix { + @include clearfix; +} +.center-block { + @include center-block; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} + + +// Toggling content +// ------------------------- + +// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + @include text-hide; +} + + +// Hide from screenreaders and browsers +// +// Credit: HTML5 Boilerplate + +.hidden { + display: none !important; +} + + +// For Affix plugin +// ------------------------- + +.affix { + position: fixed; +} diff --git a/assets/scss/bootstrap/_variables.scss b/assets/scss/bootstrap/_variables.scss new file mode 100755 index 00000000..878a0c82 --- /dev/null +++ b/assets/scss/bootstrap/_variables.scss @@ -0,0 +1,887 @@ +$bootstrap-sass-asset-helper: false !default; +// +// Variables +// -------------------------------------------------- + + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +$gray-base : #000; +$light-gray : lighten(#000000, 60%) !default; // #999999 +$very-light-gray : #ebebeb !default; // #e5e5e5 +$very-dark-gray : lighten(#000000, 9%) !default; // #171717 +$gray-darker : #0d292f !default; // #0d292f +$gray-dark : #888888 !default; // #888888 +$gray : lighten(#000, 33.5%) !default; // #555555 +$gray-light : lighten(#000, 46.7%) !default; // #777777 +$gray-lighter : lighten(#000, 93.5%) !default; // #eeeeee + +$brand-primary : #ef114c !default; +$brand-success : #8ac842 !default; +$brand-info : #07a5db !default; +$brand-warning : #fabd47 !default; +$brand-danger : #ef114c !default; + + +//== Scaffolding +// +//## Settings for some of the most global styles. + +//** Background color for ``. +$body-bg: #f7f7f7 !default; +//** Global text color on ``. +$text-color: $gray-dark !default; + +//** Global textual link color. +$link-color: $gray-base !default; +//** Link hover color set via `darken()` function. +$link-hover-color: $brand-primary !default; +//** Link hover decoration. +$link-hover-decoration: none !default; + + +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. + +$font-family-sans-serif: 'Lato', sans-serif !default; +$font-family-serif: Georgia, "Times New Roman", Times, serif !default; +//** Default monospace fonts for ``, ``, and `
            `.
            +$font-family-monospace:   "Montserrat", monospace !default;
            +$font-family-base:        'Lato', sans-serif !default;
            +
            +$font-size-base:          15px !default;
            +$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px
            +$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px
            +$font-size-md:         	  12px !default;
            +
            +$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px
            +$font-size-h2:            floor(($font-size-base * 2.15)) !default; // ~30px
            +$font-size-h3:            ceil(($font-size-base * 1.7)) !default; // ~24px
            +$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px
            +$font-size-h5:            $font-size-base !default;
            +$font-size-h6:            ceil(($font-size-base * 0.85)) !default; // ~12px
            +
            +$font-weight-base	: 400 !default;
            +//** Unit-less `line-height` for use in components like buttons.
            +$line-height-base:        1.428571429 !default; // 20/14
            +//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
            +$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px
            +
            +//** By default, this inherits from the ``.
            +$headings-font-family:    "Montserrat", monospace !default;
            +$headings-font-weight:    700 !default;
            +$headings-line-height:    1.1 !default;
            +$headings-color:          $gray-base !default;
            +
            +
            +//== Iconography
            +//
            +//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
            +
            +//** Load fonts from this directory.
            +
            +// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.
            +// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.
            +$icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/") !default;
            +
            +//** File name for all font files.
            +$icon-font-name:          "glyphicons-halflings-regular" !default;
            +//** Element ID within SVG icon file.
            +$icon-font-svg-id:        "glyphicons_halflingsregular" !default;
            +
            +
            +//== Components
            +//
            +//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
            +
            +$padding-base-vertical:     6px !default;
            +$padding-base-horizontal:   12px !default;
            +
            +$padding-large-vertical:    12px !default;
            +$padding-large-horizontal:  16px !default;
            +
            +$padding-small-vertical:    5px !default;
            +$padding-small-horizontal:  10px !default;
            +
            +$padding-md-vertical:       10px !default;
            +$padding-md-horizontal:     20px !default;
            +
            +$padding-xs-vertical:       1px !default;
            +$padding-xs-horizontal:     5px !default;
            +
            +$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome
            +$line-height-small:         1.5 !default;
            +
            +$border-radius-base:        10px !default;
            +$border-radius-large:       20px !default;
            +$border-radius-small:       4px !default;
            +
            +//** Global color for active items (e.g., navs or dropdowns).
            +$component-active-color:    #fff !default;
            +//** Global background color for active items (e.g., navs or dropdowns).
            +$component-active-bg:       $brand-primary !default;
            +
            +//** Width of the `border` for generating carets that indicator dropdowns.
            +$caret-width-base:          4px !default;
            +//** Carets increase slightly in size for larger components.
            +$caret-width-large:         5px !default;
            +
            +
            +//== Tables
            +//
            +//## Customizes the `.table` component with basic values, each used across all table variations.
            +
            +//** Padding for ``s and ``s.
            +$table-cell-padding:            8px !default;
            +//** Padding for cells in `.table-condensed`.
            +$table-condensed-cell-padding:  5px !default;
            +
            +//** Default background color used for all tables.
            +$table-bg:                      transparent !default;
            +//** Background color used for `.table-striped`.
            +$table-bg-accent:               #f9f9f9 !default;
            +//** Background color used for `.table-hover`.
            +$table-bg-hover:                #f5f5f5 !default;
            +$table-bg-active:               $table-bg-hover !default;
            +
            +//** Border color for table and cell borders.
            +$table-border-color:            #ddd !default;
            +
            +
            +//== Buttons
            +//
            +//## For each of Bootstrap's buttons, define text, background and border color.
            +
            +$btn-font-weight:                900 !default;
            +
            +$btn-default-color:              #fff !default;
            +$btn-default-bg:                 #999 !default;
            +$btn-default-border:             #999 !default;
            +
            +$btn-white-color:                #000 !default;
            +$btn-white-bg:                   #fff !default;
            +$btn-white-border:               rgba(255,255,255,.2) !default;
            +
            +$btn-primary-color:              #fff !default;
            +$btn-primary-bg:                 $brand-primary !default;
            +$btn-primary-border:             darken($btn-primary-bg, 5%) !default;
            +
            +$btn-success-color:              #fff !default;
            +$btn-success-bg:                 $brand-success !default;
            +$btn-success-border:             darken($btn-success-bg, 5%) !default;
            +
            +$btn-info-color:                 #fff !default;
            +$btn-info-bg:                    $brand-info !default;
            +$btn-info-border:                darken($btn-info-bg, 5%) !default;
            +
            +$btn-warning-color:              #fff !default;
            +$btn-warning-bg:                 $brand-warning !default;
            +$btn-warning-border:             darken($btn-warning-bg, 5%) !default;
            +
            +$btn-danger-color:               #fff !default;
            +$btn-danger-bg:                  $brand-danger !default;
            +$btn-danger-border:              darken($btn-danger-bg, 5%) !default;
            +
            +$btn-link-disabled-color:        $gray-light !default;
            +
            +// Allows for customizing button radius independently from global border radius
            +$btn-border-radius-base:         $border-radius-base !default;
            +$btn-border-radius-large:        $border-radius-large !default;
            +$btn-border-radius-small:        $border-radius-small !default;
            +
            +
            +//== Forms
            +//
            +//##
            +
            +//** `` background color
            +$input-bg:                       #fff !default;
            +//** `` background color
            +$input-bg-disabled:              $gray-lighter !default;
            +
            +//** Text color for ``s
            +$input-color:                    $gray !default;
            +//** `` border color
            +$input-border:                   #ebebeb !default;
            +
            +// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
            +//** Default `.form-control` border radius
            +// This has no effect on ``s in CSS.
            +$input-border-radius:            $border-radius-small !default;
            +//** Large `.form-control` border radius
            +$input-border-radius-large:      $border-radius-large !default;
            +//** Small `.form-control` border radius
            +$input-border-radius-small:      $border-radius-small !default;
            +
            +//** Border color for inputs on focus
            +$input-border-focus:             #fff !default;
            +
            +//** Placeholder text color
            +$input-color-placeholder:        #999 !default;
            +
            +//** Default `.form-control` height
            +$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
            +//** Large `.form-control` height
            +$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
            +//** Small `.form-control` height
            +$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
            +
            +//** `.form-group` margin
            +$form-group-margin-bottom:       15px !default;
            +
            +$legend-color:                   $gray-dark !default;
            +$legend-border-color:            #e5e5e5 !default;
            +
            +//** Background color for textual input addons
            +$input-group-addon-bg:           $gray-lighter !default;
            +//** Border color for textual input addons
            +$input-group-addon-border-color: $input-border !default;
            +
            +//** Disabled cursor for form controls and buttons.
            +$cursor-disabled:                not-allowed !default;
            +
            +
            +//== Dropdowns
            +//
            +//## Dropdown menu container and contents.
            +
            +//** Background for the dropdown menu.
            +$dropdown-bg:                    #fff !default;
            +//** Dropdown menu `border-color`.
            +$dropdown-border:                rgba(0,0,0,.15) !default;
            +//** Dropdown menu `border-color` **for IE8**.
            +$dropdown-fallback-border:       #ccc !default;
            +//** Divider color for between dropdown items.
            +$dropdown-divider-bg:            #e5e5e5 !default;
            +
            +//** Dropdown link text color.
            +$dropdown-link-color:            $gray-dark !default;
            +//** Hover color for dropdown links.
            +$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;
            +//** Hover background for dropdown links.
            +$dropdown-link-hover-bg:         #f5f5f5 !default;
            +
            +//** Active dropdown menu item text color.
            +$dropdown-link-active-color:     $component-active-color !default;
            +//** Active dropdown menu item background color.
            +$dropdown-link-active-bg:        $component-active-bg !default;
            +
            +//** Disabled dropdown menu item background color.
            +$dropdown-link-disabled-color:   $gray-light !default;
            +
            +//** Text color for headers within dropdown menus.
            +$dropdown-header-color:          $gray-light !default;
            +
            +//** Deprecated `$dropdown-caret-color` as of v3.1.0
            +$dropdown-caret-color:           #000 !default;
            +
            +
            +//-- Z-index master list
            +//
            +// Warning: Avoid customizing these values. They're used for a bird's eye view
            +// of components dependent on the z-axis and are designed to all work together.
            +//
            +// Note: These variables are not generated into the Customizer.
            +
            +$zindex-navbar:            1000 !default;
            +$zindex-dropdown:          1000 !default;
            +$zindex-popover:           1060 !default;
            +$zindex-tooltip:           1070 !default;
            +$zindex-navbar-fixed:      1030 !default;
            +$zindex-modal-background:  1040 !default;
            +$zindex-modal:             1050 !default;
            +
            +
            +//== Media queries breakpoints
            +//
            +//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
            +
            +// Extra small screen / phone
            +//** Deprecated `$screen-xs` as of v3.0.1
            +$screen-xs:                  480px !default;
            +//** Deprecated `$screen-xs-min` as of v3.2.0
            +$screen-xs-min:              $screen-xs !default;
            +//** Deprecated `$screen-phone` as of v3.0.1
            +$screen-phone:               $screen-xs-min !default;
            +
            +// Small screen / tablet
            +//** Deprecated `$screen-sm` as of v3.0.1
            +$screen-sm:                  768px !default;
            +$screen-sm-min:              $screen-sm !default;
            +//** Deprecated `$screen-tablet` as of v3.0.1
            +$screen-tablet:              $screen-sm-min !default;
            +
            +// Medium screen / desktop
            +//** Deprecated `$screen-md` as of v3.0.1
            +$screen-md:                  992px !default;
            +$screen-md-min:              $screen-md !default;
            +//** Deprecated `$screen-desktop` as of v3.0.1
            +$screen-desktop:             $screen-md-min !default;
            +
            +// Large screen / wide desktop
            +//** Deprecated `$screen-lg` as of v3.0.1
            +$screen-lg:                  1200px !default;
            +$screen-lg-min:              $screen-lg !default;
            +//** Deprecated `$screen-lg-desktop` as of v3.0.1
            +$screen-lg-desktop:          $screen-lg-min !default;
            +
            +// So media queries don't overlap when required, provide a maximum
            +$screen-xs-max:              ($screen-sm-min - 1) !default;
            +$screen-sm-max:              ($screen-md-min - 1) !default;
            +$screen-md-max:              ($screen-lg-min - 1) !default;
            +
            +
            +//== Grid system
            +//
            +//## Define your custom responsive grid.
            +
            +//** Number of columns in the grid.
            +$grid-columns:              12 !default;
            +//** Padding between columns. Gets divided in half for the left and right.
            +$grid-gutter-width:         30px !default;
            +// Navbar collapse
            +//** Point at which the navbar becomes uncollapsed.
            +$grid-float-breakpoint:     $screen-sm-min !default;
            +//** Point at which the navbar begins collapsing.
            +$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
            +
            +
            +//== Container sizes
            +//
            +//## Define the maximum width of `.container` for different screen sizes.
            +
            +//## Define the maximum width of `.container` for different screen sizes.
            +
            +// Small screen / tablet
            +$container-tablet:             ((750px + $grid-gutter-width)) !default;
            +//** For `$screen-sm-min` and up.
            +$container-sm:                 $container-tablet !default;
            +
            +// Medium screen / desktop
            +$container-desktop:            ((970px + $grid-gutter-width)) !default;
            +//** For `$screen-md-min` and up.
            +$container-md:                 $container-desktop !default;
            +
            +// Large screen / wide desktop
            +$container-large-desktop:      ((1170px + $grid-gutter-width) ) !default;
            +//** For `$screen-lg-min` and up.
            +$container-lg:                 $container-large-desktop !default;
            +
            +
            +
            +//== Navbar
            +//
            +//##
            +
            +// Basics of a navbar
            +$navbar-height:                    50px !default;
            +$navbar-margin-bottom:             $line-height-computed !default;
            +$navbar-border-radius:             $border-radius-base !default;
            +$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;
            +$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;
            +$navbar-collapse-max-height:       340px !default;
            +
            +$navbar-default-color:             #777 !default;
            +$navbar-default-bg:                #f8f8f8 !default;
            +$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;
            +
            +// Navbar links
            +$navbar-default-link-color:                #777 !default;
            +$navbar-default-link-hover-color:          #333 !default;
            +$navbar-default-link-hover-bg:             transparent !default;
            +$navbar-default-link-active-color:         #555 !default;
            +$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;
            +$navbar-default-link-disabled-color:       #ccc !default;
            +$navbar-default-link-disabled-bg:          transparent !default;
            +
            +// Navbar brand label
            +$navbar-default-brand-color:               $navbar-default-link-color !default;
            +$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;
            +$navbar-default-brand-hover-bg:            transparent !default;
            +
            +// Navbar toggle
            +$navbar-default-toggle-hover-bg:           #ddd !default;
            +$navbar-default-toggle-icon-bar-bg:        #888 !default;
            +$navbar-default-toggle-border-color:       #ddd !default;
            +
            +
            +//=== Inverted navbar
            +// Reset inverted navbar basics
            +$navbar-inverse-color:                      lighten($gray-light, 15%) !default;
            +$navbar-inverse-bg:                         #222 !default;
            +$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;
            +
            +// Inverted navbar links
            +$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;
            +$navbar-inverse-link-hover-color:           #fff !default;
            +$navbar-inverse-link-hover-bg:              transparent !default;
            +$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;
            +$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;
            +$navbar-inverse-link-disabled-color:        #444 !default;
            +$navbar-inverse-link-disabled-bg:           transparent !default;
            +
            +// Inverted navbar brand label
            +$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;
            +$navbar-inverse-brand-hover-color:          #fff !default;
            +$navbar-inverse-brand-hover-bg:             transparent !default;
            +
            +// Inverted navbar toggle
            +$navbar-inverse-toggle-hover-bg:            #333 !default;
            +$navbar-inverse-toggle-icon-bar-bg:         #fff !default;
            +$navbar-inverse-toggle-border-color:        #333 !default;
            +
            +
            +//== Navs
            +//
            +//##
            +
            +//=== Shared nav styles
            +$nav-link-padding:                          10px 15px !default;
            +$nav-link-hover-bg:                         $gray-lighter !default;
            +
            +$nav-disabled-link-color:                   $gray-light !default;
            +$nav-disabled-link-hover-color:             $gray-light !default;
            +
            +//== Tabs
            +$nav-tabs-border-color:                     #ddd !default;
            +
            +$nav-tabs-link-hover-border-color:          $gray-lighter !default;
            +
            +$nav-tabs-active-link-hover-bg:             $body-bg !default;
            +$nav-tabs-active-link-hover-color:          $gray !default;
            +$nav-tabs-active-link-hover-border-color:   #ddd !default;
            +
            +$nav-tabs-justified-link-border-color:            #ddd !default;
            +$nav-tabs-justified-active-link-border-color:     $body-bg !default;
            +
            +//== Pills
            +$nav-pills-border-radius:                   $border-radius-base !default;
            +$nav-pills-active-link-hover-bg:            $component-active-bg !default;
            +$nav-pills-active-link-hover-color:         $component-active-color !default;
            +
            +
            +//== Pagination
            +//
            +//##
            +
            +$pagination-color:                     $link-color !default;
            +$pagination-bg:                        transparent !default;
            +$pagination-border:                    #ddd !default;
            +
            +$pagination-hover-color:               $link-hover-color !default;
            +$pagination-hover-bg:                  $gray-lighter !default;
            +$pagination-hover-border:              #ddd !default;
            +
            +$pagination-active-color:              #fff !default;
            +$pagination-active-bg:                 $brand-primary !default;
            +$pagination-active-border:             $brand-primary !default;
            +
            +$pagination-disabled-color:            $gray-light !default;
            +$pagination-disabled-bg:               #fff !default;
            +$pagination-disabled-border:           #ddd !default;
            +
            +
            +//== Pager
            +//
            +//##
            +
            +$pager-bg:                             $pagination-bg !default;
            +$pager-border:                         $pagination-border !default;
            +$pager-border-radius:                  15px !default;
            +
            +$pager-hover-bg:                       $pagination-hover-bg !default;
            +
            +$pager-active-bg:                      $pagination-active-bg !default;
            +$pager-active-color:                   $pagination-active-color !default;
            +
            +$pager-disabled-color:                 $pagination-disabled-color !default;
            +
            +
            +//== Jumbotron
            +//
            +//##
            +
            +$jumbotron-padding:              30px !default;
            +$jumbotron-color:                inherit !default;
            +$jumbotron-bg:                   $gray-lighter !default;
            +$jumbotron-heading-color:        inherit !default;
            +$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;
            +$jumbotron-heading-font-size:    ceil(($font-size-base * 4.5)) !default;
            +
            +
            +//== Form states and alerts
            +//
            +//## Define colors for form feedback states and, by default, alerts.
            +
            +$state-success-text:             #8ac842 !default;
            +$state-success-bg:               #1bbc9b !default;
            +$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;
            +
            +$state-info-text:                #31708f !default;
            +$state-info-bg:                  #56b0ee !default;
            +$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;
            +
            +$state-warning-text:             #8a6d3b !default;
            +$state-warning-bg:               #fcb53f !default;
            +$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;
            +
            +$state-danger-text:              #a94442 !default;
            +$state-danger-bg:                #ff7877 !default;
            +$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;
            +
            +
            +//== Tooltips
            +//
            +//##
            +
            +//** Tooltip max width
            +$tooltip-max-width:           200px !default;
            +//** Tooltip text color
            +$tooltip-color:               #fff !default;
            +//** Tooltip background color
            +$tooltip-bg:                  $brand-primary !default;
            +$tooltip-opacity:             .9 !default;
            +
            +//** Tooltip arrow width
            +$tooltip-arrow-width:         5px !default;
            +//** Tooltip arrow color
            +$tooltip-arrow-color:         $tooltip-bg !default;
            +
            +
            +//== Popovers
            +//
            +//##
            +
            +//** Popover body background color
            +$popover-bg:                          #fff !default;
            +//** Popover maximum width
            +$popover-max-width:                   276px !default;
            +//** Popover border color
            +$popover-border-color:                rgba(0,0,0,.2) !default;
            +//** Popover fallback border color
            +$popover-fallback-border-color:       #ccc !default;
            +
            +//** Popover title background color
            +$popover-title-bg:                    darken($popover-bg, 3%) !default;
            +
            +//** Popover arrow width
            +$popover-arrow-width:                 10px !default;
            +//** Popover arrow color
            +$popover-arrow-color:                 $popover-bg !default;
            +
            +//** Popover outer arrow width
            +$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;
            +//** Popover outer arrow color
            +$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;
            +//** Popover outer arrow fallback color
            +$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;
            +
            +
            +//== Labels
            +//
            +//##
            +
            +//** Default label background color
            +$label-default-bg:            $gray-light !default;
            +//** Primary label background color
            +$label-primary-bg:            $brand-primary !default;
            +//** Success label background color
            +$label-success-bg:            $brand-success !default;
            +//** Info label background color
            +$label-info-bg:               $brand-info !default;
            +//** Warning label background color
            +$label-warning-bg:            $brand-warning !default;
            +//** Danger label background color
            +$label-danger-bg:             $brand-danger !default;
            +
            +//** Default label text color
            +$label-color:                 #fff !default;
            +//** Default text color of a linked label
            +$label-link-hover-color:      #fff !default;
            +
            +
            +//== Modals
            +//
            +//##
            +
            +//** Padding applied to the modal body
            +$modal-inner-padding:         20px !default;
            +
            +//** Padding applied to the modal title
            +$modal-title-padding:         20px !default;
            +//** Modal title line-height
            +$modal-title-line-height:     $line-height-base !default;
            +
            +//** Background color of modal content area
            +$modal-content-bg:                             #fff !default;
            +//** Modal content border color
            +$modal-content-border-color:                   rgba(0,0,0,.2) !default;
            +//** Modal content border color **for IE8**
            +$modal-content-fallback-border-color:          #999 !default;
            +
            +//** Modal backdrop background color
            +$modal-backdrop-bg:           #000 !default;
            +//** Modal backdrop opacity
            +$modal-backdrop-opacity:      .5 !default;
            +//** Modal header border color
            +$modal-header-border-color:   #e5e5e5 !default;
            +//** Modal footer border color
            +$modal-footer-border-color:   $modal-header-border-color !default;
            +
            +$modal-lg:                    900px !default;
            +$modal-md:                    600px !default;
            +$modal-sm:                    300px !default;
            +
            +
            +//== Alerts
            +//
            +//## Define alert colors, border radius, and padding.
            +
            +$alert-padding:               15px !default;
            +$alert-border-radius:         $border-radius-small !default;
            +$alert-link-font-weight:      bold !default;
            +
            +$alert-success-bg:            $state-success-bg !default;
            +$alert-success-text:          $state-success-text !default;
            +$alert-success-border:        $state-success-border !default;
            +
            +$alert-info-bg:               $state-info-bg !default;
            +$alert-info-text:             $state-info-text !default;
            +$alert-info-border:           $state-info-border !default;
            +
            +$alert-warning-bg:            $state-warning-bg !default;
            +$alert-warning-text:          $state-warning-text !default;
            +$alert-warning-border:        $state-warning-border !default;
            +
            +$alert-danger-bg:             $state-danger-bg !default;
            +$alert-danger-text:           $state-danger-text !default;
            +$alert-danger-border:         $state-danger-border !default;
            +
            +
            +//== Progress bars
            +//
            +//##
            +
            +//** Background color of the whole progress component
            +$progress-bg:                 #f5f5f5 !default;
            +//** Progress bar text color
            +$progress-bar-color:          #fff !default;
            +//** Variable for setting rounded corners on progress bar.
            +$progress-border-radius:      $border-radius-base !default;
            +
            +//** Default progress bar color
            +$progress-bar-bg:             $brand-primary !default;
            +//** Success progress bar color
            +$progress-bar-success-bg:     $brand-success !default;
            +//** Warning progress bar color
            +$progress-bar-warning-bg:     $brand-warning !default;
            +//** Danger progress bar color
            +$progress-bar-danger-bg:      $brand-danger !default;
            +//** Info progress bar color
            +$progress-bar-info-bg:        $brand-info !default;
            +
            +
            +//== List group
            +//
            +//##
            +
            +//** Background color on `.list-group-item`
            +$list-group-bg:                 #fff !default;
            +//** `.list-group-item` border color
            +$list-group-border:             #ddd !default;
            +//** List group border radius
            +$list-group-border-radius:      $border-radius-base !default;
            +
            +//** Background color of single list items on hover
            +$list-group-hover-bg:           #f5f5f5 !default;
            +//** Text color of active list items
            +$list-group-active-color:       $component-active-color !default;
            +//** Background color of active list items
            +$list-group-active-bg:          $component-active-bg !default;
            +//** Border color of active list elements
            +$list-group-active-border:      $list-group-active-bg !default;
            +//** Text color for content within active list items
            +$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;
            +
            +//** Text color of disabled list items
            +$list-group-disabled-color:      $gray-light !default;
            +//** Background color of disabled list items
            +$list-group-disabled-bg:         $gray-lighter !default;
            +//** Text color for content within disabled list items
            +$list-group-disabled-text-color: $list-group-disabled-color !default;
            +
            +$list-group-link-color:         #555 !default;
            +$list-group-link-hover-color:   $list-group-link-color !default;
            +$list-group-link-heading-color: #333 !default;
            +
            +
            +//== Panels
            +//
            +//##
            +
            +$panel-bg:                    #fff !default;
            +$box-content-padding:          15px !default;
            +$panel-heading-padding:       10px 15px !default;
            +$panel-footer-padding:        $panel-heading-padding !default;
            +$panel-border-radius:         0 !default;
            +
            +//** Border color for elements within panels
            +$panel-inner-border:          #ddd !default;
            +$panel-footer-bg:             #f5f5f5 !default;
            +
            +$panel-default-text:          $gray-dark !default;
            +$panel-default-border:        #FFF !default;
            +$panel-default-heading-bg:    #f5f5f5 !default;
            +
            +$panel-primary-text:          #fff !default;
            +$panel-primary-border:        $brand-primary !default;
            +$panel-primary-heading-bg:    $brand-primary !default;
            +
            +$panel-success-text:          $state-success-text !default;
            +$panel-success-border:        $state-success-border !default;
            +$panel-success-heading-bg:    $state-success-bg !default;
            +
            +$panel-info-text:             $state-info-text !default;
            +$panel-info-border:           $state-info-border !default;
            +$panel-info-heading-bg:       $state-info-bg !default;
            +
            +$panel-warning-text:          $state-warning-text !default;
            +$panel-warning-border:        $state-warning-border !default;
            +$panel-warning-heading-bg:    $state-warning-bg !default;
            +
            +$panel-danger-text:           $state-danger-text !default;
            +$panel-danger-border:         $state-danger-border !default;
            +$panel-danger-heading-bg:     $state-danger-bg !default;
            +
            +
            +//== Thumbnails
            +//
            +//##
            +
            +//** Padding around the thumbnail image
            +$thumbnail-padding:           4px !default;
            +//** Thumbnail background color
            +$thumbnail-bg:                $body-bg !default;
            +//** Thumbnail border color
            +$thumbnail-border:            #ddd !default;
            +//** Thumbnail border radius
            +$thumbnail-border-radius:     $border-radius-base !default;
            +
            +//** Custom text color for thumbnail captions
            +$thumbnail-caption-color:     $text-color !default;
            +//** Padding around the thumbnail caption
            +$thumbnail-caption-padding:   9px !default;
            +
            +
            +//== Wells
            +//
            +//##
            +
            +$well-bg:                     #f5f5f5 !default;
            +$well-border:                 darken($well-bg, 7%) !default;
            +
            +
            +//== Badges
            +//
            +//##
            +
            +$badge-color:                 #fff !default;
            +//** Linked badge text color on hover
            +$badge-link-hover-color:      #fff !default;
            +$badge-bg:                    $gray-light !default;
            +
            +//** Badge text color in active nav link
            +$badge-active-color:          $link-color !default;
            +//** Badge background color in active nav link
            +$badge-active-bg:             #fff !default;
            +
            +$badge-font-weight:           bold !default;
            +$badge-line-height:           1 !default;
            +$badge-border-radius:         10px !default;
            +
            +
            +//== Breadcrumbs
            +//
            +//##
            +
            +$breadcrumb-padding-vertical:   40px !default;
            +$breadcrumb-padding-horizontal: 0px !default;
            +//** Breadcrumb background color
            +$breadcrumb-bg:                 transparent !default;
            +//** Breadcrumb text color
            +$breadcrumb-color:              #fff !default;
            +//** Text color of current page in the breadcrumb
            +$breadcrumb-active-color:       #fff !default;
            +//** Textual separator for between breadcrumb elements
            +$breadcrumb-separator:          "/" !default;
            +
            +
            +//== Carousel
            +//
            +//##
            +
            +$carousel-text-shadow:                        none !default;
            +
            +$carousel-control-color:                      #fff !default;
            +$carousel-control-width:                      44px !default;
            +$carousel-control-opacity:                    1 !default;
            +$carousel-control-font-size:                  20px !default;
            +
            +$carousel-indicator-active-bg:                $brand-primary !default;
            +$carousel-indicator-border-color:             $brand-primary !default;
            +
            +$carousel-caption-color:                      #fff !default;
            +
            +
            +//== Close
            +//
            +//##
            +
            +$close-font-weight:           bold !default;
            +$close-color:                 #000 !default;
            +$close-text-shadow:           0 1px 0 #fff !default;
            +
            +
            +//== Code
            +//
            +//##
            +
            +$code-color:                  #c7254e !default;
            +$code-bg:                     #f9f2f4 !default;
            +
            +$kbd-color:                   #fff !default;
            +$kbd-bg:                      #333 !default;
            +
            +$pre-bg:                      #f5f5f5 !default;
            +$pre-color:                   $gray-dark !default;
            +$pre-border-color:            #ccc !default;
            +$pre-scrollable-max-height:   340px !default;
            +
            +
            +//== Type
            +//
            +//##
            +
            +//** Horizontal offset for forms and lists.
            +$component-offset-horizontal: 180px !default;
            +//** Text muted color
            +$text-muted:                  $gray-light !default;
            +//** Abbreviations and acronyms border color
            +$abbr-border-color:           $gray-light !default;
            +//** Headings small color
            +$headings-small-color:        $gray-light !default;
            +//** Blockquote small color
            +$blockquote-small-color:      $gray-light !default;
            +//** Blockquote font size
            +$blockquote-font-size:        ($font-size-base * 1.25) !default;
            +//** Blockquote border color
            +$blockquote-border-color:     $gray-lighter !default;
            +//** Page header border color
            +$page-header-border-color:    $gray-lighter !default;
            +//** Width of horizontal description list titles
            +$dl-horizontal-offset:        $component-offset-horizontal !default;
            +//** Horizontal line color.
            +$hr-border:                   $gray-lighter !default;
            diff --git a/assets/scss/bootstrap/mixins/_clearfix.scss b/assets/scss/bootstrap/mixins/_clearfix.scss
            new file mode 100755
            index 00000000..dc3e2ab4
            --- /dev/null
            +++ b/assets/scss/bootstrap/mixins/_clearfix.scss
            @@ -0,0 +1,22 @@
            +// Clearfix
            +//
            +// For modern browsers
            +// 1. The space content is one way to avoid an Opera bug when the
            +//    contenteditable attribute is included anywhere else in the document.
            +//    Otherwise it causes space to appear at the top and bottom of elements
            +//    that are clearfixed.
            +// 2. The use of `table` rather than `block` is only necessary if using
            +//    `:before` to contain the top-margins of child elements.
            +//
            +// Source: http://nicolasgallagher.com/micro-clearfix-hack/
            +
            +@mixin clearfix() {
            +  &:before,
            +  &:after {
            +    content: " "; // 1
            +    display: table; // 2
            +  }
            +  &:after {
            +    clear: both;
            +  }
            +}
            diff --git a/assets/scss/bootstrap/mixins/_grid-framework.scss b/assets/scss/bootstrap/mixins/_grid-framework.scss
            new file mode 100755
            index 00000000..51f169f2
            --- /dev/null
            +++ b/assets/scss/bootstrap/mixins/_grid-framework.scss
            @@ -0,0 +1,79 @@
            +// Framework grid generation
            +//
            +// Used only by Bootstrap to generate the correct number of grid classes given
            +// any value of `$grid-columns`.
            +
            +// [converter] This is defined recursively in LESS, but Sass supports real loops
            +@mixin make-grid-columns($class,$i: 1, $list: ".col-#{$class}-#{$i}") {
            +  @for $i from (1 + 1) through $grid-columns {
            +    $list: "#{$list}, .col-#{$class}-#{$i}";
            +  }
            +  #{$list} {
            +    position: relative;
            +    // Prevent columns from collapsing when empty
            +    min-height: 1px;
            +    // Inner gutter via padding
            +    padding-left:  ceil(($grid-gutter-width / 2));
            +    padding-right: floor(($grid-gutter-width / 2));
            +  }
            +}
            +
            +
            +// [converter] This is defined recursively in LESS, but Sass supports real loops
            +@mixin float-grid-columns($class, $i: 1, $list: ".col-#{$class}-#{$i}") {
            +  @for $i from (1 + 1) through $grid-columns {
            +    $list: "#{$list}, .col-#{$class}-#{$i}";
            +  }
            +  #{$list} {
            +    float: left;
            +  }
            +}
            +
            +
            +@mixin calc-grid-column($index, $class, $type) {
            +  @if ($type == width) and ($index > 0) {
            +    .col-#{$class}-#{$index} {
            +      width: percentage(($index / $grid-columns));
            +    }
            +  }
            +  @if ($type == push) and ($index > 0) {
            +    .col-#{$class}-push-#{$index} {
            +      left: percentage(($index / $grid-columns));
            +    }
            +  }
            +  @if ($type == push) and ($index == 0) {
            +    .col-#{$class}-push-0 {
            +      left: auto;
            +    }
            +  }
            +  @if ($type == pull) and ($index > 0) {
            +    .col-#{$class}-pull-#{$index} {
            +      right: percentage(($index / $grid-columns));
            +    }
            +  }
            +  @if ($type == pull) and ($index == 0) {
            +    .col-#{$class}-pull-0 {
            +      right: auto;
            +    }
            +  }
            +  @if ($type == offset) {
            +    .col-#{$class}-offset-#{$index} {
            +      margin-left: percentage(($index / $grid-columns));
            +    }
            +  }
            +}
            +
            +// [converter] This is defined recursively in LESS, but Sass supports real loops
            +@mixin loop-grid-columns($columns, $class, $type) {
            +  @for $i from 0 through $columns {
            +    @include calc-grid-column($i, $class, $type);
            +  }
            +}
            +
            +
            +// Create grid for specific class
            +@mixin make-grid($class) {
            +  @include float-grid-columns($class);
            +  @include loop-grid-columns($grid-columns, $class, width);
            +
            +}
            diff --git a/assets/scss/bootstrap/mixins/_grid.scss b/assets/scss/bootstrap/mixins/_grid.scss
            new file mode 100755
            index 00000000..0820258c
            --- /dev/null
            +++ b/assets/scss/bootstrap/mixins/_grid.scss
            @@ -0,0 +1,122 @@
            +// Grid system
            +//
            +// Generate semantic grid columns with these mixins.
            +
            +// Centered container element
            +@mixin container-fixed($gutter: $grid-gutter-width) {
            +  margin-right: auto;
            +  margin-left: auto;
            +  padding-left:  ($gutter / 2);
            +  padding-right: ($gutter / 2);
            +  @include clearfix;
            +}
            +
            +// Creates a wrapper for a series of columns
            +@mixin make-row($gutter: $grid-gutter-width) {
            +  margin-left:  ceil(($gutter / -2));
            +  margin-right: floor(($gutter / -2));
            +  @include clearfix;
            +}
            +
            +// Generate the extra small columns
            +@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {
            +  position: relative;
            +  float: left;
            +  width: percentage(($columns / $grid-columns));
            +  min-height: 1px;
            +  padding-left:  ($gutter / 2);
            +  padding-right: ($gutter / 2);
            +}
            +@mixin make-xs-column-offset($columns) {
            +  margin-left: percentage(($columns / $grid-columns));
            +}
            +@mixin make-xs-column-push($columns) {
            +  left: percentage(($columns / $grid-columns));
            +}
            +@mixin make-xs-column-pull($columns) {
            +  right: percentage(($columns / $grid-columns));
            +}
            +
            +// Generate the small columns
            +@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {
            +  position: relative;
            +  min-height: 1px;
            +  padding-left:  ($gutter / 2);
            +  padding-right: ($gutter / 2);
            +
            +  @media (min-width: $screen-sm-min) {
            +    float: left;
            +    width: percentage(($columns / $grid-columns));
            +  }
            +}
            +@mixin make-sm-column-offset($columns) {
            +  @media (min-width: $screen-sm-min) {
            +    margin-left: percentage(($columns / $grid-columns));
            +  }
            +}
            +@mixin make-sm-column-push($columns) {
            +  @media (min-width: $screen-sm-min) {
            +    left: percentage(($columns / $grid-columns));
            +  }
            +}
            +@mixin make-sm-column-pull($columns) {
            +  @media (min-width: $screen-sm-min) {
            +    right: percentage(($columns / $grid-columns));
            +  }
            +}
            +
            +// Generate the medium columns
            +@mixin make-md-column($columns, $gutter: $grid-gutter-width) {
            +  position: relative;
            +  min-height: 1px;
            +  padding-left:  ($gutter / 2);
            +  padding-right: ($gutter / 2);
            +
            +  @media (min-width: $screen-md-min) {
            +    float: left;
            +    width: percentage(($columns / $grid-columns));
            +  }
            +}
            +@mixin make-md-column-offset($columns) {
            +  @media (min-width: $screen-md-min) {
            +    margin-left: percentage(($columns / $grid-columns));
            +  }
            +}
            +@mixin make-md-column-push($columns) {
            +  @media (min-width: $screen-md-min) {
            +    left: percentage(($columns / $grid-columns));
            +  }
            +}
            +@mixin make-md-column-pull($columns) {
            +  @media (min-width: $screen-md-min) {
            +    right: percentage(($columns / $grid-columns));
            +  }
            +}
            +
            +// Generate the large columns
            +@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {
            +  position: relative;
            +  min-height: 1px;
            +  padding-left:  ($gutter / 2);
            +  padding-right: ($gutter / 2);
            +
            +  @media (min-width: $screen-lg-min) {
            +    float: left;
            +    width: percentage(($columns / $grid-columns));
            +  }
            +}
            +@mixin make-lg-column-offset($columns) {
            +  @media (min-width: $screen-lg-min) {
            +    margin-left: percentage(($columns / $grid-columns));
            +  }
            +}
            +@mixin make-lg-column-push($columns) {
            +  @media (min-width: $screen-lg-min) {
            +    left: percentage(($columns / $grid-columns));
            +  }
            +}
            +@mixin make-lg-column-pull($columns) {
            +  @media (min-width: $screen-lg-min) {
            +    right: percentage(($columns / $grid-columns));
            +  }
            +}
            diff --git a/assets/scss/bootstrap/mixins/_opacity.scss b/assets/scss/bootstrap/mixins/_opacity.scss
            new file mode 100755
            index 00000000..88e9a576
            --- /dev/null
            +++ b/assets/scss/bootstrap/mixins/_opacity.scss
            @@ -0,0 +1,8 @@
            +// Opacity
            +
            +@mixin opacity($opacity) {
            +  opacity: $opacity;
            +  // IE8 filter
            +  $opacity-ie: ($opacity * 100);
            +  filter: alpha(opacity=$opacity-ie);
            +}
            diff --git a/assets/scss/bootstrap/mixins/_resize.scss b/assets/scss/bootstrap/mixins/_resize.scss
            new file mode 100755
            index 00000000..83fa6379
            --- /dev/null
            +++ b/assets/scss/bootstrap/mixins/_resize.scss
            @@ -0,0 +1,6 @@
            +// Resize anything
            +
            +@mixin resizable($direction) {
            +  resize: $direction; // Options: horizontal, vertical, both
            +  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
            +}
            diff --git a/assets/scss/bootstrap/mixins/_size.scss b/assets/scss/bootstrap/mixins/_size.scss
            new file mode 100755
            index 00000000..abbe2463
            --- /dev/null
            +++ b/assets/scss/bootstrap/mixins/_size.scss
            @@ -0,0 +1,10 @@
            +// Sizing shortcuts
            +
            +@mixin size($width, $height) {
            +  width: $width;
            +  height: $height;
            +}
            +
            +@mixin square($size) {
            +  @include size($size, $size);
            +}
            diff --git a/assets/scss/bootstrap/mixins/_vendor-prefixes.scss b/assets/scss/bootstrap/mixins/_vendor-prefixes.scss
            new file mode 100755
            index 00000000..df4c1ec8
            --- /dev/null
            +++ b/assets/scss/bootstrap/mixins/_vendor-prefixes.scss
            @@ -0,0 +1,222 @@
            +// Vendor Prefixes
            +//
            +// All vendor mixins are deprecated as of v3.2.0 due to the introduction of
            +// Autoprefixer in our Gruntfile. They will be removed in v4.
            +
            +// - Animations
            +// - Backface visibility
            +// - Box shadow
            +// - Box sizing
            +// - Content columns
            +// - Hyphens
            +// - Placeholder text
            +// - Transformations
            +// - Transitions
            +// - User Select
            +
            +
            +// Animations
            +@mixin animation($animation) {
            +  -webkit-animation: $animation;
            +       -o-animation: $animation;
            +          animation: $animation;
            +}
            +@mixin animation-name($name) {
            +  -webkit-animation-name: $name;
            +          animation-name: $name;
            +}
            +@mixin animation-duration($duration) {
            +  -webkit-animation-duration: $duration;
            +          animation-duration: $duration;
            +}
            +@mixin animation-timing-function($timing-function) {
            +  -webkit-animation-timing-function: $timing-function;
            +          animation-timing-function: $timing-function;
            +}
            +@mixin animation-delay($delay) {
            +  -webkit-animation-delay: $delay;
            +          animation-delay: $delay;
            +}
            +@mixin animation-iteration-count($iteration-count) {
            +  -webkit-animation-iteration-count: $iteration-count;
            +          animation-iteration-count: $iteration-count;
            +}
            +@mixin animation-direction($direction) {
            +  -webkit-animation-direction: $direction;
            +          animation-direction: $direction;
            +}
            +@mixin animation-fill-mode($fill-mode) {
            +  -webkit-animation-fill-mode: $fill-mode;
            +          animation-fill-mode: $fill-mode;
            +}
            +
            +// Backface visibility
            +// Prevent browsers from flickering when using CSS 3D transforms.
            +// Default value is `visible`, but can be changed to `hidden`
            +
            +@mixin backface-visibility($visibility){
            +  -webkit-backface-visibility: $visibility;
            +     -moz-backface-visibility: $visibility;
            +          backface-visibility: $visibility;
            +}
            +
            +// Drop shadows
            +//
            +// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
            +// supported browsers that have box shadow capabilities now support it.
            +
            +@mixin box-shadow($shadow...) {
            +  -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1
            +          box-shadow: $shadow;
            +}
            +
            +// Box sizing
            +@mixin box-sizing($boxmodel) {
            +  -webkit-box-sizing: $boxmodel;
            +     -moz-box-sizing: $boxmodel;
            +          box-sizing: $boxmodel;
            +}
            +
            +// CSS3 Content Columns
            +@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {
            +  -webkit-column-count: $column-count;
            +     -moz-column-count: $column-count;
            +          column-count: $column-count;
            +  -webkit-column-gap: $column-gap;
            +     -moz-column-gap: $column-gap;
            +          column-gap: $column-gap;
            +}
            +
            +// Optional hyphenation
            +@mixin hyphens($mode: auto) {
            +  word-wrap: break-word;
            +  -webkit-hyphens: $mode;
            +     -moz-hyphens: $mode;
            +      -ms-hyphens: $mode; // IE10+
            +       -o-hyphens: $mode;
            +          hyphens: $mode;
            +}
            +
            +// Placeholder text
            +@mixin placeholder($color: $input-color-placeholder) {
            +  // Firefox
            +  &::-moz-placeholder {
            +    color: $color;
            +    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526
            +  }
            +  &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+
            +  &::-webkit-input-placeholder  { color: $color; } // Safari and Chrome
            +}
            +
            +// Transformations
            +@mixin scale($ratio...) {
            +  -webkit-transform: scale($ratio);
            +      -ms-transform: scale($ratio); // IE9 only
            +       -o-transform: scale($ratio);
            +          transform: scale($ratio);
            +}
            +
            +@mixin scaleX($ratio) {
            +  -webkit-transform: scaleX($ratio);
            +      -ms-transform: scaleX($ratio); // IE9 only
            +       -o-transform: scaleX($ratio);
            +          transform: scaleX($ratio);
            +}
            +@mixin scaleY($ratio) {
            +  -webkit-transform: scaleY($ratio);
            +      -ms-transform: scaleY($ratio); // IE9 only
            +       -o-transform: scaleY($ratio);
            +          transform: scaleY($ratio);
            +}
            +@mixin skew($x, $y) {
            +  -webkit-transform: skewX($x) skewY($y);
            +      -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
            +       -o-transform: skewX($x) skewY($y);
            +          transform: skewX($x) skewY($y);
            +}
            +@mixin translate($x, $y) {
            +  -webkit-transform: translate($x, $y);
            +      -ms-transform: translate($x, $y); // IE9 only
            +       -o-transform: translate($x, $y);
            +          transform: translate($x, $y);
            +}
            +@mixin translate3d($x, $y, $z) {
            +  -webkit-transform: translate3d($x, $y, $z);
            +          transform: translate3d($x, $y, $z);
            +}
            +@mixin rotate($degrees) {
            +  -webkit-transform: rotate($degrees);
            +      -ms-transform: rotate($degrees); // IE9 only
            +       -o-transform: rotate($degrees);
            +          transform: rotate($degrees);
            +}
            +@mixin rotateX($degrees) {
            +  -webkit-transform: rotateX($degrees);
            +      -ms-transform: rotateX($degrees); // IE9 only
            +       -o-transform: rotateX($degrees);
            +          transform: rotateX($degrees);
            +}
            +@mixin rotateY($degrees) {
            +  -webkit-transform: rotateY($degrees);
            +      -ms-transform: rotateY($degrees); // IE9 only
            +       -o-transform: rotateY($degrees);
            +          transform: rotateY($degrees);
            +}
            +@mixin perspective($perspective) {
            +  -webkit-perspective: $perspective;
            +     -moz-perspective: $perspective;
            +          perspective: $perspective;
            +}
            +@mixin perspective-origin($perspective) {
            +  -webkit-perspective-origin: $perspective;
            +     -moz-perspective-origin: $perspective;
            +          perspective-origin: $perspective;
            +}
            +@mixin transform-origin($origin) {
            +  -webkit-transform-origin: $origin;
            +     -moz-transform-origin: $origin;
            +      -ms-transform-origin: $origin; // IE9 only
            +          transform-origin: $origin;
            +}
            +
            +
            +// Transitions
            +
            +@mixin transition($transition...) {
            +  -webkit-transition: $transition;
            +       -o-transition: $transition;
            +          transition: $transition;
            +}
            +@mixin transition-property($transition-property...) {
            +  -webkit-transition-property: $transition-property;
            +          transition-property: $transition-property;
            +}
            +@mixin transition-delay($transition-delay) {
            +  -webkit-transition-delay: $transition-delay;
            +          transition-delay: $transition-delay;
            +}
            +@mixin transition-duration($transition-duration...) {
            +  -webkit-transition-duration: $transition-duration;
            +          transition-duration: $transition-duration;
            +}
            +@mixin transition-timing-function($timing-function) {
            +  -webkit-transition-timing-function: $timing-function;
            +          transition-timing-function: $timing-function;
            +}
            +@mixin transition-transform($transition...) {
            +  -webkit-transition: -webkit-transform $transition;
            +     -moz-transition: -moz-transform $transition;
            +       -o-transition: -o-transform $transition;
            +          transition: transform $transition;
            +}
            +
            +
            +// User select
            +// For selecting text on the page
            +
            +@mixin user-select($select) {
            +  -webkit-user-select: $select;
            +     -moz-user-select: $select;
            +      -ms-user-select: $select; // IE10+
            +          user-select: $select;
            +}
            diff --git a/assets/scss/cmb2-front.scss b/assets/scss/cmb2-front.scss
            new file mode 100755
            index 00000000..5dda464b
            --- /dev/null
            +++ b/assets/scss/cmb2-front.scss
            @@ -0,0 +1,6 @@
            +@import "bootstrap/variables";
            +@import "bootstrap/mixins";
            +
            + 
            +@import "opalestate/vars";
            +@import "cmb2/cmb2-front";
            \ No newline at end of file
            diff --git a/assets/scss/cmb2/cmb2-display.scss b/assets/scss/cmb2/cmb2-display.scss
            new file mode 100755
            index 00000000..dfed254e
            --- /dev/null
            +++ b/assets/scss/cmb2/cmb2-display.scss
            @@ -0,0 +1 @@
            +@import "partials/display";
            diff --git a/assets/scss/cmb2/cmb2-front.scss b/assets/scss/cmb2/cmb2-front.scss
            new file mode 100755
            index 00000000..bb3318a2
            --- /dev/null
            +++ b/assets/scss/cmb2/cmb2-front.scss
            @@ -0,0 +1,77 @@
            +@import "partials/variables";
            +@import "partials/mixins";
            +
            +
            +
            +
            +// uploader fields //
            +.cmb2-uploader-files {
            +	display:flex;
            +	flex-wrap:wrap;
            +	> div{
            +		width: 180px;
            +		height: 130px;
            +		overflow: hidden;
            +	}
            +	.preview-image{
            +		height: 100%;
            +		img{
            +			height: 100%;
            +		}
            +	}
            +	.button-placehold {	
            +		border:dashed 1px #ebebeb;
            +		cursor: pointer;
            +		text-align: center;
            +		i{
            +			display: block;
            +			font-size: 24px;
            +			margin-bottom: 8px;
            +		}
            +		.button-placehold-content{
            +			position: relative;
            +			top: 50%;
            +			transform: translateY(-50%);
            +		}
            +	}
            +	input.select-file{
            +		display: none;
            +	}
            +}
            +.uploader-item-preview {
            +	position:relative;
            +	.btn-close {
            +		position:absolute;
            +		top:4px;
            +		right:5px;
            +		width:15px;
            +		height:15px;
            +		cursor:pointer;
            +		&:hover::before{
            +			color: red;
            +		}
            +		&::before{
            +			content: '\f00d';
            +			font-family: Fontawesome;
            +			transition: all .3s ease-in-out;
            +		}
            +	}
            +	.preview-icon{
            +		padding-top: 4px;
            +	}
            +}
            +
            +//// 
            +
            +
            +@import "partials/main_wrap";
            +@import "partials/post_metaboxes";
            +@import "partials/context_metaboxes";
            +@import "partials/misc";
            +@import "partials/collapsible_ui";
            +@import "partials/jquery_ui";
            +
            +/**
            + * CMB2 Frontend
            + */
            +@import "partials/front";
            diff --git a/assets/scss/cmb2/cmb2.scss b/assets/scss/cmb2/cmb2.scss
            new file mode 100755
            index 00000000..0fe61352
            --- /dev/null
            +++ b/assets/scss/cmb2/cmb2.scss
            @@ -0,0 +1,12 @@
            +@import "partials/variables";
            +@import "partials/mixins";
            +
            +@import "partials/main_wrap";
            +@import "partials/post_metaboxes";
            +@import "partials/context_metaboxes";
            +@import "partials/options-page";
            +@import "partials/new_term";
            +@import "partials/misc";
            +@import "partials/sidebar_placements";
            +@import "partials/collapsible_ui";
            +@import "partials/jquery_ui";
            diff --git a/assets/scss/cmb2/index.html b/assets/scss/cmb2/index.html
            new file mode 100755
            index 00000000..85fe2db4
            --- /dev/null
            +++ b/assets/scss/cmb2/index.html
            @@ -0,0 +1 @@
            +do not hack here
            \ No newline at end of file
            diff --git a/assets/scss/cmb2/index.php b/assets/scss/cmb2/index.php
            new file mode 100755
            index 00000000..eea59b98
            --- /dev/null
            +++ b/assets/scss/cmb2/index.php
            @@ -0,0 +1,2 @@
            + .cmb-row:first-of-type >,
            +	.cmb-field-list > .cmb-row:first-of-type > {
            +		.cmb-td,
            +		.cmb-th {
            +			border: 0;
            +		}
            +	}
            +}
            +
            +.cmb-add-row {
            +	margin: 1.8em 0 0;
            +}
            +
            +.cmb-nested .cmb-td,
            +.cmb-repeatable-group .cmb-th,
            +.cmb-repeatable-group:first-of-type {
            +	border: 0;
            +}
            +
            +.cmb-row:last-of-type,
            +.cmb2-wrap .cmb-row:last-of-type,
            +.cmb-repeatable-group:last-of-type {
            +	border-bottom: 0;
            +}
            +
            +.cmb-repeatable-grouping {
            +	border: 1px solid $light-gray;
            +	padding: 0 1em;
            +
            +	&.cmb-row {
            +		margin: 0 0 0.8em;
            +	}
            +
            +	+ .cmb-repeatable-grouping {
            +	}
            +}
            +$headings-color: #0a1938;
            +.cmb-th {
            +	color: $headings-color;
            +	float: left;
            +	font-weight: 500;
            +	line-height: 1.2;
            +	padding: 20px 10px 20px 0;
            +	vertical-align: top;
            +	width: 200px;
            +
            +	@media (max-width: $mobile-break) {
            +		@include fullth;
            +	}
            +}
            +
            +.cmb-td {
            +	line-height: 1.3;
            +	max-width: 100%;
            +	padding: 15px 10px;
            +	vertical-align: middle;
            +}
            +
            +.cmb-type-title {
            +
            +	.cmb-td {
            +		padding: 0;
            +	}
            +}
            +
            +.cmb-th label {
            +	display: block;
            +	padding: 5px 0;
            +}
            +
            +.cmb-th + .cmb-td {
            +	float: left;
            +}
            +
            +.cmb-td .cmb-td {
            +	padding-bottom: 1em;
            +}
            +
            +.cmb-remove-row {
            +	text-align: right;
            +}
            +
            +.empty-row.hidden {
            +	display: none;
            +}
            +
            +// Repeatable fields styles
            +.cmb-repeat-table {
            +	background-color: $almostwhite;
            +	border: 1px solid darken($light-gray, 3%);
            +
            +	.cmb-row.cmb-repeat-row {
            +		position: relative;
            +		counter-increment: el;
            +
            +		margin: 0;
            +		padding: 10px 10px 10px 50px;
            +		border-bottom: none !important; // Sometime, we need !important :).
            +
            +		& + .cmb-repeat-row {
            +			border-top: solid 1px $light-gray;
            +		}
            +
            +		&.ui-sortable-helper {
            +			outline: dashed 2px $light-gray !important; // Sometime, we need !important :).
            +		}
            +
            +		&:before {
            +			content: counter(el);
            +			display: block;
            +
            +			top: 0;
            +			left: 0;
            +			position: absolute;
            +
            +			width: 35px;
            +			height: 100%;
            +			line-height: 35px;
            +			cursor: move;
            +			color: $gray;
            +			text-align: center;
            +			border-right: solid 1px $light-gray;
            +		}
            +
            +		.cmb-td {
            +			margin: 0;
            +			padding: 0;
            +		}
            +
            +	}
            +
            +	+ .cmb-add-row {
            +		margin: 0;
            +
            +		&:before {
            +			content: '';
            +			width: 1px;
            +			height: 1.6em;
            +			display: block;
            +			margin-left: 17px;
            +			background-color: darken($light-gray, 5%);
            +		}
            +	}
            +
            +	.cmb-remove-row {
            +		top: 7px;
            +		right: 7px;
            +		position: absolute;
            +
            +		width: auto;
            +		margin-left: 0;
            +		padding: 0 !important; // Sometime, we need !important :).
            +
            +		display: none;
            +
            +		> .cmb-remove-row-button {
            +			font-size: 20px;
            +			text-indent: -1000px;
            +
            +			overflow: hidden;
            +			position: relative;
            +
            +			height: auto;
            +			line-height: 1;
            +			padding: 0 10px 0;
            +
            +			&:before {
            +				@include pseudo-dashicons("\f335");
            +			}
            +		}
            +	}
            +
            +	.cmb-repeat-row:hover .cmb-remove-row {
            +		display: block;
            +	}
            +
            +}
            +
            +.cmb-repeatable-group {
            +
            +	.cmb-th {
            +		padding: 5px;
            +	}
            +
            +	.cmb-group-title {
            +		background-color: $light-gray;
            +		padding: 8px 12px 8px 2.2em;
            +		margin: 0 -1em;
            +		min-height: 1.5em;
            +		font-size: 14px;
            +		line-height: 1.4;
            +
            +		h4 {
            +			border: 0;
            +			margin: 0;
            +			font-size: 1.2em;
            +			font-weight: 500;
            +			padding: 0.5em 0.75em;
            +		}
            +
            +		.cmb-th {
            +			display: block;
            +			width: 100%;
            +		}
            +	}
            +
            +	.cmb-group-description .cmb-th {
            +		@include fullth;
            +	}
            +
            +	.cmb-shift-rows {
            +		font-size: 1em;
            +		margin-right: 1em;
            +		text-decoration: none;
            +
            +		.dashicons {
            +			font-size: 1.5em;
            +			height: 1.5em;
            +			line-height: 1.2em;
            +			width: 1em;
            +
            +			&.dashicons-arrow-down-alt2 {
            +				line-height: 1.3em;
            +
            +			}
            +		}
            +	}
            +
            +	.cmb2-upload-button {
            +		float: right;
            +	}
            +
            +}
            +
            +p.cmb2-metabox-description {
            +	color: $gray;
            +	font-style: italic;
            +	margin: 0;
            +	padding-top: .5em;
            +}
            +
            +span.cmb2-metabox-description {
            +	color: $gray;
            +	font-style: italic;
            +}
            +
            +.cmb2-metabox-title {
            +	margin: 0 0 5px 0;
            +	padding: 5px 0 0 0;
            +	font-size: 14px;
            +}
            +
            +.cmb-inline ul {
            +	padding: 4px 0 0 0;
            +}
            +
            +.cmb-inline li {
            +	display: inline-block;
            +	padding-right: 18px;
            +}
            +
            +.cmb-type-textarea-code pre {
            +	margin: 0;
            +}
            +
            +.cmb2-media-status {
            +
            +	.img-status {
            +		clear: none;
            +		display: inline-block;
            +		vertical-align: middle;
            +		margin-right: 10px;
            +		width: auto;
            +
            +		img {
            +			max-width: 350px;
            +			height: auto;
            +		}
            +	}
            +
            +	.img-status img,
            +	.embed-status {
            +		background: $lightchecker;
            +		border: 5px solid $white;
            +		outline: 1px solid $light-gray;
            +		box-shadow: inset 0 0 15px rgba( 0, 0, 0, 0.3 ), inset 0 0 0 1px rgba( 0, 0, 0, 0.05 );
            +		background-image: linear-gradient(45deg, $darkchecker 25%, transparent 25%, transparent 75%, $darkchecker 75%, $darkchecker), linear-gradient(45deg, $darkchecker 25%, transparent 25%, transparent 75%, $darkchecker 75%, $darkchecker);
            +		background-position: 0 0, 10px 10px;
            +		background-size: 20px 20px;
            +		border-radius: 2px;
            +		-moz-border-radius: 2px;
            + 		margin: 15px 0 0 0;
            +	}
            +
            +	.embed-status {
            +		float: left;
            +		max-width: 800px;
            +	}
            +
            +	.img-status, .embed-status {
            +		position: relative;
            +
            +		.cmb2-remove-file-button {
            +			background: url(../images/ico-delete.png);
            +			height: 16px;
            +			left: -5px;
            +			position: absolute;
            +			text-indent: -9999px;
            +			top: -5px;
            +			width: 16px;
            +		}
            +
            +	}
            +
            +	.img-status {
            +
            +		.cmb2-remove-file-button {
            +			top: 10px;
            +		}
            +	}
            +
            +	.img-status img, .file-status > span {
            +		cursor: pointer;
            +	}
            +
            +	&.cmb-attach-list {
            +		.img-status img, .file-status > span {
            +			cursor: move;
            +		}
            +	}
            +
            +}
            +
            +.cmb-type-file-list .cmb2-media-status .img-status {
            +	clear: none;
            +	vertical-align: middle;
            +	width: auto;
            +	margin-right: 10px;
            +	margin-bottom: 10px;
            +	margin-top: 0;
            +}
            +
            +.cmb-attach-list li {
            +	clear: both;
            +	display: inline-block;
            +	width: 100%;
            +	margin-top: 5px;
            +	margin-bottom: 10px;
            +	img {
            +		float: left;
            +		margin-right: 10px;
            +	}
            +}
            +
            +.cmb2-remove-wrapper {
            +	margin: 0;
            +}
            +
            +.child-cmb2 .cmb-th {
            +	text-align: left;
            +}
            +
            +.cmb2-indented-hierarchy {
            +	padding-left: 1.5em;
            +}
            +
            +@media (max-width: $mobile-break) {
            +	.cmb-th,
            +	.cmb-td,
            +	.cmb-th + .cmb-td {
            +		display: block;
            +		float: none;
            +		width: 100%;
            +	}
            +}
            +.opalestate-submission-form {
            +	position: relative;
            +	.cmb-td{
            +		width: 100%;
            +		padding: 15px 0;
            +	}
            +	.cmb-th{
            +		width: 100%;
            +		padding-bottom: 0;
            +		padding-top: 15px;
            +		label{
            +			margin: 0;
            +			padding: 0;
            +		}
            +	}
            +	span.cmb2-metabox-description{
            +		padding-top: .5em;
            +		display: block;
            +	}
            +	.cmb2-wrap{
            +		input.cmb2-text-medium, input.cmb2-text-small{
            +			width: 100%;
            +		}
            +	}
            +	.opalestate-tab-content{
            +		&::after{
            +			content: '';
            +			display: block;
            +			clear: both;
            +		}
            +	}
            +	.submission-next-btn{
            +		@media screen and (min-width:768px){
            +			float: right;
            +		}
            +	}
            +	.btn-submit-cmb{
            +		position: absolute;
            +		bottom: 0px;
            +		right: 0px;
            +		padding: 19px 25px 17px 20px;
            +		@media screen and (max-width:767px){
            +			position: relative;
            +			bottom: 0;
            +			right: 0;
            +			margin-top: 15px;
            +		}
            +		&::before{
            +			content: "\f138";
            +			font-family: Fontawesome;
            +			margin-right: 18px;
            +			padding-right: 20px;
            +		}
            +		&::after{
            +			content: "";
            +			width: 52px;
            +			position: absolute;
            +			top: 0;
            +			left: 0;
            +			height: 100%;
            +			background-color: transparent;
            +			-webkit-box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15);
            +			box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15);
            +		}
            +	}
            +	.submission-back-btn,.submission-next-btn,.submission-next-btn{
            +		margin-top: 15px;
            +	}
            +	.cmb-repeatable-group{
            +		.cmb-group-title{
            +			font-size: 15px;
            +		}
            +	} 
            +	.cmb2-metabox{
            +		button.dashicons-before.dashicons-no-alt.cmb-remove-group-row{
            +			top: .4em;
            +		}
            +	}
            +	
            +	.cmb-type-group{
            +		.field-row-2{
            +			.cmb-row{
            +				border-bottom: none;
            +				margin-bottom: 0;
            +				padding-bottom: 0;
            +			}
            +		} 
            +		.cmb-row{
            +			padding-top: 15px;
            +			padding-bottom: 15px;
            +			margin-bottom: 15px;
            +			&.postbox{
            +				padding-top: 0;
            +				border-bottom: 1px solid #e9e9e9;
            +			}
            +		}
            +		.cmb-th{
            +			width: 100%;
            +			padding: 0;
            +			float: none;
            +			& + .cmb-td{
            +				width: 100%;
            +				float: none;
            +				padding: 15px 0;
            +			}
            +		}
            +	}
            +	
            +}
            diff --git a/assets/scss/cmb2/partials/_misc.scss b/assets/scss/cmb2/partials/_misc.scss
            new file mode 100755
            index 00000000..b9fbc03e
            --- /dev/null
            +++ b/assets/scss/cmb2/partials/_misc.scss
            @@ -0,0 +1,29 @@
            +/*--------------------------------------------------------------
            + * Misc.
            +--------------------------------------------------------------*/
            +
            +#poststuff .cmb-repeatable-group h2 {
            +	margin: 0;
            +}
            +
            +.edit-tags-php,
            +.profile-php,
            +.user-edit-php {
            +	.cmb2-metabox-title {
            +		font-size: 1.4em;
            +	}
            +}
            +
            +.cmb2-postbox, .cmb2-no-box-wrap {
            +	.cmb-spinner {
            +		float: left;
            +		display: none;
            +	}
            +}
            +
            +.cmb-spinner {
            +	display: none;
            +	&.is-active {
            +		display: block;
            +	}
            +}
            diff --git a/assets/scss/cmb2/partials/_mixins.scss b/assets/scss/cmb2/partials/_mixins.scss
            new file mode 100755
            index 00000000..7c1d00fe
            --- /dev/null
            +++ b/assets/scss/cmb2/partials/_mixins.scss
            @@ -0,0 +1,51 @@
            +//--------------------------------------------------------------
            +// Mixins
            +//--------------------------------------------------------------
            +
            +@mixin fullth() {
            +	font-size: 1.2em;
            +	@include _fullth;
            +}
            +
            +@mixin fullth_side() {
            +
            +	@include _fullth;
            +
            +	label {
            +		font-size: $font-size;
            +		line-height: 1.4em;
            +	}
            +}
            +
            +@mixin _fullth() {
            +	display: block;
            +	float: none;
            +	padding-bottom: 1em;
            +	text-align: left;
            +	width: 100%;
            +
            +	label {
            +		display: block;
            +		margin-top: 0;
            +		margin-bottom: 0.5em;
            +	}
            +}
            +
            +@mixin pseudo-dashicons( $glyph: "\f333" ) {
            +	content: $glyph;
            +	font-family: 'Dashicons';
            +	speak: none;
            +	font-weight: normal;
            +	font-variant: normal;
            +	text-transform: none;
            +	line-height: 1;
            +	-webkit-font-smoothing: antialiased;
            +	margin: 0;
            +	text-indent: 0;
            +	position: absolute;
            +	top: 0;
            +	left: 0;
            +	width: 100%;
            +	height: 100%;
            +	text-align: center;
            +}
            diff --git a/assets/scss/cmb2/partials/_new_term.scss b/assets/scss/cmb2/partials/_new_term.scss
            new file mode 100755
            index 00000000..33a13f32
            --- /dev/null
            +++ b/assets/scss/cmb2/partials/_new_term.scss
            @@ -0,0 +1,31 @@
            +/*--------------------------------------------------------------
            + * New-Term Page
            +--------------------------------------------------------------*/
            +
            +#addtag {
            +	.cmb-th {
            +		float: none;
            +		width: auto;
            +		padding: 20px 0 0;
            +	}
            +
            +	.cmb-td {
            +		padding: 0;
            +	}
            +
            +	.cmb-th + .cmb-td {
            +		float: none;
            +	}
            +
            +	select {
            +		max-width: 100%;
            +	}
            +
            +	.cmb2-metabox {
            +		padding-bottom: 20px;
            +	}
            +
            +	.cmb-row li label {
            +		display: inline;
            +	}
            +}
            \ No newline at end of file
            diff --git a/assets/scss/cmb2/partials/_options-page.scss b/assets/scss/cmb2/partials/_options-page.scss
            new file mode 100755
            index 00000000..442ca143
            --- /dev/null
            +++ b/assets/scss/cmb2/partials/_options-page.scss
            @@ -0,0 +1,71 @@
            +/*--------------------------------------------------------------
            + * Options page
            +--------------------------------------------------------------*/
            +
            +.cmb2-options-page {
            +	max-width: 1200px;
            +
            +	&.wrap > h2 {
            +		margin-bottom: 1em;
            +	}
            +
            +	.cmb2-metabox > .cmb-row {
            +		padding: 1em;
            +		margin-top: -1px;
            +		background: $white;
            +		border: 1px solid $light-gray;
            +		box-shadow: 0 1px 1px rgba(black, 0.05);
            +
            +		> .cmb-th {
            +			padding: 0;
            +			font-weight: initial;
            +		}
            +
            +		> .cmb-th + .cmb-td {
            +			float: none;
            +			padding: 0 0 0 1em;
            +			margin-left: 200px;
            +
            +			@media (max-width: $mobile-break) {
            +				padding: 0;
            +				margin-left: 0;
            +			}
            +		}
            +	}
            +
            +	// Title field style.
            +	.cmb2-wrap .cmb-type-title {
            +		margin-top: 1em;
            +		padding: 0.6em 1em;
            +		background-color: $almostwhite;
            +
            +		.cmb2-metabox-title {
            +			font-size: 12px;
            +			margin-top: 0;
            +			margin-bottom: 0;
            +			text-transform: uppercase;
            +		}
            +
            +		.cmb2-metabox-description {
            +			padding-top: 0.25em;
            +		}
            +	}
            +
            +	.cmb-repeatable-group {
            +		.cmb-group-description .cmb-th {
            +			padding: 0 0 0.8em 0;
            +		}
            +
            +		.cmb-group-name {
            +			font-size: 16px;
            +			margin-top: 0;
            +			margin-bottom: 0;
            +		}
            +
            +		.cmb-th > .cmb2-metabox-description {
            +			font-weight: 400;
            +			padding-bottom: 0 !important;
            +		}
            +	}
            +
            +}
            diff --git a/assets/scss/cmb2/partials/_post_metaboxes.scss b/assets/scss/cmb2/partials/_post_metaboxes.scss
            new file mode 100755
            index 00000000..c3f4510c
            --- /dev/null
            +++ b/assets/scss/cmb2/partials/_post_metaboxes.scss
            @@ -0,0 +1,84 @@
            +/*--------------------------------------------------------------
            + * Post Metaboxes
            +--------------------------------------------------------------*/
            +
            +#poststuff .cmb-group-title {
            +	margin-left: -1em;
            +	margin-right: -1em;
            +	min-height: 1.5em;
            +}
            +
            +#poststuff .repeatable .cmb-group-title {
            +	padding-left: 2.2em;
            +}
            +
            +.cmb2-postbox, .cmb-type-group {
            +
            +	.cmb2-wrap {
            +		margin: 0;
            +
            +		> .cmb-field-list > .cmb-row {
            +			padding: 1.8em 0;
            +		}
            +
            +		input[type=text] {
            +
            +			&.cmb2-oembed {
            +				width: 100%;
            +			}
            +		}
            +	}
            +
            +	.cmb-row {
            +		padding: 0 0 1.8em;
            +		margin: 0 0 0.8em;
            +
            +		.cmbhandle {
            +			right: -1em;
            +			position: relative;
            +			color: $dark-gray;
            +		}
            +	}
            +
            +	.cmb-repeatable-grouping {
            +		padding: 0 1em;
            +		max-width: 100%;
            +		min-width: 1px !important;
            +	}
            +
            +	.cmb-repeatable-group > .cmb-row {
            +		padding-bottom: 0;
            +	}
            +
            +	.cmb-th {
            +		width: 18%;
            +		padding: 0 2% 0 0;
            +		// text-align: right;
            +	}
            +
            +	.cmb-td {
            +		margin-bottom: 0;
            +		padding: 0;
            +		line-height: 1.3;
            +	}
            +
            +	.cmb-th + .cmb-td {
            +		width: 80%;
            +		float: right;
            +	}
            +
            +	.cmb-row:not(:last-of-type),
            +	.cmb-repeatable-group:not(:last-of-type) {
            +		border-bottom: 1px solid $light-gray;
            +
            +		@media (max-width: $mobile-break) {
            +			border-bottom: 0;
            +		}
            +	}
            +
            +	.cmb-repeat-group-field,
            +	.cmb-remove-field-row {
            +		padding-top: 1.8em;
            +	}
            +
            +}
            diff --git a/assets/scss/cmb2/partials/_sidebar_placements.scss b/assets/scss/cmb2/partials/_sidebar_placements.scss
            new file mode 100755
            index 00000000..e69de29b
            diff --git a/assets/scss/cmb2/partials/_variables.scss b/assets/scss/cmb2/partials/_variables.scss
            new file mode 100755
            index 00000000..34621c21
            --- /dev/null
            +++ b/assets/scss/cmb2/partials/_variables.scss
            @@ -0,0 +1,25 @@
            +//--------------------------------------------------------------
            +// Variables
            +//--------------------------------------------------------------
            +
            +// Mobile break-point
            +$mobile-break : 450px;
            +
            +// Fonts
            +$font-sans    : sans-serif;
            +$font-serif   : Georgia, Times, "Times New Roman", serif;
            +$font-mono    : "Courier 10 Pitch", Courier, monospace;
            +$font-size    : 14px;
            +
            +// Colors
            +$dark-gray    : #222222;
            +$gray         : #757575;
            +$light-gray   : #e9e9e9;
            +$lightchecker : #eee;
            +$darkchecker  : #d0d0d0;
            +$blue         : #0063ce;
            +$light-yellow : #fffff8;
            +$white        : #ffffff;
            +$almostwhite  : #fafafa;
            +$red          : #f00;
            +$dark-red     : #a00;
            diff --git a/assets/scss/cmb2/partials/index.php b/assets/scss/cmb2/partials/index.php
            new file mode 100755
            index 00000000..eea59b98
            --- /dev/null
            +++ b/assets/scss/cmb2/partials/index.php
            @@ -0,0 +1,2 @@
            + .box-heading {
            +    color: $heading-text-color;
            +    background-color: $heading-bg-color;
            +    border-color: $heading-border;
            +
            +    +  .box-content {
            +      border-top-color: $border;
            +    }
            +  }
            +  & > .box-content{
            +      border-color:$border;
            +  }
            +  & > .box-footer {
            +    + .box-collapse .box-body {
            +      border-bottom-color: $border;
            +    }
            +  }
            +}
            +@mixin button-3d($suffixclass, $height3d ,$color3d){
            +  border: 0;
            +  @if ($suffixclass == "empty") {
            +      box-shadow: 0 $height3d $color3d inset;
            +      -o-box-shadow: 0 $height3d $color3d inset;
            +      -moz-box-shadow: 0 $height3d $color3d inset;
            +      -webkit-box-shadow: 0 $height3d $color3d inset;
            +      -ms-box-shadow: 0 $height3d $color3d inset;
            +  }
            +  @else {
            +  &.btn-#{$suffixclass}{
            +     box-shadow: 0 $height3d $color3d inset;
            +      -o-box-shadow: 0 $height3d $color3d inset;
            +      -moz-box-shadow: 0 $height3d $color3d inset;
            +      -webkit-box-shadow: 0 $height3d $color3d inset;
            +      -ms-box-shadow: 0 $height3d $color3d inset;
            +    }
            +  }
            +}
            +
            +@mixin button-inverse( $suffixclass,  $color ,$background ){
            + 
            +  &.btn-#{$suffixclass}{
            +      &:hover{ 
            +        color:$color;
            +        background:transparent;
            +      }
            +  }
            +}
            +
            +@mixin button-outline( $suffixclass, $color, $hovercolor ){
            +  background:transparent;
            +  &.btn-#{$suffixclass}{
            +      color:$color;
            +      &:hover{
            +          color:$hovercolor;
            +      }
            +  }
            +}
            +/// button variant outline
            +@mixin button-variant-outline($color, $background, $border, $colorhover, $bghover, $borderhover ) {
            +  color: $color;
            +  background-color: $background;
            +  border-color: $border;
            +
            +  &:hover,
            +  &:focus,
            +  &:active,
            +  &.active {
            +    color: $colorhover;
            +    background-color: $bghover;
            +        border-color: $borderhover ;
            +  }
            +  .open & { &.dropdown-toggle {
            +    color: $colorhover;
            +    background-color: $bghover;
            +        border-color: $borderhover ;
            +  } }
            +  &:active,
            +  &.active {
            +    background-image: none;
            +  }
            +  .open & { &.dropdown-toggle {
            +    background-image: none;
            +  } }
            +  &.disabled,
            +  &[disabled],
            +  fieldset[disabled] & {
            +    &,
            +    &:hover,
            +    &:focus,
            +    &:active,
            +    &.active {
            +      background-color: $background;
            +          border-color: $border;
            +    }
            +  }
            +
            +  .badge {
            +    color: $background;
            +    background-color: $color;
            +  }
            +}
            +// icon variant inverse
            +
            +@mixin icons-inverse( $suffixclass,  $color ,$background ){
            + 
            +  &.icons-#{$suffixclass}{
            +      &:hover{ 
            +        color:$color;
            +        background:transparent;
            +      }
            +  }
            +}
            +// icon variant outline
            +
            +@mixin icons-outline( $suffixclass, $color, $hovercolor ){
            +  &.icons-#{$suffixclass}{
            +  background:transparent;
            +      color:$color;
            +      &:hover{
            +          color:$hovercolor;
            +      }
            +  }
            +}
            +
            +// Block
            +// -------------------------
            +@mixin block-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {
            +  
            +  border: solid 1px $border;
            +
            +  & .#{$block-heading-selector} {
            +    + .#{$block-prefix}-collapse .#{$block-content-selector} {
            +      border-top-color: $border;
            +    }
            +  }
            +  & > .#{$block-prefix}-footer {
            +    + .#{$block-prefix}-collapse .#{$block-prefix}-body {
            +      border-bottom-color: $border;
            +    }
            +  }
            +}
            +
            +/****/
            +/****/
            +@mixin container-layout-variant($color, $background, $linkcolor ){
            +    background: $background;
            +    color: $color;
            +    a{
            +      color:$linkcolor; 
            +      &:hover{
            +        color: $theme-color; 
            +      }  
            +    }         
            +}
            +
            +@mixin widget-heading-style(){
            +     font-size: 36px;
            +      position: relative;
            +      text-align: center;
            +      padding-bottom: 35px;
            +      text-transform: uppercase;
            +      margin-top: 0;
            +      margin-bottom: 40px;
            +      &.style-2 {
            +        font-size: 20px;
            +        margin-bottom: 20px;
            +        @include rtl-text-align-left();
            +        padding-bottom: 0;
            +        .widget-heading {
            +          font-size: 20px;
            +          > span:first-child {
            +            position: relative;
            +            margin-bottom: 20px;
            +            padding-bottom: 15px;
            +            display: block;
            +            &:before {
            +              content: "";
            +              background-color: $theme-color;
            +              @include size(40px,1px);
            +              position: absolute;
            +              bottom: 0;
            +              @include rtl-left(0px);
            +            }
            +          }
            +          .description {
            +            font-size: 18px;
            +            font-family: $font-family-base;
            +            color: $black;
            +            line-height: 30px;
            +          }
            +        }
            +        &:before,
            +        &:after {
            +          content: none;
            +        }
            +        @media screen and (max-width: $screen-xs-max) {
            +          margin-top: 20px;
            +        }
            +      }
            +      &.style-3 {
            +        text-transform: none;
            +        padding-bottom: 0;
            +        .description {
            +          margin: 15px 23% 0;
            +        }
            +        &:before,
            +        &:after {
            +          content: none;
            +        }
            +      }
            +      &.style-4 {
            +        background: url('#{$image-theme-path}heading-title-bg.png') no-repeat center bottom;
            +        .widget-heading {
            +          color: $white;
            +          .description {
            +            &:after {
            +              content: none;
            +            }
            +          }
            +        }
            +        &:before {
            +          content: none;
            +        }
            +        &:after {
            +          background-color: transparent;
            +        }
            +      }
            +      &:before {
            +        content: "";
            +        width: 156px;
            +        height: 1px;
            +        background-color: #d3d3d3;
            +        position: absolute;
            +        bottom: 0;
            +        @include rtl-left(50%);
            +        @include rtl-margin-left(-78px);
            +      }
            +      &:after {
            +        content: "";
            +        border: 2px solid $theme-color;
            +        @include border-radius(2px);
            +        @include rotate(45deg);
            +        position: absolute;
            +        bottom:-5px;
            +        @include rtl-left(50%);
            +        @include square(12px);
            +        z-index: 1;
            +        @include rtl-margin-left(-6px);
            +        background-color: $white;
            +      }
            +      .widget-heading {
            +        margin: 0;
            +        font-size: 36px;
            +        @media screen and (max-width: 979px) {
            +          font-size: 30px;
            +        }
            +        @media screen and (max-width: $screen-xs-min) {
            +          font-size: 24px;
            +        }
            +      }
            +      .description, .widget-desc{
            +          display: block;
            +          font-size: 18px;
            +          font-style: italic;
            +          color: $light-gray;
            +          font-weight: 400;
            +          text-transform: none;
            +          font-family: $font-family-base;
            +          margin: 10px 0 0;
            +          line-height: 1.4;
            +          &:after {
            +            content: "";
            +            @include size(50px,1px);
            +            background-color: $body-bg;
            +            position: absolute;
            +            bottom: 0;
            +            @include rtl-left(50%);
            +            @include rtl-margin-left(-25px);
            +          }
            +      }
            +      @media screen and (max-width: 979px) {
            +        font-size: 30px;
            +        padding-bottom: 25px;
            +        margin-bottom: 30px;
            +      }
            +}
            +
            +@mixin widget-specical-style(){
            +  margin-bottom: 40px;
            +  @include widget-heading-style();
            +  &.text-white {
            +    .widget-heading {
            +      color: $white;
            +      &:after {
            +        background-color: $white;
            +      }
            +    }    
            +  }
            +}
            \ No newline at end of file
            diff --git a/assets/scss/components/mixins/_rtl.scss b/assets/scss/components/mixins/_rtl.scss
            new file mode 100755
            index 00000000..c8b2fcff
            --- /dev/null
            +++ b/assets/scss/components/mixins/_rtl.scss
            @@ -0,0 +1,259 @@
            +// Support for RTL (Right to Left) & non-latin fonts
            +
            +$rtl-left : left;
            +$rtl-right : right;
            +$rtl-center: center;
            +
            +// BASIC CONVERTER (ignore these)
            +
            +@mixin rtl-base-simple ($property, $direction) {
            +  #{$property}:$direction;
            +  .rtl & {
            +    @if $direction == $rtl-right {
            +      #{$property}:$rtl-left;
            +    }
            +    @else {
            +      #{$property}:$rtl-right;
            +    }
            +  }
            +}
            +@mixin rtl-base-inherit ($property, $direction, $value, $inherit : inherit) {
            +  #{$property}-#{$direction}: $value;
            +  .rtl & {
            +    @if $direction == $rtl-right {
            +      #{$property}-#{$rtl-left}: $value;
            +    }
            +    @else {
            +      #{$property}-#{$rtl-right}: $value;
            +    }
            +    #{$property}-#{$direction}: $inherit;
            +  }
            +}
            +
            +@mixin rtl-base-toprightbottomleft ($property, $t, $r, $b, $l) {
            +  #{$property}: $t $r $b $l;
            +  .rtl & {
            +    #{$property}: $t $l $b $r;
            +  }
            +}
            +
            +// BODY STYLES
            +@mixin rtl-direction ($forBody : true) {
            +  direction: ltr;
            +  @if $forBody {
            +    &.rtl {
            +      direction: rtl;
            +    }
            +  }
            +  @else {
            +    .rtl & {
            +      direction: rtl;
            +    }
            +  }
            +}
            +
            +@mixin rtl-font-family ($ltr, $rtl, $forBody : false) {
            +  font-family: $ltr;
            +  @if $forBody {
            +    &.rtl, &.non-latin {
            +      font-family:$rtl;
            +    }
            +  }
            +  @else {
            +    .rtl &, .non-latin & {
            +      font-family:$rtl;
            +    }
            +  }
            +}
            +
            +
            +// MARGIN
            +
            +@mixin rtl-margin ($t, $r, $b, $l) {
            +  @include rtl-base-toprightbottomleft(margin,$t, $r, $b, $l);
            +}
            +@mixin rtl-margin-left ($value) {
            +  @include rtl-base-inherit(margin,$rtl-left,$value);
            +}
            +@mixin rtl-margin-right ($value) {
            +  @include rtl-base-inherit(margin,$rtl-right,$value);
            +}
            +
            +// PADDING
            +
            +@mixin rtl-padding ($t, $r, $b, $l) {
            +  @include rtl-base-toprightbottomleft(padding,$t, $r, $b, $l);
            +}
            +@mixin rtl-padding-left ($value) {
            +  @include rtl-base-inherit(padding,$rtl-left,$value);
            +}
            +@mixin rtl-padding-right ($value) {
            +  @include rtl-base-inherit(padding,$rtl-right,$value);
            +}
            +
            +// BORDER
            +
            +@mixin rtl-border-left ($value) {
            +  @include rtl-base-inherit(border,$rtl-left,$value);
            +}
            +@mixin rtl-border-right ($value) {
            +  @include rtl-base-inherit(border,$rtl-right,$value);
            +}
            +
            +// POSITION
            +
            +@mixin rtl-left ($value) {
            +  #{$rtl-left}: $value;
            +  .rtl & {
            +    #{$rtl-right}: $value;
            +    #{$rtl-left}: auto;
            +  }
            +}
            +@mixin rtl-right ($value) {
            +  #{$rtl-right}: $value;
            +  .rtl & {
            +    #{$rtl-left}: $value;
            +    #{$rtl-right}: auto;
            +  }
            +}
            +
            +
            +// CLEAR
            +
            +@mixin rtl-clear-left () {
            +  @include rtl-base-simple(clear, $rtl-left);
            +}
            +@mixin rtl-clear-right () {
            +  @include rtl-base-simple(clear, $rtl-right);
            +}
            +
            +// TEXT-ALIGN
            +
            +@mixin rtl-text-align-left () {
            +  @include rtl-base-simple(text-align, $rtl-left);
            +}
            +@mixin rtl-text-align-right () {
            +  @include rtl-base-simple(text-align, $rtl-right);
            +}
            +@mixin rtl-text-align-center () {
            +  @include rtl-base-simple(text-align, $rtl-center);
            +}
            +
            +// FLOAT
            +
            +@mixin rtl-float-left () {
            +  @include rtl-base-simple(float, $rtl-left);
            +}
            +@mixin rtl-float-right () {
            +  @include rtl-base-simple(float, $rtl-right);
            +}
            +
            +// BACKGROUND-POSITION
            +
            +@mixin rtl-background-position-left ($vertical) {
            +  background-position:$rtl-left $vertical;
            +  .rtl & {
            +    background-position:$rtl-right $vertical;
            +  }
            +}
            +@mixin rtl-background-position-right ($vertical) {
            +  background-position:$rtl-right $vertical;
            +  .rtl & {
            +    background-position:$rtl-left $vertical;
            +  }
            +}
            +
            +@mixin rtl-background-position-percent ($vertical, $horPercent) {
            +  background-position:$horPercent $vertical;
            +  .rtl & {
            +    background-position:100% - $horPercent $vertical;
            +  }
            +}
            +
            +// TEXT-SHADOW & BOX-SHADOW
            +
            +@mixin rtl-text-shadow ($x, $rest) {
            +  text-shadow: $x $rest;
            +  .rtl & {
            +    text-shadow: -1 * $x $rest;
            +  }
            +}
            +@mixin rtl-box-shadow ($x, $rest) {
            +  -moz-box-shadow: $x $rest;
            +  -webkit-box-shadow: $x $rest;
            +  box-shadow: $x $rest;
            +  .rtl & {
            +    -moz-box-shadow: -1 * $x $rest;
            +    -webkit-box-shadow: -1 * $x $rest;
            +    box-shadow: -1 * $x $rest;
            +  }
            +}
            +
            +// BORDER-RADIUS
            +
            +@mixin rtl-border-radius-topright ($tl, $tr, $br, $bl) {
            +  -moz-border-radius: $tl, $tr, $br, $bl;
            +  -webkit-border-radius: $tl, $tr, $br, $bl;
            +  border-top-radius: $tl, $tr, $br, $bl;
            +  .rtl & {
            +    -moz-border-radius: $tr, $tl, $bl, $br;
            +    -webkit-border-radius: $tr, $tl, $bl, $br;
            +    border-top-radius: $tr, $tl, $bl, $br;
            +  }
            +}
            +
            +@mixin rtl-border-radius-topright ($value) {
            +  -moz-border-radius-top#{$rtl-right}: $value;
            +  -webkit-border-top-#{$rtl-right}-radius: $value;
            +  border-top-#{$rtl-right}-radius: $value;
            +  .rtl & {
            +    -moz-border-radius-top#{$rtl-left}: $value;
            +    -webkit-border-top-#{$rtl-left}-radius: $value;
            +    border-top-#{$rtl-left}-radius: $value;
            +    -moz-border-radius-top#{$rtl-right}: inherit;
            +    -webkit-border-top-#{$rtl-right}-radius: inherit;
            +    border-top-#{$rtl-right}-radius: inherit;
            +  }
            +}
            +
            +@mixin rtl-border-radius-bottomright ($value) {
            +  -moz-border-radius-bottom#{$rtl-right}: $value;
            +  -webkit-border-bottom-#{$rtl-right}-radius: $value;
            +  border-bottom-#{$rtl-right}-radius: $value;
            +  .rtl & {
            +    -moz-border-radius-bottom#{$rtl-left}: $value;
            +    -webkit-border-bottom-#{$rtl-left}-radius: $value;
            +    border-bottom-#{$rtl-left}-radius: $value;
            +    -moz-border-radius-bottom#{$rtl-right}: inherit;
            +    -webkit-border-bottom-#{$rtl-right}-radius: inherit;
            +    border-bottom-#{$rtl-right}-radius: inherit;
            +  }
            +}
            +
            +@mixin rtl-border-radius-topleft ($value) {
            +  -moz-border-radius-top#{$rtl-left}: $value;
            +  -webkit-border-top-#{$rtl-left}-radius: $value;
            +  border-top-#{$rtl-left}-radius: $value;
            +  .rtl & {
            +    -moz-border-radius-top#{$rtl-right}: $value;
            +    -webkit-border-top-#{$rtl-right}-radius: $value;
            +    border-top-#{$rtl-right}-radius: $value;
            +    -moz-border-radius-top#{$rtl-left}: inherit;
            +    -webkit-border-top-#{$rtl-left}-radius: inherit;
            +    border-top-#{$rtl-left}-radius: inherit;
            +  }
            +}
            +
            +@mixin rtl-border-radius-bottomleft ($value) {
            +  -moz-border-radius-bottom#{$rtl-left}: $value;
            +  -webkit-border-bottom-#{$rtl-left}-radius: $value;
            +  border-bottom-#{$rtl-left}-radius: $value;
            +  .rtl & {
            +    -moz-border-radius-bottom#{$rtl-right}: $value;
            +    -webkit-border-bottom-#{$rtl-right}-radius: $value;
            +    border-bottom-#{$rtl-right}-radius: $value;
            +    -moz-border-radius-bottom#{$rtl-left}: inherit;
            +    -webkit-border-bottom-#{$rtl-left}-radius: inherit;
            +    border-bottom-#{$rtl-left}-radius: inherit;
            +  }
            +}
            diff --git a/assets/scss/components/mixins/_template-mixins.scss b/assets/scss/components/mixins/_template-mixins.scss
            new file mode 100755
            index 00000000..b98348b0
            --- /dev/null
            +++ b/assets/scss/components/mixins/_template-mixins.scss
            @@ -0,0 +1,278 @@
            +// Box Size
            +// -------------------------
            +@mixin box-size($background, $padding-top,$padding-bottom){
            +    background: $background;
            +    padding-top: $padding-top;
            +    padding-bottom: $padding-bottom;
            +}
            +
            +// Button
            +// -------------------------
            +@mixin button-outline($color, $background, $border, $background-hover, $color-hover, $border-hover, $border-radius) {
            +    color: $color;
            +    background-color: $background;
            +    border: $border;
            +    @include border-radius($border-radius);
            +    &:hover,
            +    &:focus,
            +    &:active,
            +    &.active {
            +        color: $color-hover;
            +        background-color: $background-hover;
            +        border: $border-hover;
            +    }
            +    .fa,.icon{
            +        font-size: $icon-font-size-base;
            +        margin: 0;
            +    }
            +}
            +
            +// Block
            +// -------------------------
            +@mixin block-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {
            +    border-color: $border;
            +    background: $heading-bg-color;
            +    & .#{$block-heading-selector} {
            +        & span:before, & span:after{ background:$white; }
            +        color: $heading-text-color;
            +        background-color: $heading-bg-color;
            +        border-color: $heading-border;
            +        + .#{$block-prefix}-collapse .#{$block-content-selector} {
            +            border-top-color: $border;
            +        }
            +    }
            +    & > .#{$block-prefix}-footer {
            +        + .#{$block-prefix}-collapse .#{$block-prefix}-body {
            +            border-bottom-color: $border;
            +        }
            +    }
            +}
            +
            +@mixin block-elements-styles($border, $heading-text-color, $heading-bg-color, $heading-border, $text-color, $text-color-primary){
            +    border-color: $border;
            +    background: $heading-bg-color;
            +    & .#{$block-heading-selector} {
            +        color: $heading-text-color;
            +        background-color: $heading-bg-color;
            +        border-color: $heading-border;
            +        + .#{$block-prefix}-collapse .#{$block-content-selector} {
            +            border-top-color: $border;
            +        }
            +    }
            +    & > .#{$block-prefix}-footer {
            +        + .#{$block-prefix}-collapse .#{$block-prefix}-body {
            +            border-bottom-color: $border;
            +        }
            +    }
            +}
            +
            +/****/
            +@mixin container-layout-variant($color, $background, $linkcolor,  $topbar-link-color-hover ){
            +    background: $background;
            +    color: $color;
            +    a{
            +        color:$linkcolor;
            +    }
            +    a:hover{
            +        color: $topbar-link-color-hover;
            +    }
            +}
            +
            +//== Inline block
            +//==========================================
            +@mixin inline-block ($haslayout : true){
            +    display: inline-block;
            +    vertical-align: middle;
            +    @if $haslayout == true {
            +        .lt-ie8 & {
            +            display: inline;
            +            zoom: 1;
            +        }
            +    }
            +}
            +
            +//== vertical block
            +//==========================================
            +@mixin vertical-center( $width: 100px, $height: 100px) {
            +    left: 0;
            +    right: 0;
            +    bottom: 0;
            +    top: 0;
            +    margin: auto;
            +    width: $width;
            +    height: $height;
            +    position: absolute;
            +}
            +
            +//== Translate X - Y - Z
            +//==========================================
            +@mixin translateX($x) {
            +    -webkit-transform: translateX($x);
            +    -ms-transform: translateX($x); // IE9 only
            +    -o-transform: translateX($x);
            +    transform: translateX($x);
            +}
            +
            +@mixin translateY($y) {
            +    -webkit-transform: translateY($y);
            +    -ms-transform: translateY($y); // IE9 only
            +    -o-transform: translateY($y);
            +    transform: translateY($y);
            +}
            +
            +@mixin translateZ($z) {
            +    -webkit-transform: translateZ($z);
            +    -ms-transform: translateZ($z); // IE9 only
            +    -o-transform: translateZ($z);
            +    transform: translateZ($z);
            +}
            +
            +//== Transform
            +//==========================================
            +@mixin transform($argument){
            +    -webkit-transform: ($argument);
            +    -moz-transform: ($argument);
            +    -ms-transform: ($argument);
            +    -o-transform: ($argument);
            +    transform: ($argument);
            +}
            +
            +//== Transform
            +//==========================================
            +@mixin transition-delay($time1,$time2){
            +    -webkit-transition-delay: ($time1,$time2);
            +    -moz-transition-delay: ($time1,$time2);
            +    -ms-transition-delay: ($time1,$time2);
            +    -o-transition-delay: ($time1,$time2);
            +    transition-delay: ($time1,$time2);
            +}
            +
            +//== Background Size
            +//==========================================
            +@mixin background-size($size1,$size2) {
            +    -webkit-background-size: ($size1,$size2);
            +    -moz-background-size: ($size1,$size2);
            +    -ms-background-size: ($size1,$size2);
            +    -o-background-size: ($size1,$size2);
            +    background-size: ($size1,$size2);
            +}
            +
            +//== Background origin
            +//==========================================
            +@mixin background-origin($value1,$value2){
            +    -webkit-background-origin: ($value1,$value2);
            +    -moz-background-origin: ($value1,$value2);
            +    -ms-background-origin: ($value1,$value2);
            +    -o-background-origin: ($value1,$value2);
            +    background-origin: ($value1,$value2);
            +}
            +
            +//== Border radius
            +//==========================================
            +@mixin border-radius($radius) {
            +    border-radius         : $radius;
            +    -webkit-border-radius : $radius;
            +    -moz-border-radius    : $radius;
            +    -ms-border-radius     : $radius;
            +    -o-border-radius      : $radius;
            +}
            +
            +//== Text Shadow
            +//==========================================
            +@mixin text-shadow($shadow) {
            +    text-shadow         : $shadow;
            +    -webkit-text-shadow : $shadow;
            +    -moz-text-shadow    : $shadow;
            +    -ms-text-shadow     : $shadow;
            +    -o-text-shadow      : $shadow;
            +}
            +
            +//== Transform Origin
            +//==========================================
            +@mixin transform-origin($originX,$originY) {
            +    -webkit-transform-origin : $originX $originY;
            +    -moz-transform-origin    : $originX $originY;
            +    -ms-transform-origin     : $originX $originY; // IE9 only
            +    transform-origin         : $originX $originY;
            +}
            +
            +//== appearance
            +//==========================================
            +@mixin appearance() {
            +    -webkit-appearance : none;
            +    -moz-appearance    : none;
            +    -o-appearance      : none;
            +    -ms-appearance     : none;
            +    appearance         : none;
            +}
            +
            +//== selection
            +//==========================================
            +$prefixes: ("-moz-", "");
            +@mixin selection($color, $background) {
            +    @each $prefix in $prefixes {
            +        ::#{$prefix}selection {
            +            color: $color;
            +            background: $background;
            +        }
            +    }
            +}
            +
            +//== animation fill mode
            +//==========================================
            +@mixin animation-fill-mode($fill) {
            +    -webkit-animation-fill-mode: $fill;
            +    -moz-animation-fill-mode: $fill;
            +    -o-animation-fill-mode: $fill;
            +    animation-fill-mode: $fill;
            +}
            +
            +//== filter
            +//==========================================
            +@mixin filter($argument){
            +    filter         : $argument;
            +    -webkit-filter : $argument;
            +    -moz-filter    : $argument;
            +    -o-filter      : $argument;
            +    -ms-filter     : $argument;
            +}
            +
            +// Clear Lists
            +// -------------------------
            +@mixin clear-list(){
            +    padding    : 0;
            +    margin     : 0;
            +    list-style : none;
            +}
            +
            +// Formart lists widget
            +// -------------------------
            +@mixin lists-style() {
            +    ul,ol{
            +        @include clear-list();
            +        li{
            +            &:first-child{
            +
            +            }
            +            &:last-child{
            +                border-bottom: 0;
            +                padding-bottom: 0;
            +            }
            +            .children{
            +                > li{
            +                    &:before{
            +                        top: 24px;
            +                    }
            +                }
            +            }
            +        }
            +        ul{
            +            li:first-child{
            +                padding-top: 14px;
            +                background-position: 0 24px;
            +            }
            +        }
            +    }
            +}
            +
            +@import "functions";
            \ No newline at end of file
            diff --git a/assets/scss/components/vars/_elements.scss b/assets/scss/components/vars/_elements.scss
            new file mode 100755
            index 00000000..c7f969a0
            --- /dev/null
            +++ b/assets/scss/components/vars/_elements.scss
            @@ -0,0 +1,244 @@
            +$opalestate-parallax-before-background : url("http://venusdemo.com/wpopal/mix/mobile/wp-content/uploads/2014/11/bg-footer-cd.jpg")!default;
            +
            +$element-color-primary        : $theme-color !default;
            +
            + /* --- SCSS For Accordion --- */
            +$opalestate-accordion-background:                        $brand-success !default; 
            +$opalestate-accordion-color:                             $brand-success !default;
            +
            +$opalestate-accordion-border-color:                      #eee !default;
            +
            + /* --- SCSS For Breadcrumb --- */
            +
            + /* --- SCSS For Buttons --- */
            +
            + /* --- SCSS For Call-to-action --- */$white : #FFFFFF !default;
            +
            + /* --- SCSS For Content-slider --- *//*  */
            +
            +$opalestate-carousel-md-width:                             44px !default;
            +$opalestate-carousel-md-height:                            44px !default;
            +
            +$opalestate-carousel-sm-width:                             34px !default;
            +$opalestate-carousel-sm-height:                            34px !default;
            +
            +$opalestate-carousel-xs-width:                             30px !default;
            +$opalestate-carousel-xs-height:                            30px !default;
            + 
            +/* carousel-controls-v1 */
            +$opalestate-carousel-controls-v1-color:                    #999 !default;
            +$opalestate-carousel-controls-v1-hover-color:              darken($opalestate-carousel-controls-v1-color, 15%) !default;
            +$opalestate-carousel-controls-v1-bg:                       rgba(0, 0, 0, 0.5) !default;
            +
            +/* carousel-controls-v2 */
            +$opalestate-carousel-controls-v2-color:                    #999 !default;
            +$opalestate-carousel-controls-v2-hover-color:              darken($opalestate-carousel-controls-v2-color, 25%) !default;
            +
            +/* carousel-controls-v3 */
            +$opalestate-carousel-controls-v3-color:                    #fff !default;
            +$opalestate-carousel-controls-v3-hover-color:              #fff !default;
            +$opalestate-carousel-controls-v3-bg:                       $element-color-primary  !default;
            +$opalestate-carousel-controls-v3-hover-bg:                 darken($opalestate-carousel-controls-v3-bg, 15%) !default;
            +
            +
            +
            +/* Navigation Styles */
            +
            +/* carousel-indicators-v1 */
            +$opalestate-carousel-indicators-v1-bg:                     #ddd !default;
            +$opalestate-carousel-indicators-v1-hover-bg:               $brand-success !default;
            +
            +/* carousel-indicators-v2 */
            +$opalestate-carousel-indicators-v2-bg:                     #ddd !default;
            +$opalestate-carousel-indicators-v2-hover-bg:               $brand-success !default;
            +
            +/* carousel-indicators-v3 */
            +$opalestate-carousel-indicators-v3-bg:                     $brand-success !default;
            +$opalestate-carousel-indicators-v3-hover-bg:               $brand-success !default;
            +
            +/* carousel-indicators-v4 */
            +$opalestate-carousel-indicators-v4-bg:                     $brand-success !default;
            +$opalestate-carousel-indicators-v4-hover-bg:               $brand-success !default;
            +
            +
            +/* carousel-indicators-v5 */
            +$opalestate-carousel-indicators-v5-bg:                     $brand-success !default;
            +$opalestate-carousel-indicators-v5-hover-bg:               $brand-success !default;
            +
            +/* carousel-indicators-v6 */
            +$opalestate-carousel-indicators-v6-bg:                     $brand-success !default;
            +$opalestate-carousel-indicators-v6-hover-bg:               $brand-success !default;
            +
            + /* --- SCSS For Counters --- */
            +$opalestate-counter-color:                   $brand-primary;
            +$opalestate-counter-font-weight:             700;
            +$opalestate-counter-font-size:               48px;
            +
            +$opalestate-counter-icon-font-size:          46px;
            +$opalestate-counter-heading-font-weight:     400;
            +
            + /* --- SCSS For Heading --- */$opalestate-heading-color:            $brand-success;
            +
            + /* --- SCSS For Icon-box --- */
            +
            + /* --- SCSS For Interactive-banner --- */
            +
            + /* --- SCSS For Latest-posts --- *//* latest posts */
            +$opalestate-latest-posts-color:                   #696969;
            +$opalestate-latest-posts-a-color:                 #000;
            +$opalestate-latest-posts-a-hover-color:           red;
            +$opalestate-latest-posts-font-size:               14px;
            +$opalestate-latest-posts-title-font-size:         18px;
            +
            +$opalestate-latest-posts-profile-font-size:       13px;
            +$opalestate-latest-posts-profile-color:           #696969;
            +
            + /* --- SCSS For List --- *//* variables for list */
            +$opalestate-list-color:                           #666 !default; 
            +$opalestate-list-a-color:                         $opalestate-list-color !default; 
            +$opalestate-list-a-color-hover:                   $brand-success  !default;
            +
            +/* variables for list light */
            +
            +$opalestate-list-light-color:                     #FFFFFF !default; 
            +$opalestate-list-light-a-color:                   $opalestate-list-light-color !default; 
            +$opalestate-list-light-a-color-hover:             $brand-success  !default;
            +
            +
            + /* --- SCSS For Message --- */
            +
            + /* --- SCSS For Newsletter --- */$newsletter-v2-bg            : lighten($gray-light, 50%) !default;
            +$newsletter-v3-bg            : $gray-dark !default;
            +
            +
            + /* --- SCSS For Piechart --- */
            +
            + /* --- SCSS For Pricing --- */
            +
            + /* --- SCSS For Process-steps --- *//* process-steps */
            +$opalestate-process-steps-color:                      #000;
            +$opalestate-process-steps-bg:                         #000;
            +
            +$opalestate-process-steps-active-color:               $brand-success;
            +$opalestate-process-steps-active-bg:                  $brand-success;
            +
            + /* --- SCSS For Service --- *//* variables for tab style1 using as base of tab */
            +
            +
            + /* --- SCSS For Style-icon --- *//* Variables icons default */
            +$opalestate-style-icon-color:                              #fff!default;
            +$opalestate-style-icon-hover-color:                        #fff!default;
            +$opalestate-style-icon-bg:                                 $brand-success!default;
            +$opalestate-style-icon-hover-bg:                           darken($opalestate-style-icon-bg, 5%)!default;
            +
            +/* Variables icons bodered */
            +$opalestate-style-icon-bodered-color:                      $brand-success!default;
            +$opalestate-style-icon-bodered-hover-color:                darken($opalestate-style-icon-bodered-color, 10%)!default;
            +
            +/* Variables icons darker */
            +$opalestate-style-icon-darker-color:                        #fff!default;
            +$opalestate-style-icon-darker-hover-color:                  #fff!default;
            +$opalestate-style-icon-darker-bg:                           #000!default;
            +$opalestate-style-icon-darker-hover-bg:                     lighten($opalestate-style-icon-darker-bg, 35%)!default;
            +
            +/* Variables icons light */
            +$opalestate-style-icon-light-color:                        #000!default;
            +$opalestate-style-icon-light-hover-color:                  #fff!default;
            +$opalestate-style-icon-light-bg:                           #f0f0f0!default;
            +$opalestate-style-icon-light-hover-bg:                     darken($opalestate-style-icon-light-bg, 10%)!default;
            +
            +/* Variables icons plain */
            +$opalestate-style-icon-plain-color:                        $brand-success!default;
            +$opalestate-style-icon-plain-hover-color:                  #000!default;
            +$opalestate-style-icon-plain-bg:                           transparent!default;
            +$opalestate-style-icon-plain-hover-bg:                     transparent!default;
            +
            +/* Variables icons for light style */
            +$opalestate-light-style-icon-color:                        $brand-success!default;
            +$opalestate-light-style-icon-hover-color:                  $brand-success!default;
            +$opalestate-light-style-icon-bg:                           transparent!default;
            +$opalestate-light-style-icon-hover-bg:                     darken(#fff, 5%)!default;
            +
            +$opalestate-light-style-icon-bodered-color:                #fff!default;
            +$opalestate-light-style-icon-bodered-hover-color:          darken(#fff, 5%)!default;
            +$opalestate-light-style-icon-bodered-bg:                   #fff!default;
            +$opalestate-light-style-icon-bodered-hover-bg:             darken(#fff, 5%)!default;
            +
            +/* Variables icons outline */
            +
            +$icons-outline-color:                              #d1d646!default;
            +$icons-outline-bg:                                 transparent!default;
            +$icons-outline-border:                             $icons-outline-color!default;
            +$icons-outline-hover-color:                        #fff!default;		
            +$icons-outline-hover-bg:                           $icons-outline-color!default;
            +$icons-outline-hover-border:                       darken($icons-outline-hover-bg, 5%)!default;
            +
            +/* Variables icons inverse */
            +
            +$icons-inverse-color:                              #fff!default;
            +$icons-inverse-bg:                                 #d1d646!default;
            +$icons-inverse-border:                             darken($icons-inverse-bg, 5%)!default;
            +$icons-inverse-hover-color:                        #d1d646!default;	
            +$icons-inverse-hover-bg:                            transparent!default;
            +$icons-inverse-hover-border:                       $icons-inverse-bg!default;
            +
            +
            + /* --- SCSS For Table --- */
            +
            + /* --- SCSS For Tabs --- */
            +/* variables for tab style1 using as base of tab */
            +$opalestate-tabs-a-color:#FFFFFF !default; 
            +$opalestate-tabs-a-color-active:#000000 !default;
            +
            +$opalestate-tabs-padding: 10px 20px !default; 
            +$opalestate-tabs-background: $brand-primary !default;
            +$opalestate-tabs-background-hover: #f6f6f6 !default;
            +$opalestate-tabs-content-background:#f6f6f6 !default;
            +
            +$opalestate-tabs-border-color : #eee !default;
            +$opalestate-tabs-content-border:  1px solid $opalestate-tabs-border-color !default;
            +$opalestate-tabs-content-padding: 15px 20px!default;
            +
            +
            +/* tab style version 5 */
            +$opalestate-tabs-primary-background-hover:#000000!default;
            +$opalestate-tabs-primary-background:#FFFFFF !default;
            +
            +/* tab style version 6 */
            +$opalestate-tabs-v6-heading-background: #FFFFFF !default; 
            +
            +$opalestate-tabs-v6-a-color : #000000 !default;
            +$opalestate-tabs-v6-a-color-active:red !default;
            +$opalestate-tabs-v6-heading-padding: 10px 20px;
            +$opalestate-tabs-v6-heading-border-top-color:#000000 !default; 
            +
            +$opalestate-tabs-v6-heading-border-color:#eee !default;  
            +$opalestate-tabs-v6-content-border-color:1px solid $opalestate-tabs-border-color !default;
            +
            + /* --- SCSS For Testimonials --- *//* testimonials default */
            +$opalestate-testimonials-color:                              #696969;
            +$opalestate-testimonials-a-color:                            #696969;
            +$opalestate-testimonials-heading-color:                      #696969;							
            +
            +
            +/* testimonials-v1 */
            +$opalestate-testimonials-v1-color:                              #696969;
            +$opalestate-testimonials-v1-a-color:                            #696969;
            +$opalestate-testimonials-v1-background:                         #f3f3f3;
            +$opalestate-testimonials-v1-light-background:                   #fff;
            +$opalestate-testimonials-v1-light-color:                        $gray-dark;
            +
            +/* testimonials light */
            +$opalestate-testimonials-light-color:                              #fff;
            +$opalestate-testimonials-light-a-color:                            #fff;
            +$opalestate-testimonials-light-heading-color:                      #fff;
            +
            +
            +
            + /* --- SCSS For Typography --- */
            +$opalestate-blockquote-icon-background  : $brand-primary !default;
            +$opalestate-blockquote-icon-color       : #FFFFFF !default;
            +$opalestate-blockquote-icon-font-size   : 17px !default;
            +$opalestate-blockquote-icon-line-height : 22px !default;
            +
            +$opalestate-blockquote-color            : #000000 !default;
            diff --git a/assets/scss/components/vars/_form.scss b/assets/scss/components/vars/_form.scss
            new file mode 100755
            index 00000000..abeeb1f4
            --- /dev/null
            +++ b/assets/scss/components/vars/_form.scss
            @@ -0,0 +1,114 @@
            +// Select
            +// -------------------------
            +$select-size                            : 32px !default;
            +$select-border-color                    : $border-color !default;
            +$select-padding                         : 4px 6px !default;
            +
            +// Input
            +// -------------------------
            +$input-padding                          : 5px 6px !default;
            +$input-font-size                        : $font-size-base - 1;
            +
            +$input-group-form-bg                    : transparent !default;
            +$input-group-form-margin                : 0 0 5px 0!default;
            +$input-group-padding                    : 6px 11px !default;
            +$input-group-font-size                  : 12px !default;
            +$input-group-addon-color                : #fff !default;
            +$input-group-height                     : 42px !default;
            +
            +$input-form-bg                          : $gray-darker !default;
            +
            +// Button
            +// -------------------------
            +$btn-transform                          : uppercase !default;
            +$btn-padding-vertical                   : 5px !default;
            +$btn-padding-horizontal                 : 20px !default;
            +$btn-font-size                          : 12px !default;
            +$btn-line-height                        : 30px !default;
            +$btn-border-radius                      : 4px !default;
            +
            +$btn-lg-padding-vertical                : 15px !default;
            +$btn-lg-padding-horizontal              : 30px !default;
            +$btn-lg-font-size                       : 18px !default;
            +$btn-lg-line-height                     : $line-height-large !default;
            +$btn-lg-border-radius                   : 5px !default;
            +
            +$btn-sm-padding-vertical                : 7px !default;
            +$btn-sm-padding-horizontal              : 12px !default;
            +$btn-sm-font-size                       : 10px !default;
            +$btn-sm-line-height                     : $line-height-small !default;
            +$btn-sm-border-radius                   : $border-radius-small !default;
            +
            +$btn-xs-padding-vertical                : 4px !default;
            +$btn-xs-padding-horizontal              : 10px !default;
            +$btn-xs-font-size                       : 10px !default;
            +$btn-xs-line-height                     : $line-height-small !default;
            +$btn-xs-border-radius                   : $border-radius-small !default;
            +
            +$btn-outline-color                      : $white !default;
            +$btn-outline-hover-color                : $white !default;
            +$btn-outline-height                     : 36px !default;
            +$btn-outline-padding 			: 3px 15px !default;
            +$btn-outline-bg                         : $theme-color !default;
            +$btn-outline-hover-bg                   :$theme-color-second !default;
            +$btn-outline-border                     : 0 !default;
            +$btn-outline-border-hover               : 0 !default;
            +$btn-outline-font-size                  : 12px !default;
            +$btn-outline-line-height                : 28px !default;
            +$btn-outline-border-radius              : 0 !default;
            +
            +$btn-outline-sm-padding-vertical        : 8px !default;
            +$btn-outline-sm-padding-horizontal      : 18px !default;
            +$btn-outline-sm-font-size               : 11px !default;
            +$btn-outline-sm-line-height             : 1.3 !default;
            +$btn-outline-sm-border-radius           : 3px !default;
            +
            +$btn-outline-xs-padding-vertical        : 5px !default;
            +$btn-outline-xs-padding-horizontal      : 15px !default;
            +$btn-outline-xs-font-size               : 11px !default;
            +$btn-outline-xs-line-height             : 1.2 !default;
            +$btn-outline-xs-border-radius           : 3px !default;
            +
            +$btn-outline-lg-padding-vertical        : 21px !default;
            +$btn-outline-lg-padding-horizontal      : 48px !default;
            +$btn-outline-lg-font-size               : 14px !default;
            +$btn-outline-lg-line-height             : 3 !default;
            +$btn-outline-lg-border-radius           : 4px !default;
            +
            +$btn-inverse-color                      : $black !default;
            +$btn-inverse-hover-color                : $white !default;
            +$btn-inverse-bg                         : $white !default;
            +$btn-inverse-hover-bg                   : $black !default;
            +$btn-inverse-border-color               : $border-color !default;
            +$btn-inverse-border-hover-color         : $border-color !default;
            +$btn-inverse-font-size                  : 12px !default;
            +$btn-inverse-padding                    : 10px 15px !default;
            +
            +$btn-outline-inverse-color              : $theme-color-second !default;
            +$btn-outline-inverse-bg                 : $black !default;
            +$btn-outline-inverse-border-color       : 1px solid $btn-outline-inverse-bg !default;
            +$btn-outline-inverse-hover-bg           : $theme-color !default;
            +$btn-outline-inverse-hover-color        : $white !default;
            +$btn-outline-inverse-border-hover-color : 1px solid $theme-color-second !default;
            +
            +// Search
            +// -------------------------
            +$search-bg                              : $white !default;
            +$search-font-size                       : 12px !default;
            +$search-padding                         : 15px !default;
            +$search-width                           : auto !default;
            +$search-button-bg                       : transparent !default;
            +$search-main-button-bg                  : $white !default;
            +$search-main-button-border              : $border-color !default;
            +$search-main-button-color               : $gray-darker !default;
            +$search-button-border                   : 0px !default;
            +$search-button-hover-bg                 : $white !default;
            +$search-button-color                    : $white !default;
            +$search-button-size                     : 36px !default;
            +$search-button-hover-color              : $gray-darker !default;
            +$search-radius                          : 3px !default;
            +$search-height                          : 50px !default;
            +$search-border                          : transparent !default;
            +$search-hover-border                    : $border-color !default;
            +$search-border-radius                   : 4px !default;
            +$search-categories-border-radius        : 4px !important;
            diff --git a/assets/scss/components/vars/_layout.scss b/assets/scss/components/vars/_layout.scss
            new file mode 100755
            index 00000000..51f8766e
            --- /dev/null
            +++ b/assets/scss/components/vars/_layout.scss
            @@ -0,0 +1,91 @@
            +
            +// Topbar
            +// -------------------------
            +$topbar-bg                                      : #1c2b49 !default;
            +$topbar-link-color                              : $light-gray !default;
            +$topbar-link-hover-color                        : $theme-color !default;
            +$topbar-color                                   : $light-gray !default;
            +$topbar-border                                  : 0 !default;
            +$topbar-font-size                               : 14px !default;
            +$topbar-icon-color                              : $theme-color !default;
            +$topbar-icon-font-size                          : 14px !default;
            +$topbar-text-transform                          : none !default;
            +$topbar-padding                            		: 0 !default;
            +
            +//// Header
            +
            +$header-main-padding : 30px 0 !default; 
            +$header-main-margin : 0 !default; 
            +$header-bg-color: #233354 !default;
            +
            +
            +$massbottom-head-bg		 : $theme-color !default;
            +$massbottom-head-padding : 6px 9px !default;
            +$massbottom-head-color   : $theme-color !default;
            +$massbottom-head-border-color: darken($massbottom-head-bg,4%)!default; 
            +
            +/**
            + *
            + */
            +
            + $mainmenu-bg: #222222 !default;
            +
            +
            +
            +
            +// Footer
            +// -------------------------  
            +$footer-bg                                      : none !default;
            +$footer-color                                   : #ccc !default;
            +$footer-transform                               : none !default;
            +$footer-font-size                               : 14px !default; 
            +$footer-border                                  : none !default;
            +$footer-padding-top                             : 60px !default;
            +$footer-padding-bottom                          : 0 !default;
            +$footer-text-hightlight                         : $white !default;
            +$footer-link-font-size							      : 14px !default;
            +$footer-column-margin                           : 0 0 25px 0 !default;
            +$footer-link-color                              : #FFF !default;
            +$footer-link-hover-color                        : $theme-color !default;
            +$footer-icon-color                              : darken($white, 20%) !default;
            +$footer-icon-font-size                          : 13px !default;
            +$footer-heading-font-size                       : 16px !default;
            +$footer-heading-color                           : $white !default;
            +$footer-heading-margin                          : 0 0 25px !default;
            +$footer-heading-padding                         : 0 0 15px !default;
            +$footer-heading-display                         : none !default;
            +$footer-heading-transform                       : uppercase !default;
            +$footer-list-transform                          : none !default;
            +$footer-list-font-size                          : 14px !default; 
            +$footer-list-margin                             : 0 0 10px !default;
            +$footer-list-light-height                       : 2.5 !default;  
            +$footer-heading-fweight                         : 400 !default;
            +$footer-heading-ffamily                         : $font-family-second !default;
            +
            +$footer-newsletter-padding                      : 25px !default;
            +$footer-newsletter-bg                           : $theme-color !default;
            +$footer-newsletter-color                        : #484848 !default;
            +$footer-newsletter-heading-font-size            : 18px !default;
            +
            +$footer-top-bg 									: $white !default;
            +$footer-top-color  								: $black !default;
            +$footer-top-padding-top							: 12px !default; 
            +$footer-top-padding-bottom						: 12px !default;
            +$footer-top-font-size							: 12px !default;
            +$footer-top-letter-spacing						: 2px !default;
            +$footer-top-border-color 						: rgba(0, 0, 0, 0.1);
            +// Copyright
            +// -------------------------
            +
            + // Copyright
            +// -------------------------
            +$copyright-bg                                   : none !default;
            +$copyright-color                                : $light-gray !default;
            +$copyright-link-color                           : $light-gray !default;
            +$copyright-padding-top                          : 30px !default;
            +$copyright-padding-bottom                       : 30px !default;
            +$copyright-font-size							: 14px !default; 
            +$copyright-font-weight							: 400 !default;
            +
            +$del-font-size									: 12px !default;
            +$del-color										: #999999;
            \ No newline at end of file
            diff --git a/assets/scss/components/vars/_nav.scss b/assets/scss/components/vars/_nav.scss
            new file mode 100755
            index 00000000..863a3a26
            --- /dev/null
            +++ b/assets/scss/components/vars/_nav.scss
            @@ -0,0 +1,95 @@
            +// Main Menu
            +// -------------------------
            +$megamenu-bg                               : $white !default;
            +$navbar-mega-border                        : transparent !default;
            +$navbar-mega-line-height                   : 75px !default;
            +
            +$navbar-mega-skin2-bg                      : transparent !default;
            +$navbar-mega-skin2-border                  : $border-color !default;
            +$navbar-mega-skin2-line-height             : 30px !default; 
            +
            +$navbar-text-transform                     : none !default;
            +
            +$navbar-font-size                          : 14px !default;
            +$navbar-font-weight                        : 400 !default;
            + 
            +$navbar-link-margin                        : 0 !default;
            +$navbar-link-padding                       : 6px 20px !default;
            +$navbar-link-color                         : $white !default;
            +$navbar-link-hover-color                   : $theme-color !default;
            +$navbar-link-hover-bg                      : $nocolor !default;
            +$navbar-link-active-color                  : $theme-color !default;
            +$navbar-link-active-bg                     : $nocolor !default;
            +$navbar-link-font-family		           : $headings-font-family !default;
            +
            +$navbar-widget-title-color                 : $black !default;
            +$navbar-widget-title-margin                : 0 0 10px 0 !default;
            +$navbar-widget-title-font-size             : 14px !default;
            +$navbar-widget-title-font-weight		   : 900 !default;
            +
            +$navbar-dropdown-padding                   : 8px 18px !default;
            +$navbar-dropdown-bg                        : #fff !default;
            +$navbar-dropdown-size                      : 200px !default;
            +$navbar-dropdown-link-color                : #000 !default;
            +$navbar-dropdown-link-hover-color          : $theme-color !default;
            +$navbar-dropdown-link-hover-bg             : $nocolor !default;
            +$navbar-dropdown-link-transform            : none !default;
            +$navbar-dropdown-link-font-size            : 14px !default;
            +$navbar-dropdown-link-font-weight          : 400 !default;
            +$navbar-dropdown-link-border-color         : $nocolor !default;
            +
            +$navbar-link-small-padding                 : 18px 0 !default;
            +$navbar-link-large-padding                 : 46px 0 46px !default;  
            +
            +// Vertical Menu
            +// -------------------------
            +
            +// Top Menu
            +// -------------------------
            +$navbar-menutop-font-weight				    : 800 !default;
            +$navbar-menutop-font-size				       : 12px !default;
            +$navbar-menutop-padding-top				    : 22px !default;
            +$navbar-menutop-padding-bottom			    : 18px !default;
            +$navbar-menutop-color					       : #828282 !default;
            +$navbar-menutop-margin					       : 0 10px !default;
            +
            +// Off-Canvas Menu
            +// -------------------------
            +$navbar-offcanvas-width                    : 69% !default;
            +$navbar-offcanvas-bg-close                 : $nocolor !default;
            +$navbar-offcanvas-color                    : $black !default;
            +$navbar-offcanvas-bg                       : #f5f5f5  !default;
            +$navbar-offcanvas-border                   : rgba(0, 0, 0, 0.1) !default;
            +
            +// Inverted navbar links
            +// -------------------------
            +$navbar-offcanvas-link-color               : $text-color !default;
            +$navbar-offcanvas-link-hover-color         : #0281AB !default;
            +$navbar-offcanvas-link-hover-bg            : transparent !default;
            +$navbar-offcanvas-link-active-color        : $navbar-offcanvas-link-hover-color !default;
            +$navbar-offcanvas-link-active-bg           : darken($navbar-offcanvas-bg, 10%) !default;
            +$navbar-offcanvas-link-disabled-color      : #444 !default;
            +$navbar-offcanvas-link-disabled-bg         : transparent !default;
            +$navbar-offcanvas-link-font-size           : 14px !default;
            +
            +// Inverted navbar brand label
            +// -------------------------
            +$navbar-offcanvas-brand-color              : $navbar-offcanvas-link-color !default;
            +$navbar-offcanvas-brand-hover-color        : $white !default;
            +$navbar-offcanvas-brand-hover-bg           : transparent !default;
            +
            +// Inverted navbar search
            +// -------------------------
            +$navbar-offcanvas-search-bg                : lighten($navbar-offcanvas-bg, 25%) !default;
            +$navbar-offcanvas-search-bg-focus          : $white !default;
            +$navbar-offcanvas-search-border            : $navbar-offcanvas-bg !default;
            +$navbar-offcanvas-search-placeholder-color : $light-gray !default;
            +$navbar-offcanvas-search-input-bg          : transparentize($black, .10) !default;
            +
            +// Inverted navbar toggle
            +// -------------------------
            +$navbar-offcanvas-toggle-hover-bg          : $gray-dark !default;
            +$navbar-offcanvas-toggle-icon-bar-bg       : $white !default;
            +$navbar-offcanvas-toggle-border-color      : $gray-dark !default;
            +
            +$navbar-offcanvas-button-position          : -172px !default;
            \ No newline at end of file
            diff --git a/assets/scss/components/vars/_widget.scss b/assets/scss/components/vars/_widget.scss
            new file mode 100755
            index 00000000..9c55db7f
            --- /dev/null
            +++ b/assets/scss/components/vars/_widget.scss
            @@ -0,0 +1,88 @@
            +/**
            + *   Blocks Layout Selectors
            + */
            +$block-prefix                    : 'widget' !default;
            +$block-selector                  : 'widget ' !default;
            +$block-heading-selector          : 'widget-title, .widgettitle' !default;
            +$block-content-selector          : 'widget-content' !default;
            +$block-heading-reversed-selector : 'widget-title-reversed' !default;
            +$container-prefix                : 'wpb-container' !default;
            +
            +
            +
            +// Box Modules
            +// -------------------------
            +$block-module-margin-bottom                     : 30px !default;
            +$block-module-padding                           : 0px !default;
            +$block-module-border-color                      : none !default;
            +
            +$block-module-heading-color						: #000000 !default;
            +$block-module-heading-border                    : 0px !default;
            +$block-module-heading-transform                 : uppercase !default;
            +$block-module-heading-line-height               : normal !default;
            +$block-module-heading-bg                        : transparent !default;
            +$block-module-heading-padding                   : 0 0 15px !default;
            +$block-module-heading-margin                    : 0 0 25px !default;
            +$block-module-heading-font-size                 : 16px !default;
            +$block-module-heading-font-weight               : 700 !default;
            +$block-module-heading-show-separator            : none !default;
            +$block-module-heading-image-position            : 0 0 !default;
            +
            +$block-module-content-bg                        : transparent !default;
            +$block-module-content-color						: #bbb !default;
            +$block-module-content-border                    : 1px solid $border-color !default;
            +$block-module-content-padding                   : 20px !default;
            +$block-module-content-margin                    : 1px !default;
            +$block-module-content-radius                    : 0px !default;
            +
            +$block-module-highlighted-bg                    : $theme-color !default;
            +$block-module-highlighted-border                : solid 2px $theme-color !default;
            +
            +$block-module-footer-heading-color              : $white !default;
            +
            +$block-product-padding                          : 0 !default;
            +$block-heading-letter-spacing                   : 0 !default;
            +
            +// Sidebar
            +// -------------------------
            +$block-sidebar-module-border                    : none !default;
            +$block-sidebar-box-padding                      : 0 !default; 
            +$block-sidebar-box-margin                       : 0 0 30px !default;
            +
            +$block-sidebar-list-padding-vertical            : 13px 0px 13px 13px !default;
            +$block-sidebar-list-border-color                : $border-color !default;
            +
            +$block-sidebar-hightlight-margin 				: 0 0 20px !default;
            +$block-sidebar-heading-margin            		: 0 !default;
            +$block-sidebar-heading-hightlight-bg            : $nocolor !default;
            +$block-sidebar-heading-hightlight-padding       : 0 !default;
            +$block-sidebar-heading-hightlight-margin    	: 0 !default;
            +$block-sidebar-heading-hightlight-color         : $black !default;
            +$block-sidebar-heading-hightlight-margin-bottom : 0px !default;
            +$block-sidebar-heading-hightlight-font-size     : 14px !default;
            +$block-sidebar-heading-hightlight-font-weight   : 900 !default;
            +$block-sidebar-hightlight-content-bg			: $nocolor !default;
            +$block-sidebar-hightlight-content-color			: #666666 !default; 
            +$block-sidebar-hightlight-content-padding		: 0 !default;
            +$block-sidebar-hightlight-border   				: 1px solid rgba(0, 0, 0, 0.1) !default;
            +$block-sidebar-hightlight-font-size 			: 12px !default;	
            +$block-sidebar-hightlight-transform 			: uppercase !default;
            +$block-sidebar-hightlight-font-weight			: 300 !default;						
            +$block-sidebar-link-hightlight-color            : $white !default;
            +$block-sidebar-link-hightlight-hover-color      : $theme-color !default;
            +$block-sidebar-list-hightlight-border-color     : #393939 !default;
            +$block-sidebar-list-hightlight-font-size        : 10px !default;
            +$block-sidebar-list-hightlight-padding          : 17px 15px !default;
            +$block-sidebar-list-hightlight-image            : url('#{$image-theme-path}dot.jpg') 0 22px no-repeat !default;
            +$block-sidebar-list-image                       : url('#{$image-theme-path}dot.jpg') 0 22px no-repeat !default;
            +
            +$block-sidebar-heading-padding                  : 0 0 30px !default;
            +$block-sidebar-heading-margin                   : 0 !default;
            +$block-sidebar-heading-font-size                : 14px !default;
            +$block-sidebar-heading-color                    : $black !default; 
            +$block-sidebar-heading-line-height              : 20px !default;
            +$block-sidebar-heading-font-weight				: 900 !default;
            +
            +$block-sidebar-widget-border                    : 1px solid lighten($border-color, 3%) !default;
            +
            +/********* LAYOUT **************/
            \ No newline at end of file
            diff --git a/assets/scss/opalestate.scss b/assets/scss/opalestate.scss
            new file mode 100755
            index 00000000..7400de4a
            --- /dev/null
            +++ b/assets/scss/opalestate.scss
            @@ -0,0 +1,41 @@
            +/*
            +Theme Name: FullHouse
            +Theme URI: http://demovenustheme.com/wordpress/opalestate/
            +Author: Opal Team
            +Author URI: https://wordpress.org/
            +Description: In 2019, our default theme lets you create a responsive magazine website with a sleek, modern design. Feature your favorite homepage content in either a grid or a slider. Use the three widget areas to customize your website, and change your content's layout with a full-width page template and a contributor page to show off your authors. Creating a magazine website with WordPress has never been easier.
            +Version: 1.0
            +License: GNU General Public License v2 or later
            +License URI: http://www.gnu.org/licenses/gpl-2.0.html
            +Tags: black, green, white, light, dark, two-columns, three-columns, left-sidebar, right-sidebar, fixed-layout, responsive-layout, custom-background, custom-header, custom-menu, editor-style, featured-images, flexible-header, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready, accessibility-ready
            +Text Domain: opalestate
            +
            +This theme, like WordPress, is licensed under the GPL.
            +Use it to make something cool, have fun, and share what you've learned with others.
            +*/
            +// Core variables and mixins
            +
            +@import "bootstrap/variables";
            +@import "bootstrap/mixins";
            +
            +@import "bootstrap/grid";
            +@import "opalestate/vars";
            +
            +
            +@import "components/variables";
            +@import "components/mixins";
            +
            +@import "opalestate/layout";
            +@import "opalestate/page";
            +@import "opalestate/shortcodes";
            +
            +// @import "opalestate/styles";
            +@import "opalestate/3rd";
            +@import "opalestate/form";
            +@import "opalestate/properties-loop";
            +@import "opalestate/agency-loop";
            +@import "opalestate/elements";
            +@import "opalestate/styles";
            +@import "opalestate/modules";
            +
            +@import "opalestate/dashboard";
            \ No newline at end of file
            diff --git a/assets/scss/opalestate/_3rd.scss b/assets/scss/opalestate/_3rd.scss
            new file mode 100755
            index 00000000..7feb7652
            --- /dev/null
            +++ b/assets/scss/opalestate/_3rd.scss
            @@ -0,0 +1,497 @@
            +//header login
            +.site-header-account{
            +  .account-label{
            +    margin-left: 5px;
            +  }
            +  .opalestate-popup{
            +    .popup-body{
            +      padding: 0;
            +      box-shadow: none;
            +      background-color: transparent;
            +    }
            +  }
            +  .btn{
            +    margin-bottom: $padding-base;
            +  }
            +  .opalestate-social-login__buttons{
            +    a{
            +      padding: 0 10px;
            +    }
            +    i{
            +      margin-right: 10px;
            +      padding-right: 10px;
            +    }
            +  }
            +}
            +
            +//Google Login
            +.mfp-with-zoom .mfp-container,
            +.mfp-with-zoom.mfp-bg {
            +  opacity: 0;
            +  -webkit-backface-visibility: hidden;
            +  /* ideally, transition speed should match zoom duration */
            +  -webkit-transition: all 0.3s ease-in-out;
            +  -moz-transition: all 0.3s ease-in-out;
            +  -o-transition: all 0.3s ease-in-out;
            +  transition: all 0.3s ease-in-out;
            +}
            +.mfp-with-zoom .white-popup{
            +  top: 20px;
            +  -webkit-transition: all 0.3s ease-in-out;
            +  -moz-transition: all 0.3s ease-in-out;
            +  -o-transition: all 0.3s ease-in-out;
            +  transition: all 0.3s ease-in-out;
            +}
            +.mfp-with-zoom.mfp-ready .white-popup{
            +  top: 0;
            +}
            +.mfp-with-zoom.mfp-ready .mfp-container {
            +    opacity: 1;
            +    
            +}
            +.mfp-with-zoom.mfp-ready.mfp-bg {
            +    opacity: 0.8;
            +}
            +
            +.mfp-with-zoom.mfp-removing .mfp-container,
            +.mfp-with-zoom.mfp-removing.mfp-bg {
            +  opacity: 0;
            +}
            +.white-popup {
            +  position: relative;
            +  background: $white;
            +  padding: $grid-gutter-width;
            +  width:auto;
            +  max-width: 500px;
            +  margin: 20px auto;
            +  .mfp-close{
            +    top: 15px;
            +  }
            +  .submit{
            +    a{
            +      display: block;
            +      margin-top: 10px;
            +    }
            +  }
            +  .opalestate-button{
            +    padding: 17px 35px 14px 35px;
            +    width: 100%;
            +  }
            +}
            +
            +
            +.opalestate-social-login__buttons{
            +  list-style: none;
            +  padding: 0;
            +  margin: 0;
            +  a{
            +    display: block;
            +    padding: 0 $padding-base;
            +    color: $white;
            +    &:hover{
            +      color: $white;
            +    }
            +  }
            +  li{
            +    &:not(:last-child){
            +      margin-bottom: $padding-base;
            +    }
            +  }
            +  i{
            +    margin-right: $padding-base;
            +    padding: 16px $padding-base 14px 0;
            +    position: relative;
            +    text-align: center;
            +    width: 35px;
            +    &::after{
            +      content: "";
            +      position: absolute;
            +      top: 0;
            +      right: 0;
            +      height: 100%;
            +      border-left: 1px solid rgba(0, 0, 0, .1);
            +      border-right: 1px solid rgba(255, 255, 255, .1);
            +    }
            +  }
            +}
            +.opalestate-social-login-facebook-btn{
            +  background-color: #3C5A99;
            +}
            +.opalestate-social-login-google-btn{
            +  background-color: #d34836;
            +}
            +// Loading map
            +.sk-folding-cube {
            +  margin: 20px auto;
            +  width: 40px;
            +  height: 40px;
            +  position: relative;
            +  -webkit-transform: rotateZ(45deg);
            +          transform: rotateZ(45deg);
            +}
            +
            +.sk-folding-cube .sk-cube {
            +  float: left;
            +  width: 50%;
            +  height: 50%;
            +  position: relative;
            +  -webkit-transform: scale(1.1);
            +      -ms-transform: scale(1.1);
            +          transform: scale(1.1); 
            +}
            +.sk-folding-cube .sk-cube:before {
            +  content: '';
            +  position: absolute;
            +  top: 0;
            +  left: 0;
            +  width: 100%;
            +  height: 100%;
            +  background-color: $theme-color;
            +  -webkit-animation: sk-foldCubeAngle 2.4s infinite linear both;
            +          animation: sk-foldCubeAngle 2.4s infinite linear both;
            +  -webkit-transform-origin: 100% 100%;
            +      -ms-transform-origin: 100% 100%;
            +          transform-origin: 100% 100%;
            +}
            +.sk-folding-cube .sk-cube2 {
            +  -webkit-transform: scale(1.1) rotateZ(90deg);
            +          transform: scale(1.1) rotateZ(90deg);
            +}
            +.sk-folding-cube .sk-cube3 {
            +  -webkit-transform: scale(1.1) rotateZ(180deg);
            +          transform: scale(1.1) rotateZ(180deg);
            +}
            +.sk-folding-cube .sk-cube4 {
            +  -webkit-transform: scale(1.1) rotateZ(270deg);
            +          transform: scale(1.1) rotateZ(270deg);
            +}
            +.sk-folding-cube .sk-cube2:before {
            +  -webkit-animation-delay: 0.3s;
            +          animation-delay: 0.3s;
            +}
            +.sk-folding-cube .sk-cube3:before {
            +  -webkit-animation-delay: 0.6s;
            +          animation-delay: 0.6s; 
            +}
            +.sk-folding-cube .sk-cube4:before {
            +  -webkit-animation-delay: 0.9s;
            +          animation-delay: 0.9s;
            +}
            +@-webkit-keyframes sk-foldCubeAngle {
            +  0%, 10% {
            +    -webkit-transform: perspective(140px) rotateX(-180deg);
            +            transform: perspective(140px) rotateX(-180deg);
            +    opacity: 0; 
            +  } 25%, 75% {
            +    -webkit-transform: perspective(140px) rotateX(0deg);
            +            transform: perspective(140px) rotateX(0deg);
            +    opacity: 1; 
            +  } 90%, 100% {
            +    -webkit-transform: perspective(140px) rotateY(180deg);
            +            transform: perspective(140px) rotateY(180deg);
            +    opacity: 0; 
            +  } 
            +}
            +
            +@keyframes sk-foldCubeAngle {
            +  0%, 10% {
            +    -webkit-transform: perspective(140px) rotateX(-180deg);
            +            transform: perspective(140px) rotateX(-180deg);
            +    opacity: 0; 
            +  } 25%, 75% {
            +    -webkit-transform: perspective(140px) rotateX(0deg);
            +            transform: perspective(140px) rotateX(0deg);
            +    opacity: 1; 
            +  } 90%, 100% {
            +    -webkit-transform: perspective(140px) rotateY(180deg);
            +            transform: perspective(140px) rotateY(180deg);
            +    opacity: 0; 
            +  }
            +}
            +
            +
            +////
            +.cmb2-element{
            +  .ui-datepicker{
            +    width: 350px !important;
            +    .ui-datepicker-month,.ui-datepicker-year{
            +      display: inline-block;
            +    }
            +  }
            +}
            +
            +.noUi-target, .noUi-target * {
            +  -webkit-touch-callout: none;
            +  -webkit-user-select: none;
            +  -ms-touch-action: none;
            +  -ms-user-select: none;
            +  -moz-user-select: none;
            +  -moz-box-sizing: border-box;
            +  box-sizing: border-box
            +}
            +.noUi-target {
            +  position: relative;
            +  direction: ltr
            +}
            +.noUi-base {
            +  width: 100%;
            +  height: 100%;
            +  position: relative;
            +  border-radius: 3px;
            +}
            +.noUi-origin {
            +  position: absolute;
            +  right: 0;
            +  top: 0;
            +  left: 0;
            +  bottom: 0;
            +}
            +.noUi-handle {
            +  position: relative;
            +  z-index: 1
            +}
            +.noUi-stacking .noUi-handle {
            +  z-index: 10
            +}
            +.noUi-state-tap .noUi-origin {
            +  -webkit-transition: left .3s, top .3s;
            +  transition: left .3s, top .3s
            +}
            +.noUi-state-drag * {
            +  cursor: inherit!important
            +}
            +.noUi-base {
            +  -webkit-transform: translate3d(0, 0, 0);
            +  transform: translate3d(0, 0, 0)
            +}
            +.noUi-horizontal {
            +  height: 6px;
            +  border-radius: 3px;
            +  .noUi-base {
            +    .noUi-origin {
            +      .noUi-handle {
            +        @include rtl-margin-left(-18px);
            +      }
            +      &:first-child {
            +        .noUi-handle {
            +          @include rtl-margin-left(0px);
            +        }
            +      }
            +    }
            +  }
            +}
            +.noUi-horizontal[data-mode="1"]{
            +  .noUi-base{
            +    background: $primary;
            +    .noUi-origin{
            +      background: #e9e9f6;
            +      &:first-child {
            +        .noUi-handle {
            +          @include rtl-margin-left(-9px);
            +        }
            +      }
            +    }
            +  }
            +}
            +.noUi-horizontal[data-mode="2"]{
            +  .noUi-base{
            +    background:#e9e9f6;
            +    .noUi-origin{
            +      background: transparent;
            +    }
            +  }
            +}
            +.noUi-horizontal .noUi-handle {
            +  height:18px;
            +  width:18px;
            +  left: 0px;
            +  top: -6px;
            +  &.noUi-handle-upper {
            +    @include rtl-margin-left(-18px);
            +  }
            +}
            +.noUi-vertical {
            +  width: 18px
            +}
            +.noUi-vertical .noUi-handle {
            +  width: 28px;
            +  height: 34px;
            +  left: -6px;
            +  top: -17px
            +}
            +.noUi-background {
            +  background: #dadada;
            +  border-radius: 3px;
            +}
            +.noUi-connect {
            +  background: $primary;
            +  border-radius: 3px;
            +  height: 100%;
            +  position: absolute;
            +}
            +.noUi-origin {
            +}
            +.noUi-target {
            +}
            +.noUi-target.noUi-connect {
            +}
            +.noUi-dragable {
            +  cursor: w-resize
            +}
            +.noUi-vertical .noUi-dragable {
            +  cursor: n-resize
            +}
            +.noUi-handle {
            +  border-radius: 50%;
            +  background: #FFF;
            +  cursor: default;
            +  border: 1px solid transparentize($black, .9);
            +}
            +.noUi-active {
            +  box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #DDD, 0 3px 6px -3px #BBB
            +}
            +.noUi-handle:after, .noUi-handle:before {
            +}
            +.noUi-handle:after {
            +}
            +.noUi-vertical .noUi-handle:after, .noUi-vertical .noUi-handle:before {
            +}
            +.noUi-vertical .noUi-handle:after {
            +}
            +[disabled] .noUi-connect, [disabled].noUi-connect {
            +  background: #B8B8B8
            +}
            +[disabled] .noUi-handle {
            +  cursor: not-allowed
            +}
            +
            +
            +//Tooltip
            +.opalestate-rating-detail-container { display: none; }
            +.opalestate-tooltip{
            +  display: inline-block;
            +  line-height: 1;
            +}
            +.opalestate-rating-detail{
            +  padding: 0;
            +  margin: 0;
            +  list-style: none;
            +  text-align: center;
            +  line-height: 2;
            +  li{
            +    padding: 5px 0;
            +    label{
            +      margin-bottom: 0;
            +    }
            +  }
            +  li:not(:last-child){
            +    border-bottom: 1px solid $border-color;
            +    
            +  }
            +}
            +body {
            +  .tooltipster-sidetip .tooltipster-box {
            +    border: none; 
            +    border-radius: 5px;
            +    background: white;
            +    box-shadow: $box-shadow-base;
            +  }
            +  
            +  .tooltipster-sidetip.tooltipster-bottom .tooltipster-box {
            +    margin-top: 6px;
            +  }
            +  
            +  .tooltipster-sidetip.tooltipster-left .tooltipster-box {
            +    margin-right: 6px;
            +  }
            +  
            +  .tooltipster-sidetip.tooltipster-right .tooltipster-box {
            +    margin-left: 6px;
            +  }
            +  
            +  .tooltipster-sidetip.tooltipster-top .tooltipster-box {
            +    margin-bottom: 6px;
            +  }
            +  
            +  .tooltipster-sidetip .tooltipster-content {
            +    color: $body-color;
            +    background-color: $white;
            +  }
            +  
            +  .tooltipster-sidetip .tooltipster-arrow {
            +    height: 6px;
            +    margin-left: -6px;
            +    width: 12px;
            +  }
            +  
            +  .tooltipster-sidetip.tooltipster-left .tooltipster-arrow,
            +  .tooltipster-sidetip.tooltipster-right .tooltipster-arrow {
            +    height: 12px;
            +    margin-left: 0;
            +    margin-top: -6px;
            +    width: 6px;
            +  }
            +  
            +  .tooltipster-sidetip .tooltipster-arrow-background {
            +    display: none;
            +  }
            +  
            +  .tooltipster-sidetip .tooltipster-arrow-border {
            +    border: 6px solid transparent;
            +  }
            +  
            +  .tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-border {
            +    border-bottom-color: white;
            +  }
            +  
            +  .tooltipster-sidetip.tooltipster-left .tooltipster-arrow-border {
            +    border-left-color: white;
            +  }
            +  
            +  .tooltipster-sidetip.tooltipster-right .tooltipster-arrow-border {
            +    border-right-color: white;
            +  }
            +  
            +  .tooltipster-sidetip.tooltipster-top .tooltipster-arrow-border {
            +    border-top-color: white;
            +  }
            +  
            +  .tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-uncropped {
            +    top: -6px;
            +  }
            +  
            +  .tooltipster-sidetip.tooltipster-right .tooltipster-arrow-uncropped {
            +    left: -6px;
            +  }
            +}
            +
            +/***/
            +
            +/**
            + * jQuery toast plugin created by Kamran Ahmed copyright MIT license 2014
            + */
            +.jq-toast-wrap { display: block; position: fixed; width: 350px;  pointer-events: none !important; margin: 0; padding: 0; letter-spacing: normal; z-index: 9000 !important; }
            +.jq-toast-wrap * { margin: 0; padding: 0; }
            +
            +.jq-toast-wrap.bottom-left { bottom: 20px; left: 20px; }
            +.jq-toast-wrap.bottom-right { bottom: 20px; right: 40px; }
            +.jq-toast-wrap.top-left { top: 20px; left: 20px; }
            +.jq-toast-wrap.top-right { top: 20px; right: 40px; }
            +
            +.jq-toast-single { display: block; width: 100%; padding: 10px; margin: 0px 0px 5px; border-radius: 4px; font-size: 12px;line-height: 17px; position: relative;  pointer-events: all !important; background-color: #444444; color: white; }
            +
            +.jq-toast-single h2 {font-size: 14px; margin: 0px 0px 7px; background: none; color: inherit; line-height: inherit; letter-spacing: normal; }
            +.jq-toast-single a { color: #eee; text-decoration: none; font-weight: bold; border-bottom: 1px solid white; padding-bottom: 3px; font-size: 12px; }
            +
            +.jq-toast-single ul { margin: 0px 0px 0px 15px; background: none; padding:0px; }
            +.jq-toast-single ul li { list-style-type: disc !important; line-height: 17px; background: none; margin: 0; padding: 0; letter-spacing: normal; }
            +
            +.close-jq-toast-single { position: absolute; top: 3px; right: 7px; font-size: 14px; cursor: pointer; }
            +
            +.jq-toast-loader { display: block; position: absolute; top: -2px; height: 5px; width: 0%; left: 0; border-radius: 5px; background: red; }
            +.jq-toast-loaded { width: 100%; }
            +.jq-has-icon { padding: 10px 10px 10px 50px; background-repeat: no-repeat; background-position: 10px; }
            +.jq-icon-info { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII='); background-color: #31708f; color: #d9edf7; border-color: #bce8f1; }
            +.jq-icon-warning { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII='); background-color: #8a6d3b; color: #fcf8e3; border-color: #faebcc; }
            +.jq-icon-error { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII='); background-color: #a94442; color: #f2dede; border-color: #ebccd1; }
            +.jq-icon-success { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg=='); color: #dff0d8; background-color: #3c763d; border-color: #d6e9c6; }
            \ No newline at end of file
            diff --git a/assets/scss/opalestate/_agency-loop.scss b/assets/scss/opalestate/_agency-loop.scss
            new file mode 100755
            index 00000000..f3fe4ba2
            --- /dev/null
            +++ b/assets/scss/opalestate/_agency-loop.scss
            @@ -0,0 +1,150 @@
            +.opalestate_agency{
            +    margin-bottom: $grid-gutter-width;
            +}
            +.trusted-label{
            +    font-size: 23px;
            +    color: $primary;
            +    text-align: center;
            +    line-height: 1;
            +}
            +.team-header {
            +    .trusted-label{
            +        position: absolute;
            +        right: 20px;
            +        background-color: $white;
            +        border-radius: 50%;
            +        bottom: 0;
            +        transform: translateY(50%);
            +        border: 1px solid $border-color;
            +        width: 48px;
            +        line-height: 48px;
            +    }
            +}
            +
            +.agency-box-title{
            +    display: inline-block;
            +    margin-right: 10px;
            +    line-height: 1;
            +}
            +.agency-address{
            +    margin-bottom: 0;
            +}
            +.agency-box-meta{
            +    [class*="agency-box-"]{
            +        &:not(:last-of-type){
            +        }
            +        i{
            +            width: $font-size-base;
            +            margin-right: 12px;
            +            display: inline-block;
            +        }
            +    }
            +    a{
            +        color: inherit;
            +        &:hover{
            +            color: $link-hover-color;
            +        }
            +    }
            +    
            +}
            +//Grid Layout
            +.agency-grid-style{
            +    
            +    .agency-body-content{
            +        background-color: #f8f8f8;
            +    }
            +    .agency-logo{
            +        width: 80px;
            +        height: 80px;
            +        border-radius: 5px;
            +        overflow: hidden;
            +        margin-right: $grid-gutter-width;
            +    }
            +    .agency-info{
            +        padding: $grid-gutter-width;
            +        display: flex;
            +        flex-wrap: wrap;
            +        border-bottom: 1px solid $border-color;
            +    }
            +    .agency-content{
            +        flex: 1;
            +    }
            +    .agency-box-meta{
            +        padding: $grid-gutter-width;
            +        [class*="agency-box-"]{
            +            line-height: 1;
            +            &:not(:last-of-type){
            +                margin-bottom: 13px;
            +            }
            +        }
            +    }
            +    .agency-box-title{
            +        margin-bottom: 9px;
            +        margin-right: 0;
            +        display: block;
            +    }
            +    .agency-address{
            +        font-size: 13px;
            +    }
            +}
            +
            +//List Layout
            +.agency-list-style{
            +    .agency-inner{
            +        display: flex;
            +        flex-wrap: wrap;
            +        padding: $grid-gutter-width 0;
            +        border: 1px solid $border-color;
            +    }
            +    .agent-box-image{
            +        height: 100%;
            +        img{
            +            height: 100%;
            +        }
            +    }
            +    .agency-header{
            +        
            +        margin: 0 $grid-gutter-width;
            +    }
            +    .agency-body-content{
            +        flex: 1;
            +        padding: $grid-gutter-width 0 0;
            +    }
            +    .agency-logo{
            +        width: 48px;
            +        height: 48px;
            +        border-radius: 50%;
            +        border: 1px solid $border-color;
            +        overflow: hidden;
            +        position: absolute;
            +        bottom: 0;
            +        right: $grid-gutter-width;
            +        transform: translateY(50%);
            +    }
            +    .agency-info{
            +        position: relative;
            +        padding: 0 $grid-gutter-width 18px;
            +        border-bottom: 1px solid $border-color;
            +        margin-bottom: 17px;
            +
            +    }
            +    .agency-box-meta{
            +        @media screen and (max-width:767px){
            +            padding: 0 30px;
            +        }
            +    }
            +    .agency-box-title{
            +        margin-bottom: 0px;
            +    }
            +    @media screen and (min-width:768px) {
            +        .agency-body-content{
            +            padding: 0 0 0 10px;
            +        }
            +        .agency-header{
            +            max-width: 240px;
            +        }
            +        .agency-info{
            +            padding: 0 0 18px;
            +        }
            +    }
            +}
            \ No newline at end of file
            diff --git a/assets/scss/opalestate/_archive.scss b/assets/scss/opalestate/_archive.scss
            new file mode 100755
            index 00000000..7c82b822
            --- /dev/null
            +++ b/assets/scss/opalestate/_archive.scss
            @@ -0,0 +1,88 @@
            +//
            +.archive{
            +	.opalestate-head{
            +		margin-bottom: 80px;
            +	}
            +}
            +.opalestate-head {
            +	position: relative;
            +	background-color:$secondary;	
            +	display: flex;
            +	align-items: center;
            +	min-height: 640px;
            +	.opalestate-heading {
            +		color:$white;
            +		text-align:center;
            +		p{
            +			margin-bottom: 50px;
            +		}
            +		a{
            +			color: $white;
            +			&:hover{
            +				color: $link-hover-color;
            +			}
            +		}
            +	}
            +	.opalestate-head-title{ 
            +		color: $white;
            +		margin-bottom: 19px;
            +	}
            +	.search-agent-title{
            +		display: none;
            +	}
            +
            +	.opalestate-head-form{
            +		padding: 0 $grid-gutter-width;
            +		margin-bottom: 21px;
            +	}
            +}
            +.opalestate-single-agent{
            +	min-height: 500px;
            +	align-items: flex-end;
            +	.opalestate-heading{
            +		text-align: left;
            +		& > span{
            +			margin-bottom: 13px;
            +			display: inline-block;
            +		}
            +	}
            +	
            +	.opalestate-head-title{
            +		margin-bottom: 29px;
            +	}
            +}
            +.opalesate-archive-top{
            +	margin-bottom: $grid-gutter-width*2;
            +    padding: 12px 0;
            +    border-style: solid;
            +	border-width: 1px 0 1px;
            +	border-color: $border-color;
            +	position: relative;
            +	.opalestate-results{
            +		line-height: 45px;
            +	}
            +	.opalestate-sortable{
            +		display: inline-block;
            +		.form-control,.select2-selection--single{
            +			padding-top: 8px;
            +		}
            +	}
            +}
            +.opalesate-archive-bottom {
            +	position: relative;
            +}
            +
            +.display-mode{
            +	display: inline-block;
            +	.btn:not(:disabled):not(.disabled){
            +        padding: 0;
            +        background-color: transparent;
            +        color: $body-color;
            +		margin-left: 10px;
            +		font-size: 18px;
            +        &.active,&:hover{
            +            background-color: transparent;
            +            color: $secondary;
            +        }
            +    }
            +}
            diff --git a/assets/scss/opalestate/_dashboard.scss b/assets/scss/opalestate/_dashboard.scss
            new file mode 100755
            index 00000000..6d665b75
            --- /dev/null
            +++ b/assets/scss/opalestate/_dashboard.scss
            @@ -0,0 +1,253 @@
            +.opalestate-admin-box{
            +	margin-bottom:$padding-base*2;
            +	h3 {
            +		border-bottom:1px $border-color solid;
            +		padding-bottom:15px;
            +		padding-top:30px;
            +		font-size:150%;
            +	}
            +}
            +
            +/** CMD BOX 2 */
            +.select2-search-member {
            +	display:flex;
            +	.member-meta {
            +		margin-left:12px;
            +		font-weight:500
            +	}
            +}
            +.cmb2-wrap .field-row-2 .cmb-row  {
            +	display: inline-block;
            +	width: 50%;
            +}
            +
            +.cmb2-wrap .field-row-2 .cmb-row:nth-child(even) > div {
            +	@media screen and (min-width:768px){
            +		padding-left: 12px;
            +	}
            +}
            +.cmb2-wrap  .cmb-td {
            +	padding: 4px 0;
            +}
            +
            +
            +.bg-info {
            +	background-color:#0288d1 !important;
            +}
            +.bg-warning {
            +	background-color:#ffca28!important;
            +}
            +.alert.alert-success{
            +	background: #0F93FA;
            +}
            +
            +.alert.alert-danger{
            +	background: #f55753;
            +}
            +.alert.alert-warning{
            +	background: #ffca28;
            +}
            +/**
            + *
            + * Dashboard Page
            + */
            +
            +@media( max-width: $screen-xs-max ) {
            +
            +	.user-dasboard-sidebar {
            +		display:none;
            +	}
            +	body.active {
            +		.user-dasboard-sidebar{
            +			display:block;
            +		}
            +		margin-left:251px!important;
            +	}
            +	.page-template-user-management {
            +		margin-left:0!important;
            +	}
            +
            +	#show-user-sidebar-btn {
            +		display:block!important;
            +	}
            +}
            +
            +.navbar-left {
            +	display:flex;
            +}
            +.opalestate-user-greeting {
            +	.popup-head  {
            +		float:right;
            +	}
            +	.popup-head a { 
            +		color:$white; 
            +		text-align:right;
            +		img {
            +			width:40px;
            +			border-radius:50%;
            +		}
            +		position:relative;
            +		i { 
            +			padding:12px; 
            +			border-radius:50%;
            +			background:rgba(0, 0, 0, .06 );
            +		}
            +	}
            +
            +	ul {
            +		padding:0;
            +		margin :0 ;
            +		list-style:none;
            +	}
            +	
            +}
            +
            + .dashboard-navbar {
            +
            + 	background-color: $white;
            + 	padding:9px $grid-gutter-width;
            + 	
            +	border-bottom:1px solid $border-color;
            +	ul{
            +		margin-bottom: 0;
            +	}
            + }
            +
            +.card-item {
            +	background-color:$white;
            +	border:solid 1px $border-color;
            +	padding:$padding-base;
            +	i {
            +		background:rgba(0, 0, 0, .18);
            +		padding:15px;
            +		border-radius:50%;
            +	}
            +	h5 {
            +		font-size:200%;
            +		text-align:center;
            +	}
            +	span {
            +		font-weight:700
            +	}
            +}
            +
            +.page-template-user-management {
            +	.opalestate-box{
            +		@media screen and (min-width:768px){
            +			margin-right: $padding-base;
            +		}
            +	}
            +	&.logged-in { margin-left:251px; }
            +	#content {
            +		padding-left:$padding-base*2;
            +		padding-right:$padding-base*2;
            +	}
            +
            +	#show-user-sidebar-btn {
            +	 	display:none;
            +		margin-right:$padding-base;
            +	}
            +	.opalestate-panel-myaccount {
            +		padding-top: $padding-base*3;
            +		padding-bottom: $padding-base*3;
            +	}
            +}
            +.admin-bar{
            +	.opalestate-user-management{
            +		.user-dasboard-sidebar{
            +			padding-top: 32px;
            +		}
            +	}
            +}
            +.opalmembership-dashboard{
            +	.btn-link{
            +		background-color: $secondary;
            +		color: $white;
            +		&:hover{
            +			background-color: $primary;
            +		}
            +	}
            +}
            +.opalestate-user-management {
            +	min-height: 600px;
            +	.property-submission-form{
            +		.opalestate-box{
            +			margin-right: 0;
            +		}
            +	}
            +	.user-dasboard-sidebar {
            +		background-color:$headings-color;
            +		min-height:900px;
            +		position:fixed;
            +		left:0;
            +		width:250px;
            +		height:100%;
            +		z-index:100;
            +		top:0px;
            +	 	.user-dasboard-sidebar-inner{
            +	 		padding-top:20px;
            +	 	}
            +	}
            +	.navbar-brand {
            +		padding:32px $padding-base;
            +	}
            +	
            +
            +	.account-links {
            +		list-style:none;
            +		padding:0;
            +		margin : 0; 
            +		a {
            +			padding:8px 20px;
            +			width:100%;
            +			display:block;
            +			font-weight:500	;
            +			i {
            +				margin-right:6px;
            +				color:$body-color;
            +			}
            +			color:$body-color;
            +			&:hover {
            +				background-color:$primary;
            +
            +			}
            +		}
            +	}
            +
            +	.site-main {
            +		padding-top:$padding-base;
            +		$padding-bottom:$padding-base;
            +	}
            +}
            +
            +//my reviews
            +.opalestate-my-reviews{
            +	.commentlist{
            +		margin: 0;
            +	}
            +	.meta{
            +		margin-bottom: 10px;
            +	}
            +	.opalestate-review__ratings{
            +		margin-bottom: 0;
            +	}
            +}
            +.opalestate-my-reviews-item_property-name{
            +	margin-bottom: 5px;
            +}
            +.opalestate-my-reviews-item_property-view{
            +	font-size: 12px;
            +	font-style: italic;
            +}
            +
            +//my property
            +.my-property-list{
            +	.entry-content{
            +		width: 100%;
            +	}
            +}
            +
            +
            +.dashboard {
            +	
            +}
            \ No newline at end of file
            diff --git a/assets/scss/opalestate/_elements.scss b/assets/scss/opalestate/_elements.scss
            new file mode 100755
            index 00000000..3eed54dc
            --- /dev/null
            +++ b/assets/scss/opalestate/_elements.scss
            @@ -0,0 +1,975 @@
            +.floating-keep-top {
            +	position: fixed;
            +    top: 0;
            +    width:100%;
            +    background:#FFF;
            +	z-index:999;
            +	transition: all 1s ease-in-out;
            +}
            +.admin-bar{
            +	.floating-keep-top{
            +		top: 32px;
            +	}
            +}
            +.hide {
            +    display: none !important;
            +}
            +.highlight-text{
            +	font-weight: $headings-font-weight;
            +}
            +//Property status
            +ul.property-status{
            +	padding: 0;
            +	margin: 0;
            +	display: inline-block;
            +	li{
            +		list-style: none;
            +		display: inline-block;
            +		&:not(:last-child){
            +			margin-right: 5px;
            +		}
            +	}
            +}
            +//single stick bars
            +.keep-top-bars{
            +	top: -70px;
            +	transition: all 1s ease-in-out;
            +	border-bottom: 1px solid $border-color;
            +	ul{
            +		margin: 0;
            +		align-items: center;
            +		&:not(.opalestate-scroll-elements){
            +			padding: 10px 0;
            +		}
            +		li{
            +			&:not(:last-child){
            +				margin-right: 50px;
            +			}
            +		}
            +	}
            +	&.floating-keep-top{
            +		border-bottom: none;
            +		box-shadow: $box-shadow-base;
            +	}
            +		
            +	.single-property-buttons{
            +		flex: 1;
            +		text-align: right;
            +		a{
            +			position: relative;
            +			margin-left: 20px;
            +			text-transform: capitalize;
            +			i{
            +				margin-right: 18px;
            +				padding-right: 20px;
            +			}
            +			&::before{
            +				content: "";
            +				width: 52px;
            +				position: absolute;
            +				top: 0;
            +				left: 0;
            +				height: 100%;
            +				background-color: transparent;
            +				box-shadow: $box-shadow-base;
            +			}
            +		}
            +	}
            +}
            +.opalestate-scroll-elements{
            +	a:not(.btn-primary){
            +		display: block;
            +		padding: 21px 0 17px;
            +		border-bottom: 3px solid transparent;
            +		color: inherit;
            +		transition: all .5s ease-in-out;
            +		&:focus, &:hover{
            +			border-color: $primary;
            +			color: inherit;
            +		}
            +	}
            +}
            +
            +
            +//Rating star
            +.opalestate-rating__stars{
            +	position: relative;
            +    overflow: hidden;
            +    height: $font-size-base;
            +    font-size: $font-size-base;
            +	width: calc(#{$font-size-base}*5 - 5px);
            +	line-height: 1;
            +	
            +	&::before{
            +		font-family:'FontAwesome';
            +		font-size: inherit;
            +		text-rendering: auto;
            +		content: "\f005\f005\f005\f005\f005";
            +		opacity: 0.5;
            +		position: absolute;
            +		top: 0;
            +		left: 0;
            +	}
            +	span{
            +		position: relative;
            +		overflow: hidden;
            +		display: block;
            +		height: 100%;
            +		color: transparent;
            +		padding-top: 20px;
            +		&::before{
            +			font-family:'FontAwesome';
            +			font-size: inherit;
            +			text-rendering: auto;
            +			content: "\f005\f005\f005\f005\f005";
            +			color: #f6be15;
            +			position: absolute;
            +			top: 0;
            +			left: 0;
            +			width: calc(#{$font-size-base}*5);
            +		}
            +	}
            +}
            +p.stars {
            +	a {
            +		position: relative;
            +		height: 1em;
            +		width: 1em;
            +		text-indent: -999em;
            +		display: inline-block;
            +		text-decoration: none;
            +
            +		&::before {
            +			display: block;
            +			position: absolute;
            +			top: 0;
            +			left: 0;
            +			width: 1em;
            +			height: 1em;
            +			line-height: 1;
            +			font-family: "FontAwesome";
            +			content: "\f006";
            +			text-indent: 0;
            +		}
            +
            +		&:hover {
            +			~ a::before {
            +				
            +				content: "\f006";
            +			}
            +		}
            +	}
            +
            +	&:hover {
            +		a {
            +			&::before {
            +				
            +				content: '\f005';
            +			}
            +		}
            +	}
            +
            +	&.selected {
            +		a.active {
            +			&::before {
            +				
            +				content: '\f005';
            +			}
            +
            +			~ a::before {
            +				
            +				content: '\f006';
            +			}
            +		}
            +
            +		a:not( .active ) {
            +			&::before {
            +				
            +				content: '\f005';
            +			}
            +		}
            +	}
            +}
            +
            +//mortgage
            +.opalestate-mortgage-chart-svg{
            +	display: inline-block;
            +	overflow: hidden;
            +	margin-bottom: 0;
            +	&::after{
            +		content:"";
            +		position: absolute;
            +		width: 60px;
            +		height: 60px;
            +		transform: translate(-50%, -50%);
            +		border-radius: 50%;
            +		top: 50%;
            +		left: 50%;
            +		background-color: #fff;
            +	}
            +}
            +.opalestate-loan-amount{
            +	display: none;
            +}
            +
            +
            +// Form group
            +.opal-form-group{
            +	margin-top: 16px;
            +		label{
            +			margin-bottom: 0;
            +			cursor: pointer;
            +			display: block;
            +			padding-left: 25px;
            +		}
            +}
            +
            +/** 
            +* SOCIAL ICONS 
            +**/
            +.opalestate-social-icons{
            +	margin:15px -30px 0 -30px;
            +	border-top: 1px solid $border-color;
            +	padding: 0 $theme-padding;
            +	[class^="opalestate-social-"]{
            +		font-size: 13px;           
            +		color: $body-color;               
            +		display:inline-block;                
            +		margin: 10px 5px 0 0;
            +		overflow: hidden;
            +		text-decoration: none; 
            +		text-align: center;       
            +		vertical-align: top;
            +		line-height: 32px;                        
            +		@include square(34px);
            +		background: $border-color;
            +		transition: all 0.2s ease-out 0s;
            +		border-radius: 50%;
            +		&:last-of-type{
            +			margin-right: 0;
            +		}
            +		&:hover{
            +			border-color: $link-hover-color;
            +			color: $link-hover-color;
            +		}
            +	} 
            +	.opalestate-social-white{
            +		background: #FFFFFF;
            +		color: $body-color;
            +		border: 1px solid $border-color;
            +	}   
            +	.opalestate-social-outline{
            +		background: transparent;
            +		color: #000;
            +		border: 1px solid #000;
            +	}   
            +	.opalestate-social-outline-light{
            +		background: transparent;
            +		color: #FFF;
            +		border: 1px solid #FFFFFF;
            +		&:hover{
            +			background: #FFF;
            +			color: #000;
            +			border-color: #000;
            +		}
            +	}
            +	&:first-child{
            +		[class*="opalestate-social-"]{
            +			margin-top: 0;
            +		}
            +	}
            +	&:last-child{
            +		[class*="opalestate-social-"]{
            +			margin-bottom: 0;
            +		}
            +	}
            +	&.opalestate-sicolor{
            +		[class*="opalestate-social-"]{
            +			color: #FFFFFF;
            +		}
            +	}
            +}
            +/**
            + * Tabs
            + */
            + .opalestate-tab-head{
            +	background-color:$primary;
            + }
            + 	.tab-item {
            +		 color: $white;
            +		 border-bottom: 3px solid transparent;
            +		 transition: all .5s ease-in-out;
            + 		&.active,&:hover {
            +		border-color: $secondary;
            +		color: $white;
            + 		}
            +		padding: 14px 18px 15px;
            +		font-weight: $headings-font-weight;
            + 	}
            + 	.opalestate-tab-content {
            + 		display: none;
            + 		&.active {
            + 			display: block;
            + 		}
            + 		clear:both;
            + 	}
            +
            +
            +.opalmembership-login-form-wrapper{
            +	text-align: center;
            +}
            +
            +.list-tabs {
            +	margin-bottom: $padding-base;
            +	background-color: $white;
            +	padding: 0;
            +	ul {
            +		padding: 0;
            +		margin: 0;
            +		li {
            +			text-transform: uppercase;
            +			display: inline-block;
            +			position: relative;
            +			 
            +			a {
            +				display: block;
            +				padding: 5px 20px;
            +			}
            +			&.active,
            +			&:hover {
            +				
            +				a {
            +					color: $white;
            +					background-color: $primary;
            +				}
            +			}
            +		}
            +	}
            +} 
            +/**
            + * end Tabs
            + */
            +//Status Label
            +.property-group-label, 
            +.agency-label {
            +	position: absolute;
            +	z-index: 1;
            +	top: $padding-base;
            +	left: 20px;
            +	line-height: 1;
            +}
            +
            +.property-group-status {
            +	position: absolute;
            +	z-index: 1;
            +	top: $padding-base;
            +	right: 20px;
            +	line-height: 1;
            +}
            +
            +.property-group-status + .property-meta-bottom {
            +	top: 45px;
            +    right: 20px;
            +    z-index: 9;
            +} 
            +
            +.agency-header{
            +	position: relative;
            +}
            +
            +// label 
            +.label {
            +	display: inline-block;
            +	padding: 3px 10px;
            +	line-height: 14px;
            +	font-size: 10px;
            +	font-weight: 500;
            +	margin-bottom: 0;
            +	text-transform: uppercase;
            +	text-align: center;
            +	white-space: nowrap;
            +	vertical-align: baseline;
            +	color: $white;
            +}	
            +
            +.property-label, 
            +.property-status-item  {
            +	margin:0;
            +	padding:0;
            +	list-style: none;
            +	line-height: 14px;
            +	&.property-status-for-rent,
            +	&.property-status-for-sale {
            +		background-color:$primary;
            +	}
            +	.property-label-item:not(last-child){
            +		margin-right:5px;
            +	}
            +}
            +
            +.property-label-rented {
            +   background-color: #2048f6;
            +   color: $white;
            +}
            +
            +.property-label-sold {
            +    background-color: #fee882;
            +    color: $white;
            +}
            +
            +.label-featured {
            +	background-color:$secondary;
            +	color:$white;
            +	margin-bottom: 5px;
            +}
            +
            +.single {
            +	.label-featured {
            +		margin-bottom: 0;
            +		margin-right: 5px;
            +    }
            +}
            +
            +.label-danger {
            +	background-color:$primary;
            +	color:$white;
            +}
            +
            +//// 
            +.property-meta-list {
            +	> li {
            +		vertical-align: middle;
            +	}
            +	.icon-box {
            +		display: inline-block;
            +	}
            +	.info-meta{
            +		display: inline-block;
            +	}
            +}
            +
            +/// map infor view 
            +.map-info-preview{
            +	position: relative;
            +	padding: $grid-gutter-width;
            +	background-color:#FFFFFF;
            +	margin-bottom: 15px;
            +	max-width: 300px;
            +	box-shadow: $box-shadow-base;
            +	&:before {
            +		@include triangle( bottom,0px, $white, 20px );
            +		transform: translateX(-50%);
            +		left: 50%;
            +		bottom: -14px;
            +		margin-left: -34px;
            +	}
            +	a img{
            +		max-width: 240px;
            +		width: 240px;
            +	}
            +	.media-top{
            +		position: relative;
            +	}
            +	.property-status{
            +		top: 10px;
            +		left: 10px;
            +		position: absolute;
            +		line-height: 1;
            +	}
            +	.label-property{
            +		visibility: hidden;
            +	}
            +	.info-container{
            +		.prop-title {
            +			text-transform: uppercase; 
            +			margin: 15px 0 8px;
            +		}
            +		p {
            +			line-height: 22px;
            +		}
            +		.prop-address {
            +			 
            +		}
            +	}
            +	.property-meta-list.list-inline {
            +		border-top: 1px solid $border-color;
            +		padding: 0;
            +		display: flex;
            +		flex-wrap: wrap;
            +		> li {
            +			flex-basis: 50%;
            +			padding: 0;
            +			margin: $padding-base 0 0;
            +			i{
            +				width: 20px;
            +
            +			}
            +		}
            +	}
            +	.arrow-down{
            +		border-style: solid;
            +		border-width: 10px 10px 0;
            +		bottom: -13px;
            +		height: 0;
            +		left: 112px;
            +		position: absolute;
            +		width: 0;
            +		border-color:$primary;
            +		display: none;
            +	}
            +}
            +
            +.opalestate-map-preview-wrap {
            +	.gm-style img {
            +		max-width: inherit !important;
            +	}
            +}
            +
            +.infoBox {
            +	> img {
            +		position: absolute!important;
            +		z-index: 99;
            +		right: -5px;
            +		top: -10px;
            +	}
            +}
            +
            +.opalestate-popup{
            +	position: relative;
            +	.popup-head {
            +		position:relative;
            +		> span {
            +			cursor: pointer;
            +		}
            +		.notify {
            +			background-color:#00bcd4;
            +			padding:1px 6px;
            +			border-radius:50%;
            +			position:absolute;
            +			top:-10px;
            +			right:0px;
            +			font-size:8px;
            +			color:$white;
            +			&.active {
            +				top:auto;
            +				bottom:-10px;
            +				padding:5px;
            +				background-color:$primary
            +			}
            +		}
            +	}
            +
            +	.popup-body{
            +		display: none;
            +		position:absolute;
            +		z-index: 999;
            +		min-width: 450px;
            +		top: 30px;
            +		margin:0 0 0 -194px;
            +		padding: $grid-gutter-width;
            +		background-color: $white;
            +		box-shadow: $box-shadow-base;
            +		h6 {
            +			margin-bottom: 15px;
            +		}
            +		label {
            +			text-transform: uppercase;
            +		}
            +		button {
            +			margin-top: 20px;
            +		}
            +		
            +		.account-dashboard-content{
            +			padding: $grid-gutter-width;
            +			background-color: $white;
            +			box-shadow: $box-shadow-base;
            +			position: relative;
            +			&:before {
            +				@include triangle( top,0px, $white, 20px );
            +				transform: translateX(-50%);
            +				left: 50%;
            +				top: -14px;
            +			}
            +		}
            +		
            +	}
            +	&.active .popup-body{
            +		display: block;
            +	}
            +	&.hover-align-right:hover .popup-body {
            +		display:block;
            +		right:0;
            +		padding-top:30px;
            +		min-width: 250px;
            +		.account-dashboard-content{
            +			&:before {
            +				right:-15px;
            +				left:auto;
            +			}
            +		}
            +
            +	}
            +	
            +	.popup-close{
            +		position:absolute;
            +		top: 10px;
            +		@include rtl-right(15px);
            +		color:$primary;
            +		cursor: hand;cursor:pointer;
            +	}
            +}
            +//Pagination
            +.pagination {
            +	li{
            +        display: block;
            +        min-width: 40px;
            +        text-align: center;
            +        padding: 5px $padding-base;
            +        font-weight: 500;
            +        color: $body-color;
            +        &.current, &:hover{
            +			background-color: $primary;
            +			a{
            +				color: $white;
            +			}
            +        }
            +	}
            +	.nav-links{
            +		display: flex;
            +		flex-wrap: wrap;
            +	}
            +}
            +
            +//// opalestate-dropdown
            +
            +.opalestate-dropdown {
            +	position:relative;
            +	.dropdown-body {
            +		position:absolute;
            +		display:none;
            +		background:red;
            +		min-width:250px;
            +		right:0;
            +		top:50px;
            +	}
            +	&:hover {
            +		.dropdown-body {
            +			display:block;
            +		}
            +	}
            +}
            +
            +//Agent
            +// display in single package
            +.agent-box-list {
            +	.inner {
            +		display:flex;
            +		.agent-preview { 
            +			width:80px;
            +			margin-right:$padding-base;
            +			img { border-radius:50%; }
            +		}
            +		border-bottom:solid 1px $border-color;
            +		padding-bottom:$padding-base*2;
            +	}
            +	.opalestate-social-icons {
            +		padding-top:$padding-base; 
            +	}
            +}
            +
            +.single-property-sidebar {
            +	.agent-box-list{
            +		.inner {
            +			border-bottom:0;
            +		}
            +		.opalestate-social-icons {
            +			border-bottom: 1px solid $border-color;
            +			padding-bottom:$padding-base;
            +			padding-top: 5px;
            +		}
            +
            +	}
            +}
            +
            +.agent-box-image{
            +	overflow: hidden;
            +}
            +.property-agent-info{
            +	.team-header{
            +		text-align: center;
            +		border: 1px solid $border-color;
            +	}
            +}
            +.property-agent-contact{
            +	.agent-preview{
            +		margin-bottom: 0;
            +	}
            +	.team-header{
            +		margin-bottom: $grid-gutter-width;
            +	}
            +}
            +.team-header {
            +	position: relative;
            +	.agent-label {
            +		position: absolute;
            +		text-transform: uppercase;
            +		padding: 0 10px;
            +		color: $white;
            +		margin: 0;
            +		font-size: 10px;
            +		font-weight: 500;
            +		li {
            +			list-style: none;
            +		}
            +	}
            +	.agent-featured{
            +		.agent-label{
            +			top: 0;
            +			left: 0;
            +			background-color: $primary;
            +		}
            +	}
            +	.agent-levels{
            +		.agent-label{
            +			bottom: 0;
            +			left: 0;
            +			background-color: $secondary;
            +		}
            +	}
            +}
            +.agent-box-title{
            +	border-bottom: 1px solid $border-color;
            +	padding-bottom: 20px;
            +	//margin-bottom: 28px;
            +}
            +.agent-preview{
            +	margin-bottom: $grid-gutter-width;
            +	position: relative;
            +	.agent-avatar{
            +		position: absolute;
            +		bottom: 10px;
            +		left: 10px;
            +		width: 35px;
            +		border-radius: 50%;
            +	}
            +}
            +
            +.agent-box-job{
            +	display: none;
            +}
            +
            +.agent-box-meta{
            +	color: $body-color-light;
            +	div[class*="agent-box-"]{
            +		line-height: 1;
            +		padding: 8px 1px;
            +		&:first-of-type{
            +			padding-top: 0;
            +		}
            +		&:last-of-type{
            +			padding-bottom: 0;
            +		}
            +		&:not(:last-of-type){
            +			//border-bottom: 1px solid $border-color;
            +		}
            +		i{
            +			width: $font-size-base;
            +			margin-right: 6px;
            +		}
            +	}
            +	a{
            +		color: inherit;
            +	}
            +	h4 {
            +		padding-top:0;
            +	}
            +}
            +.gallery-summery-style  {
            +
            +	display:flex;
            +	flex-wrap:wrap;
            +	a {
            +		display:block;
            +		width:20%;
            +		height:120px;
            +		background-size:cover;
            +		background-repeat:no-repeat;
            + 
            +	}
            +}
            +
            +//Featured Properties
            +.my-featured-section{
            +	.opalestate_property{
            +		margin-right: 1px;
            +	}
            +}
            +
            +
            +//Floor plans
            +.property-floorplans-session, .tabl-simple-style{ //tabs outline
            +	.opalestate-tab-head{
            +		line-height: 1;
            +		border-bottom: 1px solid $border-color;
            +		margin-bottom: 16px;
            +		margin-top: 0;
            +		background-color: transparent;
            +	}
            +	.tab-item{
            +		background-color: transparent;
            +		padding: 0;
            +		color: $headings-color;
            +		display: inline-block;
            +		padding-bottom: 19px;
            +		font-weight: $headings-font-weight;
            +		border-bottom: 3px solid transparent;
            +		margin-bottom: -2px;
            +		&:not(:last-of-type){
            +			margin-right: 28px;
            +		}	
            +		&.active, &:hover{
            +			background-color: transparent;
            +			color: $headings-color;
            +			border-color: $secondary;
            +		}
            +	}
            +}
            +.plan-name,.plan-content{
            +	display: none;
            +}
            +.plan-image{
            +	padding: 24px;
            +}
            +
            +//Property categories
            +.property-category{
            +	position: relative;
            +	overflow: hidden;
            +	.static-content{
            +		padding: $grid-gutter-width;
            +		position: absolute;
            +		top: 0;
            +		width: 100%;
            +		height: 100%;
            +		display: flex;
            +		flex-wrap: wrap;
            +		align-items: center;
            +		a{
            +			color: $white;
            +		}
            +	}
            +	.property-category-count{
            +		color: $secondary;
            +	}
            +	.property-category-title{
            +		margin-bottom: 10px;
            +	}
            +	.property-category-info{
            +		flex-basis: 100%;
            +	}
            +	.category-overlay{
            +		position: absolute;
            +		top: 0;
            +		width: 100%;
            +		height: 100%;
            +		display: block;
            +		z-index: 2;
            +	}
            +	&:hover{
            +		.property-category-bg{
            +			transform: scale(1.1);
            +			&::before{
            +				background-color: rgba(0, 0, 0, 0.5);
            +			}
            +		}
            +	}
            +}
            +.property-category-bg{
            +	background-repeat: no-repeat;
            +	background-size: cover;
            +	position: relative;
            +	display: block;
            +	height: 100%;
            +	min-height: 340px;
            +	transform: scale(1);
            +	transition: opacity 0.5s ease, transform 1s cubic-bezier(0, 0, 0.44, 1.18), -webkit-transform 1s cubic-bezier(0, 0, 0.44, 1.18);
            +	background-position: center center;
            +	&::before{
            +		content: "";
            +		position: absolute;
            +		width: 100%;
            +		height: 100%;
            +		background-color: rgba(0, 0, 0, 0.35);
            +		top: 0;
            +		left: 0;
            +	}
            +}
            +
            +
            +
            +.property-city{
            +	position: relative;
            +	overflow: hidden;
            +	.static-content{
            +		padding: $grid-gutter-width;
            +		position: absolute;
            +		top: 0;
            +		width: 100%;
            +		height: 100%;
            +		display: flex;
            +		flex-wrap: wrap;
            +		align-items: center;
            +		a{
            +			color: $white;
            +		}
            +	}
            +	.property-city-count{
            +		color: $secondary;
            +	}
            +	.property-city-title{
            +		margin-bottom: 10px;
            +	}
            +	.property-city-info{
            +		flex-basis: 100%;
            +	}
            +	.city-overlay{
            +		position: absolute;
            +		top: 0;
            +		width: 100%;
            +		height: 100%;
            +		display: block;
            +		z-index: 2;
            +	}
            +	&:hover{
            +		.property-city-bg{
            +			transform: scale(1.1);
            +			&::before{
            +				background-color: rgba(0, 0, 0, 0.5);
            +			}
            +		}
            +	}
            +}
            +.property-city-bg{
            +	background-repeat: no-repeat;
            +	background-size: cover;
            +	position: relative;
            +	display: block;
            +	height: 100%;
            +	min-height: 340px;
            +	transform: scale(1);
            +	transition: opacity 0.5s ease, transform 1s cubic-bezier(0, 0, 0.44, 1.18), -webkit-transform 1s cubic-bezier(0, 0, 0.44, 1.18);
            +	background-position: center center;
            +	&::before{
            +		content: "";
            +		position: absolute;
            +		width: 100%;
            +		height: 100%;
            +		background-color: rgba(0, 0, 0, 0.35);
            +		top: 0;
            +		left: 0;
            +	}
            +}
            +
            +#opalestate-map-preview .cluster img + div {
            +	line-height: 30px !important;
            +}
            \ No newline at end of file
            diff --git a/assets/scss/opalestate/_form.scss b/assets/scss/opalestate/_form.scss
            new file mode 100755
            index 00000000..579b5e99
            --- /dev/null
            +++ b/assets/scss/opalestate/_form.scss
            @@ -0,0 +1,481 @@
            +
            +/*
            + *
            + */
            +.opalestate-search-form{
            +	&:not([class*="opalestate-search-form--vertical"]){
            +		background-color: $white;
            +		padding: $theme-padding/2 $theme-padding ;
            +		&.opalestate-search-agents-form {
            +			border:1px solid $border-color;
            +			margin-bottom: $theme-margin;
            +		}
            +	}
            +	.btn-search, .status-item, .opalestate-collapse-btn {
            +		margin-top: 45px;
            +	}
            +
            +	&.hidden-labels{
            +		.opalestate-label{
            +			display: none;
            +		}
            +		.input-search-city {
            +			.opalestate-popup {
            +				top: 20%;
            +			}
            +		}
            +		.select2-container,.btn-search,.form-control,.opal-collapse-button,.input-group-number {
            +			margin: $padding-base 0;
            +		}
            +		.opal-slide-ranger{
            +			.slide-ranger-label{
            +				display: block;
            +				line-height: 2;
            +			}
            +		}
            +		.map-remove { top: 10px;}
            +	}
            +	.opalestate-label{
            +		font-weight: $headings-font-weight;
            +		display: block;
            +		color: $headings-color;
            +		line-height: 1;
            +		margin-top: $theme-margin/2;
            +		margin-bottom: $theme-margin/2;
            +	}
            +	h6 {
            +		margin: 0;
            +	}
            +	.searchbox-top {
            +		border-bottom:solid 1px $border-color;
            +		margin-bottom: $padding-base;
            +		text-transform: uppercase;
            +	}
            +	.select2-container,.btn-search,.form-control,.list-property-status,.opal-collapse-button,.input-group-number {
            +		margin-bottom: $padding-base;
            +	}
            +	
            +	.opal-slide-ranger{
            +		padding: ceil($padding-base/2) 0;
            +		.slide-ranger-label{
            +			display: block;
            +			line-height: 1;
            +		}
            +	}
            +	.list-property-status{
            +		.status-item{
            +			cursor: pointer;
            +			text-align: center;
            +			flex: 1;
            +			padding: 9px 0 6px;
            +			color: $white;
            +			background-color: $secondary;
            +			transition: all ease-in-out 0.5s;
            +			&:hover,&.active{
            +				background-color: $primary;
            +			}
            +		}
            +	}
            +	.btn-search {
            +		width: 100%;
            +		text-align: center;
            +		i{
            +			margin-right: 5px;
            +		}
            +	}
            +	.opal-slide-ranger{
            +		@media screen and (max-width:$screen-sm){
            +			margin: $grid-gutter-width/2 0;
            +		}
            +	}
            +}
            +.opalestate-archive-agency,
            +.opalestate-archive-search-block,
            +.post-type-archive-opalestate_agent{
            +	.opalestate-search-form {
            +		&:not([class*="opalestate-search-form--vertical"]) {
            +			margin: 0 -30px;
            +		}
            +	}
            +}
            +
            +.map-remove {
            +	display: none;
            +	position: absolute;
            +	right: 50px;
            +	top: 40px;
            +}
            +.opalestate-search-opal-map {
            +	&.active {
            +		.map-remove {
            +			display: block;
            +			&:focus,
            +			&:hover {
            +				cursor: pointer;
            +			}
            +		}
            +		input[value=""] + .map-remove {
            +			display: none;
            +		}
            +	}
            +}
            +
            +[class*="opalestate-search-form--vertical"]{
            +	.btn-search{
            +		margin-top: 15px;
            +	}
            +	.opalestate-label {
            +		margin-top: 10px;
            +		margin-bottom: 10px;
            +	}
            +}
            +.search-more-options{
            +	position: relative;
            +	margin: $padding-base 0 5px;
            +	line-height: 1;
            +	
            +}
            +
            +a.opal-collapse-button{
            +	display: block;
            +	font-weight: 600;
            +	&:before {
            +		font-family: "Font Awesome 5 Free";
            +		content: '\f0fe';
            +		padding-right:5px;
            +		color: $primary;
            +		transition: all 0.5s ease;
            +	}
            +	&.show{
            +		color: $link-hover-color;
            +		&:before {
            +			content: '\f146';
            +		}
            +	}
            +}
            +
            +
            +.more-options-container{
            +	margin-top: $padding-base;
            +}
            +.more-options-items{
            +	display: inline-block;
            +	width: 100%;
            +
            +}
            +.opal-collapse-container{
            +    width: 100%;
            +	display: none;
            +}
            +button.opal-collapse-button{
            +	transition: all 0.5s;
            +	width: 100%;
            +	i::before{
            +		display: block;
            +		transition: all 0.5s;
            +	}
            +	&:hover,&.show{
            +		outline: none;
            +	}
            +	&:focus{
            +		outline: none;
            +	}
            +	&.show{
            +		i::before{
            +			transform: rotate(180deg);
            +			
            +		}
            +	}
            +}
            +.more-options-item{
            +	width: 25%;
            +	float: left;
            +	margin-bottom: $padding-base;
            +	@media(max-width: 767px) {
            +		width: 100%;
            +	}
            +}
            +.input-search-city {
            +	position:relative;
            +	.opalestate-popup {
            +		position: absolute;
            +		top: 40px;
            +		right: 16px;
            +	}
            +}
            +
            +//custom checkbox
            +.form-item--types{
            +	.group-item{
            +		display: block;
            +		position: relative;
            +		padding-left: 0px;
            +		margin-bottom: 15px;
            +		cursor: pointer;
            +		-webkit-user-select: none;
            +		-moz-user-select: none;
            +		-ms-user-select: none;
            +		user-select: none;
            +		line-height: 1;
            +		.custom-checkbox-label{
            +			z-index: -1;
            +		}
            +		input[type="checkbox"]{
            +			position: absolute;
            +			opacity: 0;
            +			cursor: pointer;
            +			&:checked ~ .custom-checkbox-label{
            +				background-color: $primary;
            +				&::after{
            +					display: block;
            +				}
            +			}
            +		}
            +		&:hover{
            +			input ~ .custom-checkbox-label{
            +				background-color: #ccc;
            +			}
            +	
            +		}
            +	}
            +	
            +}
            +
            +.opalestate-search-form--vertical {
            +	.more-options-item {
            +		float:none;
            +		width:100%;
            +	}
            +}
            +
            +.more-options-label{
            +	display: inline-block;
            +    position: relative;
            +    padding-left: 23px;
            +    margin-bottom: 0px;
            +    cursor: pointer;
            +    -webkit-user-select: none;
            +    -moz-user-select: none;
            +    -ms-user-select: none;
            +	user-select: none;
            +	input[type="checkbox"]{
            +		position: absolute;
            +		opacity: 0;
            +		cursor: pointer;
            +		&:checked ~ .custom-checkbox-label{
            +			background-color: $secondary;
            +			&::after{
            +				display: block;
            +			}
            +		}
            +	}
            +	&:hover{
            +		input ~ .custom-checkbox-label{
            +			background-color: #ccc;
            +		}
            +
            +	}
            +}
            +.custom-checkbox-label{
            +	position: absolute;
            +	top: 0;
            +	left: 0;
            +	height: 15px;
            +	width: 15px;
            +	background-color: #eee;
            +	&::after{
            +		content: "";
            +		position: absolute;
            +		display: none;
            +		left: 5px;
            +		top: 2px;
            +		width: 5px;
            +		height: 8px;
            +		border: solid $white;
            +		border-width: 0 2px 2px 0;
            +		-webkit-transform: rotate(45deg);
            +		-ms-transform: rotate(45deg);
            +		transform: rotate(45deg);
            +	}
            +
            +}
            +//status bar 2
            +.search-status-bar--2{
            +	.list-property-status{ 
            +		padding:0;
            +		margin: 0;
            +		.status-item {
            +			font-size: 100%;
            +			padding: 8px 35px 5px 35px;
            +			color: $headings-color;
            +			border-width: 1px 0 1px;
            +			margin-right: 0;
            +			margin-top: $padding-base;
            +			border-style: solid;
            +			border-color: transparent;
            +			position: relative;
            +			font-weight: $headings-font-weight;
            +			flex: unset;
            +			background-color: transparent;
            +			&:last-child{
            +				margin-right: 0;
            +			}
            +			@media screen and (max-width:767px){
            +				margin-right: $theme-margin;
            +			}
            +			&.active,&:hover {
            +				background-color: transparent;
            +				color: $link-hover-color;
            +				border-color: $link-hover-color;
            +			}
            +			&.active{
            +				&::after{
            +					content: "";
            +					border-top: 8px solid;
            +					border-right: 9px solid transparent;
            +					border-left: 9px solid transparent;
            +					border-bottom: 0;
            +					position: absolute;
            +					top: 100%;
            +					left: 50%;
            +					transform: translateX(-50%);
            +				}
            +			}
            +		}
            +	}
            +}
            +
            +//Form vertical
            +.opalestate-search-form--vertical{
            +	.select2-container, .input-group-number{
            +		margin-top: 0;
            +	}
            +	.opalestate-label{
            +		display: inline-block;
            +	}
            +}
            +
            +//Form vertical2
            +.opalestate-search-form--vertical-2{
            +	padding-top: 0;
            +	padding-bottom: 0;
            +	.opalestate-label{
            +		display: none;
            +	}
            +	.input-group-number{
            +		margin-top: 15px;
            +	}
            +	h6{
            +		margin-bottom: 5px;
            +	}
            +	.input-search-city{
            +		.opalestate-popup{
            +			top: 20%;
            +		}
            +	} 
            +	.opal-form-content{
            +		.form-item:not(:last-of-type){
            +			border-bottom: 1px solid $border-color;
            +			padding-bottom: $padding-base;
            +			margin-bottom: $grid-gutter-width; 
            +		}
            +	}
            +	.more-options-items {
            +		.more-options-item {
            +			width: 100%;
            +		}
            +	}
            +}
            +
            +
            +.input-group-number{
            +	display: inline-flex;
            +	align-items: center;
            +	border: 1px solid $border-color;
            +	padding: $input-padding-y $input-padding-x;
            +	height: $input-height;
            +	width: 100%;
            +	position: relative;
            +	background-color: $white;
            +	i[class*="icon-property-"]{
            +        margin-right: $input-padding-x;
            +	}
            +	.form-control{
            +		padding: 0;
            +		margin: 0;
            +		height: auto;
            +		border: none;
            +		flex: 1;
            +		background-color: transparent;
            +		&:focus{
            +			background-color: transparent;
            +		}
            +	}
            +	.btn-actions{
            +		position: absolute;
            +		right: 0;
            +		top: 0;
            +		line-height: $input-height;
            +		span{
            +			padding-left: $input-padding-x;
            +			padding-right: $input-padding-x;
            +            border-left: 1px solid $border-color;
            +            &:hover{
            +                color: $secondary;
            +                cursor: pointer;
            +            }
            +		}
            +	}
            +}
            +
            +//Form v6
            +.opalestate-search-form--advanced-6{
            +	display: flex;
            +	.opalestate-search-form__item:not(:first-child){
            +        flex: 1;
            +    }
            +    .opalestate-search-form__item:first-child{
            +        flex-basis: 12%;
            +        .select2-selection--single{
            +            padding-left: 10px;
            +            border-right: 0;
            +            .select2-selection__rendered{
            +                padding: 0;
            +            }
            +        }
            +    }
            +    .btn-search{
            +        width: 128px;
            +    }
            +}
            +
            +//Search Agent
            +.search-agent-title{
            +	margin-bottom: 0;
            +}
            +//
            +.select2-container{
            +	&.select2-container--default .select2-selection--single {
            +		display: block;
            +		width: 100%;
            +		height: $input-height;
            +		padding: $input-padding-y $input-padding-x;
            +		font-size: $font-size-base;
            +		line-height: $input-line-height;
            +		color: $input-color;
            +		background-color: $input-bg;
            +		border: 1px solid $input-border-color; 
            +		background-clip: padding-box;
            +		border-radius: 0;
            +		.select2-selection__arrow {
            +			height: $input-height;
            +			width: 40px;
            +		}
            +	}
            +	.select2-dropdown{
            +		border-color: $border-color;
            +	}
            +}
            +
            +
            +
            diff --git a/assets/scss/opalestate/_layout.scss b/assets/scss/opalestate/_layout.scss
            new file mode 100755
            index 00000000..89f067e1
            --- /dev/null
            +++ b/assets/scss/opalestate/_layout.scss
            @@ -0,0 +1 @@
            +/** list **/
            diff --git a/assets/scss/opalestate/_modules.scss b/assets/scss/opalestate/_modules.scss
            new file mode 100755
            index 00000000..473d4c0c
            --- /dev/null
            +++ b/assets/scss/opalestate/_modules.scss
            @@ -0,0 +1,70 @@
            +@keyframes spinner-border {
            +	to { transform: rotate(360deg); }
            +  }
            +
            +
            +//favorite button
            +.property-toggle-favorite {
            +	@include transition(.5s);
            +	cursor: pointer;
            +	&:hover {
            +		color: $link-hover-color;
            +	}
            +}
            +
            +/// split search ///
            +header#masthead {
            +	position:relative;
            +}
            +
            +.pull-right {
            +	float: right!important;
            +}
            +.ajax-map-search-split{
            +	.split-maps-container{
            +		@media screen and (min-width:1200px){
            +			padding-left: 0;
            +		}
            +	}
            +	.opalestate-search-form{
            +		margin: 0;
            +		padding: $padding-base 0;
            +	}
            +}
            +.split-maps-container {
            +	@media screen and (min-width:1200px){
            +		position:fixed !important;
            +	}
            +	left: 0;
            +	right: auto;
            +	top: 0;
            +	z-index: 0;
            +	
            +}
            +.split-search-container{
            +	@media screen and (min-width:1200px){
            +		padding-right: $grid-gutter-width;
            +	}
            +}
            +.opalestate-loading {
            +	position:absolute;
            +	@include opacity(0.9);
            +	background-color:#fff;
            +	top: 0;
            +	right: 0;
            +	width: 100%;
            +	height: 100%;
            +	text-align: center;
            +	&::before{
            +		content:"";
            +		display: inline-block;
            +		width: 2rem;
            +		height: 2rem;
            +		vertical-align: text-bottom;
            +		border: .25em solid #000;
            +		border-right-color: transparent;
            +		border-radius: 50%;
            +		animation: spinner-border .75s linear infinite;
            +	}
            +	
            +}
            \ No newline at end of file
            diff --git a/assets/scss/opalestate/_page.scss b/assets/scss/opalestate/_page.scss
            new file mode 100755
            index 00000000..b9a7898c
            --- /dev/null
            +++ b/assets/scss/opalestate/_page.scss
            @@ -0,0 +1,100 @@
            +
            +@import "single";
            +@import "archive";
            +
            +// no header and footer for user management page 
            +.page-template-user-management  {
            +	header, footer, #colophon {
            +		display:none;
            +	}
            +	article header {
            +		display:block !important;
            +	}
            +}
            +/// my-properties  page
            +.button-actions {
            +	position:absolute;
            +	top: 0;
            +	right: 0;
            +	color:$white;
            +	z-index: 1;
            +	display: flex;
            +	a{
            +		background-color:$primary;
            +		color: $white;
            +		&:hover{
            +			cursor: pointer;
            +			background-color: $secondary;
            +			color: $white;
            +		}
            +		
            +	}
            +}
            +.my-properties{
            +	.property-status{
            +		position: relative;
            +		top: 0;
            +		left: 0;
            +	}
            +	.property-meta-list{
            +		padding: 0;
            +	}
            +	.my-properties-bottom{
            +		display: none;
            +	}
            +	.abs-col-item{
            +		padding-top: 10px;
            +	}
            +	.entry-title{
            +		margin: 0;
            +	}
            +}
            +
            +
            +/// search agent page
            +
            +.search-agents-wrap {
            +	.opalestate-search-agents-form {
            +		padding-bottom: $grid-gutter-width;
            +	}
            +}
            +	//Grid style
            +	.agent-grid-style {
            +		margin-bottom: $grid-gutter-width;
            +		background-color: $white;
            +		.agent-body{
            +			border-style: solid;
            +			border-width: 0 1px 1px 1px;
            +			border-color: $border-color;
            +			padding: $grid-gutter-width $grid-gutter-width $grid-gutter-width/2;
            +		}
            +		.agent-job{
            +			line-height: 1;
            +			padding-bottom: 14px;	
            +			border-bottom: 1px solid #ebebeb;
            +		}
            +		.trusted-label{
            +			position: absolute;
            +			right: 20px;
            +			background-color: $white;
            +			border-radius: 50%;
            +			bottom: 0;
            +			transform: translateY(50%);
            +			border: 1px solid $border-color;
            +			width: 48px;
            +			line-height: 48px;
            +		}
            +	}
            +
            +	//List style
            +	.agent-list-style{
            +		padding: $grid-gutter-width;
            +		border: 1px solid $border-color;
            +		margin-bottom: $grid-gutter-width;
            +		.team-info{
            +			margin: $padding-base 0 0;
            +		}
            +		.agent-box-title{
            +			
            +		}
            +	}
            \ No newline at end of file
            diff --git a/assets/scss/opalestate/_properties-loop.scss b/assets/scss/opalestate/_properties-loop.scss
            new file mode 100755
            index 00000000..cbcb6e4a
            --- /dev/null
            +++ b/assets/scss/opalestate/_properties-loop.scss
            @@ -0,0 +1,696 @@
            +
            +//property options
            +.property-options{
            +	position: absolute;
            +    bottom: 10px;
            +    right: 10px;
            +    .opalestate-ajax-gallery{
            +        width: 35px;
            +        line-height: 35px;
            +        text-align: center;
            +        display: inline-block;
            +        color: $white;
            +        background-color: $secondary;
            +        border-radius: 50%;
            +        &:hover{
            +            background-color: $primary;
            +        }
            +    }
            +}
            +.author-avatar{
            +    img{
            +        border-radius: 50%;
            +    }
            +}
            +
            +//property loop
            +.opalestate_property{
            +    margin-bottom: $grid-gutter-width;
            +    background-color: $white;
            +    border:solid 1px $border-color;
            +    position:relative;
            +    &.opalestate-single-property,&[class*="property-featured"]{
            +        border:none;
            +        margin-bottom: 0;
            +        background: transparent;
            +    }
            +    header{
            +		position: relative;
            +	}
            +}
            +
            +.property-box-image{
            +    overflow: hidden;
            +    position: relative;
            +    a{
            +        &::after{
            +            content: "";
            +            position: absolute;
            +            width: 100%;
            +            height: 100%;
            +            background-color:rgba(0, 0, 0, 0.3);
            +            top: 0;
            +            left: 0;
            +        }
            +    }
            +    
            +}
            +
            +.property-price{
            +    .property-regular-price,.property-saleprice{
            +        font-size: 18px;
            +        letter-spacing: -0.5px;
            +        font-weight: $headings-font-weight;
            +        color:$primary;
            +    }
            +    .property-regular-price.has-saleprice{
            +        font-size: $font-size-base;
            +        opacity: 0.8;
            +    }
            +}
            +
            +
            +/** ----list---- **/
            +.property-list{
            +    display: flex;
            +    flex-wrap: wrap;
            +    header{
            +        flex-basis: 35.065%;
            +    }
            +    .property-box-image{
            +        height: 100%;
            +        img{
            +            height: 100%;
            +        }
            +    }
            +    
            +    .entry-title{
            +        margin: 7px 0 0px;
            +    }
            +    .property-address{
            +        margin: 6px 0 23px;
            +    }
            +    .abs-col-item{
            +        flex: 1;
            +		padding-left:$grid-gutter-width;
            +        position: relative;
            +        display: flex;
            +        flex-wrap: wrap;
            +    }
            +    .property-meta-list{
            +        align-self: flex-end;
            +        flex-basis: 100%;
            +        padding: $padding-base 0 0;
            +        margin-top: $padding-base;
            +        border-top: 1px solid $border-color;
            +        li{
            +            margin-bottom: $padding-base;
            +            &:not(:last-child){
            +                margin-right: $grid-gutter-width;
            +            }
            +            
            +        }
            +    }
            +    .entry-summary{
            +        flex-basis: 25%;
            +        padding: 0 $grid-gutter-width;
            +    }
            +    .property-meta-bottom{
            +        display: flex;
            +        position: absolute;
            +        top: 10px;
            +        right: 10px;
            +        .property-toggle-favorite{
            +            display: block;
            +            width: 22px;
            +            line-height: 22px;
            +            border-radius: 50%;
            +            color: $white;
            +            text-align: center;
            +            cursor: pointer;
            +            font-size: 12px;
            +            background-color:rgba(0,0,0,0.3);
            +            &:hover{
            +                background-color: $link-hover-color;
            +            }
            +        }
            +    }
            +    .author-avatar{
            +        width: 22px;
            +    }
            +    .author-link{
            +        display: block;
            +        line-height: 1;
            +    }
            +    .author-name{
            +        display: none;
            +    }
            +    .meta-item:not(:last-of-type){
            +        margin-right: 5px;
            +    }
            +    .property-group-label{
            +        top: 10px;
            +        left: 10px;
            +    }
            +    @media screen and (max-width: 992px) {
            +        padding: $padding-base;
            +        header{
            +            flex-basis: 100%;
            +        }
            +        .abs-col-item{
            +            padding: $padding-base 0 0;
            +        }
            +        .entry-summary{
            +            flex-basis: 33.3333%;
            +            padding-top: $padding-base;
            +            padding-right: 0;
            +        }
            +    }
            +    @media screen and (max-width: 767px) {
            +        .entry-summary{
            +            flex-basis: 100%;
            +            padding: $padding-base 0 0;
            +        }
            +    }
            +}
            +// list style 1
            +.property-list-style-v1 {
            +	header {
            +		padding-bottom:0;
            +    }
            +    .property-list{
            +        padding: 10px;
            +    }
            +}
            +.container-cols-3{
            +    .abs-col-item{
            +        @media screen and (min-width: 768px) {
            +            border-right: 1px solid $border-color;
            +        }
            +    }
            +}
            +//list style 2
            +.property-list-style-v2{
            +    .property-list{
            +        padding: 0;
            +    }
            +    .abs-col-item{
            +        padding: 0 $grid-gutter-width;
            +        border: none;
            +    }
            +    .entry-content{
            +        width: 100%;
            +    }
            +    .entry-title{
            +        margin: 16px 0 0px;
            +    }
            +    .property-address{
            +        margin: 6px 0 0px;
            +    }
            +    .property-meta-list{
            +        padding: 0;
            +        margin-top: 9px;
            +        li{
            +            margin-top: 19px;
            +            margin-bottom: 8px;
            +            &:not(:last-child){
            +                margin-right: 30px;
            +            }
            +        }
            +        .label-property{
            +            display: none;
            +        }
            +    }
            +}
            +////
            +ul.property-meta-list{
            +    padding: $grid-gutter-width 20px 0;
            +    margin: 0;
            +    li{
            +        line-height: 1;
            +        margin-bottom: $grid-gutter-width;
            +    }
            +	i{
            +		margin-right: 5px;
            +		width: 20px;
            +        display: inline-block;
            +        font-style: unset;
            +	}	
            +}
            +i[class*="icon-property-"]{
            +    font-family: FontAwesome;
            +}
            +.icon-property-areasize:before{
            +    content: "\f047";
            +    
            +}
            +.icon-property-bedrooms:before{
            +    content: "\f236";
            +    
            +}
            +.icon-property-bathrooms:before{
            +    content: "\f2cd";
            +    
            +}
            +.icon-property-parking:before{
            +    content: "\f1b9";
            +    
            +}
            +.icon-property-builtyear:before{
            +    content: "\f073";
            +    
            +}
            +.icon-property-plotsize:before{
            +    content: "\f278";
            +    
            +}
            +.icon-property-orientation:before{
            +    content: "\f14e";
            +    
            +}
            +.icon-property-livingrooms:before{
            +    content: "\f26c";
            +    
            +}
            +.icon-property-kitchens:before{
            +    content: "\f0f5";
            +    
            +}
            +.icon-property-amountrooms:before{
            +    content: "\f1ad";
            +    
            +}
            +
            +/** Grid **/
            +.property-grid{
            +	.entry-content{
            +		padding: 0 20px $padding-base;
            +	}
            +	.entry-title{
            +        margin: 0 0 6px;
            +    }
            +    .property-address{
            +        margin: 0;
            +        span.property-view-map {
            +            color: $body-color;
            +        }
            +    }
            +    
            +    .property-meta-list.list-inline{
            +		li{
            +            flex-basis: 50%;
            +            margin-right: 0;
            +		}
            +    }
            +    .property-price{
            +        .property-regular-price,.property-saleprice{
            +            @media screen and (min-width:768px){
            +                font-size: 24px;
            +            }
            +            letter-spacing: -0.5px;
            +            color: $primary;
            +        }
            +        .property-regular-price.has-saleprice{
            +            font-size: $font-size-base;
            +        }
            +    }
            +    .entry-content-bottom {
            +        display: flex;
            +        align-items: center;
            +        border-top: 1px solid $border-color;
            +        > *:not(:first-child){
            +            position: relative;
            +            padding: 11px 0;
            +            border-left: 1px solid $border-color;
            +        }
            +        > *:first-child{
            +            margin-left: 20px;
            +            flex: 1;
            +        }
            +    }
            +    .property-toggle-favorite{
            +        width: 52px;
            +        text-align: center;
            +    }
            +    @media screen and (max-width:767px){
            +        .entry-content{
            +            padding: $grid-gutter-width $padding-base $padding-base;
            +        }
            +        .property-meta-list{
            +            padding: 23px $padding-base 17px $padding-base;
            +        }
            +        .property-meta-bottom{
            +            margin-left: $padding-base;
            +        }
            +        .property-group-label{
            +            left: $padding-base;
            +        }
            +    }
            +}
            +//Header Inner Author Link
            +.property-grid, .property-featured{ 
            +    .author-link{
            +        line-height: 1;
            +        display: flex;
            +        align-items: center;
            +        &:hover{
            +            color: $link-hover-color;
            +        }
            +    }
            +    .author-avatar{
            +        width: 35px;
            +        margin-right: 8px;
            +    }
            +    .author-name{
            +        font-size: 13px;
            +        font-weight: $headings-font-weight;
            +    }
            +}
            +/** Grid Layout 1**/
            +.property-grid-v1{
            +    .author-link{
            +        position: absolute;
            +        bottom: 10px;
            +        left: 20px;
            +        color: $white;
            +    }
            +}
            +/** Grid Layout 2**/
            +.property-grid-v2{
            +    .property-group-label{
            +        top: 10px;
            +    }
            +    .author-name{
            +        display: none;
            +    }
            +    .property-meta-list.list-inline{
            +        li{
            +            flex-basis: unset;
            +            &:not(:last-child){
            +                margin-right: 25px;
            +            }
            +        }
            +    }
            +    .entry-content-bottom{
            +        .author-link{
            +            padding: 0;
            +            width: 52px;
            +            justify-content: center;
            +        }
            +    }
            +    
            +    .author-avatar{
            +        margin: 0;
            +        width: 30px;
            +        padding: 11px 0;
            +    }
            +}
            +
            +/** Grid Layout 3**/
            +.property-grid-v3{
            +    .property-meta-bottom{
            +        position: absolute;
            +        bottom: $padding-base;
            +        padding-left: $padding-base;
            +        width: 100%;
            +    }
            +    .entry-title{
            +        margin: 17px 0 6px;
            +    }
            +    header{
            +        padding: 5px 5px 0;
            +    }
            +    .entry-summary{
            +        margin-bottom: 20px;
            +    }
            +    .property-price{
            +        color: $white;
            +        line-height: 1;
            +        .property-regular-price,.property-saleprice{
            +            color: $white;
            +            font-size: 18px;
            +        }
            +        .property-price-label{
            +            font-size: 13px;
            +        }
            +        .property-regular-price.has-saleprice{
            +            font-size: $font-size-base;
            +        }
            +    }
            +    .entry-content{
            +        padding: 0 20px;
            +    }
            +    .property-meta-list.list-inline{
            +        padding: 0;
            +        .info-meta{
            +            .label-property {
            +                display: none;
            +            }
            +        }
            +        li{
            +            flex-basis: unset;
            +            &:not(:last-child){
            +                margin-right: $grid-gutter-width;
            +            }
            +        }
            +    }
            +    .entry-content-bottom{
            +        border: none;
            +        padding: 10px 20px;
            +        background-color: #f4f4f4;
            +        & > *:not(:first-child){
            +            border: none;
            +            padding: 0;
            +            width: 30px;
            +            background-color: rgba(126, 126, 126, 0.2);
            +            border-radius: 3px;
            +            color: #fff;
            +            &:hover{
            +                background-color: $link-hover-color;
            +            }
            +        }
            +        & > *:first-child{
            +            margin-left: 0;
            +        }
            +    }
            +    .author-avatar{
            +        width: 30px;
            +    }
            +}
            +
            +//Mark Hover Item
            +.property-mark-hover-item{
            +    .property-grid__header {
            +        min-height: 245px;
            +    }
            +    .list-inline{
            +        padding: 0;
            +    }
            +    header{
            +        &::before{
            +            content: "";
            +            position: absolute;
            +            top: 0;
            +            left: 0;
            +            right: 0;
            +            bottom: 0;
            +            background-image: -webkit-gradient(linear, left top, left bottom, from(transparent), to(rgba(0, 0, 0, 0.95)));
            +            background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.95));
            +            z-index: 1;
            +        }
            +    }
            +    .property-price-wrapper,.property-areasize{
            +        display: inline-block;
            +        margin-right: 30px;
            +    }
            +    
            +    .entry-content{
            +        position: absolute;
            +        bottom: 0;
            +        left: 0;
            +        z-index: 2;
            +        padding: 0 15px 15px;
            +        color: $white;
            +    }
            +    .entry-title{
            +        color:inherit;
            +        a{
            +            color:inherit;
            +        }
            +    }
            +    .property-price{
            +        .property-regular-price,.property-saleprice{
            +            font-size: 18px;
            +            color: inherit;
            +        }
            +    }
            +}
            +
            +/** Featured Property **/
            +.property-featured{
            +    display: flex;
            +    flex-wrap: wrap;
            +    .featured-info{
            +        background-color: $headings-color;
            +        color: $white;
            +        flex-basis: 50%;
            +        padding: 52px 75px 49px 100px;
            +        @media screen and (max-width:992px) {
            +            flex-basis: 100%;
            +        }
            +        @media screen and (max-width:1024px) {
            +            padding: $grid-gutter-width;
            +        }
            +    }
            +    .author-link{
            +        position: absolute;
            +        bottom: 10px;
            +        left: 15px;
            +        color: $white;
            +    }
            +    .property-view-map{
            +        color: $white;
            +        i {
            +            color: $white;
            +        }
            +        a{
            +            color: $white;
            +        }
            +    }
            +    header{
            +        flex-basis: 100%;
            +        @media screen and (min-width:992px) {
            +            flex-basis: 50%;
            +        }
            +    }
            +    ul.property-meta-list{
            +        padding: 0;
            +        > li {
            +            margin-right: 0;
            +            width: 50%;
            +        }
            +        i{
            +            color: $secondary;
            +            width: auto;
            +        }
            +        .icon-box {
            +            font-size: 30px;
            +            width: auto;
            +        }
            +        .info-meta{
            +            span {
            +                display: block;
            +                margin-bottom: 5px;
            +            }
            +        }
            +    }
            +    
            +    .entry-title{
            +        margin-top: 14px;
            +        margin-bottom: 8px;
            +        a{
            +            color: $white;
            +            &:hover{
            +                color: $link-hover-color;
            +            }
            +        }
            +        
            +    }
            +    .property-address{
            +        margin: 0 0 20px;
            +    }
            +    .property-description{
            +        margin-bottom: $grid-gutter-width;
            +    }
            +    .property-price{
            +        .property-regular-price,.property-saleprice{
            +            font-size: 24px;
            +            color: $white;
            +        }
            +        .property-regular-price.has-saleprice{
            +            font-size: 18px;
            +        }
            +    }
            +    .property-toggle-favorite{
            +        display: none;
            +        width: 22px;
            +        line-height: 22px;
            +        border-radius: 3px;
            +        color: $white;
            +        text-align: center;
            +        cursor: pointer;
            +        font-size: 12px;
            +        background-color: $headings-color;
            +        position: absolute;
            +        right: 10px;
            +        top: 10px;
            +
            +        &:hover{
            +            background-color: $link-hover-color;
            +        }
            +    }
            +    @media(min-width: 1200px) {
            +        .featured-info {
            +           margin-top: 50px;
            +        }
            +        header {
            +            flex-basis: calc(50% + 50px);
            +            margin-bottom: 50px;
            +            margin-left: -50px;
            +        }
            +    }
            +}
            +header{
            +    &:hover{
            +        .property-bg-thumbnail{
            +            a{
            +                transform: scale(1.1);
            +            }
            +        }
            +    }
            +}
            +.property-bg-thumbnail{
            +    height: 100%;
            +    overflow: hidden;
            +    a{
            +        background-repeat: no-repeat;
            +        background-size: cover;
            +        position: relative;
            +        display: block;
            +        height: 100%;
            +        min-height: 340px;
            +        transform: scale(1);
            +        transition: opacity 0.5s ease, transform 1s cubic-bezier(0, 0, 0.44, 1.18), -webkit-transform 1s cubic-bezier(0, 0, 0.44, 1.18);
            +        background-position: center center;
            +        &::before{
            +            content: "";
            +            position: absolute;
            +            width: 100%;
            +            height: 100%;
            +            background-color: rgba(0, 0, 0, 0.3);
            +            top: 0;
            +            left: 0;
            +        }
            +    }
            +}
            +
            +.opalestate-pagination {
            +  text-align: center;
            +  margin: $theme-margin 0;
            +  ul {
            +    margin: 0 auto;
            +    li {
            +      list-style: none;
            +      display: inline-block;
            +      .page-numbers {
            +        padding:5px 15px;
            +        display: block;
            +        &:hover,
            +        &.current {
            +          background: $secondary;
            +          color: $white;
            +        }
            +      }
            +    }
            +  }
            +}
            diff --git a/assets/scss/opalestate/_shortcodes.scss b/assets/scss/opalestate/_shortcodes.scss
            new file mode 100755
            index 00000000..1b12617c
            --- /dev/null
            +++ b/assets/scss/opalestate/_shortcodes.scss
            @@ -0,0 +1,164 @@
            +// split map search //// 
            +.maps-container-fixed {
            +    position: relative;
            +    width: 100%;
            +    @media (min-width:1024px){
            +        position:fixed;
            +        z-index:0;
            +        width:50%;
            +        top:0;
            +        min-height:600px;
            +    }
            +}
            +
            +/** Shortcodes **/
            +.opalestate-search-properties{
            +	.search-properies-form{
            +		margin-top: $grid-gutter-width;
            +	}
            +}
            +
            +// my account form /// 
            +
            +.opalestate-my-account-form {
            +    position: relative;
            +    background: $white;
            +    padding: $grid-gutter-width;
            +    width:auto;
            +    max-width: 550px;
            +    margin: 20px auto;
            +    .submit{
            +        a{
            +            display: block;
            +            margin-top: 10px;
            +        }
            +    }
            +    .opalestate-button{
            +        padding: 17px 35px 14px 35px;
            +        width: 100%;
            +    }
            +    h3 {
            +        display:none;
            +    }
            +}
            +
            +.opalesate-properties-results {
            +    min-height:800px;   
            +}
            +
            +.membership-packages{
            +    padding-top: 40px;
            +    padding-bottom: 50px;
            +}
            +
            +.pricing.pricing-v3{
            +    border: 1px solid $border-color;
            +    border-radius:5px;
            +    padding: 0;
            +    margin-bottom: $grid-gutter-width;
            +    overflow: hidden;
            +    .pricing-header{
            +        text-align: center;
            +        background: $primary;
            +        color: $white;
            +        position: relative;
            +        padding: $grid-gutter-width/2 0px 0px;
            +    }
            +    .plan-price{
            +        color: $white;
            +        line-height: 2.3rem;
            +        margin-top: $grid-gutter-width/2;
            +        p{
            +            display: inline-block;
            +        }
            +    }
            +    .pricing-body {
            +        padding: $grid-gutter-width/2 $grid-gutter-width;
            +    }
            +    .plan-figure{
            +        font-size: 36px;
            +        color: $white;
            +        display: block;
            +        font-weight: bold;
            +    }
            +    .plain-info{
            +        & > div{
            +            padding: 10px 0;
            +            font-size: 14px;
            +        }
            +        .item-info{
            +            border-bottom: 1px solid $border-color;
            +            padding-bottom: $padding-base;
            +            margin-bottom: $padding-base;
            +            color: $headings-color;
            +            font-weight: $headings-font-weight;
            +            text-transform: uppercase;
            +            &:last-child{
            +                margin-bottom: 0;
            +            }
            +        }
            +        i{
            +            margin-right: 10px;
            +        }
            +    }
            +    .membership-form-wrapper{
            +        color: $white;
            +    }
            +    .membership-add-to-purchase{
            +        width: 100%;
            +        border: 0;
            +        text-align: center;
            +        background-color: #999;
            +        line-height: 42px;
            +        text-transform: capitalize;
            +        &:hover{
            +            background-color: gray;
            +        }
            +    }
            +    .pricing-footer{
            +        padding: 0 $grid-gutter-width $grid-gutter-width;
            +        text-align: center;
            +    }
            +    .plan-title{
            +        color: $white;
            +        font-size: 18px;
            +        margin: 0;
            +        border: none;
            +        font-weight: $headings-font-weight;
            +        letter-spacing: -0.5px;
            +        position: relative;
            +    }
            +
            +}
            +.package-hightlighted{
            +    .plan-subtitle{
            +        background-color: $secondary;
            +        color:$black;
            +        font-size: 12px;
            +        text-transform: uppercase;
            +        letter-spacing: 2px;
            +        position: absolute;
            +        bottom: -10px;
            +        display: block !important;
            +        margin: 0 auto;
            +        max-width: 150px;
            +        left: 0;
            +        right: 0;
            +        font-weight: $headings-font-weight;
            +    }
            +    .pricing.pricing-v3{
            +        @media screen and (min-width:992px) {
            +            //margin-top: -40px;
            +        }
            +        .membership-add-to-purchase{
            +            background-color: $secondary;
            +            &:hover{
            +                background-color: $primary;
            +            }
            +        }
            +        .pricing-footer{
            +            //padding-bottom: $grid-gutter-width *2;
            +        }
            +    }   
            +    
            +}
            \ No newline at end of file
            diff --git a/assets/scss/opalestate/_single.scss b/assets/scss/opalestate/_single.scss
            new file mode 100755
            index 00000000..4be788f6
            --- /dev/null
            +++ b/assets/scss/opalestate/_single.scss
            @@ -0,0 +1,1065 @@
            +.property-date{
            +	display: inline-block;
            +}
            +
            +.entry-summary-tabs{
            +	margin-top: 62px;
            +}
            +.property-meta {
            +	flex-basis: 100%;
            +}
            +
            +.property-types-list,
            +.property-categories-list {
            +  display: inline-block;
            +  margin-right: $padding-base;
            +}
            +
            +.property-address {
            +	display: inline-block;
            +	margin-top: 12px;
            +	margin-right: $padding-base;
            +	.property-view-map {
            +		i {
            +			color: $body-color;
            +		}
            +		a {
            +			margin-right: 4px;
            +		}
            +	}
            +}
            +
            +.box-inner-summary{
            +	padding: $grid-gutter-width;
            +	@media screen and (max-width:767px){
            +		padding: $grid-gutter-width 0;
            +	}
            +}
            +
            +.opalestate-box{
            +	padding-bottom: $grid-gutter-width;
            +	@media screen and (min-width:768px){
            +		padding: $grid-gutter-width;
            +		border: 1px solid $border-color;
            +	}
            +	.opalestate_property{
            +		&:last-of-type{
            +			margin-bottom: 0;
            +		}
            +	}
            +}
            +.opalestate-sidebar-box{
            +	margin-bottom: $grid-gutter-width;
            +	@media screen and (min-width:768px){
            +		padding: $grid-gutter-width;
            +		border: 1px solid $border-color;
            +	}
            +	@media screen and (max-width:768px){
            +		margin-top: $grid-gutter-width;
            +	}
            +}
            +.property-information{
            +	ul.list-info {
            +		padding:0;
            +		margin-bottom: 0;
            +		li {
            +			list-style: none;
            +			
            +			h6 {
            +				margin-bottom: 0;
            +				flex: 1;
            +				color: $body-color;
            +			}
            +			a{
            +				color: inherit;
            +			}
            +			&:not(:last-child){
            +				div[class*="property-label-"]{
            +					border-bottom: 1px solid $border-color;
            +				}
            +			}
            +		}
            +		div[class*="property-label-"]{
            +			padding: 4px 0;
            +			overflow: hidden;
            +			display: flex;
            +			align-items: center;
            +			h6{
            +				line-height: 1;
            +			}
            +			i{
            +				width: $font-size-base;
            +				margin-right: $padding-base;
            +			}
            +		}
            +	}
            +}
            +
            +
            +// Amenity
            +.property-amenities, .property-facilities {
            +	.list-group-item-text {
            +		line-height: 23px;
            +		margin-top: 21px;
            +		
            +			i {
            +				margin-right: 2px;
            +			}
            +			div[class*="col-"]{
            +				line-height: 40px;
            +			}
            +			div.active {
            +				i {
            +					color: $secondary;
            +				}
            +			}
            +		}
            +}
            +.property-amenities{
            +	img{
            +		width: 15px;
            +		margin-right: 5px;
            +	}
            +}
            +// Attachments
            +.property-attachments{
            +	i{
            +		font-size:36px;
            +		margin-right: $padding-base;
            +		float:left;
            +	}
            +	a{
            +		vertical-align: top;
            +		line-height: 1;
            +		display: block;
            +		text-transform: capitalize;
            +		padding-bottom:5px;
            +	}
            +	.list-group-item-text{
            +		margin-top: 36px;
            +	}
            +}
            +//Single Property Map
            +.google-map-tabs{
            +	.opalestate-tab-head{
            +		margin: 0;
            +		background: transparent;
            +	}
            +	position: relative;
            +	.tab-item {
            +		&.active,&:hover {
            +		   background-color: $primary;
            +		   color: $white;
            +		}
            +		border: none;
            +		padding: 5px 10px;
            +		margin-right: 10px;
            +		color: $white;
            +		background-color: $secondary;
            +		font-weight: $font-weight-base;
            +	}
            +	.opalestate-tab-wrap{
            +		position: absolute;
            +		top: 10px;
            +		right: 50px;
            +		z-index: 2;
            +	}
            +}
            +
            +/// near by
            +#property-search-places {
            +		bottom: 25px;
            +		left: 10px;
            +		position: absolute;
            +		z-index: 1;
            +		.btn-map-search {
            +			cursor: pointer;
            +			background-color: $white;
            +			text-align: center;
            +			@include square(40px);
            +			position: relative;
            +			i {
            +				display: block;
            +				line-height: 40px;
            +				&.fa-hospital-o {
            +					color: #b3e180;
            +				}
            +				&.fa-plus-square {
            +					color: #ec8f73;
            +				}
            +				&.fa-graduation-cap {
            +					color: #8fbfe4;
            +				}
            +				&.fa-shopping-basket {
            +					color: #9d4cfa;
            +				}
            +				&.fa-subway {
            +					color: #fabd47;
            +				}
            +				&.fa-bank {
            +					color: #6eadfb;
            +				}
            +			}
            +			em{
            +				background:$primary;
            +				margin-left: 10px;
            +				font-size: 10px;
            +				color:#FFF;
            +				padding: 1px 3px;
            +			}
            +			span {
            +				width: 0;
            +				display: block;
            +				visibility: hidden;
            +				@include transition(.35s);
            +				position: absolute;
            +				left: 50%;
            +				top: 0;
            +				background-color: $white;
            +				line-height: 40px;
            +				padding: 0 10px;
            +				z-index: -1;
            +				@include opacity(0);
            +				font-size: 12px;
            +			}
            +			&:hover,
            +			&.active {
            +				span {
            +					visibility: visible;
            +					width: 200px;
            +					left: 100%;
            +					z-index: 1;
            +					@include opacity(1);
            +				}
            +			}
            +		}
            +	}
            +
            +
            +/// agent 
            +.agent-sidebar{
            +	@media screen and (min-width:992px){
            +		margin-top: -286px;
            +	}
            +}
            +.single-agent{
            +	margin-top: $grid-gutter-width;
            +}
            +.agent-address-map{
            +	border-top: none;
            +}
            +
            +//agency profile
            +.agency-preview{
            +	display: none;
            +}
            + 
            + 
            +.property-agency-contact{
            +	@media screen and (max-width:1024px){
            +		margin-top: $grid-gutter-width;
            +	}
            +	p{
            +		margin-bottom: 0;
            +	}
            +	.entry-title{
            +		margin-bottom: 6px;
            +	}
            +	.opalestate-social-icons{
            +		margin: 0 0 0 $padding-base;
            +		[class^="opalestate-social-"]{
            +			margin: 4px 0 0;
            +		}
            +	}
            +	.agency-top-meta{
            +		display: flex;
            +		flex-wrap: wrap;
            +		padding-bottom: 12px;
            +		margin-bottom: 20px;
            +		position: relative;
            +		
            +	}
            +	.agency-top-meta,.agency-excerpt{
            +		&::before{
            +			content: "";
            +			@media screen and (max-width:1024px){
            +				width: 100%;
            +				left: 0;
            +				right: auto;
            +			}
            +			width: calc( 100% + #{$grid-gutter-width});
            +			height: 1px;
            +			background-color: $border-color;
            +			bottom: 0;
            +			position: absolute;
            +			right: -$grid-gutter-width;
            +		}
            +	}
            +	.agency-top-info{
            +		flex: 1;
            +	}
            +	.agency-excerpt{
            +		padding-bottom: 20px;
            +		margin-bottom: 13px;
            +		position: relative;
            +	}
            +}
            +/**
            + * Single property
            + */
            +.opalestate-box-content{
            +	margin: $grid-gutter-width 0 0;
            +	@media screen and (min-width:768px){
            +		margin: $grid-gutter-width*2 0 0;
            +	}
            +}
            +
            +.opalestate-rows {
            +	.opal-row {
            +		display: flex;
            +		flex-flow: wrap;
            +	}
            +}
            +
            +.outbox-title{
            +	margin-bottom: $padding-base;
            +	display: inline-block;
            +	line-height: 1;
            +}
            +.property-single-info{
            +	display: flex;
            +    flex-wrap: wrap;
            +	align-items: flex-end;
            +	justify-content: space-between;
            +	margin-top: 40px;
            +	margin-bottom: 50px;
            +}
            +
            +.group-items{
            +	display: flex;
            +	align-items: center;
            +	flex-wrap: wrap;
            +	@media screen and (min-width:768px){
            +		flex: 1;
            +	}
            +	.entry-title{
            +		margin-bottom: 0;
            +	}
            +	.property-status{
            +		position: relative;
            +		display: flex;
            +		top: 0;
            +		left: 0;
            +		li{
            +			line-height: 14px;
            +		}
            +		span{
            +			margin-bottom: 0;
            +		}
            +	}
            +}
            +
            +//Swiper
            +.swiper-container{
            +	[class*="swiper-button-"]{
            +		display: block;
            +		color: $secondary;
            +		width: 62px;
            +		height: 62px;
            +		text-align: center;
            +		background-color: rgba(255, 255, 255, 0.8);
            +		transition: all .5s ease-in-out;
            +		background-size: 10px 20px;
            +		opacity: 0;
            +		&:hover{
            +			background-color: $white;
            +		}
            +	}
            +	.swiper-button-next{
            +		right: -62px;
            +	}
            +	.swiper-button-prev{
            +		left: -62px;
            +	}
            +	&:hover{
            +		[class*="swiper-button-"]{
            +			opacity: 1;
            +		}
            +		.swiper-button-next{
            +			right: 20px;
            +		}
            +		.swiper-button-prev{
            +			left: 20px;
            +		}
            +	}
            +}
            +
            +[class*="swiper-button-"]{
            +
            +}
            +
            +.swiper-pagination{
            +	display: none !important;
            +}
            +.opalestate-single-property {
            +	&.opalestate_property{
            +		
            +		border: none;
            +	} 
            +	.owl-thumb-wrapper{
            +		padding-top: 10px;
            +		.owl-item:not(:last-of-type){
            +			padding-right: 10px;
            +		}
            +	}
            +	 
            +	.entry-summary{
            +		@media screen and (min-width:768px){
            +			border: 1px solid $border-color;
            +			padding-bottom: 40px;
            +		}
            +		
            +	}
            +	.property-meta-list{
            +		border-bottom: 1px solid $border-color;
            +		padding: $grid-gutter-width $grid-gutter-width 0;
            +		@media screen and (max-width:767px){
            +			padding: $grid-gutter-width 0 0;
            +			border:none;
            +		}
            +		i{
            +			color: $secondary;
            +		}
            +		li:not(:last-child){
            +			margin-right: $grid-gutter-width;
            +		}
            +	}
            +	.entry-content{
            +		@media screen and (min-width:768px){
            +			padding: $grid-gutter-width $grid-gutter-width 0;
            +		}
            +	}
            +	.box-heading{
            +		line-height: 1;
            +		margin-bottom: 16px;
            +	}
            +	
            +}
            +
            +//Print single property
            +.opalestate-single-property--print{
            +	.table-responsive{
            +		table{
            +			tr{
            +				td:last-child,th:last-child{
            +					display: none;
            +				}
            +			}
            +		}
            +	}
            +	.opalestate-tab-head{
            +		display: none;
            +	}
            +	.opalestate-tab-content, .plan-name{
            +		display: block;
            +	}
            +}
            +
            +//Single Layout 2
            +.opalestate-single-property--version-2{
            +	.entry-summary{
            +		border: none;
            +		padding-bottom: 0;
            +	}
            +	.single-property-sidebar{
            +		.opalestate-box-content{
            +			&:first-of-type{
            +				margin-top: 0;
            +			}
            +		}
            +	}
            +}
            +
            +.opalestate-tab-content{
            +	.opalestate-box-content{
            +		&:first-of-type{
            +			margin-top: 28px;
            +		}
            +	}
            +}
            +.property-tab-content{
            +	@media screen and (min-width:768px){
            +		border: 1px solid $border-color;
            +	}
            +}
            +
            +//Single Layout 3
            +.opalestate-single-property--version-3{
            +	.property-single-info{
            +		margin-bottom: 0;
            +		display: block;
            +	}
            +	.single-price-content{
            +		.property-price{
            +			text-align: left;
            +			margin-bottom: 7px;
            +			span{
            +				display: inline;
            +			}
            +		}
            +	}
            +	
            +}
            +
            +
            +//Single Layout 5
            +.opalestate-single-property--version-5{
            +	.property-single-info{
            +		margin-bottom: 0;
            +		display: block;
            +	}
            +	.single-price-content{
            +		.property-price{
            +			text-align: left;
            +			margin-bottom: 7px;
            +			span{
            +				display: inline;
            +			}
            +		}
            +	}
            +	
            +}
            +
            +//yelp nearby
            +.opalestate-yelp-bussines_wrapper{
            +	&:not(:last-of-type){
            +		margin-bottom: $grid-gutter-width;
            +	}
            +}
            +.opalestate-yelp-unit{
            +	display: flex;
            +	flex-wrap: wrap;
            +	&:not(:last-of-type){
            +		margin-bottom: $grid-gutter-width;
            +	}
            +}
            +.opalestate-yelp-title{
            +	line-height: 1;
            +	padding-bottom: 20px;
            +	border-bottom: 1px solid $border-color;
            +	margin-bottom: $grid-gutter-width;
            +}
            +.opalestate-yelp-icon{
            +	display: none;
            +	width: $font-size-base;
            +	margin-right: $padding-base;
            +}
            +.opalestate-yelp-category{
            +	display: inline-block;
            +	margin-bottom: 0;
            +	line-height: 1;
            +}
            +.opalestate-yelp-unit__name{
            +	line-height: 1;
            +	margin-bottom: 9px;
            +	margin-right: $padding-base;
            +}
            +.opalestate-yelp-unit-distance{
            +	display: none;
            +	line-height: 1;
            +    margin: 10px 0;
            +}
            +.opalestate-yelp-unit__info{
            +	flex: 1;
            +}
            +.opalestate-yelp-unit__address{
            +	line-height: 1;
            +}
            +.opalestate-yelp-unit__avatar{
            +	width: 50px;
            +    height: 50px;
            +	margin-right: 20px;
            +	img{
            +		width: 100%;
            +		height: 100%;
            +	}
            +}
            +.opalestate-yelp-unit__ratings{
            +	.opalestate-rating__stars{
            +		margin-left: auto;
            +		span{
            +			&::before{
            +				color: #d32323;
            +			}
            +		}
            +	}
            +}
            +
            +//walkscores
            +.walkscores-logo{
            +	float: right;
            +    line-height: 24px;
            +    margin-bottom: $padding-base;
            +}
            +.walk_details{
            +	display: flex;
            +	align-items: center;
            +	flex-wrap: wrap;
            +	&:not(:last-of-type){
            +		margin-bottom: $grid-gutter-width;
            +	}
            +}
            +.text-holder{
            +	flex: 1;
            +	h6{
            +		margin-bottom: 0;
            +	}
            +}
            +.number-holder{
            +	margin-right: 10px;
            +}
            +.scores-label{
            +	margin-bottom: 0;
            +	line-height: 24px;
            +	width: 60px;
            +    height: 60px;
            +    text-align: center;
            +    border-radius: 50%;
            +    border: 2px solid $primary;
            +	color: $primary;
            +}
            +.walk-more-details{
            +	text-transform: capitalize;
            +}
            +.single-price-content{
            +	.property-price {
            +		padding-top: 17px;
            +		span{
            +			line-height: 1;
            +		}
            +		@media screen and (min-width:768px){
            +			text-align: right;
            +			.property-regular-price,.property-saleprice{
            +				font-size: 36px;
            +			}
            +			.property-regular-price.has-saleprice{
            +				font-size: 24px;
            +			}
            +			.property-before-price-label,.property-price-label{
            +				display: block;
            +			}
            +		}
            +		.property-price-label {
            +			margin-top: 12px;
            +		}
            +		.property-before-price-label{
            +			margin-bottom: 12px;
            +		}
            +	}
            +	.call-to-price{
            +		font-size: 18px;
            +		font-weight: 500;
            +		color: $headings-color;
            +	}
            +}
            +.property-meta-top{
            +	line-height: 52px;
            +	.property-meta-top__list{
            +		margin-bottom: 0;
            +		align-items: center;
            +		.property-meta-top__button{
            +			width: 52px;
            +			text-align: center;
            +			margin-right: 0;
            +		}
            +	}
            +	.list-inline__print{
            +		span{
            +			display: none;
            +		}
            +	}
            +	.list-inline__sku{
            +		@media screen and (max-width:767px){
            +			flex-basis: 100%;
            +		}
            +	}
            +	@media screen and (min-width:768px) {
            +		border-bottom: 1px solid $border-color;
            +		padding-left: $grid-gutter-width;
            +		.property-meta-top__list{
            +			justify-content: flex-end;
            +			li:first-child:not(.property-meta-top__button){
            +				flex: 1;
            +			}
            +		}
            +		.property-meta-top__button{
            +			border-left: 1px solid $border-color;
            +		}
            +		
            +	}
            +}
            +.property-sku{
            +	font-weight: $headings-font-weight;
            +	color: $headings-color;
            +}
            +
            +//Reviews
            +.opalestate-reviews{
            +	padding-top: 0;
            +	padding-bottom: 0;
            +	.comment-form-comment{
            +		margin-bottom: 10px;
            +	}
            +	#respond{
            +		padding: 0;
            +	}
            +}
            +.opalestate-rating-percent__item{
            +	display: flex;
            +	flex-wrap: wrap;
            +	margin: 11px 0;
            +	&:last-of-type{
            +		margin-bottom: 0;
            +	}
            +	&:first-of-type{
            +		margin-top: 0;
            +	}
            +}
            +.opalestate-rating-percent__label{
            +	line-height: 1;
            +	margin-right: 15px;
            +	margin-bottom: 0;
            +}
            +.opalestate-process-bar{
            +	display: flex;
            +    height: 5px;
            +    overflow: hidden;
            +    font-size: 13px;
            +	background-color: #eeeeee;
            +	flex: 1;
            +}
            +.opalestate-process-bar__item{
            +	text-align: center;
            +	background-color: $primary;
            +}
            +.opalestate-process-text{
            +	display: block;
            +	line-height: 1;
            +	margin-left: 17px;
            +	width: 34px;
            +}
            +.opalestate-rating-header{
            +	display: flex;
            +	flex-wrap: wrap;
            +	font-size: 13px;
            +	font-weight: 500;
            +	
            +	margin-bottom: 58px;
            +	@media screen and (min-width:768px){
            +		border-bottom: 1px solid $border-color;
            +	}
            +	& > div{
            +		
            +		padding-bottom: 26px;
            +		@media screen and (max-width:767px){
            +			flex-basis: 100%;
            +			padding: 30px 0 0;
            +			border: none;
            +		}
            +	}
            +}
            +.opalestate-rating-percent{
            +	padding-right: $grid-gutter-width;
            +	flex-basis: 38%;
            +	border-right: 1px solid $border-color;
            +	padding-top: $grid-gutter-width;
            +}
            +.opalestate-overall{
            +	padding-left: $grid-gutter-width;
            +	flex-basis: 62%;
            +	padding-top: 25px;
            +}
            +.opalestate-overall__info{
            +	display: flex;
            +	flex-wrap: wrap;
            +	margin-bottom: 21px;
            +}
            +.opalestate-overall__point{
            +	margin-right: 40px;
            +	.point-number{
            +		margin-bottom: 0;
            +		line-height: 1;
            +		color: $primary;
            +	}
            +}
            +.opalestate-overall__star{
            +	display: flex;
            +    flex-wrap: wrap;
            +    align-items: center;
            +	flex: 1;
            +	.opalestate-overall__heading{
            +		flex-basis: 100%;
            +		margin-bottom: 11px;
            +	}
            +	.opalestate-rating, .opalestate-overall__rating-count{
            +		margin-right: 5px;
            +	}
            +}
            +.opalestate-overall-features{
            +	display: flex;
            +	flex-wrap: wrap;
            +}
            +.opalestate-overall-features__item{
            +	line-height: 1;
            +	&:not(:last-of-type){
            +		margin-right: 53px;
            +	}
            +}
            +.opalestate-overall-features__label{
            +	margin-bottom: 0;
            +	text-transform: uppercase;
            +	margin-bottom: 11px;
            +}
            +.opalestate-overall-features__percent{
            +	color: $headings-color;
            +}
            +.commentlist{
            +	padding: 0;
            +	margin-bottom: 28px;
            +	margin-top: 58px;
            +	> li{
            +		padding-bottom: 22px;
            +		display: block;
            +		&:not(:last-of-type){
            +			margin-bottom: $grid-gutter-width;
            +			border-bottom: 1px solid $border-color;
            +		}
            +	}
            +}
            +.opalestate-noreviews{
            +	margin-bottom: 25px;
            +}
            +.comment_container{
            +	display: flex;
            +    flex-wrap: wrap;
            +	align-items: flex-start;
            +	p{
            +		margin-bottom: 0;
            +	}
            +	.avatar{
            +		width: 50px;
            +		border-radius: 50%;
            +		margin-right: 28px;
            +	}
            +	.comment-text{
            +		flex: 1;
            +	}
            +	.meta{
            +		margin-bottom: $padding-base;
            +		line-height: 1;
            +	}
            +	.opalestate-rating{
            +		display: inline-block;
            +	}
            +}
            +.opalestate-review__ratings{
            +	margin-bottom: 31px;
            +}
            +.opalestate-review__author{
            +	font-weight: 500;
            +	color: $headings-color;
            +}
            +.comment-form-rating{
            +	display: inline-block;
            +	@media screen and (min-width:480px) {
            +		width: 33.3333%;
            +	}
            +}
            +
            +//Virtual 360
            +.property-360-virtual-session{
            +	iframe{
            +		width: 100%;
            +		min-height: 500px;
            +		display: block;
            +	}
            +}
            +
            +//video
            +.property-video-session{
            + 	iframe{
            +		@media screen and (min-width:768px) {
            +			width: 100%;
            +			min-height: 400px;
            +		}
            +		display: block;
            +		height: auto;
            + 	}
            +}
            +
            +/*
            + * Preview layout
            + */
            +.property-preview-custom-size {
            +	position:relative;
            +	overflow: hidden;
            +	height: 580px;
            +	.property-preview-map, .opalestate-tab-content, iframe {
            +		height: 100%;
            +		width: 100%;
            +		border: none;
            +	}
            +}
            +.property-preview{
            +	.swiper-pagination-images{
            +		margin-top: 10px;
            +	}
            +}
            +.property-preview-street-map{
            +	height: 100%;
            +}
            +.property-abs-info {
            +	position:absolute;
            +	padding:$padding-base;
            +	bottom:10%;
            +	left:9%;
            +	background:$white;
            +	z-index:99
            +} 
            +.gallery-metro-preview {
            +	display:flex;
            +	height: 100%;
            +	a {
            +		display:block;
            +		width:100%;
            +		height:100%;
            +		background-size:cover;
            +		background-repeat:no-repeat;
            +		background-position: center center;
            +	}
            +	.no-image {
            +		background-color:$primary;	
            +
            +	}
            +	span {
            +		display:block;
            +		background-color:#000;
            +		width:100%;
            +		height:100%;
            +		@include opacity(0.7);
            +		color:#FFF;
            + 
            +		position:relative;
            +		em {
            +			
            +		}
            +	}
            +	.metro-big {
            +		width:50%;
            +
            +	}
            +	.metro-group-small {
            +		width:50%;
            +		display:flex;
            +		flex-wrap:wrap;
            +	}
            +	.metro-small {
            +		width:33%;
            +		height:auto;
            +		text-align: center;
            +	}
            +} 
            +//Mark Picture
            +.opalestate-swiper-wrap {
            +	position:relative;
            +}
            +
            +.swiper-slide {
            +	.thumb-nav {
            +		width:100%;
            +		height:100px;
            +		background-size:cover;
            +		background-repeat:no-repeat;
            +		background-position:center center
            +	}
            +}	
            +
            +.property-mark-pics-preview{
            +	.property-heading-top{
            +		position: absolute;
            +		bottom: 0;
            +		left: 50%;
            +		transform: translateX(-50%);
            +	}
            +	.property-single-info{
            +		margin-bottom: 46px;
            +	}
            +	.property-thumbnail{
            +		position: relative;
            +		&::before{
            +			content: "";
            +			position: absolute;
            +			width: 100%;
            +			height: 100%;
            +			background-color: rgba(0, 0, 0, 0.4);
            +			transition: all .5s ease-in-out;
            +		}
            +	}
            +	.entry-title, a, .property-single-info, .property-price > span:first-child{
            +		color: $white;
            +	}
            +}
            +
            +//Apartment
            +.property-apartments-session{
            +	padding-top: 6px;
            +}
            +.table-responsive{
            +	overflow-x: auto;
            +    min-height: 0.01%;
            +    table{
            +		table-layout: unset;
            +		text-align: center;
            +		margin-bottom: 0;
            +		th{
            +			padding: 14px 3px;
            +			border-style: solid;
            +			border-color: $border-color;
            +			border-width: 0 0 1px 0;
            +			font-weight: 500;
            +		}
            +		td{
            +			border:none;
            +			padding: 12px 3px 10px;
            +		}
            +		tbody{
            +			tr:nth-of-type(2n+2){
            +				background-color: #f8f8f8;
            +			}
            +		}
            +	}
            +	@media screen and (max-width: 767px){
            +		width: 100%;
            +		margin-bottom: 15px;
            +		overflow-y: hidden;
            +		border: 1px solid $border-color;
            +		position: relative;
            +		z-index: 30;
            +		table{
            +			width: 730px;
            +		}
            +	}
            +}
            +
            +//single agency
            +.agency-box-top{
            +	.agency-grid-style{
            +		.agency-info{
            +			border-bottom: none;
            +		}
            +	}
            +}
            +.opalestate_single_agency{
            +	padding-bottom: $grid-gutter-width;
            +}
            +
            diff --git a/assets/scss/opalestate/_styles.scss b/assets/scss/opalestate/_styles.scss
            new file mode 100755
            index 00000000..e8c0a388
            --- /dev/null
            +++ b/assets/scss/opalestate/_styles.scss
            @@ -0,0 +1,14 @@
            +.opalestate-note {
            +	font-size:90%;
            +	color:#888;
            +}
            +.list-inline {
            +    list-style: none;
            +    display: flex;
            +    flex-wrap: wrap;
            +    li{
            +        &:not(:last-child){
            +            margin-right: $grid-gutter-width;
            +        }
            +    }
            +}
            \ No newline at end of file
            diff --git a/assets/scss/opalestate/_vars.scss b/assets/scss/opalestate/_vars.scss
            new file mode 100755
            index 00000000..805e1721
            --- /dev/null
            +++ b/assets/scss/opalestate/_vars.scss
            @@ -0,0 +1,23 @@
            +$headings-font-weight: 500;
            +$input-height: 50px;
            +$input-padding-y: .65rem;
            +$input-padding-x: 1rem;
            +$input-line-height: $input-height;
            +
            +$primary:   #2f73e9 !default;
            +$secondary: #02ce76 !default;
            +$white	 :  #FFF !default;
            +
            +$headings-color:   #0a1938;
            +$border-color:     #ebebeb;
            +$box-shadow-base: 0px 2px 8px 4px rgba(0, 0, 0, 0.12);
            +
            +$padding-base:        ($grid-gutter-width/2);
            +$grid-gutter-width:   30px;
            +
            +
            +$price-color:red;
            +$link-hover-color: $primary;
            +$input-border-color: #ebebeb;
            +$body-color: #7e7e7e;
            +$body-color-light: #bbb;
            \ No newline at end of file
            diff --git a/assets/scss/submission.scss b/assets/scss/submission.scss
            new file mode 100755
            index 00000000..bcb1c04c
            --- /dev/null
            +++ b/assets/scss/submission.scss
            @@ -0,0 +1,302 @@
            +@import "bootstrap/variables";
            +@import "bootstrap/mixins";
            +
            +@import "bootstrap/grid";
            +@import "opalestate/vars";
            +
            +.cmb2-id-opalestate-ppt-enablemapview{
            +	p.cmb2-metabox-description{
            +		display: inline;
            +	}
            +}
            +.opalestate-submission-form {
            +	label {
            +		.required {
            +			color:red ;
            +		}
            +	}
            +	input.required {
            +		border: 1px solid rgb(255, 0, 0);
            +	}
            +	.opal-map-desc {
            +		display: none;
            +	}
            +	.cmb2-wrap{
            +		input.cmb2-datepicker{
            +			width: 100%;
            +		}
            +	}
            +	
            +}
            +
            +#property-thumbs-container {
            +	width:100%;
            +	clear:both;
            +}
            +
            +#property-thumbs-container .gallery-thumbnail{
            + 
            +	margin-bottom: 15px;
            +	position: relative;
            +	width:180px;
            +	height:180px;
            +}
            +
            +#property-thumbs-container .icon-delete{
            +	position: absolute;
            +	bottom: 6px;
            +	left: 0;
            +	z-index: 99;
            +	padding: 5px; 
            +	background: #CCC;
            +}
            +
            +
            +#property-thumbs-container .icon-featured{
            +	position: absolute;
            +	bottom: 6px;
            +	right: 0;
            +	z-index: 99;
            +	padding: 5px; 
            +	background: #CCC;
            +}
            +#property-thumbs-container .icon-featured .fa-star{
            +	color:#fc8826;
            +}
            +
            +
            +.media-drag-drop {
            +  background-color: #efefef;
            +  border: 2px dashed #dfdfdf;
            +  text-align: center;
            +  padding: 30px;
            +}
            +.media-drag-drop h4 {
            +  color: #8b9293;
            +  font-size: 18px;
            +  line-height: 18px;
            +  margin: 0 0 20px;
            +  font-weight: 400;
            +  text-transform: inherit;
            +  text-align: inherit;
            +}
            +.media-drag-drop .fa {
            +  margin-right: 8px;
            +}
            +.property-submission-form{
            +	margin-bottom: 80px;
            +	max-width: 90%;
            +    margin-left: auto;
            +	margin-right: auto;
            +	.alert{
            +		padding: $padding-base;
            +		p{
            +			margin-bottom: 0;
            +			a{
            +				padding: 0;
            +				background-color: transparent;
            +				text-transform: unset;
            +				font-weight: $headings-font-weight;
            +				color: $white;
            +				&:hover{
            +					color: $link-hover-color;
            +				}
            +			}
            +		}
            +		
            +	}
            +}
            +
            +//
            +
            +//Submission tab
            +.opalestate-submission-tab-head{
            +	display: flex;
            +	flex-wrap: wrap;
            +	margin-bottom: $grid-gutter-width;
            +	justify-content: center;
            +	.tab-item{
            +		color: $headings-color;
            +		padding: 0;
            +		border: none;
            +		position: relative;
            +		padding-right: 30px;
            +		@media screen and (max-width:1024px){
            +			padding-right: 20px;
            +		}
            +		@media screen and (max-width:992px){
            +			flex-basis: 25%;
            +			margin-bottom: 10px;
            +			&:last-of-type{
            +				&::before{
            +					content: none;
            +				}
            +			}
            +		}
            +		@media screen and (max-width:767px){
            +			flex-basis: 50%;
            +		}
            +		span{
            +			padding-bottom: 10px;
            +			display: inline-block;
            +			position: relative;
            +			&::before{
            +				content: "";
            +				position: absolute;
            +				width: 100%;
            +				height: 3px;
            +				bottom: 0;
            +				left: 0;
            +				background-color: #f0f0f0;
            +			}
            +		}
            +		&:last-of-type{
            +			padding-right: 0;
            +			&::after{
            +				width: 100%;
            +			}
            +		}
            +		&::before{
            +			content: "";
            +			position: absolute;
            +			width: 100%;
            +			height: 3px;
            +			bottom: 0;
            +			left: 0;
            +			background-color: #f0f0f0;
            +		}
            +		
            +		&.active{
            +			span::before{
            +				background-color: $primary;
            +			}
            +		}
            +		&.passed:not(.active){
            +			&::before{
            +				background-color: $primary;
            +			}
            +			span::before{
            +				background-color: transparent;
            +			}
            +		}
            +		&.passed.active ~ .passed{
            +			&::before{
            +				background-color: #f0f0f0;
            +			}
            +		}
            +	}
            +}
            +
            +.opalestate-submission-tab{
            +	.cmb-type-opal-map{
            +		@media screen and (max-width:767px) {
            +			.form-group{
            +				padding: 0 15px;
            +			}
            +			.opalestate-map-wrap ~ div{
            +				width: 100%;
            +			}
            +		}
            +	}
            +	.cmb-add-row{
            +		margin-top: 0;
            +	}
            +	.cmb-multicheck-toggle{
            +		font-style: italic;
            +		text-decoration: underline;
            +		cursor: pointer;
            +		transition: all .3s ease-in-out;
            +		&:hover{
            +			color: $link-hover-color;
            +		}
            +	}
            +	.cmb2-checkbox-list{
            +		li{
            +			@media screen and (min-width:768px) {
            +				flex-basis: 50%;
            +			}
            +			flex-basis: 100%;
            +			margin-right: 0;
            +			font-size: $font-size-base;
            +			line-height: 1;
            +			display: inline-block;
            +			position: relative;
            +			padding-left: 0;
            +			margin-bottom: $padding-base;
            +			margin-top: $padding-base;
            +			cursor: pointer;
            +			-webkit-user-select: none;
            +			-moz-user-select: none;
            +			-ms-user-select: none;
            +			user-select: none;
            +			img{
            +				width: $font-size-base;
            +				height: $font-size-base;
            +				vertical-align: top;
            +			}
            +			label{
            +				margin-bottom: 0;
            +				padding-left: 25px;
            +				cursor: pointer;
            +			}	
            +			input[type="checkbox"]{
            +				position: absolute;
            +				opacity: 0;
            +				cursor: pointer;
            +				&:checked ~ span.custom-checkbox-label{
            +					background-color: $primary;
            +					&::after{
            +						display: block;
            +					}
            +				}
            +			}
            +			.custom-checkbox-label{
            +				z-index: -1;
            +			}
            +		}
            +	}
            +	button.btn.submission-next-btn{
            +		position: relative;
            +		padding: 19px 25px 17px 20px;
            +		&::before{
            +			content: "\f138";
            +			font-family: Fontawesome;
            +			margin-right: 18px;
            +			padding-right: 20px;
            +		}
            +		&::after{
            +			content: "";
            +			width: 52px;
            +			position: absolute;
            +			top: 0;
            +			left: 0;
            +			height: 100%;
            +			background-color: transparent;
            +			-webkit-box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15);
            +			box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15);
            +		}
            +	}
            +	.submission-back-btn{
            +		position: relative;
            +		padding-left: 25px;
            +		padding-right: 20px;
            +		&::after{
            +			content: "\f137";
            +			font-family: Fontawesome;
            +			margin-left: 18px;
            +			padding-left: 20px;
            +		}
            +		&::before{
            +			content: "";
            +			width: 52px;
            +			position: absolute;
            +			top: 0;
            +			right: 0;
            +			height: 100%;
            +			background-color: transparent;
            +			-webkit-box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15);
            +			box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15);
            +			transform: rotate(180deg);
            +		}
            +	}
            +}
            diff --git a/assets/submission.css b/assets/submission.css
            new file mode 100755
            index 00000000..41579ba5
            --- /dev/null
            +++ b/assets/submission.css
            @@ -0,0 +1,431 @@
            +@media (min-width: 768px) {
            +  .opal-row, .row {
            +    margin-left: -15px;
            +    margin-right: -15px;
            +  }
            +  .opal-row .col-sm-1, .opal-row .col-sm-2, .opal-row .col-sm-3, .opal-row .col-sm-4, .opal-row .col-sm-5, .opal-row .col-sm-6, .opal-row .col-sm-7, .opal-row .col-sm-8, .opal-row .col-sm-9, .opal-row .col-sm-10, .opal-row .col-sm-11, .opal-row .col-sm-12, .row .col-sm-1, .row .col-sm-2, .row .col-sm-3, .row .col-sm-4, .row .col-sm-5, .row .col-sm-6, .row .col-sm-7, .row .col-sm-8, .row .col-sm-9, .row .col-sm-10, .row .col-sm-11, .row .col-sm-12 {
            +    float: left;
            +  }
            +  .opal-row .col-sm-1, .row .col-sm-1 {
            +    width: 8.33333%;
            +  }
            +  .opal-row .col-sm-2, .row .col-sm-2 {
            +    width: 16.66667%;
            +  }
            +  .opal-row .col-sm-3, .row .col-sm-3 {
            +    width: 25%;
            +  }
            +  .opal-row .col-sm-4, .row .col-sm-4 {
            +    width: 33.33333%;
            +  }
            +  .opal-row .col-sm-5, .row .col-sm-5 {
            +    width: 41.66667%;
            +  }
            +  .opal-row .col-sm-6, .row .col-sm-6 {
            +    width: 50%;
            +  }
            +  .opal-row .col-sm-7, .row .col-sm-7 {
            +    width: 58.33333%;
            +  }
            +  .opal-row .col-sm-8, .row .col-sm-8 {
            +    width: 66.66667%;
            +  }
            +  .opal-row .col-sm-9, .row .col-sm-9 {
            +    width: 75%;
            +  }
            +  .opal-row .col-sm-10, .row .col-sm-10 {
            +    width: 83.33333%;
            +  }
            +  .opal-row .col-sm-11, .row .col-sm-11 {
            +    width: 91.66667%;
            +  }
            +  .opal-row .col-sm-12, .row .col-sm-12 {
            +    width: 100%;
            +  }
            +  .opal-row .col-sm-1, .opal-row .col-sm-2, .opal-row .col-sm-3, .opal-row .col-sm-4, .opal-row .col-sm-5, .opal-row .col-sm-6, .opal-row .col-sm-7, .opal-row .col-sm-8, .opal-row .col-sm-9, .opal-row .col-sm-10, .opal-row .col-sm-11, .opal-row .col-sm-12, .row .col-sm-1, .row .col-sm-2, .row .col-sm-3, .row .col-sm-4, .row .col-sm-5, .row .col-sm-6, .row .col-sm-7, .row .col-sm-8, .row .col-sm-9, .row .col-sm-10, .row .col-sm-11, .row .col-sm-12 {
            +    position: relative;
            +    min-height: 1px;
            +    padding-left: 15px;
            +    padding-right: 15px;
            +  }
            +  .opal-row:before, .opal-row:after, .row:before, .row:after {
            +    content: " ";
            +    display: table;
            +  }
            +  .opal-row:after, .row:after {
            +    clear: both;
            +  }
            +}
            +@media (min-width: 992px) {
            +  .opal-row .col-md-1, .opal-row .col-md-2, .opal-row .col-md-3, .opal-row .col-md-4, .opal-row .col-md-5, .opal-row .col-md-6, .opal-row .col-md-7, .opal-row .col-md-8, .opal-row .col-md-9, .opal-row .col-md-10, .opal-row .col-md-11, .opal-row .col-md-12, .row .col-md-1, .row .col-md-2, .row .col-md-3, .row .col-md-4, .row .col-md-5, .row .col-md-6, .row .col-md-7, .row .col-md-8, .row .col-md-9, .row .col-md-10, .row .col-md-11, .row .col-md-12 {
            +    float: left;
            +  }
            +  .opal-row .col-md-1, .row .col-md-1 {
            +    width: 8.33333%;
            +  }
            +  .opal-row .col-md-2, .row .col-md-2 {
            +    width: 16.66667%;
            +  }
            +  .opal-row .col-md-3, .row .col-md-3 {
            +    width: 25%;
            +  }
            +  .opal-row .col-md-4, .row .col-md-4 {
            +    width: 33.33333%;
            +  }
            +  .opal-row .col-md-5, .row .col-md-5 {
            +    width: 41.66667%;
            +  }
            +  .opal-row .col-md-6, .row .col-md-6 {
            +    width: 50%;
            +  }
            +  .opal-row .col-md-7, .row .col-md-7 {
            +    width: 58.33333%;
            +  }
            +  .opal-row .col-md-8, .row .col-md-8 {
            +    width: 66.66667%;
            +  }
            +  .opal-row .col-md-9, .row .col-md-9 {
            +    width: 75%;
            +  }
            +  .opal-row .col-md-10, .row .col-md-10 {
            +    width: 83.33333%;
            +  }
            +  .opal-row .col-md-11, .row .col-md-11 {
            +    width: 91.66667%;
            +  }
            +  .opal-row .col-md-12, .row .col-md-12 {
            +    width: 100%;
            +  }
            +  .opal-row .col-md-1, .opal-row .col-md-2, .opal-row .col-md-3, .opal-row .col-md-4, .opal-row .col-md-5, .opal-row .col-md-6, .opal-row .col-md-7, .opal-row .col-md-8, .opal-row .col-md-9, .opal-row .col-md-10, .opal-row .col-md-11, .opal-row .col-md-12, .row .col-md-1, .row .col-md-2, .row .col-md-3, .row .col-md-4, .row .col-md-5, .row .col-md-6, .row .col-md-7, .row .col-md-8, .row .col-md-9, .row .col-md-10, .row .col-md-11, .row .col-md-12 {
            +    position: relative;
            +    min-height: 1px;
            +    padding-left: 15px;
            +    padding-right: 15px;
            +  }
            +}
            +@media (min-width: 1200px) {
            +  .opal-row .col-lg-1, .opal-row .col-lg-2, .opal-row .col-lg-3, .opal-row .col-lg-4, .opal-row .col-lg-5, .opal-row .col-lg-6, .opal-row .col-lg-7, .opal-row .col-lg-8, .opal-row .col-lg-9, .opal-row .col-lg-10, .opal-row .col-lg-11, .opal-row .col-lg-12, .row .col-lg-1, .row .col-lg-2, .row .col-lg-3, .row .col-lg-4, .row .col-lg-5, .row .col-lg-6, .row .col-lg-7, .row .col-lg-8, .row .col-lg-9, .row .col-lg-10, .row .col-lg-11, .row .col-lg-12 {
            +    float: left;
            +  }
            +  .opal-row .col-lg-1, .row .col-lg-1 {
            +    width: 8.33333%;
            +  }
            +  .opal-row .col-lg-2, .row .col-lg-2 {
            +    width: 16.66667%;
            +  }
            +  .opal-row .col-lg-3, .row .col-lg-3 {
            +    width: 25%;
            +  }
            +  .opal-row .col-lg-4, .row .col-lg-4 {
            +    width: 33.33333%;
            +  }
            +  .opal-row .col-lg-5, .row .col-lg-5 {
            +    width: 41.66667%;
            +  }
            +  .opal-row .col-lg-6, .row .col-lg-6 {
            +    width: 50%;
            +  }
            +  .opal-row .col-lg-7, .row .col-lg-7 {
            +    width: 58.33333%;
            +  }
            +  .opal-row .col-lg-8, .row .col-lg-8 {
            +    width: 66.66667%;
            +  }
            +  .opal-row .col-lg-9, .row .col-lg-9 {
            +    width: 75%;
            +  }
            +  .opal-row .col-lg-10, .row .col-lg-10 {
            +    width: 83.33333%;
            +  }
            +  .opal-row .col-lg-11, .row .col-lg-11 {
            +    width: 91.66667%;
            +  }
            +  .opal-row .col-lg-12, .row .col-lg-12 {
            +    width: 100%;
            +  }
            +  .opal-row .col-lg-1, .opal-row .col-lg-2, .opal-row .col-lg-3, .opal-row .col-lg-4, .opal-row .col-lg-5, .opal-row .col-lg-6, .opal-row .col-lg-7, .opal-row .col-lg-8, .opal-row .col-lg-9, .opal-row .col-lg-10, .opal-row .col-lg-11, .opal-row .col-lg-12, .row .col-lg-1, .row .col-lg-2, .row .col-lg-3, .row .col-lg-4, .row .col-lg-5, .row .col-lg-6, .row .col-lg-7, .row .col-lg-8, .row .col-lg-9, .row .col-lg-10, .row .col-lg-11, .row .col-lg-12 {
            +    position: relative;
            +    min-height: 1px;
            +    padding-left: 15px;
            +    padding-right: 15px;
            +  }
            +}
            +
            +.cmb2-id-opalestate-ppt-enablemapview p.cmb2-metabox-description {
            +  display: inline;
            +}
            +
            +.opalestate-submission-form label .required {
            +  color: red;
            +}
            +.opalestate-submission-form input.required {
            +  border: 1px solid red;
            +}
            +.opalestate-submission-form .opal-map-desc {
            +  display: none;
            +}
            +.opalestate-submission-form .cmb2-wrap input.cmb2-datepicker {
            +  width: 100%;
            +}
            +
            +#property-thumbs-container {
            +  width: 100%;
            +  clear: both;
            +}
            +
            +#property-thumbs-container .gallery-thumbnail {
            +  margin-bottom: 15px;
            +  position: relative;
            +  width: 180px;
            +  height: 180px;
            +}
            +
            +#property-thumbs-container .icon-delete {
            +  position: absolute;
            +  bottom: 6px;
            +  left: 0;
            +  z-index: 99;
            +  padding: 5px;
            +  background: #CCC;
            +}
            +
            +#property-thumbs-container .icon-featured {
            +  position: absolute;
            +  bottom: 6px;
            +  right: 0;
            +  z-index: 99;
            +  padding: 5px;
            +  background: #CCC;
            +}
            +
            +#property-thumbs-container .icon-featured .fa-star {
            +  color: #fc8826;
            +}
            +
            +.media-drag-drop {
            +  background-color: #efefef;
            +  border: 2px dashed #dfdfdf;
            +  text-align: center;
            +  padding: 30px;
            +}
            +
            +.media-drag-drop h4 {
            +  color: #8b9293;
            +  font-size: 18px;
            +  line-height: 18px;
            +  margin: 0 0 20px;
            +  font-weight: 400;
            +  text-transform: inherit;
            +  text-align: inherit;
            +}
            +
            +.media-drag-drop .fa {
            +  margin-right: 8px;
            +}
            +
            +.property-submission-form {
            +  margin-bottom: 80px;
            +  max-width: 90%;
            +  margin-left: auto;
            +  margin-right: auto;
            +}
            +.property-submission-form .alert {
            +  padding: 15px;
            +}
            +.property-submission-form .alert p {
            +  margin-bottom: 0;
            +}
            +.property-submission-form .alert p a {
            +  padding: 0;
            +  background-color: transparent;
            +  text-transform: unset;
            +  font-weight: 500;
            +  color: #FFF;
            +}
            +.property-submission-form .alert p a:hover {
            +  color: #2f73e9;
            +}
            +
            +.opalestate-submission-tab-head {
            +  display: flex;
            +  flex-wrap: wrap;
            +  margin-bottom: 30px;
            +  justify-content: center;
            +}
            +.opalestate-submission-tab-head .tab-item {
            +  color: #0a1938;
            +  padding: 0;
            +  border: none;
            +  position: relative;
            +  padding-right: 30px;
            +}
            +@media screen and (max-width: 1024px) {
            +  .opalestate-submission-tab-head .tab-item {
            +    padding-right: 20px;
            +  }
            +}
            +@media screen and (max-width: 992px) {
            +  .opalestate-submission-tab-head .tab-item {
            +    flex-basis: 25%;
            +    margin-bottom: 10px;
            +  }
            +  .opalestate-submission-tab-head .tab-item:last-of-type::before {
            +    content: none;
            +  }
            +}
            +@media screen and (max-width: 767px) {
            +  .opalestate-submission-tab-head .tab-item {
            +    flex-basis: 50%;
            +  }
            +}
            +.opalestate-submission-tab-head .tab-item span {
            +  padding-bottom: 10px;
            +  display: inline-block;
            +  position: relative;
            +}
            +.opalestate-submission-tab-head .tab-item span::before {
            +  content: "";
            +  position: absolute;
            +  width: 100%;
            +  height: 3px;
            +  bottom: 0;
            +  left: 0;
            +  background-color: #f0f0f0;
            +}
            +.opalestate-submission-tab-head .tab-item:last-of-type {
            +  padding-right: 0;
            +}
            +.opalestate-submission-tab-head .tab-item:last-of-type::after {
            +  width: 100%;
            +}
            +.opalestate-submission-tab-head .tab-item::before {
            +  content: "";
            +  position: absolute;
            +  width: 100%;
            +  height: 3px;
            +  bottom: 0;
            +  left: 0;
            +  background-color: #f0f0f0;
            +}
            +.opalestate-submission-tab-head .tab-item.active span::before {
            +  background-color: #2f73e9;
            +}
            +.opalestate-submission-tab-head .tab-item.passed:not(.active)::before {
            +  background-color: #2f73e9;
            +}
            +.opalestate-submission-tab-head .tab-item.passed:not(.active) span::before {
            +  background-color: transparent;
            +}
            +.opalestate-submission-tab-head .tab-item.passed.active ~ .passed::before {
            +  background-color: #f0f0f0;
            +}
            +
            +@media screen and (max-width: 767px) {
            +  .opalestate-submission-tab .cmb-type-opal-map .form-group {
            +    padding: 0 15px;
            +  }
            +  .opalestate-submission-tab .cmb-type-opal-map .opalestate-map-wrap ~ div {
            +    width: 100%;
            +  }
            +}
            +.opalestate-submission-tab .cmb-add-row {
            +  margin-top: 0;
            +}
            +.opalestate-submission-tab .cmb-multicheck-toggle {
            +  font-style: italic;
            +  text-decoration: underline;
            +  cursor: pointer;
            +  transition: all .3s ease-in-out;
            +}
            +.opalestate-submission-tab .cmb-multicheck-toggle:hover {
            +  color: #2f73e9;
            +}
            +.opalestate-submission-tab .cmb2-checkbox-list li {
            +  flex-basis: 100%;
            +  margin-right: 0;
            +  font-size: 15px;
            +  line-height: 1;
            +  display: inline-block;
            +  position: relative;
            +  padding-left: 0;
            +  margin-bottom: 15px;
            +  margin-top: 15px;
            +  cursor: pointer;
            +  -webkit-user-select: none;
            +  -moz-user-select: none;
            +  -ms-user-select: none;
            +  user-select: none;
            +}
            +@media screen and (min-width: 768px) {
            +  .opalestate-submission-tab .cmb2-checkbox-list li {
            +    flex-basis: 50%;
            +  }
            +}
            +.opalestate-submission-tab .cmb2-checkbox-list li img {
            +  width: 15px;
            +  height: 15px;
            +  vertical-align: top;
            +}
            +.opalestate-submission-tab .cmb2-checkbox-list li label {
            +  margin-bottom: 0;
            +  padding-left: 25px;
            +  cursor: pointer;
            +}
            +.opalestate-submission-tab .cmb2-checkbox-list li input[type="checkbox"] {
            +  position: absolute;
            +  opacity: 0;
            +  cursor: pointer;
            +}
            +.opalestate-submission-tab .cmb2-checkbox-list li input[type="checkbox"]:checked ~ span.custom-checkbox-label {
            +  background-color: #2f73e9;
            +}
            +.opalestate-submission-tab .cmb2-checkbox-list li input[type="checkbox"]:checked ~ span.custom-checkbox-label::after {
            +  display: block;
            +}
            +.opalestate-submission-tab .cmb2-checkbox-list li .custom-checkbox-label {
            +  z-index: -1;
            +}
            +.opalestate-submission-tab button.btn.submission-next-btn {
            +  position: relative;
            +  padding: 19px 25px 17px 20px;
            +}
            +.opalestate-submission-tab button.btn.submission-next-btn::before {
            +  content: "\f138";
            +  font-family: Fontawesome;
            +  margin-right: 18px;
            +  padding-right: 20px;
            +}
            +.opalestate-submission-tab button.btn.submission-next-btn::after {
            +  content: "";
            +  width: 52px;
            +  position: absolute;
            +  top: 0;
            +  left: 0;
            +  height: 100%;
            +  background-color: transparent;
            +  -webkit-box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15);
            +  box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15);
            +}
            +.opalestate-submission-tab .submission-back-btn {
            +  position: relative;
            +  padding-left: 25px;
            +  padding-right: 20px;
            +}
            +.opalestate-submission-tab .submission-back-btn::after {
            +  content: "\f137";
            +  font-family: Fontawesome;
            +  margin-left: 18px;
            +  padding-left: 20px;
            +}
            +.opalestate-submission-tab .submission-back-btn::before {
            +  content: "";
            +  width: 52px;
            +  position: absolute;
            +  top: 0;
            +  right: 0;
            +  height: 100%;
            +  background-color: transparent;
            +  -webkit-box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15);
            +  box-shadow: 3px 0px 7px 0px rgba(0, 0, 0, 0.15);
            +  transform: rotate(180deg);
            +}
            diff --git a/changelog.txt b/changelog.txt
            new file mode 100755
            index 00000000..118d965e
            --- /dev/null
            +++ b/changelog.txt
            @@ -0,0 +1,2 @@
            += 1.0.0 - 2019-09-03 =
            +* Release.
            diff --git a/config.rb b/config.rb
            new file mode 100755
            index 00000000..ba647168
            --- /dev/null
            +++ b/config.rb
            @@ -0,0 +1,25 @@
            +
            +# Require any additional compass plugins here.
            +
            +# Set this to the root of your project when deployed:
            +http_path = "/"
            +css_dir = "assets"
            +sass_dir = "assets/scss"
            +images_dir = "images"
            +javascripts_dir = "js"
            +
            +# You can select your preferred output style here (can be overridden via the command line):
            +# output_style = :expanded or :nested or :compact or :compressed
            +
            +# To enable relative paths to assets via compass helper functions. Uncomment:
            +# relative_assets = true
            +
            +# To disable debugging comments that display the original location of your selectors. Uncomment:
            + line_comments = false
            +
            +
            +# If you prefer the indented syntax, you might want to regenerate this
            +# project again passing --syntax sass, or you can uncomment this:
            +# preferred_syntax = :sass
            +# and then run:
            +# sass-convert -R --from sass --to sass sass scss && rm -rf sass && mv scss sass
            diff --git a/inc/.DS_Store b/inc/.DS_Store
            new file mode 100755
            index 0000000000000000000000000000000000000000..85240704541b4bf23ba559b4cded65278e288a34
            GIT binary patch
            literal 10244
            zcmeHMYiv|S6h5c4^xmP++fugM(w4Q4P@q6dpB5UnEzf|`(3X~$Ww(2UE4z2=-rW|c
            z#VWofpoyqJ{G%j_7+>fQQGXbJh|y?N5|JMo--#y1SAvfpdS>SCrrov}6$Q<`n>%Ob
            zoSA!P&i&4OGqV7IEwMlqfCm5+y1CRcC>iJCc7Bh!Qfv()iPRpz>~D{l!LYe~OkGFe
            zc);<1;{nG5jt3kMTpk`E&gPdgMM@`iJm7f1@j$`@e17oI&863t!%~W=gA%a?Ael;P
            zaZ#T30iun^mR?&9ODUStGv)39?WSmNF;F%qyN6dN>9yssl(IRXYz}C@8SNbkinmic
            zkEjmlmC{Ka4>%qe>jA!ZPXiwWAOyy!{W}k|bm)a3SuOhMV2#+_bE`@=1N;!78WGA-
            z4gY}E=MRScWPRP=7c{JBW##*rGAT7}a=M~0g-vB!+joQq+M~W`%xdvPHuF-OFS^5T
            z=R3mTU?T7HZ!q+M9xbOeY({;CsYgU(BcM~2EnS8g2oJP`V`jh-&uNziMNt*CM{^Gj
            z*4EcncxoDIhblaS_4SpMudW*!QkC4Ys;1T3Lc8}2-Y~THFm;wLv}YE`l;uQvgmU8y
            zHE8v>%Aux&;zKX!l|5Q^KaF5rU(^Vj)&@Odk?hejEgJRe-muvg(Yd{=
            zHyn(GOshxB>h%SCV?ke3Zw?0AjXk>69o2V5d2W*xjzn8U#U4$IS^9dN>KXm|GOBHL
            z8}v9{O+)oW#*F+~CFS!M)i3s*nK~^~W7#aHtKYB;e^BonFapsX8+}%5j+3+ZRHX_-@9xo&rN%x_#DGorh-5=D{EDsUI6+Vjem0KN9AaDcZA
            z2#dSGU92dZxxO``Q!3T0%spGxd`gE!y_1ia%PLgOQag6i7nDsGvMNOjsGUKdUk^%E
            z4XabMHELJC^qN#=vqnYj?hS`R)M-oVn%qkj?X+?YfALzM6KW5g3ChyCcnMi26KJK?JCm%Ss(%V~55oyKMTmP3&ccU;wyz0kKf`aBhMAa)
            zd02pjScJ224$i|0oKHAwz$>v4TLsouVjHf<4(!AY*n>XoCA{f`w?2%Zg;5;B8wKw6
            z;eI@T2k{=f7mwi4B+RW$!rZa(F_**#>CjK{V-lByi4Xp_T#z)(KjHxw=YhoR{Ey82
            z&jDz1`?DYW?xp|nt%>m1+HW|;8SvGnTv^N7BR&&bLKK8f?C88
            z*DP4bTr${2q;XYs4RghVUIZ9dHe@qbVk)7a6WwfbU4RZ;t_kQs<2#T%D25tX0&TF7
            zP&`09a0u=P9+4;E1$Y(Sg16ya5t$#uC-50D!8dRoeu7`%S5zWs@Q}|+1OpeC`W1)CK
            z4#+1cmR?dQj-rC{imJNB-o*F2xKt3I^pnXzQiQ^pKubT9m+N-T^5o~+RKSa+W%*1)
            zK?b}yr;My|GGGhxEBR7Jnb7fVf80CX3fJk0pZ%
            z5qF$c9j_4D&cR27v9I8JIFCRGn?|dQB0^X(me4w50by*BSZg$mz}eNb)@Y-(#wJ>8
            zY$XoZL1^2FLE?Y`T665dLE?bh@OHx7U4*$q_y9hLhlv9oNy6KB9FT;!r1^g|X*eav
            z1C9qSXAex0o%8VX|K$_^|9?3T!Redh0mlP>(*u~gtbJJvJtThQko-J;*6yKu8{Pck
            z^@gPsO(@}2xLzE`Q-L4Hi<1`8#m`x|-D}qymXb7d{p)`QIQxHR|NocIf|C}(|Iz*b
            E?`7HGi2wiq
            
            literal 0
            HcmV?d00001
            
            diff --git a/inc/admin/agency/class-agency.php b/inc/admin/agency/class-agency.php
            new file mode 100755
            index 00000000..ddba2db9
            --- /dev/null
            +++ b/inc/admin/agency/class-agency.php
            @@ -0,0 +1,156 @@
            +ID) && $post->ID ){
            +					OpalEstate_Agency::update_data_from_user( $related_id );
            +				}
            +			}
            +		}
            +	}
            +
            +	/**
            +	 *
            +	 */
            +	public function metaboxes_fields( $prefix = '' ){
            + 
            +		if ( ! $prefix ) {
            +			$prefix = OPALESTATE_AGENCY_PREFIX;
            +		}
            +
            +		$fields =  array(
            +			
            +			
            +			
            +			array(
            +			    'name'     => esc_html__('Gallery' ,'opalestate-pro'),
            +			    'desc'     => esc_html__('Select one, to add new you create in location of estate panel','opalestate-pro'),
            +			    'id'       => $prefix."gallery",
            +			    'type'     => 'file_list',
            +			) ,
            +			 
            +			array(
            +				'name' => esc_html__( 'slogan', 'opalestate-pro' ),
            +				'id'   => "{$prefix}slogan",
            +				'type' => 'text'
            +			)
            +		);
            +
            +		return apply_filters( 'opalestate_postype_agency_metaboxes_fields' , $fields );
            +	}
            +
            +	/**
            +	 *
            +	 */
            +	public function metaboxes( ){
            +
            +		global $pagenow; 
            +
            +		if( ($pagenow == 'post.php' || $pagenow == 'post-new.php') ) {
            +		
            +			$prefix = OPALESTATE_AGENCY_PREFIX;
            +
            +			$metabox = new Opalestate_Agency_MetaBox(); 
            +			
            +			$fields = $this->metaboxes_fields(); 
            +			$fields = array_merge_recursive( $fields , 
            +				$metabox->get_office_fields( $prefix ),  
            +				$metabox->get_address_fields( $prefix )
            +			);
            +
            +
            +			$box_options = array(
            +				'id'           => $prefix . 'edit',
            +				'title'        => esc_html__( 'Metabox', 'opalestate-pro' ),
            +				'object_types' => array( 'opalestate_agency' ),
            +				'show_names'   => true,
            +			);
            +
            +			// Setup meta box
            +			$cmb = new_cmb2_box( $box_options );
            +
            +			// Setting tabs
            +			$tabs_setting           = array(
            +				'config' => $box_options,
            +				'layout' => 'vertical', // Default : horizontal
            +				'tabs'   => array()
            +			);
            +
            +
            +			$tabs_setting['tabs'][] = array(
            +				'id'     => 'p-general',
            +				'icon'	 => 'dashicons-admin-home',
            +				'title'  => esc_html__( 'General', 'opalestate-pro' ),
            +				'fields' => $fields
            +			);
            +
            +			$tabs_setting['tabs'][] = array(
            +				'id'     => 'p-socials',
            +				'icon'	 => 'dashicons-admin-home',
            +				'title'  => esc_html__( 'Socials', 'opalestate-pro' ),
            +				'fields' => $metabox->get_social_fields( $prefix )
            +			);
            +
            +
            +			$tabs_setting['tabs'][] = array(
            +				'id'     => 'p-target',
            +				'icon'	 => 'dashicons-admin-tools',
            +				'title'  => esc_html__( 'Team', 'opalestate-pro' ),
            +				'fields' => $metabox->metaboxes_target()
            +			);
            +			// Set tabs
            +			$cmb->add_field( array(
            +				'id'   => '__tabs',
            +				'type' => 'tabs',
            +				'tabs' => $tabs_setting
            +			) );
            +		}
            +	}
            +}
            +new Opalestate_Admin_Agency();
            diff --git a/inc/admin/agent/class-agent.php b/inc/admin/agent/class-agent.php
            new file mode 100755
            index 00000000..95c000fa
            --- /dev/null
            +++ b/inc/admin/agent/class-agent.php
            @@ -0,0 +1,123 @@
            +
            + * @copyright  Copyright (C) 2019 wpopal.com. All Rights Reserved.
            + * @license    GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
            + *
            + * @website  http://www.wpopal.com
            + * @support  http://www.wpopal.com/support/forum.html
            + */
            +
            +if ( ! defined( 'ABSPATH' ) ) {
            +	exit; // Exit if accessed directly
            +}
            +
            +class Opalestate_Admin_Agent {
            +
            +	/**
            +	 * Auto update meta information to post from user data updated or created
            +	 */
            +	public function __construct() {
            +
            +		add_action( 'cmb2_admin_init', [ $this, 'metaboxes' ] );
            +		add_action( 'save_post', [ $this, 'save_post' ], 10, 3 );
            +
            +		add_action( 'user_register', [ $this, 'on_update_user' ], 10, 1 );
            +		add_action( 'profile_update', [ $this, 'on_update_user' ], 10, 1 );
            +	}
            +
            +	/**
            +	 * Auto update meta information to post from user data updated or created
            +	 */
            +	public function on_update_user() {
            +		if ( isset( $_POST['user_id'] ) && (int) $_POST['user_id'] && isset( $_POST['role'] ) ) {
            +			if ( $_POST['role'] == 'opalestate_agent' ) {
            +				$user_id    = absint( $_POST['user_id'] );
            +				$related_id = get_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'related_id', true );
            +				$post       = get_post( $related_id );
            +
            +				if ( isset( $post->ID ) && $post->ID ) {
            +					OpalEstate_Agent::update_data_from_user( $related_id );
            +				}
            +			}
            +		}
            +	}
            +
            +	/**
            +	 *
            +	 */
            +	public function metaboxes() {
            +		global $pagenow;
            +		if ( ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) ) {
            +			$prefix = OPALESTATE_AGENT_PREFIX;
            +
            +			$metabox = new Opalestate_Agent_MetaBox();
            +
            +			// echo '
            ' . print_r( $metabox->get_social_fields( $prefix ) ,1 );die;
            +			$box_options = [
            +				'id'           => $prefix . 'edit',
            +				'title'        => esc_html__( 'Metabox', 'opalestate-pro' ),
            +				'object_types' => [ 'opalestate_agent' ],
            +				'show_names'   => true,
            +			];
            +
            +			// Setup meta box
            +			$cmb = new_cmb2_box( $box_options );
            +
            +			// Setting tabs
            +			$tabs_setting = [
            +				'config' => $box_options,
            +				'layout' => 'vertical', // Default : horizontal
            +				'tabs'   => [],
            +			];
            +
            +			$tabs_setting['tabs'][] = [
            +				'id'     => 'p-general',
            +				'icon'   => 'dashicons-admin-home',
            +				'title'  => esc_html__( 'General', 'opalestate-pro' ),
            +				'fields' => $metabox->metaboxes_admin_fields(),
            +			];
            +
            +			$tabs_setting['tabs'][] = [
            +				'id'     => 'p-socials',
            +				'icon'   => 'dashicons-admin-home',
            +				'title'  => esc_html__( 'Socials', 'opalestate-pro' ),
            +				'fields' => $metabox->get_social_fields( $prefix ),
            +			];
            +
            +			$tabs_setting['tabs'][] = [
            +				'id'     => 'p-prices-target',
            +				'icon'   => 'dashicons-admin-tools',
            +				'title'  => esc_html__( 'Target Search', 'opalestate-pro' ),
            +				'fields' => $metabox->metaboxes_target(),
            +			];
            +			// Set tabs
            +			$cmb->add_field( [
            +				'id'   => '__tabs',
            +				'type' => 'tabs',
            +				'tabs' => $tabs_setting,
            +			] );
            +		}
            +	}
            +
            +	public function save_post( $post_id, $post, $update ) {
            +		///
            +		$post_type = get_post_type( $post_id );
            +		if ( $post_type == 'opalestate_agent' ) {
            +			if ( isset( $_POST[ OPALESTATE_AGENT_PREFIX . 'user_id' ] ) && absint( $_POST[ OPALESTATE_AGENT_PREFIX . 'user_id' ] ) ) {
            +
            +				$user_id = absint( $_POST[ OPALESTATE_AGENT_PREFIX . 'user_id' ] );
            +				update_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'related_id', $post_id );
            +
            +				OpalEstate_Agent::update_user_data( $user_id );
            +			}
            +
            +		}
            +	}
            +}
            +
            +new Opalestate_Admin_Agent();
            diff --git a/inc/admin/class-admin.php b/inc/admin/class-admin.php
            new file mode 100755
            index 00000000..53f9f290
            --- /dev/null
            +++ b/inc/admin/class-admin.php
            @@ -0,0 +1,101 @@
            +
            + * @copyright  Copyright (C) 2019 wpopal.com. All Rights Reserved.
            + * @license    GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
            + *
            + * @website  http://www.wpopal.com
            + * @support  http://www.wpopal.com/support/forum.html
            + */
            +
            +if ( ! defined( 'ABSPATH' ) ) {
            +	exit; // Exit if accessed directly
            +}
            +
            +/**
            + * @Class Wpopal_Core_Setup
            + *
            + * Entry point class to setup load all files and init working on frontend and process something logic in admin
            + */
            +class Opalestate_Admin {
            +	/**
            +	 * Opalestate_Admin constructor.
            +	 */
            +	public function __construct() {
            +		add_action( 'init', [ $this, 'setup' ] );
            +		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
            +	}
            +
            +	/**
            +	 * enqueue editor.js for edit mode
            +	 */
            +	public function enqueue_scripts() {
            +		wp_enqueue_style( 'opalestate-admin', OPALESTATE_PLUGIN_URL . 'assets/admin.css', [], '3.0.3' );
            +
            +		$suffix = '';
            +		wp_enqueue_style( 'select2', OPALESTATE_PLUGIN_URL . 'assets/3rd/select2/css/select2.min.css', null, '1.3' );
            +		wp_enqueue_script( 'select2', OPALESTATE_PLUGIN_URL . 'assets/3rd/select2/js/select2.min.js', null, '1.3', true );
            +
            +		wp_enqueue_script( 'opalestate-country-select', OPALESTATE_PLUGIN_URL . 'assets/js/country-select.js', [ 'jquery' ], null, true );
            +		wp_enqueue_script( 'opalestate-admin', OPALESTATE_PLUGIN_URL . 'assets/js/admin' . $suffix . '.js', [ 'jquery' ], null, true );
            +	}
            +
            +	/**
            +	 * Include all files from supported plugins.
            +	 */
            +	public function setup() {
            +		$this->includes( [
            +			'cron-jobs-functions.php',
            +			'agent/class-agent.php',
            +			'property/class-property.php',
            +			'agency/class-agency.php',
            +			'rating/class-rating.php',
            +			'class-user.php',
            +		] );
            +
            +		/// 
            +		$this->includes( [
            +			'settings/base.php',
            +			'settings/api_keys.php',
            +			'settings/email.php',
            +			'settings/3rd_party.php',
            +			'settings/searcharea.php',
            +			'settings/general.php',
            +			'settings/property.php',
            +		] );
            +
            +		// 
            +
            +		// Get it started
            +		$Opalestate_Settings = new Opalestate_Plugin_Settings();
            +
            +	}
            +
            +	/**
            +	 * Include list of collection files
            +	 *
            +	 * @var array $files
            +	 */
            +	public function includes( $files ) {
            +		foreach ( $files as $file ) {
            +			$this->_include( $file );
            +		}
            +	}
            +
            +	/**
            +	 * include single file if found
            +	 *
            +	 * @var string $file
            +	 */
            +	private function _include( $file = '' ) {
            +		$file = OPALESTATE_PLUGIN_DIR . 'inc/admin/' . $file;
            +		if ( file_exists( $file ) ) {
            +			include_once $file;
            +		}
            +	}
            +}
            +
            +new Opalestate_Admin();
            diff --git a/inc/admin/class-api-keys-table.php b/inc/admin/class-api-keys-table.php
            new file mode 100755
            index 00000000..362e59d9
            --- /dev/null
            +++ b/inc/admin/class-api-keys-table.php
            @@ -0,0 +1,327 @@
            + esc_html__( 'API Key', 'opalestate-pro' ),     // Singular name of the listed records
            +			'plural'   => esc_html__( 'API Keys', 'opalestate-pro' ),    // Plural name of the listed records
            +			'ajax'     => false                       // Does this table support ajax?
            +		) );
            +
            +		$this->query();
            +	}
            +
            +	/**
            +	 * This function renders most of the columns in the list table.
            +	 *
            +	 * @access public
            +	 * @since  1.1
            +	 *
            +	 * @param array $item Contains all the data of the keys
            +	 * @param string $column_name The name of the column
            +	 *
            +	 * @return string Column Name
            +	 */
            +	public function column_default( $item, $column_name ) {
            +		return $item[ $column_name ];
            +	}
            +
            +	/**
            +	 * Displays the public key rows
            +	 *
            +	 * @access public
            +	 * @since  1.1
            +	 *
            +	 * @param array $item Contains all the data of the keys
            +	 * @param string $column_name The name of the column
            +	 *
            +	 * @return string Column Name
            +	 */
            +	public function column_key( $item ) {
            +		return '';
            +	}
            +
            +	/**
            +	 * Displays the token rows
            +	 *
            +	 * @access public
            +	 * @since  1.1
            +	 *
            +	 * @param array $item Contains all the data of the keys
            +	 * @param string $column_name The name of the column
            +	 *
            +	 * @return string Column Name
            +	 */
            +	public function column_token( $item ) {
            +		return '';
            +	}
            +
            +	/**
            +	 * Displays the secret key rows
            +	 *
            +	 * @access public
            +	 * @since  1.1
            +	 *
            +	 * @param array $item Contains all the data of the keys
            +	 * @param string $column_name The name of the column
            +	 *
            +	 * @return string Column Name
            +	 */
            +	public function column_secret( $item ) {
            +		return '';
            +	}
            +
            +	/**
            +	 * Renders the column for the user field
            +	 *
            +	 * @access public
            +	 * @since  1.1
            +	 * @return void
            +	 */
            +	public function column_user( $item ) {
            +
            +		$actions = array();
            +
            +		if ( apply_filters( 'opalestate_api_log_requests', true ) ) {
            +			$actions['view'] = sprintf(
            +				'%s',
            +				esc_url( add_query_arg( array(
            +					'view'      => 'api_requests',
            +					'post_type' => 'opalestate_forms',
            +					'page'      => 'opalestate-reports',
            +					'tab'       => 'logs',
            +					's'         => $item['email']
            +				), 'edit.php' ) ),
            +				esc_html__( 'View API Log', 'opalestate-pro' )
            +			);
            +		}
            +
            +		$actions['reissue'] = sprintf(
            +			'%s',
            +			esc_url( wp_nonce_url( add_query_arg( array(
            +				'user_id'          => $item['id'],
            +				'opalestate_action'      => 'process_api_key',
            +				'opalestate_api_process' => 'regenerate'
            +			) ), 'opalestate-api-nonce' ) ),
            +			esc_html__( 'Reissue', 'opalestate-pro' )
            +		);
            +		$actions['revoke']  = sprintf(
            +			'%s',
            +			esc_url( wp_nonce_url( add_query_arg( array(
            +				'user_id'          => $item['id'],
            +				'opalestate_action'      => 'process_api_key',
            +				'opalestate_api_process' => 'revoke'
            +			) ), 'opalestate-api-nonce' ) ),
            +			esc_html__( 'Revoke', 'opalestate-pro' )
            +		);
            +
            +		$actions = apply_filters( 'opalestate_api_row_actions', array_filter( $actions ) );
            +
            +		return sprintf( '%1$s %2$s', $item['user'], $this->row_actions( $actions ) );
            +	}
            +
            +	/**
            +	 * Retrieve the table columns
            +	 *
            +	 * @access public
            +	 * @since  1.1
            +	 * @return array $columns Array of all the list table columns
            +	 */
            +	public function get_columns() {
            +		$columns = array(
            +			'user'   => esc_html__( 'Username'    , 'opalestate-pro' ),
            +			'key'    => esc_html__( 'Public Key'  , 'opalestate-pro' ),
            +			'token'  => esc_html__( 'Token'		  , 'opalestate-pro' ),
            +			'secret' => esc_html__( 'Secret Key'  , 'opalestate-pro' )
            +		);
            +
            +		return $columns;
            +	}
            +
            +	/**
            +	 * Generate the table navigation above or below the table
            +	 *
            +	 * @since 3.1.0
            +	 * @access protected
            +	 * @param string $which
            +	 */
            +	protected function display_tablenav( $which ) {
            +		if ( 'top' === $which ) {
            +			wp_nonce_field( 'bulk-' . $this->_args['plural'] );
            +			}
            +	?>
            +		
            + +
            + bulk_actions( $which ); ?> +
            + extra_tablenav( $which ); + $this->pagination( $which ); + ?> + +
            +
            + + + + + html->ajax_user_search(); ?> + + 'opalestate_user_secret_key', + 'number' => $this->per_page, + 'offset' => $this->per_page * ( $this->get_paged() - 1 ) + ) ); + $keys = array(); + + foreach ( $users as $user ) { + $keys[ $user->ID ]['id'] = $user->ID; + $keys[ $user->ID ]['email'] = $user->user_email; + $keys[ $user->ID ]['user'] = '' . $user->user_login . ''; + + $keys[ $user->ID ]['key'] = OpalEstate()->api->get_user_public_key( $user->ID ); + $keys[ $user->ID ]['secret'] = OpalEstate()->api->get_user_secret_key( $user->ID ); + $keys[ $user->ID ]['token'] = OpalEstate()->api->get_token( $user->ID ); + } + + return $keys; + } + + + /** + * Retrieve count of total users with keys + * + * @access public + * @since 1.1 + * @return int + */ + public function total_items() { + global $wpdb; + + if ( ! get_transient( 'opalestate_total_api_keys' ) ) { + $total_items = $wpdb->get_var( "SELECT count(user_id) FROM $wpdb->usermeta WHERE meta_value='opalestate_user_secret_key'" ); + + set_transient( 'opalestate_total_api_keys', $total_items, 60 * 60 ); + } + + return get_transient( 'opalestate_total_api_keys' ); + } + + /** + * Setup the final data for the table + * + * @access public + * @since 1.1 + * @return void + */ + public function prepare_items() { + $columns = $this->get_columns(); + + $hidden = array(); // No hidden columns + $sortable = array(); // Not sortable... for now + + $this->_column_headers = array( $columns, $hidden, $sortable, 'id' ); + + $data = $this->query(); + + $total_items = $this->total_items(); + + $this->items = $data; + + $this->set_pagination_args( array( + 'total_items' => $total_items, + 'per_page' => $this->per_page, + 'total_pages' => ceil( $total_items / $this->per_page ) + ) + ); + } +} diff --git a/inc/admin/class-user.php b/inc/admin/class-user.php new file mode 100755 index 00000000..62738e33 --- /dev/null +++ b/inc/admin/class-user.php @@ -0,0 +1,187 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + + +class OpalEstate_Admin_User{ + + /** + * + */ + public function __construct( ){ + + add_action( 'cmb2_admin_init', array( $this, 'register_user_profile_metabox') ); + add_action( 'personal_options', array( $this, 'show_message_user_profile' ) ); + + } + + /** + * + */ + public function show_message_user_profile(){ + + $user_id = isset( $_GET['user_id'] ) ? intval( $_GET['user_id'] ) : 0; + $roles = opalestate_user_roles_by_user_id( $user_id ); + + if( $roles ): + if( in_array( 'opalestate_agency', $roles) ): + $agency_id = get_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'related_id', true ); + if( !$agency_id ){ + return ; + } + $link = get_edit_post_link( $agency_id ); + ?> +
            +

            Opal Estate Agency and click here to update Agency profile', 'opalestate-pro'), $link ); ?>

            +
            + +
            +

            Opal Estate Agent and click here to update Agent profile', 'opalestate-pro'), $link ); ?>

            +
            + + $prefix . 'edit', + 'title' => esc_html__( 'Metabox', 'opalestate-pro' ), + 'object_types' => array( 'user' ), + 'show_names' => true, + ); + + $cmb = new_cmb2_box( $box_options ); + + // Setting tabs + $tabs_setting = array( + 'config' => $box_options, + 'layout' => 'vertical', // Default : horizontal + 'tabs' => array() + ); + + + $tabs_setting['tabs'][] = array( + 'id' => 'p-general', + 'icon' => 'dashicons-admin-home', + 'title' => esc_html__( 'General', 'opalestate-pro' ), + 'fields' => $this->get_base_fields() + ); + + $tabs_setting['tabs'][] = array( + 'id' => 'p-socials', + 'icon' => 'dashicons-admin-home', + 'title' => esc_html__( 'Socials', 'opalestate-pro' ), + 'fields' => $metabox->get_social_fields( $prefix ), + ); + + + // Set tabs + $cmb->add_field( array( + 'id' => '__tabs', + 'type' => 'tabs', + 'tabs' => $tabs_setting + ) ); + + /** + * Metabox for the user profile screen + */ + $cmb_user = new_cmb2_box( array( + 'id' => $prefix . 'edit', + 'title' => esc_html__( 'User Profile Metabox', 'cmb2' ), // Doesn't output for user boxes + 'object_types' => array( 'user' ), // Tells CMB2 to use user_meta vs post_meta + 'show_names' => true, + 'new_user_section' => 'add-new-user', // where form will show on new user page. 'add-existing-user' is only other valid option. + ) ); + + $fields = $this->extra_info_fields(); + foreach( $fields as $field ){ + $cmb_user->add_field( $field ); + } + } + } + + public function get_base_fields(){ + $prefix = OPALESTATE_USER_PROFILE_PREFIX; + + $metabox = new Opalestate_User_MetaBox(); + $fields = array_merge_recursive( + $metabox->get_base_fields( $prefix ), + $metabox->get_job_fields( $prefix ) , + $metabox->get_address_fields( $prefix ) + ); + + return $fields; + } + /** + * + */ + public function extra_info_fields(){ + + + $prefix = OPALESTATE_USER_PROFILE_PREFIX; + + $management = array(); + + + $admin_fields = array(); + $admin_fields[] = array( + 'id' => "{$prefix}block_submission", + 'name' => esc_html__( 'Block Submssion', 'opalestate-pro' ), + 'type' => 'checkbox', + 'description' => esc_html__( 'Disable Submssion Functions to not allow submit property', 'opalestate-pro' ), + 'before_row' => '
            ' + + ); + $admin_fields[] = array( + 'id' => "{$prefix}block_submission_msg", + 'name' => esc_html__( 'Block Submssion Message', 'opalestate-pro' ), + 'type' => 'textarea', + 'description' => esc_html__( 'Show message for disabled user', 'opalestate-pro' ), + ); + $management = array_merge_recursive( $admin_fields, $management ); + + + return $management; + } +} + +new OpalEstate_Admin_User(); diff --git a/inc/admin/cron-jobs-functions.php b/inc/admin/cron-jobs-functions.php new file mode 100755 index 00000000..e69de29b diff --git a/inc/admin/functions.php b/inc/admin/functions.php new file mode 100755 index 00000000..b09f1c49 --- /dev/null +++ b/inc/admin/functions.php @@ -0,0 +1,599 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * Wrapper function around cmb2_get_option + * + * @param string $key Options array key + * + * @return mixed Option value + * @since 0.1.0 + * + */ +function opalestate_get_option( $key = '', $default = false ) { + global $opalestate_options; + $value = ! empty( $opalestate_options[ $key ] ) ? $opalestate_options[ $key ] : $default; + $value = apply_filters( 'opalestate_get_option', $value, $key, $default ); + + return apply_filters( 'opalestate_get_option_' . $key, $value, $key, $default ); +} + +/** + * Update an option + * + * Updates an opalestate setting value in both the db and the global variable. + * Warning: Passing in an empty, false or null string value will remove + * the key from the opalestate_options array. + * + * @param string $key The Key to update + * @param string|bool|int $value The value to set the key to + * + * @return boolean True if updated, false if not. + * @since 1.0 + * + */ +function opalestate_update_option( $key = '', $value = false ) { + + // If no key, exit + if ( empty( $key ) ) { + return false; + } + + if ( empty( $value ) ) { + $remove_option = opalestate_delete_option( $key ); + + return $remove_option; + } + + // First let's grab the current settings + $options = get_option( 'opalestate_settings' ); + + // Let's let devs alter that value coming in + $value = apply_filters( 'opalestate_update_option', $value, $key ); + + // Next let's try to update the value + $options[ $key ] = $value; + $did_update = update_option( 'opalestate_settings', $options ); + + // If it updated, let's update the global variable + if ( $did_update ) { + global $opalestate_options; + $opalestate_options[ $key ] = $value; + } + + return $did_update; +} + +/** + * Remove an option + * + * Removes an opalestate setting value in both the db and the global variable. + * + * @param string $key The Key to delete + * + * @return boolean True if updated, false if not. + * @since 1.0 + * + */ +function opalestate_delete_option( $key = '' ) { + + // If no key, exit + if ( empty( $key ) ) { + return false; + } + + // First let's grab the current settings + $options = get_option( 'opalestate_settings' ); + + // Next let's try to update the value + if ( isset( $options[ $key ] ) ) { + + unset( $options[ $key ] ); + + } + + $did_update = update_option( 'opalestate_settings', $options ); + + // If it updated, let's update the global variable + if ( $did_update ) { + global $opalestate_options; + $opalestate_options = $options; + } + + return $did_update; +} + + +/** + * Get Settings + * + * Retrieves all Opalestate plugin settings + * + * @return array Opalestate settings + * @since 1.0 + */ +function opalestate_get_settings() { + + $settings = get_option( 'opalestate_settings' ); + + return (array) apply_filters( 'opalestate_get_settings', $settings ); + +} + +/** + * Gateways Callback + * + * Renders gateways fields. + * + * @return void + * @global $opalestate_options Array of all the Opalestate Options + * @since 1.0 + * + */ +function opalestate_enabled_gateways_callback( $field_object, $escaped_value, $object_id, $object_type, $field_type_object ) { + + $id = $field_type_object->field->args['id']; + $field_description = $field_type_object->field->args['desc']; + $gateways = opalestate_get_payment_gateways(); + + echo '
              '; + + foreach ( $gateways as $key => $option ) : + + if ( is_array( $escaped_value ) && array_key_exists( $key, $escaped_value ) ) { + $enabled = '1'; + } else { + $enabled = null; + } + + echo '
            •  '; + echo '
            • '; + + endforeach; + + if ( $field_description ) { + echo '

              ' . $field_description . '

              '; + } + + echo '
            '; + + +} + +/** + * Gateways Callback (drop down) + * + * Renders gateways select menu + * + * @param $field_object , $escaped_value, $object_id, $object_type, $field_type_object Arguments passed by CMB2 + * + * @return void + * @since 1.0 + * + */ +function opalestate_default_gateway_callback( $field_object, $escaped_value, $object_id, $object_type, $field_type_object ) { + + $id = $field_type_object->field->args['id']; + $field_description = $field_type_object->field->args['desc']; + $gateways = opalestate_get_enabled_payment_gateways(); + + echo ''; + + echo '

            ' . $field_description . '

            '; + +} + +/** + * Opalestate Title + * + * Renders custom section titles output; Really only an
            because CMB2's output is a bit funky + * + * @param $field_object , $escaped_value, $object_id, $object_type, $field_type_object + * + * @return void + * @since 1.0 + * + */ +function opalestate_title_callback( $field_object, $escaped_value, $object_id, $object_type, $field_type_object ) { + + $id = $field_type_object->field->args['id']; + $title = $field_type_object->field->args['name']; + $field_description = $field_type_object->field->args['desc']; + + echo '
            '; + +} + +/** + * Gets a number of posts and displays them as options + * + * @param array $query_args Optional. Overrides defaults. + * @param bool $force Force the pages to be loaded even if not on settings + * + * @return array An array of options that matches the CMB2 options array + * @see: https://github.com/WebDevStudios/CMB2/wiki/Adding-your-own-field-types + */ +function opalestate_cmb2_get_post_options( $query_args, $force = false ) { + + $post_options = [ '' => '' ]; // Blank option + + if ( ( ! isset( $_GET['page'] ) || 'opalestate-settings' != $_GET['page'] ) && ! $force ) { + return $post_options; + } + + $args = wp_parse_args( $query_args, [ + 'post_type' => 'page', + 'numberposts' => 10, + ] ); + + $posts = get_posts( $args ); + + if ( $posts ) { + foreach ( $posts as $post ) { + + $post_options[ $post->ID ] = $post->post_title; + + } + } + + return $post_options; +} + + +/** + * Modify CMB2 Default Form Output + * + * @param string @args + * + * @since 1.0 + */ + +add_filter( 'cmb2_get_metabox_form_format', 'opalestate_modify_cmb2_form_output', 10, 3 ); + +function opalestate_modify_cmb2_form_output( $form_format, $object_id, $cmb ) { + + //only modify the opalestate settings form + if ( 'opalestate_settings' == $object_id && 'options_page' == $cmb->cmb_id ) { + + return '
            %3$s
            '; + } + + return $form_format; + +} + + +/** + * Opalestate License Key Callback + * + * @description Registers the license field callback for EDD's Software Licensing + * @param array $field_object , $escaped_value, $object_id, $object_type, $field_type_object Arguments passed by CMB2 + * + * @return void + * @since 1.0 + * + */ +if ( ! function_exists( 'opalestate_license_key_callback' ) ) { + function opalestate_license_key_callback( $field_object, $escaped_value, $object_id, $object_type, $field_type_object ) { + + $id = $field_type_object->field->args['id']; + $field_description = $field_type_object->field->args['desc']; + $license_status = get_option( $field_type_object->field->args['options']['is_valid_license_option'] ); + $field_classes = 'regular-text opalestate-license-field'; + $type = empty( $escaped_value ) ? 'text' : 'password'; + + if ( $license_status === 'valid' ) { + $field_classes .= ' opalestate-license-active'; + } + + $html = $field_type_object->input( [ + 'class' => $field_classes, + 'type' => $type, + ] ); + + //License is active so show deactivate button + if ( $license_status === 'valid' ) { + $html .= ''; + } else { + //This license is not valid so delete it + opalestate_delete_option( $id ); + } + + $html .= ''; + + wp_nonce_field( $id . '-nonce', $id . '-nonce' ); + + echo $html; + } +} + + +/** + * Display the API Keys + * + * @return void + * @since 2.0 + */ +function opalestate_api_keys_callback() { + if ( ! current_user_can( 'manage_opalestate_settings' ) ) { + return; + } + + do_action( 'opalestate_tools_api_keys_keys_before' ); + + require_once OPALESTATE_PLUGIN_DIR . 'inc/admin/class-api-keys-table.php'; + + $keys_table_list = new Opalestate_API_Keys_Table(); + $keys_table_list->prepare_items(); + + echo ''; + echo ''; + echo ''; + + $keys_table_list->views(); + $keys_table_list->search_box( esc_html__( 'Search Key', 'opalestate-pro' ), 'key' ); + $keys_table_list->display(); + ?> + + +

            + Opalestate REST API to retrieve donation data in JSON or XML for external applications or devices, such as Zapi_keyser.', + 'opalestate-pro' ), + 'https://wpopal.com/opalestate/documentation/opalestate-api_keys-reference/', + 'https://wpopal.com/addons/opalestate/' + ); ?> +

            + + + 'attachment', + 'post_status' => 'inherit', + 'date_query' => [ + 'column' => 'post_date', + 'before' => date( 'Y-m-d', strtotime( '-1 days' ) ), + ], + 'meta_query' => [ + [ + 'key' => '_pending_to_use_', + 'value' => 1, + 'compare' => '>=', + ], + ], + ] + ); + // clean up per day + if ( $query->have_posts() ) { + while ( $query->have_posts() ) { + $query->the_post(); + wp_delete_attachment( get_the_ID() ); + } + } + wp_reset_postdata(); +} + +/** + * Searches for users via ajax and returns a list of results + * + * @return void + * @since 1.0 + * + */ +function opalestate_ajax_search_agencies() { + if ( current_user_can( 'manage_opalestate_settings' ) ) { + $search_query = trim( $_GET['q'] ); + + $agents_objects = Opalestate_Query::get_agencies( [ + 'posts_per_page' => -1, + 's' => $search_query, + ] ); + + $agents = []; + if ( ! empty( $agents_objects->posts ) && is_array( $agents_objects->posts ) ) { + foreach ( $agents_objects->posts as $object ) { + $agents[] = [ + 'id' => $object->ID, + 'name' => $object->post_title, + 'avatar_url' => 'https://avatars1.githubusercontent.com/u/9919?v=4', + 'full_name' => $object->post_title, + 'description' => 'okokok', + ]; + } + } + $output = [ + 'total_count' => count( $agents ), + 'items' => $agents, + 'incomplete_results' => false, + ]; + echo json_encode( $output ); + } + die(); +} + +add_action( 'wp_ajax_opalestate_search_agencies', 'opalestate_ajax_search_agencies' ); + + +/** + * Searches for users via ajax and returns a list of results + * + * @return void + * @since 1.0 + * + */ +function opalestate_ajax_search_agents() { + if ( current_user_can( 'manage_opalestate_settings' ) ) { + $search_query = trim( $_GET['q'] ); + + $agents_objects = Opalestate_Query::get_agents( [ + 'posts_per_page' => -1, + 's' => $search_query, + ] ); + + $agents = []; + if ( ! empty( $agents_objects->posts ) && is_array( $agents_objects->posts ) ) { + foreach ( $agents_objects->posts as $object ) { + $agents[] = [ + 'id' => $object->ID, + 'name' => $object->post_title, + 'avatar_url' => 'https://avatars1.githubusercontent.com/u/9919?v=4', + 'full_name' => $object->post_title, + 'description' => 'okokok', + ]; + } + } + $output = [ + 'total_count' => count( $agents ), + 'items' => $agents, + 'incomplete_results' => false, + ]; + echo json_encode( $output ); + } + die(); +} + +add_action( 'wp_ajax_opalestate_search_agents', 'opalestate_ajax_search_agents' ); + + +/** + * Searches for users via ajax and returns a list of results + * + * @return void + * @since 1.0 + * + */ +function opalestate_ajax_search_users() { + + if ( current_user_can( 'manage_opalestate_settings' ) ) { + + $search_query = trim( $_GET['q'] ); + + $get_users_args = [ + 'number' => 9999, + 'search' => $search_query . '*', + ]; + + if ( ! empty( $exclude ) ) { + $exclude_array = explode( ',', $exclude ); + $get_users_args['exclude'] = $exclude_array; + } + + $get_users_args = apply_filters( 'opalestate_search_users_args', $get_users_args ); + + $found_users = apply_filters( 'opalestate_ajax_found_users', get_users( $get_users_args ), $search_query ); + + $user_list = '
              '; + if ( $found_users ) { + foreach ( $found_users as $user ) { + $user_list .= '
            • ' . esc_html( $user->user_login ) . '
            • '; + } + } else { + $user_list .= '
            • ' . esc_html__( 'No users found', 'opalestate-pro' ) . '
            • '; + } + $user_list .= '
            '; + + echo json_encode( [ 'results' => $user_list ] ); + + } + die(); +} + +add_action( 'wp_ajax_opalestate_search_users', 'opalestate_ajax_search_users' ); + +function opalestate_ajax_search_username() { + + $search_query = trim( $_POST['user_name'] ); + $user = get_userdatabylogin( $search_query ); + + $output = []; + + if ( $user ) { + $data = $user->data; + $data->author_link = get_author_posts_url( $user->data->ID ); + $data->avatar = get_avatar_url( $user->data->ID ); + $output['message'] = esc_html__( 'We could find this user', 'opalestate-pro' ); + $output['status'] = true; + $output['user'] = $data; + } else { + $output['message'] = esc_html__( 'We could not find this user', 'opalestate-pro' ); + $output['status'] = false; + } + + echo json_encode( $output ); + exit; + +} + +add_action( 'wp_ajax_opalestate_ajax_search_username', 'opalestate_ajax_search_username' ); \ No newline at end of file diff --git a/inc/admin/property/class-property.php b/inc/admin/property/class-property.php new file mode 100755 index 00000000..17e904eb --- /dev/null +++ b/inc/admin/property/class-property.php @@ -0,0 +1,163 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Admin_Property { + /** + * @var $tab + */ + private $tab; + + /** + * Opalestate_Admin_Property constructor. + */ + public function __construct() { + + add_filter( 'cmb2_admin_init', [ $this, 'metaboxes' ] ); + + add_action( 'transition_opalestate_property_status', [ $this, 'process_publish_property' ], 10, 1 ); + /* property column */ + add_filter( 'manage_opalestate_property_posts_columns', [ $this, 'columns' ] ); + add_action( 'manage_opalestate_property_posts_custom_column', [ $this, 'custom_columns' ], 10, 2 ); + + add_action( 'admin_menu', [ $this, 'remove_meta_boxes' ] ); + + // add_action( 'transition_post_status', array( __CLASS__, 'save_post' ), 10, 3 ); + } + /** + * + */ + public static function save_post( $new_status, $old_status, $post ){ + if ( $new_status == 'publish' && $post->post_type == "opalestate_property" ) { + $user_id = $post->post_author; + $user = get_user_by( 'id', $user_id ); + if ( ! is_object( $user ) ) { + $from_name = opalestate_get_option( 'from_name' ); + $from_email = opalestate_get_option( 'from_email' ); + $subject = opalestate_get_option( 'publish_submission_email_subject' ); + + $headers = sprintf( "From: %s <%s>\r\n Content-type: text/html", $from_name, $from_email ); + + $property_link = get_permalink( $post ); + $tags = [ "{first_name}", "{last_name}", "{property_link}" ]; + $values = [ $user->first_name, $user->last_name, $property_link ]; + + $body = opalestate_get_option( 'publish_submission_email_body' ); + $body = html_entity_decode( $body ); + $message = str_replace( $tags, $values, $body ); + + return wp_mail( $user->user_email, $subject, $message, $headers ); + } + } + } + + /** + * + */ + public function metaboxes() { + + global $pagenow; + if ( ( $pagenow == 'post.php' || $pagenow == 'post-new.php' ) ) { + $metabox = new Opalestate_Property_MetaBox(); + + return $metabox->register_admin_fields(); + } + } + + + private function add_fields_to_tab( $fields, $tab ) { + + foreach ( $fields as $field ) { + $field['tab'] = $tab; + $field['render_row_cb'] = [ 'CMB2_Tabs', 'tabs_render_row_cb' ]; + + $this->tab->add_field( $field ); + + } + } + + /** + * + */ + public function columns( $columns ) { + $comments = $columns['comments']; + unset( $columns['author'], $columns['date'], $columns['comments'] ); + $columns['featured'] = esc_html__( 'Featured', 'opalestate-pro' ); + $columns['sku'] = esc_html__( 'Sku', 'opalestate-pro' ); + $columns['address'] = esc_html__( 'Address', 'opalestate-pro' ); + $columns['comments'] = $comments; + $columns['author'] = esc_html__( 'Author', 'opalestate-pro' ); + $columns['date'] = esc_html__( 'Date', 'opalestate-pro' ); + + return $columns; + } + + /** + * + */ + public function custom_columns( $column, $post_id ) { + $property = new Opalestate_Property( $post_id ); + $nonce = wp_create_nonce( 'opalestate_property' ); + switch ( $column ) { + case 'featured': + if ( $property->featured ) { + $url = add_query_arg( [ + 'action' => 'opalestate_remove_feature_property', + 'property_id' => $post_id, + 'nonce' => $nonce, + ], admin_url( 'admin-ajax.php' ) ); + echo ''; + echo ''; + echo ''; + } else { + $url = add_query_arg( [ + 'action' => 'opalestate_set_feature_property', + 'property_id' => $post_id, + 'nonce' => $nonce, + ], admin_url( 'admin-ajax.php' ) ); + echo ''; + echo ''; + echo ''; + } + break; + + case 'sku': + if ( $property->sku ) { + echo sprintf( '%s', $property->sku ); + } + break; + + case 'address': + if ( $property->address ) { + echo sprintf( '%s', $property->address ); + } + break; + + default: + # code... + break; + } + } + + public function remove_meta_boxes() { + remove_meta_box( 'authordiv', 'opalestate_property', 'normal' ); + } + +} + +new Opalestate_Admin_Property(); +?> diff --git a/inc/admin/rating/class-rating.php b/inc/admin/rating/class-rating.php new file mode 100755 index 00000000..dd4ebf9a --- /dev/null +++ b/inc/admin/rating/class-rating.php @@ -0,0 +1,101 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Admin_Rating { + /** + * Opalestate_Admin_Rating constructor. + */ + public function __construct() { + add_action( 'cmb2_admin_init', [ $this, 'comment_metaboxes' ] ); + add_action( 'cmb2_admin_init', [ $this, 'feature_metaboxes' ] ); + add_filter( 'opalestate_settings_tabs', [ $this, 'register_admin_setting_tab' ], 1 ); + add_filter( 'opalestate_registered_review_settings', [ $this, 'register_admin_settings' ], 10, 1 ); + + // Save Rating Meta Boxes. + add_filter( 'wp_update_comment_data', 'Opalestate_Rating_MetaBox::save', 1 ); + } + + public function comment_metaboxes() { + $metabox = new Opalestate_Rating_MetaBox(); + + return $metabox->register_admin_comment_fields(); + } + + public function feature_metaboxes() { + $metabox = new Opalestate_Rating_MetaBox(); + + return $metabox->register_admin_feature_fields(); + } + + public function register_admin_setting_tab( $tabs ) { + $tabs['review'] = esc_html__( 'Review', 'opalestate-pro' ); + + return $tabs; + } + + public function register_admin_settings( $fields ) { + $fields = [ + 'id' => 'options_page_review', + 'title' => esc_html__( 'Review Settings', 'opalestate-pro' ), + 'show_on' => [ 'key' => 'options-page', 'value' => [ 'opalestate_settings' ], ], + 'fields' => apply_filters( 'opalestate_settings_review', [ + [ + 'name' => esc_html__( 'Review Settings', 'opalestate-pro' ), + 'desc' => '
            ', + 'id' => 'opalestate_title_review_settings', + 'type' => 'title', + ], + [ + 'name' => esc_html__( 'Enable property reviews', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable property reviews', 'opalestate-pro' ), + 'id' => 'enable_property_reviews', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ], + [ + 'name' => esc_html__( 'Enable agency reviews', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable agency reviews', 'opalestate-pro' ), + 'id' => 'enable_agency_reviews', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ], + [ + 'name' => esc_html__( 'Enable agent reviews', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable agent reviews', 'opalestate-pro' ), + 'id' => 'enable_agent_reviews', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ], + ] + ), + ]; + + return $fields; + } +} + +new Opalestate_Admin_Rating(); diff --git a/inc/admin/register-settings.php b/inc/admin/register-settings.php new file mode 100755 index 00000000..b0e20cf7 --- /dev/null +++ b/inc/admin/register-settings.php @@ -0,0 +1,306 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Plugin_Settings { + + /** + * Option key, and option page slug + * + * @var string + */ + private $key = 'opalestate_settings'; + + /** + * Array of metaboxes/fields + * + * @var array + */ + protected $option_metabox = []; + + /** + * Options Page title + * + * @var string + */ + protected $title = ''; + + /** + * Options Page hook + * + * @var string + */ + protected $options_page = ''; + + protected $subtabs = array(); + + protected $setting_object = array(); + /** + * Constructor + * + * @since 1.0 + */ + public function __construct() { + + add_action( 'admin_menu', [ $this, 'admin_menu' ], 10 ); + + add_action( 'admin_init', [ $this, 'init' ] ); + + //Custom CMB2 Settings Fields + add_action( 'cmb2_render_opalestate_title', 'opalestate_title_callback', 10, 5 ); + + // add_action( 'cmb2_render_api_keys', 'opalestate_api_keys_callback', 10, 5 ); + // add_action( 'cmb2_render_license_key', 'opalestate_license_key_callback', 10, 5 ); + add_action( "cmb2_save_options-page_fields", [ $this, 'settings_notices' ], 10, 3 ); + + + add_action( 'cmb2_render_api_keys', 'opalestate_api_keys_callback', 10, 5 ); + + // Include CMB CSS in the head to avoid FOUC + add_action( "admin_print_styles-opalestate_properties_page_opalestate-settings", [ 'CMB2_hookup', 'enqueue_cmb_css' ] ); + } + + public function admin_menu() { + //Settings + $opalestate_settings_page = add_submenu_page( 'edit.php?post_type=opalestate_property', esc_html__( 'Settings', 'opalestate-pro' ), esc_html__( 'Settings', 'opalestate-pro' ), 'manage_opalestate_settings', + 'opalestate-settings', + [ $this, 'admin_page_display' ] ); + + // addons setting + $opalestate_settings_page = add_submenu_page( 'edit.php?post_type=opalestate_property', esc_html__( 'Addons', 'opalestate-pro' ), esc_html__( 'Addons', 'opalestate-pro' ), 'manage_options', 'opalestate-addons', + [ $this, 'admin_addons_page_display' ] ); + + } + + /** + * Register our setting to WP + * + * @since 1.0 + */ + public function init() { + register_setting( $this->key, $this->key ); + + } + + /** + * Retrieve settings tabs + * + * @return array $tabs + * @since 1.0 + */ + public function opalestate_get_settings_tabs() { + + $settings = $this->opalestate_settings( null ); + + $tabs = []; + $tabs['general'] = esc_html__( 'General', 'opalestate-pro' ); + + $tabs['property'] = esc_html__( 'Property', 'opalestate-pro' ); + + if ( ! empty( $settings['addons']['fields'] ) ) { + $tabs['addons'] = esc_html__( 'Add-ons', 'opalestate-pro' ); + } + + if ( ! empty( $settings['licenses']['fields'] ) ) { + $tabs['licenses'] = esc_html__( 'Licenses', 'opalestate-pro' ); + } + + $tabs['api_keys'] = esc_html__( 'API', 'opalestate-pro' ); + $tabs['3rd_party'] = esc_html__( '3rd Party', 'opalestate-pro' ); + + return apply_filters( 'opalestate_settings_tabs', $tabs ); + } + + public function admin_addons_page_display() { + require_once opalestate_get_admin_view( 'addons/list.php' ); + } + + public function get_subtabs_link ( $tab_id , $stab_id ) { + $tab_url = esc_url( add_query_arg( [ + 'settings-updated' => false, + 'tab' => $tab_id, + 'subtab' => $stab_id + ] ) ); + + return $tab_url; + } + /** + * Admin page markup. Mostly handled by CMB2 + * + * @since 1.0 + */ + public function admin_page_display() { + + $active_tab = isset( $_GET['tab'] ) && array_key_exists( $_GET['tab'], $this->opalestate_get_settings_tabs() ) ? $_GET['tab'] : 'general'; + + $sub_active_tab = isset( $_GET['subtab'] ) ? sanitize_text_field( $_GET['subtab'] ): ''; + + $tabs_fields = $this->opalestate_settings( $active_tab ); + $sub_tabs_fields = array(); + + if( empty($sub_active_tab) && $this->subtabs ){ + $first = array_flip( $this->subtabs ); + $sub_active_tab = reset( $first ); + } + + if( $this->subtabs ){ + $sub_tabs_fields = $this->setting_object->get_subtabs_content( $sub_active_tab ); + } + ?> + +
            + +
            + subtabs ): ?> +
            + +
            + + +
            + + key ); ?> + + key ); ?> + +
            +
            + + +
            + + 'page', + 'numberposts' => -1, + ] ); + + $general = array(); + $opalestate_settings = array(); + + //Return all settings array if necessary + + if ( $active_tab === null ) { + return apply_filters( 'opalestate_registered_settings', $opalestate_settings ); + } + + $output = apply_filters( 'opalestate_registered_' . $active_tab . '_settings', isset( $opalestate_settings[ $active_tab ] ) ? $opalestate_settings[ $active_tab ] : [] ); + + if( empty($output) ){ + $class = "Opalestate_Settings_".ucfirst( $active_tab )."_Tab"; + + if( class_exists($class) ){ + $tab = new $class( $this->key ); + $this->setting_object = $tab; + $this->subtabs = $tab->get_subtabs(); + + return $tab->get_tab_content( $this->key ); + } + return array( $active_tab => array() ); + } + // Add other tabs and settings fields as needed + return $output; + + } + + + /** + * Show Settings Notices + * + * @param $object_id + * @param $updated + * @param $cmb + */ + public function settings_notices( $object_id, $updated, $cmb ) { + + //Sanity check + if ( $object_id !== $this->key ) { + return; + } + + if ( did_action( 'cmb2_save_options-page_fields' ) === 1 ) { + settings_errors( 'opalestate-notices' ); + } + + add_settings_error( 'opalestate-notices', 'global-settings-updated', esc_html__( 'Settings updated.', 'opalestate-pro' ), 'updated' ); + + } + + + /** + * Public getter method for retrieving protected/private variables + * + * @param string $field Field to retrieve + * + * @return mixed Field value or exception is thrown + * @since 1.0 + * + */ + public function __get( $field ) { + + // Allowed fields to retrieve + if ( in_array( $field, [ 'key', 'fields', 'opalestate_title', 'options_page' ], true ) ) { + return $this->{$field}; + } + if ( 'option_metabox' === $field ) { + return $this->option_metabox(); + } + + throw new Exception( 'Invalid property: ' . $field ); + } +} \ No newline at end of file diff --git a/inc/admin/settings/3rd_party.php b/inc/admin/settings/3rd_party.php new file mode 100755 index 00000000..22e77a64 --- /dev/null +++ b/inc/admin/settings/3rd_party.php @@ -0,0 +1,137 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + + +class Opalestate_Settings_3rd_party_Tab extends Opalestate_Settings_Base_Tab { + + + public function get_subtabs () { + + $tabs = (array)apply_filters ( + 'opalestate_settings_3rd_party_subtabs_nav', array() + ); + + $tabs = array_merge_recursive( $tabs, array( + 'yelp' => "Yelp", + 'walkcore' => "Walkcore" + ) ); + + return $tabs; + } + + public function get_subtabs_content( $key ="" ) { + // echo $key;die; + $fields = apply_filters ( 'opalestate_settings_3rd_party_subtabs_'.$key.'_fields', array() ); + + if( $key == 'yelp' ){ + $fields = $this->get_yelp_fields(); + }else if( $key == 'walkcore' ){ + $fields = $this->get_walkscore_fields(); + } + + return [ + 'id' => 'options_page', + 'opalestate_title' => esc_html__( '3rd Party Settings', 'opalestate-pro' ), + 'show_on' => [ 'key' => 'options-page', 'value' => [ $key ], ], + 'fields' => (array)$fields + ]; + } + + public function get_walkscore_fields(){ + return array( + [ + 'name' => esc_html__( 'Walk Score', 'opalestate-pro' ), + 'desc' => '', + 'type' => 'opalestate_title', + 'id' => 'opalestate_title_general_settings_walkscore', + 'before_row' => '
            ', + 'after_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Walk Score APi Key', 'opalestate-pro' ), + 'desc' => esc_html__( 'Add Walk Score API key. To get your Walk Score API key, go to your Walk Score Account.', 'opalestate-pro' ), + 'id' => 'walkscore_api_key', + 'type' => 'text', + ] + ); + } + + public function get_yelp_fields(){ + return array( + [ + 'name' => esc_html__( 'Yelp', 'opalestate-pro' ), + 'desc' => '', + 'type' => 'opalestate_title', + 'id' => 'opalestate_title_general_settings_yelp', + 'before_row' => '
            ', + 'after_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Yelp API Client ID', 'opalestate-pro' ), + 'desc' => esc_html__( 'Add Yelp client ID. To get your Yelp Api Client ID, go to your Yelp Account. Register here', + 'opalestate-pro' ), + 'id' => 'yelp_app_id', + 'type' => 'text', + ], + [ + 'name' => esc_html__( 'Yelp API Secret', 'opalestate-pro' ), + 'desc' => esc_html__( 'Add Yelp API Secret. Register here', + 'opalestate-pro' ), + 'id' => 'yelp_app_secret', + 'type' => 'text', + ], + [ + 'name' => esc_html__( 'Yelp App key', 'opalestate-pro' ), + 'desc' => esc_html__( 'You can find it in your Yelp Application Dashboard. Register here', + 'opalestate-pro' ), + 'id' => 'yelp_app_key', + 'type' => 'text', + ], + [ + 'name' => esc_html__( 'Yelp Categories', 'opalestate-pro' ), + 'desc' => esc_html__( 'Yelp Categories to show on front page', 'opalestate-pro' ), + 'id' => 'yelp_categories', + 'type' => 'multicheck', + 'options' => OpalEstate_Yelp::get_all_categories_options(), + ], + [ + 'name' => esc_html__( 'Yelp - Number of results', 'opalestate-pro' ), + 'desc' => esc_html__( 'Number of results to show on listing page for each category.', 'opalestate-pro' ), + 'id' => 'yelp_number_results', + 'type' => 'text', + 'default' => 3, + 'attributes' => [ + 'type' => 'number', + 'min' => 1, + ], + ], + [ + 'name' => esc_html__( 'Yelp Distance Measurement Unit', 'opalestate-pro' ), + 'desc' => esc_html__( 'Yelp Distance Measurement Unit', 'opalestate-pro' ), + 'id' => 'yelp_measurement_unit', + 'type' => 'select', + 'options' => [ + 'miles' => esc_html__( 'miles', 'opalestate-pro' ), + 'kilometers' => esc_html__( 'kilometers', 'opalestate-pro' ), + ], + 'default' => 'miles', + ] + ); + } + +} \ No newline at end of file diff --git a/inc/admin/settings/api_keys.php b/inc/admin/settings/api_keys.php new file mode 100755 index 00000000..2dd0d6d2 --- /dev/null +++ b/inc/admin/settings/api_keys.php @@ -0,0 +1,46 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Settings_Api_keys_Tab extends Opalestate_Settings_Base_Tab { + + public function get_tabnav () { + + } + + public function get_tab_content( $key= '' ) { + return [ + 'id' => 'api_keys', + 'opalestate_title' => esc_html__( 'API', 'opalestate-pro' ), + 'show_on' => [ 'key' => 'options-page', 'value' => [ $key ], ], + 'show_names' => false, // Hide field names on the left + 'fields' => apply_filters( 'opalestate_settings_api', [ + [ + 'id' => 'api_keys', + 'name' => esc_html__( 'API', 'opalestate-pro' ), + 'type' => 'api_keys', + ], + ] + ), + ]; + } + + public function get_tab_fields () { + + } + +} \ No newline at end of file diff --git a/inc/admin/settings/base.php b/inc/admin/settings/base.php new file mode 100755 index 00000000..87b2c5d9 --- /dev/null +++ b/inc/admin/settings/base.php @@ -0,0 +1,47 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Settings_Base_Tab { + public $key; + + public function __construct ( $key ='' ){ + + $this->key = $key; + } + + public function get_tabnav () { + + } + + public function get_tab_content( $key= '' ) { + + } + + public function get_subtabs(){ + + } + + public function get_tab_fields () { + + } + + public function get_subtabs_content( $subtab ) { + + } + +} \ No newline at end of file diff --git a/inc/admin/settings/email.php b/inc/admin/settings/email.php new file mode 100755 index 00000000..5d67c917 --- /dev/null +++ b/inc/admin/settings/email.php @@ -0,0 +1,38 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Settings_Email_Tab extends Opalestate_Settings_Base_Tab { + + public function get_tabnav () { + + } + + public function get_tab_content( $key='' ) { + return [ + 'id' => 'options_page', + 'opalestate_title' => esc_html__( 'General Settings', 'opalestate-pro' ), + 'show_on' => [ 'key' => 'options-page', 'value' => [ $key ], ], + 'fields' => $this->get_tab_fields() + ]; + } + + public function get_tab_fields () { + + } + +} \ No newline at end of file diff --git a/inc/admin/settings/general.php b/inc/admin/settings/general.php new file mode 100755 index 00000000..9b4fbaa8 --- /dev/null +++ b/inc/admin/settings/general.php @@ -0,0 +1,257 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Settings_General_Tab extends Opalestate_Settings_Base_Tab { + + public function get_tabnav() { + + } + + public function get_tab_content( $key = '' ) { + return [ + 'id' => 'options_page', + 'opalestate_title' => esc_html__( 'General Settings', 'opalestate-pro' ), + 'show_on' => [ 'key' => 'options-page', 'value' => [ $key, ], ], + 'fields' => $this->get_tab_fields(), + ]; + } + + public function get_tab_fields( $key = '' ) { + $pages = opalestate_cmb2_get_post_options( [ + 'post_type' => 'page', + 'numberposts' => -1, + ] ); + + return apply_filters( 'opalestate_settings_general', [ + [ + 'name' => esc_html__( 'General Settings', 'opalestate-pro' ), + + 'type' => 'opalestate_title', + 'id' => 'opalestate_title_general_settings_1', + 'before_row' => '
            ', + 'after_row' => '
            ', + ], + + [ + 'name' => esc_html__( 'User Management Page', 'opalestate-pro' ), + 'desc' => esc_html__( 'This is page use User Management Page using for show content of management page such as profile, my properties', 'opalestate-pro' ), + 'id' => 'user_management_page', + 'type' => 'select', + 'options' => $pages, + ], + [ + 'name' => esc_html__( 'My Account Page', 'opalestate-pro' ), + 'desc' => esc_html__( 'This is page use User login and register an account, or reset password.', 'opalestate-pro' ), + 'id' => 'user_myaccount_page', + 'type' => 'select', + 'options' => $pages, + ], + [ + 'name' => esc_html__( 'Enable Message Database', 'opalestate-pro' ), + 'desc' => esc_html__( 'Allow User send message Contact/Equire via email and saved into database to exchange theirs message direct in User Message Management', 'opalestate-pro' ), + 'id' => 'message_log', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + + ], + + [ + 'name' => esc_html__( 'Maximun Upload Image Size', 'opalestate-pro' ), + 'desc' => esc_html__( 'Set maximun volumn size having < x MB', 'opalestate-pro' ), + + 'id' => 'upload_image_max_size', + 'type' => 'text', + 'default' => '0.5', + ], + [ + 'name' => esc_html__( 'Maximun Upload Image Files', 'opalestate-pro' ), + 'desc' => esc_html__( 'Set maximun volumn size having < x MB', 'opalestate-pro' ), + + 'id' => 'upload_image_max_files', + 'type' => 'text', + 'default' => '10', + ], + [ + 'name' => esc_html__( 'Maximun Upload Other Size', 'opalestate-pro' ), + 'desc' => esc_html__( 'Set maximun volumn size having < x MB for upload docx, pdf...', 'opalestate-pro' ), + + 'id' => 'upload_other_max_size', + 'type' => 'text', + 'default' => '0.8' + ], + [ + 'name' => esc_html__( 'Maximun Upload Other Files', 'opalestate-pro' ), + 'desc' => esc_html__( 'Set maximun volumn size having < x MB for upload docx, pdf...', 'opalestate-pro' ), + + 'id' => 'upload_other_max_files', + 'type' => 'text', + 'default' => '10', + 'after_row' => '
            ' + ], + [ + 'name' => esc_html__( 'Agent Image Size', 'opalestate-pro' ), + 'desc' => esc_html__( 'The Loop Image is an Agent that is chosen as the representative Agent in grid and list.', 'opalestate-pro' ), + + 'id' => 'agent_image_size', + 'type' => 'select', + 'default' => 'medium', + 'options' => opalestate_get_featured_image_sizes(), + + ], + + [ + 'name' => esc_html__( 'Agent Image Size', 'opalestate-pro' ), + 'desc' => esc_html__( 'The Loop Image is an Agent that is chosen as the representative Agent in grid and list.', 'opalestate-pro' ), + + 'id' => 'agent_image_size', + 'type' => 'select', + 'default' => 'medium', + 'options' => opalestate_get_featured_image_sizes(), + + ], + + + [ + 'name' => esc_html__( 'Loop Image Size', 'opalestate-pro' ), + 'desc' => esc_html__( 'The Loop Image is an image that is chosen as the representative image in grid and list.', 'opalestate-pro' ), + + 'id' => 'loop_image_size', + 'type' => 'select', + 'default' => 'large', + 'options' => opalestate_get_featured_image_sizes(), + ], + + + [ + 'name' => esc_html__( 'Featured Image Size', 'opalestate-pro' ), + 'desc' => esc_html__( 'The Featured Image is an image that is chosen as the representative image in single page. .', 'opalestate-pro' ), + 'id' => 'featured_image_size', + 'type' => 'select', + 'default' => 'full', + 'options' => opalestate_get_featured_image_sizes(), + 'after_row' => '' . esc_html__( 'To generate images with new image sizes, you can use this Force Regenerate Thumbnails', + 'opalestate-pro' ) . '', + ], + [ + 'name' => esc_html__( 'Minimum of Target Price For Agent', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enter minimum of price for starting search agent by target', 'opalestate-pro' ), + 'id' => 'search_agent_min_price', + 'type' => 'text_medium', + 'attributes' => [ + 'type' => 'number', + ], + 'default' => 0, + ], + [ + 'name' => esc_html__( 'Maximum of Target Price For Agent', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enter maximum of price for starting search agent by target', 'opalestate-pro' ), + 'id' => 'search_agent_max_price', + 'type' => 'text_medium', + 'attributes' => [ + 'type' => 'number', + ], + 'default' => 1000000, + ], + [ + 'name' => esc_html__( 'Single Layout Page', 'opalestate-pro' ), + 'desc' => esc_html__( 'Choose layout for single property.', 'opalestate-pro' ), + 'id' => 'layout', + 'type' => 'select', + 'options' => apply_filters( 'opalestate_single_layout_templates', [ '' => esc_html__( 'Inherit', 'opalestate-pro' ) ] ), + ], + + + [ + 'name' => esc_html__( 'Currency Settings', 'opalestate-pro' ), + 'desc' => '', + 'type' => 'opalestate_title', + 'id' => 'opalestate_title_general_settings_2', + 'before_row' => '
            ', + 'after_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Currency', 'opalestate-pro' ), + 'desc' => 'Choose your currency. Note that some payment gateways have currency restrictions.', + 'id' => 'currency', + 'type' => 'select', + 'options' => opalestate_get_currencies(), + 'default' => 'USD', + ], + [ + 'name' => esc_html__( 'Currency Position', 'opalestate-pro' ), + 'desc' => 'Choose the position of the currency sign.', + 'id' => 'currency_position', + 'type' => 'select', + 'options' => [ + 'before' => esc_html__( 'Before - $10', 'opalestate-pro' ), + 'after' => esc_html__( 'After - 10$', 'opalestate-pro' ), + ], + 'default' => 'before', + ], + [ + 'name' => esc_html__( 'Thousands Separator', 'opalestate-pro' ), + 'desc' => esc_html__( 'The symbol (typically , or .) to separate thousands', 'opalestate-pro' ), + 'id' => 'thousands_separator', + 'type' => 'text_small', + 'default' => ',', + ], + [ + 'name' => esc_html__( 'Decimal Separator', 'opalestate-pro' ), + 'desc' => esc_html__( 'The symbol (usually , or .) to separate decimal points', 'opalestate-pro' ), + 'id' => 'decimal_separator', + 'type' => 'text_small', + 'default' => '.', + ], + [ + 'name' => esc_html__( 'Number of Decimals', 'opalestate-pro' ), + 'desc' => esc_html__( 'This sets the number of decimal points shown in displayed prices.', 'opalestate-pro' ), + 'id' => 'number_decimals', + 'type' => 'text_small', + 'attributes' => [ + 'type' => 'number', + ], + 'default' => 2, + ], + [ + 'name' => esc_html__( 'Measurement Unit', 'opalestate-pro' ), + 'desc' => esc_html__( 'Measurement Unit', 'opalestate-pro' ), + 'id' => 'measurement_unit', + 'type' => 'select', + 'options' => apply_filters( 'opalestate_measurement_unit', [ + 'sq ft' => esc_html__( 'sq ft', 'opalestate-pro' ), + 'sq m' => esc_html__( 'sq m', 'opalestate-pro' ), + 'mq' => esc_html__( 'mq', 'opalestate-pro' ), + 'm2' => esc_html__( 'm2', 'opalestate-pro' ), + ] ), + 'default' => 'sq ft', + ], + [ + 'name' => esc_html__( 'Google Map API', 'opalestate-pro' ), + 'desc' => __( 'You need to register Google API Key, then put the key in this setting.', + 'opalestate-pro' ), + 'id' => 'google_map_api_keys', + 'type' => 'text', + 'default' => 'AIzaSyCfMVNIa7khIqYHCw6VBn8ShUWWm4tjbG8', + ], + ] + ); + } +} diff --git a/inc/admin/settings/property.php b/inc/admin/settings/property.php new file mode 100755 index 00000000..17443ad9 --- /dev/null +++ b/inc/admin/settings/property.php @@ -0,0 +1,446 @@ + + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Settings_Property_Tab extends Opalestate_Settings_Base_Tab { + public function get_subtabs() { + return apply_filters( + 'opalestate_settings_property_subtabs_nav', + [ + 'property_general' => esc_html__( 'General', 'opalestate-pro' ), + 'property_search' => esc_html__( 'Search Page', 'opalestate-pro' ), + 'property_detail' => esc_html__( 'Single Page', 'opalestate-pro' ), + ] + ); + } + + public function get_subtabs_content( $key = "" ) { + $fields = apply_filters( 'opalestate_settings_property_subtabs_' . $key . '_fields', [] ); + if ( $fields ) { + + } else { + switch ( $key ) { + case 'property_search': + $fields = $this->get_subtab_search_fields(); + break; + + case 'property_detail': + $fields = $this->get_subtab_detail_fields(); + break; + + default: + $fields = $this->get_subtab_property_fields(); + break; + } + } + + return [ + 'id' => 'options_page', + 'opalestate_title' => esc_html__( 'Property Settings', 'opalestate-pro' ), + 'show_on' => [ 'key' => 'options-page', 'value' => [ $key ], ], + 'fields' => $fields, + ]; + } + + private function get_subtab_property_fields() { + $fields = []; + + $fields[] = [ + 'name' => esc_html__( 'Enable User Submission', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable to allow user post/submit properties in front-end', 'opalestate-pro' ), + 'id' => 'enable_submission', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ]; + + // show setting short meta infox + $metabox = new Opalestate_Property_MetaBox(); + $metas = $metabox->metaboxes_info_fields(); + + $checkes = []; + + foreach ( $metas as $key => $field ) { + $id = str_replace( OPALESTATE_PROPERTY_PREFIX, '', $field['id'] ); + $checkes [ $id ] = $field['name']; + } + + $fields[] = [ + 'name' => esc_html__( 'Show Meta Information in Grid and Single Page', 'opalestate-pro' ), + 'id' => 'show_property_meta', + 'type' => 'multicheck', + 'options' => $checkes, + ]; + + $fields[] = [ + 'name' => esc_html__( 'Archive Grid layout', 'opalestate-pro' ), + 'id' => 'property_archive_grid_layout', + 'type' => 'select', + 'options' => opalestate_get_loop_property_grid_layouts(), + ]; + + $fields[] = [ + 'name' => esc_html__( 'Archive List layout', 'opalestate-pro' ), + 'id' => 'property_archive_list_layout', + 'type' => 'select', + 'options' => opalestate_get_loop_property_list_layouts(), + ]; + + return $fields; + } + + private function get_subtab_search_fields() { + $pages = opalestate_cmb2_get_post_options( [ + 'post_type' => 'page', + 'numberposts' => -1, + ] ); + + $metabox = new Opalestate_Property_MetaBox(); + $metas = $metabox->metaboxes_info_fields(); + + $fields = []; + + if ( $metas ) { + $fields[] = [ + 'name' => esc_html__( 'User Share Search', 'opalestate-pro' ), + 'desc' => esc_html__( 'Display Share Search Link Management', 'opalestate-pro' ), + 'id' => 'enable_share_earch', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ]; + + $fields[] = [ + 'name' => esc_html__( 'User Saved Search', 'opalestate-pro' ), + 'desc' => esc_html__( 'Display Save Search Link Management', 'opalestate-pro' ), + 'id' => 'enable_saved_usersearch', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ]; + + + $fields[] = [ + 'name' => esc_html__( 'Search Properties Page', 'opalestate-pro' ), + 'desc' => esc_html__( 'This is page to display result of properties after user searching via form.', + 'opalestate-pro' ), + 'id' => 'search_map_properties_page', + 'type' => 'select', + 'options' => opalestate_cmb2_get_post_options( [ + 'post_type' => 'page', + 'numberposts' => -1, + ] ), + 'default' => '', + ]; + + $fields[] = [ + 'name' => esc_html__( 'Properties Per Page', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enter min of properties display in search page', 'opalestate-pro' ), + 'id' => 'search_property_per_page', + 'type' => 'text_small', + 'attributes' => [ + 'type' => 'number', + ], + 'default' => 9, + ]; + + + $fields[] = [ + 'name' => esc_html__( 'Show Featured First', 'opalestate-pro' ), + 'id' => 'show_featured_first', + 'desc' => esc_html__( 'Show featured first in page result, as default Newest is showed', 'opalestate-pro' ), + 'type' => 'switch', + 'options' => [ + 0 => esc_html__( 'Disable', 'opalestate-pro' ), + 1 => esc_html__( 'Enable', 'opalestate-pro' ), + ], + 'default' => 0, + ]; + $fields[] = [ + 'name' => esc_html__( 'Minimum of Search Price', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enter minimum of price for starting search', 'opalestate-pro' ), + 'id' => 'search_min_price', + 'type' => 'text_medium', + 'attributes' => [ + 'type' => 'number', + ], + 'default' => 0, + ]; + $fields[] = [ + 'name' => esc_html__( 'Maximum of Search Price', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enter maximum of price for starting search', 'opalestate-pro' ), + 'id' => 'search_max_price', + 'type' => 'text_medium', + 'attributes' => [ + 'type' => 'number', + ], + 'default' => 10000000, + ]; + + + $fields[] = [ + 'name' => esc_html__( 'Minimum of Search Aea', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enter minimum of area for starting search', 'opalestate-pro' ), + 'id' => 'search_min_area', + 'type' => 'text_small', + 'attributes' => [ + 'type' => 'number', + ], + 'default' => 0, + ]; + $fields[] = [ + 'name' => esc_html__( 'Maximum of Search Aea', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enter maximum of area for starting search', 'opalestate-pro' ), + 'id' => 'search_max_area', + 'type' => 'text_small', + 'attributes' => [ + 'type' => 'number', + ], + 'default' => 1000, + ]; + + $fields[] = [ + 'name' => esc_html__( 'Search Grid layout', 'opalestate-pro' ), + 'id' => 'property_search_grid_layout', + 'type' => 'select', + 'options' => opalestate_get_loop_property_grid_layouts(), + ]; + + $fields[] = [ + 'name' => esc_html__( 'Search List layout', 'opalestate-pro' ), + 'id' => 'property_search_list_layout', + 'type' => 'select', + 'options' => opalestate_get_loop_property_list_layouts(), + ]; + + $fields[] = [ + 'name' => esc_html__( 'Horizontal Search Fields', 'opalestate-pro' ), + 'desc' => esc_html__( 'Disable or enable fields appearing in search form', 'opalestate-pro' ), + 'type' => 'opalestate_title', + 'id' => 'opalestate_title_general_settings_1', + 'before_row' => '
            ', + 'after_row' => '
            ', + ]; + + $fields[] = [ + 'name' => esc_html__( 'Show Price', 'opalestate-pro' ), + 'id' => OPALESTATE_PROPERTY_PREFIX . 'price_opt', + 'type' => 'switch', + 'options' => [ + 0 => esc_html__( 'Disable', 'opalestate-pro' ), + 1 => esc_html__( 'Enable', 'opalestate-pro' ), + ], + ]; + + foreach ( $metas as $key => $meta ) { + $fields[] = [ + 'name' => $meta['name'], + 'id' => $meta['id'] . '_opt', + 'type' => 'switch', + 'options' => [ + 0 => esc_html__( 'Disable', 'opalestate-pro' ), + 1 => esc_html__( 'Enable', 'opalestate-pro' ), + ], + ]; + } + + $fields[] = [ + 'name' => esc_html__( 'Vertical Search Fields', 'opalestate-pro' ), + 'type' => 'opalestate_title', + 'id' => 'opalestate_title_general_settings_2', + 'before_row' => '
            ', + 'after_row' => '
            ', + ]; + + $fields[] = [ + 'name' => esc_html__( 'Show Price', 'opalestate-pro' ), + 'id' => OPALESTATE_PROPERTY_PREFIX . 'price_opt_v', + 'type' => 'switch', + 'options' => [ + 0 => esc_html__( 'Disable', 'opalestate-pro' ), + 1 => esc_html__( 'Enable', 'opalestate-pro' ), + ], + ]; + + foreach ( $metas as $key => $meta ) { + $fields[] = [ + 'name' => $meta['name'], + 'id' => $meta['id'] . '_opt_v', + 'type' => 'switch', + 'options' => [ + 0 => esc_html__( 'Disable', 'opalestate-pro' ), + 1 => esc_html__( 'Enable', 'opalestate-pro' ), + ], + + ]; + } + } + + return $fields; + } + + /** + * + */ + private function get_subtab_detail_fields() { + $fields = []; + + $fields[] = [ + 'name' => esc_html__( 'Show Amenities tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Show Amenities tab in the single property page.', 'opalestate-pro' ), + 'id' => 'enable_single_amenities', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ]; + + $fields[] = [ + 'name' => esc_html__( 'Show Facilities tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Show Facilities tab in the single property page.', 'opalestate-pro' ), + 'id' => 'enable_single_facilities', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ]; + + $fields[] = [ + 'name' => esc_html__( 'Show Attachments tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Show Attachments tab in the single property page.', 'opalestate-pro' ), + 'id' => 'enable_single_attachments', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ]; + + $fields[] = [ + 'name' => esc_html__( 'Show Video tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Show Video tab in the single property page.', 'opalestate-pro' ), + 'id' => 'enable_single_video', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ]; + + $fields[] = [ + 'name' => esc_html__( 'Show Map tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Show Map tab in the single property page.', 'opalestate-pro' ), + 'id' => 'enable_single_map', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ]; + + $fields[] = [ + 'name' => esc_html__( 'Show Nearby tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Show Nearby tab in the single property page.', 'opalestate-pro' ), + 'id' => 'enable_single_nearby', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ]; + + $fields[] = [ + 'name' => esc_html__( 'Show Walk Scores tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Show Walk Scores tab in the single property page.', 'opalestate-pro' ), + 'id' => 'enable_single_walkscores', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ]; + + $fields[] = [ + 'name' => esc_html__( 'Show Apartments tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Show Apartments tab in the single property page.', 'opalestate-pro' ), + 'id' => 'enable_single_apartments', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ]; + + $fields[] = [ + 'name' => esc_html__( 'Show Floor Plans tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Show Floor Plans tab in the single property page.', 'opalestate-pro' ), + 'id' => 'enable_single_floor_plans', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ]; + + $fields[] = [ + 'name' => esc_html__( 'Show Views Statistics tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Show Views Statistics tab in the single property page.', 'opalestate-pro' ), + 'id' => 'enable_single_views_statistics', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ]; + + $fields[] = [ + 'name' => esc_html__( 'Views Statistics time limit (days)', 'opalestate-pro' ), + 'desc' => esc_html__( 'The number of days will be saved to the database.', 'opalestate-pro' ), + 'id' => 'single_views_statistics_limit', + 'type' => 'text_small', + 'attributes' => [ + 'type' => 'number', + 'min' => 1, + 'max' => 365, + ], + 'default' => 8, + ]; + + $fields[] = [ + 'name' => esc_html__( 'Related properties layout', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select a layout for related properties.', 'opalestate-pro' ), + 'id' => 'single_related_properties_layout', + 'type' => 'select', + 'options' => opalestate_get_loop_property_layouts(), + ]; + + $fields[] = [ + 'name' => esc_html__( 'Nearby properties layout', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select a layout for nearby properties.', 'opalestate-pro' ), + 'id' => 'single_nearby_properties_layout', + 'type' => 'select', + 'options' => opalestate_get_loop_property_layouts(), + ]; + + return $fields; + } +} diff --git a/inc/admin/views/addons/list.php b/inc/admin/views/addons/list.php new file mode 100755 index 00000000..ca41b666 --- /dev/null +++ b/inc/admin/views/addons/list.php @@ -0,0 +1,348 @@ +
            +

            + +

            + + $tag, + ] ); + + if ( ! is_wp_error( $plugins_api ) ) { + $plugins = $plugins_api->plugins; + $plugins_allowedtags = [ + 'a' => [ + 'href' => [], + 'title' => [], + 'target' => [], + ], + 'abbr' => [ 'title' => [] ], + 'acronym' => [ 'title' => [] ], + 'code' => [], + 'pre' => [], + 'em' => [], + 'strong' => [], + 'ul' => [], + 'ol' => [], + 'li' => [], + 'p' => [], + 'br' => [], + ]; + + $plugins_group_titles = [ + 'Performance' => _x( 'Performance', 'Plugin installer group title' ), + 'Social' => _x( 'Social', 'Plugin installer group title' ), + 'Tools' => _x( 'Tools', 'Plugin installer group title' ), + ]; + $group = null; + ?> + +
            + + groups[ $plugin['group'] ] ) ) { + $group_name = $this->groups[ $plugin['group'] ]; + if ( isset( $plugins_group_titles[ $group_name ] ) ) { + $group_name = $plugins_group_titles[ $group_name ]; + } + } else { + $group_name = $plugin['group']; + } + + // Starting a new group, close off the divs of the last one + if ( ! empty( $group ) ) { + echo '
            '; + } + + echo '

            ' . esc_html( $group_name ) . '

            '; + // needs an extra wrapping div for nth-child selectors to work + echo '
            '; + + $group = $plugin['group']; + } + $title = wp_kses( $plugin['name'], $plugins_allowedtags ); + + // Remove any HTML from the description. + $description = strip_tags( $plugin['short_description'] ); + $version = wp_kses( $plugin['version'], $plugins_allowedtags ); + + $name = strip_tags( $title . ' ' . $version ); + + $author = wp_kses( $plugin['author'], $plugins_allowedtags ); + if ( ! empty( $author ) ) { + $author = ' ' . sprintf( __( 'By %s' ), $author ) . ''; + } + + $requires_php = isset( $plugin['requires_php'] ) ? $plugin['requires_php'] : null; + $requires_wp = isset( $plugin['requires'] ) ? $plugin['requires'] : null; + + $compatible_php = is_php_version_compatible( $requires_php ); + $compatible_wp = is_wp_version_compatible( $requires_wp ); + $tested_wp = ( empty( $plugin['tested'] ) || version_compare( get_bloginfo( 'version' ), $plugin['tested'], '<=' ) ); + + $action_links = []; + + if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) { + $status = install_plugin_install_status( $plugin ); + + switch ( $status['status'] ) { + case 'install': + if ( $status['url'] ) { + if ( $compatible_php && $compatible_wp ) { + $action_links[] = sprintf( + '%s', + esc_attr( $plugin['slug'] ), + esc_url( $status['url'] ), + /* translators: %s: plugin name and version */ + esc_attr( sprintf( __( 'Install %s now' ), $name ) ), + esc_attr( $name ), + __( 'Install Now' ) + ); + } else { + $action_links[] = sprintf( + '', + _x( 'Cannot Install', 'plugin' ) + ); + } + } + break; + + case 'update_available': + if ( $status['url'] ) { + if ( $compatible_php && $compatible_wp ) { + $action_links[] = sprintf( + '%s', + esc_attr( $status['file'] ), + esc_attr( $plugin['slug'] ), + esc_url( $status['url'] ), + /* translators: %s: plugin name and version */ + esc_attr( sprintf( __( 'Update %s now' ), $name ) ), + esc_attr( $name ), + __( 'Update Now' ) + ); + } else { + $action_links[] = sprintf( + '', + _x( 'Cannot Update', 'plugin' ) + ); + } + } + break; + + case 'latest_installed': + case 'newer_installed': + if ( is_plugin_active( $status['file'] ) ) { + $action_links[] = sprintf( + '', + _x( 'Active', 'plugin' ) + ); + } elseif ( current_user_can( 'activate_plugin', $status['file'] ) ) { + $button_text = __( 'Activate' ); + /* translators: %s: plugin name */ + $button_label = _x( 'Activate %s', 'plugin' ); + $activate_url = add_query_arg( + [ + '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $status['file'] ), + 'action' => 'activate', + 'plugin' => $status['file'], + ], + network_admin_url( 'plugins.php' ) + ); + + if ( is_network_admin() ) { + $button_text = __( 'Network Activate' ); + /* translators: %s: plugin name */ + $button_label = _x( 'Network Activate %s', 'plugin' ); + $activate_url = add_query_arg( [ 'networkwide' => 1 ], $activate_url ); + } + + $action_links[] = sprintf( + '%3$s', + esc_url( $activate_url ), + esc_attr( sprintf( $button_label, $plugin['name'] ) ), + $button_text + ); + } else { + $action_links[] = sprintf( + '', + _x( 'Installed', 'plugin' ) + ); + } + break; + } + } + + $details_link = self_admin_url( + 'plugin-install.php?tab=plugin-information&plugin=' . $plugin['slug'] . + '&TB_iframe=true&width=600&height=550' + ); + + $action_links[] = sprintf( + '%s', + esc_url( $details_link ), + /* translators: %s: plugin name and version */ + esc_attr( sprintf( __( 'More information about %s' ), $name ) ), + esc_attr( $name ), + __( 'More Details' ) + ); + + if ( ! empty( $plugin['icons']['svg'] ) ) { + $plugin_icon_url = $plugin['icons']['svg']; + } elseif ( ! empty( $plugin['icons']['2x'] ) ) { + $plugin_icon_url = $plugin['icons']['2x']; + } elseif ( ! empty( $plugin['icons']['1x'] ) ) { + $plugin_icon_url = $plugin['icons']['1x']; + } else { + $plugin_icon_url = $plugin['icons']['default']; + } + + /** + * Filters the install action links for a plugin. + * + * @param string[] $action_links An array of plugin action links. Defaults are links to Details and Install Now. + * @param array $plugin The plugin currently being listed. + * @since 2.7.0 + * + */ + $action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin ); + + $last_updated_timestamp = strtotime( $plugin['last_updated'] ); + ?> +
            +

            '; + if ( ! $compatible_php && ! $compatible_wp ) { + _e( 'This plugin doesn’t work with your versions of WordPress and PHP.' ); + if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) { + printf( + /* translators: 1: "Update WordPress" screen URL, 2: "Update PHP" page URL */ + ' ' . __( 'Please update WordPress, and then learn more about updating PHP.' ), + self_admin_url( 'update-core.php' ), + esc_url( wp_get_update_php_url() ) + ); + wp_update_php_annotation( '

            ', '' ); + } elseif ( current_user_can( 'update_core' ) ) { + printf( + /* translators: %s: "Update WordPress" screen URL */ + ' ' . __( 'Please update WordPress.' ), + self_admin_url( 'update-core.php' ) + ); + } elseif ( current_user_can( 'update_php' ) ) { + printf( + /* translators: %s: "Update PHP" page URL */ + ' ' . __( 'Learn more about updating PHP.' ), + esc_url( wp_get_update_php_url() ) + ); + wp_update_php_annotation( '

            ', '' ); + } + } elseif ( ! $compatible_wp ) { + _e( 'This plugin doesn’t work with your version of WordPress.' ); + if ( current_user_can( 'update_core' ) ) { + printf( + /* translators: %s: "Update WordPress" screen URL */ + ' ' . __( 'Please update WordPress.' ), + self_admin_url( 'update-core.php' ) + ); + } + } elseif ( ! $compatible_php ) { + _e( 'This plugin doesn’t work with your version of PHP.' ); + if ( current_user_can( 'update_php' ) ) { + printf( + /* translators: %s: "Update PHP" page URL */ + ' ' . __( 'Learn more about updating PHP.' ), + esc_url( wp_get_update_php_url() ) + ); + wp_update_php_annotation( '

            ', '' ); + } + } + echo '

            '; + } + ?> +
            +
            +

            + + + + +

            +
            + +
            +

            +

            +
            +
            +
            +
            + $plugin['rating'], + 'type' => 'percent', + 'number' => $plugin['num_ratings'], + ] + ); + ?> + +
            +
            + +
            +
            + = 1000000 ) { + $active_installs_millions = floor( $plugin['active_installs'] / 1000000 ); + $active_installs_text = sprintf( + _nx( '%s+ Million', '%s+ Million', $active_installs_millions, 'Active plugin installations' ), + number_format_i18n( $active_installs_millions ) + ); + } elseif ( 0 == $plugin['active_installs'] ) { + $active_installs_text = _x( 'Less Than 10', 'Active plugin installations' ); + } else { + $active_installs_text = number_format_i18n( $plugin['active_installs'] ) . '+'; + } + printf( __( '%s Active Installations' ), $active_installs_text ); + ?> +
            +
            + ' . __( 'Untested with your version of WordPress' ) . ''; + } elseif ( ! $compatible_wp ) { + echo '' . __( 'Incompatible with your version of WordPress' ) . ''; + } else { + echo '' . __( 'Compatible with your version of WordPress' ) . ''; + } + ?> +
            +
            +
            + +
            + +

            ' . esc_html__( 'There was an error retrieving the Opalestate Add-ons list from the server. Please try again later.', 'opalestate-pro' ) . ''; + } + ?> + diff --git a/inc/agency/class-opalestate-agency-front.php b/inc/agency/class-opalestate-agency-front.php new file mode 100755 index 00000000..2b027d7f --- /dev/null +++ b/inc/agency/class-opalestate-agency-front.php @@ -0,0 +1,482 @@ + + */ + +// Exit if accessed directly +if ( ! defined( 'ABSPATH' ) ) { + exit; +} + +class Opalestate_Agency_Front { + + /** + * Instance. + * + * @access private + * @var Opalestate_Agent_Front + */ + static private $instance; + + /** + * Singleton pattern. + * + * @since $Id + * @access private + */ + private function __construct() { + } + + /** + * Get instance. + * + * @return Opalestate_Agent_Front + * @since $Id + * @access public + */ + public static function get_instance() { + if ( null === static::$instance ) { + self::$instance = new static(); + + self::$instance->init(); + } + + return self::$instance; + } + + public $new_attachmenet_ids; + + /** + * Auto update meta information to post from user data updated or created + */ + public function init() { + add_action( 'opalestate_on_set_role_agency', [ $this, 'on_set_role' ], 1, 9 ); + add_filter( 'opalestate_before_render_profile_agency_form', [ $this, 'render_front_form' ], 2, 2 ); + + add_action( 'save_post', [ $this, 'on_save_post' ], 13, 2 ); + add_filter( 'pre_get_posts', [ $this, 'archives_query' ], 1 ); + add_action( 'cmb2_after_init', [ $this, 'on_save_front_data' ] ); + + add_filter( 'opalestate_management_user_menu', [ $this, 'render_extra_profile_link' ] ); + + add_action( "opalestate_user_content_agency_profile_page", [ $this, 'render_profile' ] ); + add_action( "opalestate_user_content_agency_team_page", [ $this, 'render_team' ] ); + add_action( "opalestate_user_init", [ $this, 'process_action_member' ] ); + + $this->register_shortcodes(); + } + + /** + * + */ + public function render_extra_profile_link( $menu ) { + global $current_user; + + $user_roles = $current_user->roles; + $user_role = array_shift( $user_roles ); + + if ( $user_role == 'opalestate_agency' ) { + $menu['agency_profile'] = [ + 'icon' => 'fa fa-user', + 'link' => "agency_profile", + 'title' => esc_html__( 'Agency Profile', 'opalestate-pro' ), + 'id' => 0, + ]; + $menu['agency_team'] = [ + 'icon' => 'fa fa-users', + 'link' => "agency_team", + 'title' => esc_html__( 'Agency Team', 'opalestate-pro' ), + 'id' => 0, + ]; + } + + return $menu; + } + + /** + * Auto update meta information to post from user data updated or created + */ + public function archives_query( $query ) { + if ( $query->is_main_query() && is_post_type_archive( 'opalestate_agency' ) ) { + if ( isset( $_GET['location'] ) && $_GET['location'] != -1 ) { + $tax_query = []; + + $tax_query[] = [ + 'taxonomy' => 'opalestate_location', + 'field' => 'slug', + 'terms' => sanitize_text_field( $_GET['location'] ), + ]; + $args['tax_query'] = [ 'relation' => 'AND' ]; + $args['tax_query'] = array_merge( $args['tax_query'], $tax_query ); + $query->set( 'tax_query', $tax_query ); + } + if ( isset( $_GET['search_text'] ) ) { + $query->set( 's', sanitize_text_field( $_GET['search_text'] ) ); + } + } + + return $query; + } + + /** + * + */ + private function update_data_agent_or_agency( $prefix ) { + + global $current_user; + + $post_id = isset( $_POST['object_id'] ) && absint( $_POST['object_id'] ) ? $_POST['object_id'] : 0; + $user_id = get_current_user_id(); + $metaboxes = apply_filters( 'opalestate_before_render_profile_agency_form', [], $post_id ); + $metaboxes = apply_filters( 'cmb2_meta_boxes', $metaboxes ); + + + if ( isset( $metaboxes[ $prefix . 'front' ] ) ) { + if ( ! empty( $post_id ) ) { + $old_post = get_post( $post_id ); + $post_date = $old_post->post_date; + } else { + $post_date = ''; + } + $post = get_post( $post_id ); + $data = [ + 'ID' => $post->ID ? $post_id : null, + 'post_title' => sanitize_text_field( $_POST[ $prefix . 'title' ] ), + 'post_author' => $user_id, + 'post_type' => 'opalestate_agency', + 'post_date' => $post_date, + 'post_content' => wp_kses( $_POST[ $prefix . 'text' ], '

            ' ), + ]; + + unset( $_POST[ $prefix . 'title' ] ); + unset( $_POST[ $prefix . 'text' ] ); + + + if ( $data['ID'] > 0 ) { + $post_id = wp_update_post( $data, true ); + } else { + $data['post_status'] = 'pending'; + $post_id = wp_insert_post( $data, true ); + } + + $post = get_post( $post_id ); + + if ( empty( $post->post_content ) || empty( $post->post_title ) || ! has_post_thumbnail( $post_id ) ) { + + // $data['post_status'] = 'public'; + // $data['ID'] = $post_id; + // $post_id = wp_update_post( $data , true ); + } + update_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'related_id', $post_id ); + + /* + * Processing upload files + */ + $this->process_upload_files( $post_id, $_POST ); + + + cmb2_get_metabox_form( $metaboxes[ $prefix . 'front' ], $post_id ); + $cmb = cmb2_get_metabox( $prefix . 'front', $post_id ); + $sanitized_values = $cmb->get_sanitized_values( $_POST ); + $cmb->save_fields( $post_id, 'post', $sanitized_values ); + /// update + // Create featured image + $featured_image = get_post_meta( $post_id, $prefix . 'featured_image', true ); + + if ( ! empty( $_POST[ $prefix . 'featured_image' ] ) && isset( $_POST[ $prefix . 'featured_image' ] ) ) { + set_post_thumbnail( $post_id, sanitize_text_field( $_POST[ $prefix . 'featured_image' ] ) ); + unset( $_POST[ $prefix . 'featured_image' ] ); + } else { + delete_post_thumbnail( $post_id ); + } + + // set ready of attachment for use. + if ( $this->new_attachmenet_ids ) { + foreach ( $this->new_attachmenet_ids as $_id ) { + delete_post_meta( $_id, '_pending_to_use_', 1 ); + } + } + + return $post_id; + } + + return false; + } + + /** + * + * + */ + private function get_field_name( $field ) { + return OPALESTATE_AGENCY_PREFIX . $field; + } + + private function process_upload_files( $post_id ) { + + //upload images for featured and gallery images + if ( isset( $_FILES ) && ! empty( $_FILES ) ) { + + /// + $fields = [ + $this->get_field_name( 'avatar_id' ), + $this->get_field_name( 'gallery' ), + $this->get_field_name( 'featured_image' ), + ]; + + foreach ( $_FILES as $key => $value ) { + // allow processing in fixed collection + if ( in_array( $key, $fields ) ) { + $ufile = $_FILES[ $key ]; + + /// ///// + if ( isset( $ufile['name'] ) && is_array( $ufile['name'] ) ) { + $output = []; + + foreach ( $ufile['name'] as $f_key => $f_value ) { + $loop_file = [ + 'name' => $ufile['name'][ $f_key ], + 'type' => $ufile['type'][ $f_key ], + 'tmp_name' => $ufile['tmp_name'][ $f_key ], + 'error' => $ufile['error'][ $f_key ], + 'size' => $ufile['size'][ $f_key ], + ]; + $new_atm = $this->upload_image( $loop_file, $post_id ); + if ( $new_atm ) { + $_POST[ $key ] = isset( $_POST[ $key ] ) ? sanitize_text_field( $_POST[ $key ] ) : []; + $_POST[ $key ][ $new_atm['attachment_id'] ] = $new_atm['url']; + $this->new_attachmenet_ids[ $new_atm['attachment_id'] ] = $new_atm['attachment_id']; + } + } + + } /// + elseif ( isset( $ufile['name'] ) ) { + $new_atm = $this->upload_image( $ufile, $post_id ); + if ( $new_atm ) { + $_POST[ $key ] = $new_atm['attachment_id']; + + if ( preg_match( "#id#", $key ) ) { + $_key = str_replace( "_id", "", $key ); + $_POST[ $_key ] = $new_atm['url']; + } + $this->new_attachmenet_ids[ $new_atm['attachment_id'] ] = $new_atm['attachment_id']; + } + } + } + } + } + } + + /** + * Process upload images for properties + */ + public function upload_image( $submitted_file, $parent_id = 0 ) { + return opalesate_upload_image( $submitted_file, $parent_id ); + } + + public function on_save_front_data() { + + if ( isset( $_POST[ 'nonce_CMB2php' . OPALESTATE_AGENCY_PREFIX . 'front' ] ) ) { + + $post_id = isset( $_POST['object_id'] ) && $_POST['object_id'] ? absint( $_POST['object_id'] ) : 0; + + $post = get_post( $post_id ); + + $post_id = $this->update_data_agent_or_agency( OPALESTATE_AGENCY_PREFIX ); + + if ( $post_id ) { + OpalEstate_Agency::update_user_data( get_current_user_id() ); + } + + return opalestate_output_msg_json( true, + __( 'The data updated successful, please wait for redirecting', 'opalestate-pro' ), + [ + 'heading' => esc_html__( 'Update Information', 'opalestate-pro' ), + 'redirect' => opalestate_get_user_management_page_uri( [ 'tab' => 'agency_profile' ] ), + ] + ); + + return opalestate_output_msg_json( false, + __( 'Currently, The data could not save!', 'opalestate-pro' ), + [ 'heading' => esc_html__( 'Update Information', 'opalestate-pro' ) ] + ); + } + } + + /** + * + */ + public function register_shortcodes() { + + } + + /** + * + */ + public function render_profile() { + + $post_id = OpalEstate_User::get_member_id(); + + if ( isset( $post->ID ) && $post->post_status != 'publish' ) { + opalestate_add_notice( "warning", esc_html__( 'You account is under reviewing! it take some time to process' ) ); + add_action( "opalestate_profile_agency_form_before", "opalestate_print_notices" ); + } + + $metaboxes = $this->render_front_form( [], $post_id ); + + return opalestate_load_template_path( 'user/agency/profile-agency', [ 'metaboxes' => $metaboxes, 'post_id' => $post_id ] ); + } + + /** + * + */ + public function render_team() { + $user_id = get_current_user_id(); + $post_id = OpalEstate_User::get_member_id(); + + $metaboxes = $this->render_front_form( [], $post_id ); + + return opalestate_load_template_path( 'user/agency/agency-team', [ 'metaboxes' => $metaboxes, 'post_id' => $post_id ] ); + } + + /** + * + */ + public function process_action_member() { + if ( isset( $_POST['add_team_action'] ) && wp_verify_nonce( $_POST['add_team_action'], 'agency-add-member' ) ) { + + if ( isset( $_POST['user_id'] ) ) { + + $user_id = get_current_user_id(); + $post_id = OpalEstate_User::get_member_id(); + + $team = get_post_meta( $post_id, OPALESTATE_AGENCY_PREFIX . 'team', true ); + + if ( empty( $team ) ) { + $team = []; + } + $team[] = intval( $_POST['user_id'] ); + $team = array_unique( $team ); + + update_post_meta( $post_id, OPALESTATE_AGENCY_PREFIX . 'team', $team ); + + } + } + + if ( isset( $_GET['tab'] ) && $_GET['tab'] == "agency_team" && isset( $_GET['remove_id'] ) && $_GET['remove_id'] ) { + + $remove_id = intval( $_GET['remove_id'] ); + + $user_id = get_current_user_id(); + $post_id = OpalEstate_User::get_member_id(); + + $team = get_post_meta( $post_id, OPALESTATE_AGENCY_PREFIX . 'team', true ); + + if ( empty( $team ) ) { + $team = []; + } + $team[] = $user_id; + $team = array_unique( $team ); + foreach ( $team as $key => $id ) { + if ( $id == $remove_id ) { + unset( $team[ $key ] ); + } + } + update_post_meta( $post_id, OPALESTATE_AGENCY_PREFIX . 'team', $team ); + + wp_redirect( opalestate_get_user_management_page_uri( [ 'tab' => 'agency_team' ] ) ); + die; + } + + } + + /** + * + */ + public static function on_save_post( $post_id ) { + $post_type = get_post_type( $post_id ); + if ( $post_type == 'opalestate_agency' ) { + if ( isset( $_POST[ OPALESTATE_AGENCY_PREFIX . 'user_id' ] ) && $_POST[ OPALESTATE_AGENCY_PREFIX . 'user_id' ] ) { + update_user_meta( $_POST[ OPALESTATE_AGENCY_PREFIX . 'user_id' ], OPALESTATE_USER_PROFILE_PREFIX . 'related_id', $post_id ); + } + } + } + + public static function on_set_role( $user_id ) { + + if ( $user_id ) { + + $args = [ + 'post_type' => 'opalestate_agency', + 'posts_per_page' => 10, + ]; + + + $args['meta_key'] = OPALESTATE_AGENCY_PREFIX . 'user_id'; + $args['meta_value'] = $user_id; + $args['meta_compare'] = '='; + $args['post_status'] = [ 'publish', 'pending' ]; + + $post = get_posts( $args ); + + if ( empty( $post ) ) { + + $agency_id = self::create_agency( [], $user_id ); + update_post_meta( $agency_id, OPALESTATE_AGENCY_PREFIX . 'user_id', $user_id ); + update_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'related_id', $agency_id ); + } + } + } + + /** + * + */ + public static function create_agency( $args = [], $user_id ) { + $data = get_user_by( 'id', $user_id ); + + $args = wp_parse_args( $args, [ + 'first_name' => $data->first_name, + 'last_name' => $data->last_name, + 'avatar' => '', + 'job' => '', + 'email' => '', + 'phone' => '', + 'mobile' => '', + 'fax' => '', + 'web' => '', + 'address' => '', + 'twitter' => '', + 'facebook' => '', + 'google' => '', + 'linkedin' => '', + 'instagram' => '', + ] ); + + + $agency_id = wp_insert_post( [ + 'post_title' => $args['first_name'] && $args['last_name'] ? $args['first_name'] . ' ' . $args['last_name'] : esc_html__( 'User ID', 'opalestate-pro' ) . ': ' . $user_id, + 'post_content' => 'empty description', + 'post_excerpt' => 'empty excerpt', + 'post_type' => 'opalestate_agency', + 'post_status' => 'pending', + 'post_author' => $user_id, + ], true ); + + + do_action( 'opalesate_insert_user_agency', $agency_id ); + + return $agency_id; + } + + /** + * + */ + public function render_front_form( $metaboxes, $post_id = 0 ) { + $metabox = new Opalestate_Agency_MetaBox(); + + return $metabox->render_front_form( $metaboxes, $post_id ); + } +} + +Opalestate_Agency_Front::get_instance(); diff --git a/inc/agency/class-opalestate-agency-metabox.php b/inc/agency/class-opalestate-agency-metabox.php new file mode 100755 index 00000000..27529e44 --- /dev/null +++ b/inc/agency/class-opalestate-agency-metabox.php @@ -0,0 +1,389 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Agency_MetaBox extends Opalestate_User_MetaBox { + + /** + * + */ + public function metaboxes_target() { + + $prefix = OPALESTATE_AGENCY_PREFIX; + $fields = [ + [ + 'id' => "{$prefix}user_id", + 'name' => esc_html__( 'Link To User ID', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'Set relationship to existed user, allow user can edit Agency profile in front-end and show account info in each property.', 'opalestate-pro' ), + + ], + [ + 'name' => esc_html__( 'Agent Team', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select one, to add new you create in location of estate panel', 'opalestate-pro' ), + 'id' => $prefix . "team", + 'type' => 'adduser', + ], + ]; + + return $fields; + } + + /** + * + */ + public function metaboxes_admin_fields( $prefix = '' ) { + + if ( ! $prefix ) { + $prefix = OPALESTATE_AGENCY_PREFIX; + } + + $fields = [ + [ + 'id' => "{$prefix}featured", + 'name' => esc_html__( 'Is Featured', 'opalestate-pro' ), + 'type' => 'switch', + 'description' => esc_html__( 'Set this agent as featured', 'opalestate-pro' ), + 'options' => [ + 0 => esc_html__( 'No', 'opalestate-pro' ), + 1 => esc_html__( 'Yes', 'opalestate-pro' ), + ], + + ], + ]; + + $fields = array_merge_recursive( $fields, + $this->get_base_fields( $prefix ), + $this->get_address_fields( $prefix ) + ); + + return apply_filters( 'opalestate_postype_agency_metaboxes_fields', $fields ); + } + + /** + * + */ + public function get_front_fields( $prefix ) { + return [ + 'id' => $prefix . 'front', + 'title' => esc_html__( 'Name and Description', 'opalestate-pro' ), + 'object_types' => [ 'opalestate_property' ], + 'context' => 'normal', + 'object_types' => [ 'user' ], // Tells CMB2 to use user_meta vs post_meta + 'priority' => 'high', + 'show_names' => true, + 'fields' => $this->get_fields( $prefix ), + ]; + } + + /** + * + */ + public function get_fields( $prefix ) { + + $management = [ + [ + 'name' => esc_html__( 'Avatar Picture', 'opalestate-pro' ), + 'desc' => esc_html__( 'This image will display in user detail and profile box information', 'opalestate-pro' ), + 'id' => $prefix . 'avatar', + 'type' => is_admin() ? 'file' : 'opal_upload', + 'avatar' => true, + 'before_row' => '

            ', + 'after_row' => '
            ', + ], + + [ + 'id' => 'first_name', + 'name' => esc_html__( 'First Name', 'opalestate-pro' ), + 'type' => 'text', + 'attributes' => [ + 'required' => 'required', + ], + 'before_row' => '
            ', + + ], + [ + 'id' => 'last_name', + 'name' => esc_html__( 'Last Name', 'opalestate-pro' ), + 'type' => 'text', + 'attributes' => [ + 'required' => 'required', + ], + ], + + [ + 'id' => 'description', + 'name' => esc_html__( 'Biographical Info', 'opalestate-pro' ), + 'type' => 'textarea', + 'description' => esc_html__( 'Share a little biographical information to fill out your profile. This may be shown publicly.', 'opalestate-pro' ), + + 'after_row' => '
            ', + ], + [ + 'id' => "{$prefix}job", + 'name' => esc_html__( 'Title/Job', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'Please enter position or job in your company.', 'opalestate-pro' ), + 'before_row' => '

            ' . __( 'Information', 'opalestate-pro' ) . '

            ', // callback + ], + + [ + 'id' => "{$prefix}company", + 'name' => esc_html__( 'company', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'Please enter company name.', 'opalestate-pro' ), + ], + [ + 'id' => "{$prefix}email", + 'name' => esc_html__( 'Contact email', 'opalestate-pro' ), + 'type' => 'text_email', + 'description' => esc_html__( 'Enter contact name that allow user contact you via the contact form of website.', 'opalestate-pro' ), + ], + + [ + 'id' => "{$prefix}phone", + 'name' => esc_html__( 'Phone', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'Enter your home phone.', 'opalestate-pro' ), + ], + + [ + 'id' => "{$prefix}skype", + 'name' => esc_html__( 'Skype', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'Input for skype account.', 'opalestate-pro' ), + ], + + [ + 'id' => "url", + 'name' => esc_html__( 'Website URL', 'opalestate-pro' ), + 'type' => 'text_url', + 'description' => esc_html__( 'Link to your website', 'opalestate-pro' ), + 'after_row' => '
            ', + ], + + [ + 'id' => "{$prefix}facebook", + 'name' => esc_html__( 'Facebook', 'opalestate-pro' ), + 'type' => 'text_url', + 'description' => esc_html__( 'Enter your facebook profile or facebook newfeed', 'opalestate-pro' ), + 'before_row' => '

            ' . __( 'Social', 'opalestate-pro' ) . '

            ', // callback + ], + + [ + 'id' => "{$prefix}linkedin", + 'name' => esc_html__( 'Linkedin URL', 'opalestate-pro' ), + 'type' => 'text_url', + 'description' => esc_html__( 'Input for linked in profile.', 'opalestate-pro' ), + ], + [ + 'id' => "{$prefix}instagram", + 'name' => esc_html__( 'Instagram URL', 'opalestate-pro' ), + 'type' => 'text_url', + 'description' => esc_html__( 'Input for instagram profile.', 'opalestate-pro' ), + ], + [ + 'id' => "{$prefix}pinterest", + 'name' => esc_html__( 'Pinterest Url', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'Input for pinterest feed', 'opalestate-pro' ), + ], + + [ + 'id' => "{$prefix}googleplus", + 'name' => esc_html__( 'Google Plus Url', 'opalestate-pro' ), + 'type' => 'text_url', + 'description' => esc_html__( 'Input for goolge plus profile or your newfeed.', 'opalestate-pro' ), + ], + + [ + 'id' => "{$prefix}youtube", + 'name' => esc_html__( 'Youtube Url', 'opalestate-pro' ), + 'type' => 'text_url', + 'description' => esc_html__( 'Input for your channel youtube.', 'opalestate-pro' ), + ], + + [ + 'id' => "{$prefix}vimeo", + 'name' => esc_html__( 'Vimeo Url', 'opalestate-pro' ), + 'type' => 'text_url', + 'description' => esc_html__( 'Input for your channel Vimeo', 'opalestate-pro' ), + 'after_row' => '
            ', + ], + ]; + + return $management; + } + + /** + * + */ + public function metaboxes_front_fields( $prefix = '', $post_id = 0 ) { + if ( ! $prefix ) { + $prefix = OPALESTATE_AGENCY_PREFIX; + } + $post = get_post( $post_id ); + + $fields = [ + + [ + 'id' => $prefix . 'post_type', + 'type' => 'hidden', + 'default' => 'opalestate_agency', + ], + [ + 'id' => 'post_id', + 'type' => 'hidden', + 'default' => $post_id, + ], + + [ + 'name' => esc_html__( 'Title / Name', 'opalestate-pro' ), + 'id' => $prefix . 'title', + 'type' => 'text', + 'default' => ! empty( $post ) ? $post->post_title : '', + 'attributes' => [ + 'required' => 'required', + ], + ], + [ + 'name' => esc_html__( 'slogan', 'opalestate-pro' ), + 'id' => "{$prefix}slogan", + 'type' => 'text', + ], + [ + 'name' => esc_html__( 'Information', 'opalestate-pro' ), + 'id' => $prefix . 'text', + 'type' => 'wysiwyg', + 'default' => ! empty( $post ) ? $post->post_content : '', + 'attributes' => [ + 'required' => 'required', + ], + ], + + [ + 'name' => esc_html__( 'Types', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select one, to add new you create in location of estate panel', 'opalestate-pro' ), + 'id' => $prefix . "type", + 'taxonomy' => 'opalestate_types', + 'type' => 'taxonomy_select', + + ] + ]; + + + $fields = array_merge_recursive( $fields, + $this->get_base_front_fields( $prefix ), + $this->get_address_fields( $prefix ), + $this->get_social_fields( $prefix ) + ); + + return apply_filters( 'opalestate_postype_office_metaboxes_fields', $fields ); + } + + public function get_base_front_fields( $prefix ) { + return [ + [ + 'id' => "{$prefix}featured_image", + 'name' => esc_html__( 'Banner', 'opalestate-pro' ), + 'type' => 'uploader', + 'is_featured' => true, + 'limit' => 1, + 'single' => 1, + 'description' => esc_html__( 'Select one or more images to show as gallery', 'opalestate-pro' ), + 'before_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Avatar Picture', 'opalestate-pro' ), + 'desc' => esc_html__( 'This image will display in user detail and profile box information', 'opalestate-pro' ), + 'id' => $prefix . 'avatar', + 'type' => 'hidden', + 'single' => 1, + 'limit' => 1, + 'avatar' => true, + + ], + [ + 'name' => esc_html__( 'Avatar Picture', 'opalestate-pro' ), + 'desc' => esc_html__( 'This image will display in user detail and profile box information', 'opalestate-pro' ), + 'id' => $prefix . 'avatar_id', + 'type' => 'uploader', + 'single' => 1, + 'limit' => 1, + 'avatar' => true, + + ], + [ + 'name' => esc_html__( 'Gallery', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select one, to add new you create in location of estate panel', 'opalestate-pro' ), + 'id' => $prefix . "gallery", + 'type' => 'uploader', + 'after_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Email', 'opalestate-pro' ), + 'id' => "{$prefix}email", + 'type' => 'text', + 'before_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Website', 'opalestate-pro' ), + 'id' => "{$prefix}web", + 'type' => 'text_url', + ], + [ + 'name' => esc_html__( 'Phone', 'opalestate-pro' ), + 'id' => "{$prefix}phone", + 'type' => 'text', + ], + + [ + 'name' => esc_html__( 'Mobile', 'opalestate-pro' ), + 'id' => "{$prefix}mobile", + 'type' => 'text', + ], + + [ + 'name' => esc_html__( 'Fax', 'opalestate-pro' ), + 'id' => "{$prefix}fax", + 'type' => 'text', + 'after_row' => '
            ', + ], + ]; + } + + /** + * + */ + public function render_front_form( $metaboxes, $post_id = 0 ) { + + $prefix = OPALESTATE_AGENCY_PREFIX; + + $metaboxes[ $prefix . 'front' ] = [ + 'id' => $prefix . 'front', + 'title' => esc_html__( 'Agency Information', 'opalestate-pro' ), + 'object_types' => [ 'opalestate_agency' ], + 'context' => 'normal', + 'priority' => 'high', + 'show_names' => true, + 'cmb_styles' => false, + 'fields' => $this->metaboxes_front_fields( $prefix, $post_id ), + ]; + + return $metaboxes; + } +} diff --git a/inc/agency/class-opalestate-agency-posttype.php b/inc/agency/class-opalestate-agency-posttype.php new file mode 100755 index 00000000..8059b2f9 --- /dev/null +++ b/inc/agency/class-opalestate-agency-posttype.php @@ -0,0 +1,103 @@ + + * @copyright Copyright (C) 2016 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * Class Opalestate_PostType_Agency + * + * @version 1.0 + */ +class Opalestate_PostType_Agency { + + /** + * Init + */ + public static function init() { + add_action( 'init', [ __CLASS__, 'definition' ] ); + } + + + /** + * Register Post type and taxonomies + */ + public static function definition() { + if ( ! is_blog_installed() || post_type_exists( 'opalestate_agency' ) ) { + return; + } + + $labels = [ + 'name' => esc_html__( 'Agencies', 'opalestate-pro' ), + 'singular_name' => esc_html__( 'Property', 'opalestate-pro' ), + 'add_new' => esc_html__( 'Add New Agency', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New Agency', 'opalestate-pro' ), + 'edit_item' => esc_html__( 'Edit Agency', 'opalestate-pro' ), + 'new_item' => esc_html__( 'New Agency', 'opalestate-pro' ), + 'all_items' => esc_html__( 'All Agencies', 'opalestate-pro' ), + 'view_item' => esc_html__( 'View Agency', 'opalestate-pro' ), + 'search_items' => esc_html__( 'Search Agency', 'opalestate-pro' ), + 'not_found' => esc_html__( 'No Agencies found', 'opalestate-pro' ), + 'not_found_in_trash' => esc_html__( 'No Agencies found in Trash', 'opalestate-pro' ), + 'parent_item_colon' => '', + 'menu_name' => esc_html__( 'Agencies', 'opalestate-pro' ), + ]; + + $labels = apply_filters( 'opalestate_postype_agency_labels', $labels ); + + register_post_type( 'opalestate_agency', + apply_filters( 'opalestate_agency_post_type_parameters', [ + 'labels' => $labels, + 'supports' => [ 'title', 'editor', 'thumbnail', 'comments', 'author', 'excerpt' ], + 'public' => true, + 'has_archive' => true, + 'menu_position' => 51, + 'categories' => [], + 'menu_icon' => 'dashicons-groups', + 'rewrite' => [ 'slug' => esc_html_x( 'agency', 'agency slug', 'opalestate-pro' ) ], + ] ) + ); + + /// + $labels = [ + 'name' => esc_html__( 'Agency Categories', 'opalestate-pro' ), + 'singular_name' => esc_html__( 'Category', 'opalestate-pro' ), + 'search_items' => esc_html__( 'Search Category', 'opalestate-pro' ), + 'all_items' => esc_html__( 'All Categories', 'opalestate-pro' ), + 'parent_item' => esc_html__( 'Parent Category', 'opalestate-pro' ), + 'parent_item_colon' => esc_html__( 'Parent Category:', 'opalestate-pro' ), + 'edit_item' => esc_html__( 'Edit Category', 'opalestate-pro' ), + 'update_item' => esc_html__( 'Update Category', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New Category', 'opalestate-pro' ), + 'new_item_name' => esc_html__( 'New Category Name', 'opalestate-pro' ), + 'menu_name' => esc_html__( 'Agency Categories', 'opalestate-pro' ), + ]; + /// + register_taxonomy( 'opalestate_agency_cat', [ 'opalestate_agency' ], + [ + 'hierarchical' => true, + 'labels' => $labels, + 'show_ui' => true, + 'show_admin_column' => true, + 'query_var' => true, + 'show_in_nav_menus' => true, + 'rewrite' => [ + 'slug' => esc_html_x( 'agency-category', 'agency category slug', 'opalestate-pro' ), + ], + ] ); + } +} + +Opalestate_PostType_Agency::init(); diff --git a/inc/agency/class-opalestate-agency-query.php b/inc/agency/class-opalestate-agency-query.php new file mode 100755 index 00000000..65268752 --- /dev/null +++ b/inc/agency/class-opalestate-agency-query.php @@ -0,0 +1,20 @@ + + * @copyright Copyright (C) 2014 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +// Exit if accessed directly +if ( !defined( 'ABSPATH' ) ) exit; + +class Opalestate_Agency_Query extends OpalEstate_Abstract_Query { + +} \ No newline at end of file diff --git a/inc/agency/class-opalestate-agency.php b/inc/agency/class-opalestate-agency.php new file mode 100755 index 00000000..db25e1f0 --- /dev/null +++ b/inc/agency/class-opalestate-agency.php @@ -0,0 +1,306 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * @class OpalEstate_Agency + * + * @version 1.0 + */ +class OpalEstate_Agency { + + /** + * @var String $author_name + * + * @access protected + */ + protected $author_name; + + /** + * @var Boolean $is_featured + * + * @access protected + */ + protected $is_featured; + + /** + * Get A Instance Of Opalestate_Property + */ + public static function get_instance( $post_id = null ) { + static $_instance; + if ( ! $_instance ) { + $_instance = new OpalEstate_Agency( $post_id ); + } + + return $_instance; + } + + + /** + * Constructor + */ + public function __construct( $post_id = null ) { + + global $post; + + $this->post = $post; + $this->post_id = $post_id ? $post_id : get_the_ID(); + $this->author = get_userdata( $post->post_author ); + $this->author_name = ! empty( $this->author ) ? sprintf( '%s %s', $this->author->first_name, $this->author->last_name ) : null; + $this->is_featured = $this->get_meta( 'featured' ); + $this->is_trusted = $this->get_meta( 'trusted' ); + } + + public function get_id() { + return $this->post_id; + } + + /** + * Get Collection Of soicals with theirs values + */ + public function get_socials() { + $socials = [ + 'facebook' => '', + 'twitter' => '', + 'pinterest' => '', + 'google' => '', + 'instagram' => '', + 'linkedIn' => '', + ]; + + $output = []; + + foreach ( $socials as $social => $k ) { + + $data = $this->get_meta( $social ); + if ( $data && $data != "#" && ! empty( $data ) ) { + $output[ $social ] = $data; + } + } + + return $output; + } + + /** + * Get url of user avatar by agency id + */ + public static function get_avatar_url( $userID ) { + + return get_post_meta( $userID, OPALESTATE_AGENCY_PREFIX . "avatar", true ); + + } + + /** + * Render list of levels of agency + */ + public function render_level() { + $levels = wp_get_post_terms( $this->post_id, 'opalestate_agency_cat' ); + + if ( empty( $levels ) ) { + return; + } + + $output = ''; + foreach ( $levels as $key => $value ) { + $output .= '' . $value->name . ''; + } + $output .= ''; + + echo $output; + } + + /** + * get meta data value of key without prefix + */ + public function get_meta( $key ) { + return get_post_meta( $this->get_id(), OPALESTATE_AGENCY_PREFIX . $key, true ); + } + + + /** + * return true if this agency is featured + */ + public function is_featured() { + return $this->is_featured; + } + + + public function render_avatar() { + + } + + /** + * render block information by id + */ + public static function render_box_info( $post_id ) { + + } + + + public function get_gallery() { + return $this->get_meta( 'gallery' ); + } + + + public function get_trusted() { + return $this->is_trusted; + } + + public function get_members() { + $team = []; + $ids = get_post_meta( $this->post_id, OPALESTATE_AGENCY_PREFIX . 'team', true ); + + foreach ( $ids as $id ) { + $user = get_user_by( 'id', $id ); // echo '
            ' . print_r( $user, 1 );die;
            +			$team[] = [
            +				'id'          => $user->ID,
            +				'name'        => $user->display_name,
            +				'avatar_url'  => OpalEstate_User::get_author_picture( $user->ID ),
            +				'username'    => $user->user_login,
            +				'description' => 'okokok',
            +			];
            +		}
            +
            +		return $team;
            +	}
            +
            +	public static function get_link( $agency_id ) {
            +		$agency = get_post( $agency_id );
            +		$url    = self::get_avatar_url( $agency_id );
            +
            +		return [
            +			'name'   => $agency->post_title,
            +			'avatar' => $url,
            +			'link'   => get_permalink( $agency->ID ),
            +		];
            +	}
            +
            +	public static function metaboxes_fields() {
            +		$metabox = new Opalestate_Agency_MetaBox();
            +		$fields  = $metabox->metaboxes_admin_fields();
            +
            +		return array_merge_recursive( $fields, $metabox->get_social_fields( OPALESTATE_AGENCY_PREFIX ) );
            +	}
            +
            +	/**
            +	 * Get rating count.
            +	 *
            +	 * @param string $context What the value is for. Valid values are view and edit.
            +	 * @return int
            +	 */
            +	public function get_rating_counts() {
            +		return $this->get_meta( 'rating_count' ) ? $this->get_meta( 'rating_count' ) : 0;
            +	}
            +
            +	/**
            +	 * Get average rating.
            +	 *
            +	 * @param string $context What the value is for. Valid values are view and edit.
            +	 * @return float
            +	 */
            +	public function get_average_rating() {
            +		return $this->get_meta( 'average_rating' ) ? $this->get_meta( 'average_rating' ) : 0;
            +	}
            +
            +	/**
            +	 * Get review count.
            +	 *
            +	 * @param string $context What the value is for. Valid values are view and edit.
            +	 * @return int
            +	 */
            +	public function get_review_count() {
            +		return $this->get_meta( 'review_count' ) ? $this->get_meta( 'review_count' ) : 0;
            +	}
            +
            +	public function get_rating_count_stats() {
            +		return $this->get_meta( 'rating_count_stats' ) ? $this->get_meta( 'rating_count_stats' ) : [
            +			5 => 0,
            +			4 => 0,
            +			3 => 0,
            +			2 => 0,
            +			1 => 0,
            +		];
            +	}
            +
            +	public function get_rating_average_stats() {
            +		return $this->get_meta( 'rating_average_stats' );
            +	}
            +
            +	/**
            +	 *
            +	 */
            +	public static function update_user_data( $user_id ) {
            +
            +		$fields = self::metaboxes_fields();
            +
            +		$others = [
            +			'avatar_id' => '',
            +			'map'       => '',
            +		];
            +
            +		foreach ( $fields as $key => $field ) {
            +			$kpos = $field['id'];
            +			$tmp  = str_replace( OPALESTATE_AGENCY_PREFIX, "", $field['id'] );
            +			if ( isset( $_POST[ $kpos ] ) && $tmp ) {
            +				$data = is_string( $_POST[ $kpos ] ) ? sanitize_text_field( $_POST[ $kpos ] ) : $_POST[ $kpos ];
            +				update_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . $tmp, $data );
            +			}
            +		}
            +
            +		// update for others 
            +		foreach ( $others as $key => $value ) {
            +			$kpos = OPALESTATE_AGENCY_PREFIX . $key;
            +			if ( isset( $_POST[ $kpos ] ) ) {
            +				$data = is_string( $_POST[ $kpos ] ) ? sanitize_text_field( $_POST[ $kpos ] ) : $_POST[ $kpos ];
            +				update_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . $key, $data );
            +			}
            +		}
            +	}
            +
            +	/**
            +	 *
            +	 */
            +	public static function update_data_from_user( $related_id ) {
            +
            +
            +		$fields = self::metaboxes_fields();
            +
            +		$others = [
            +			'avatar_id' => '',
            +			'map'       => '',
            +		];
            +		foreach ( $fields as $key => $field ) {
            +
            +			$tmp  = str_replace( OPALESTATE_AGENCY_PREFIX, "", $field['id'] );
            +			$kpos = OPALESTATE_USER_PROFILE_PREFIX . $tmp;
            +
            +			if ( isset( $_POST[ $kpos ] ) && $tmp ) {
            +				$data = is_string( $_POST[ $kpos ] ) ? sanitize_text_field( $_POST[ $kpos ] ) : $_POST[ $kpos ];
            +				update_post_meta( $related_id, OPALESTATE_AGENCY_PREFIX . $tmp, $data );
            +			}
            +		}
            +
            +		// update for others 
            +		foreach ( $others as $key => $value ) {
            +			$kpos = OPALESTATE_USER_PROFILE_PREFIX . $key;
            +			if ( isset( $_POST[ $kpos ] ) ) {
            +				$data = is_string( $_POST[ $kpos ] ) ? sanitize_text_field( $_POST[ $kpos ] ) : $_POST[ $kpos ];
            +				update_post_meta( $related_id, OPALESTATE_AGENCY_PREFIX . $key, $data );
            +			}
            +		}
            +	}
            +}
            diff --git a/inc/agency/functions.php b/inc/agency/functions.php
            new file mode 100755
            index 00000000..e69de29b
            diff --git a/inc/agent/class-opalestate-agent-front.php b/inc/agent/class-opalestate-agent-front.php
            new file mode 100755
            index 00000000..d26f5b75
            --- /dev/null
            +++ b/inc/agent/class-opalestate-agent-front.php
            @@ -0,0 +1,508 @@
            +
            + * @copyright  Copyright (C) 2014 wpopal.com. All Rights Reserved.
            + */
            +
            +// Exit if accessed directly
            +if ( ! defined( 'ABSPATH' ) ) {
            +	exit;
            +}
            +
            +class Opalestate_Agent_Front {
            +
            +	/**
            +	 * Instance.
            +	 *
            +	 * @access private
            +	 * @var Opalestate_Agent_Front
            +	 */
            +	static private $instance;
            +
            +	/**
            +	 * Singleton pattern.
            +	 *
            +	 * @since  $Id
            +	 * @access private
            +	 */
            +	private function __construct() {
            +	}
            +
            +	public $new_attachmenet_ids;
            +
            +	/**
            +	 * Get instance.
            +	 *
            +	 * @access public
            +	 * @return Opalestate_Agent_Front
            +	 */
            +	public static function get_instance() {
            +		if ( null === static::$instance ) {
            +			self::$instance = new static();
            +
            +			self::$instance->init();
            +		}
            +
            +		return self::$instance;
            +	}
            +
            +	/**
            +	 * Auto update meta information to post from user data updated or created
            +	 */
            +	public function init() {
            +
            +		add_action( 'opalestate_on_set_role_agent', [ $this, 'on_set_role' ], 1, 9 );
            +		add_filter( 'opalestate_before_render_profile_agent_form', [ $this, 'render_front_form' ], 2, 2 );
            +		add_filter( 'pre_get_posts', [ $this, 'archives_query' ], 1 );
            +		add_action( 'cmb2_after_init', [ $this, 'on_save_front_data' ] );
            +
            +		add_action( 'opalestate_user_content_agent_profile_page', [ $this, 'render_profile' ] );
            +		add_filter( 'opalestate_management_user_menu', [ $this, 'render_extra_profile_link' ] );
            +
            +		$this->register_shortcodes();
            +	}
            +
            +
            +	/**
            +	 * render_extra_profile_link.
            +	 */
            +	public function render_extra_profile_link( $menu ) {
            +		global $current_user;
            +
            +		$user_roles = $current_user->roles;
            +		$user_role  = array_shift( $user_roles );
            +
            +		if ( $user_role == 'opalestate_agent' ) {
            +			$menu['extra_profile'] = [
            +				'icon'  => 'fa fa-user',
            +				'link'  => "agent_profile",
            +				'title' => esc_html__( 'Agent Profile', 'opalestate-pro' ),
            +				'id'    => 0,
            +			];
            +		}
            +
            +		return $menu;
            +	}
            +
            +	/**
            +	 * render_profile
            +	 */
            +	public function render_profile() {
            +
            +		$user_id = get_current_user_id();
            +		$post_id = get_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'related_id', true );
            +
            +		$post = get_post( $post_id );
            +
            +		if ( isset( $post->ID ) && $post->post_status != 'publish' ) {
            +			opalestate_add_notice( "warning", esc_html__( 'You account is under reviewing! it take some time to process' ) );
            +			add_action( "opalestate_profile_agency_form_before", "opalestate_print_notices" );
            +		}
            +
            +		$metaboxes = $this->render_front_form( [], $post_id );
            +
            +		return opalestate_load_template_path( 'user/agent/profile-agent', [ 'metaboxes' => $metaboxes, 'post_id' => $post_id ] );
            +	}
            +
            +	/**
            +	 * Process upload images for properties
            +	 */
            +	public function upload_image( $submitted_file, $parent_id = 0 ) {
            +		return opalesate_upload_image( $submitted_file, $parent_id );
            +	}
            +
            +	/**
            +	 * Remove dirty images of current user
            +	 */
            +	public function remove_dirty_images( $post_id, $user_id ) {
            +
            +		if ( isset( $_POST['remove_image_id'] ) && is_array( $_POST['remove_image_id'] ) && $_POST['remove_image_id'] ) {
            +			foreach ( $_POST['remove_image_id'] as $key => $value ) {
            +				$post = get_post( $value );
            +				if ( $post->post_author == $user_id ) {
            +					wp_delete_attachment( $value );
            +				}
            +			}
            +		}
            +	}
            +
            +	private function process_upload_files( $post_id ) {
            +
            +		//upload images for featured and gallery images
            +		if ( isset( $_FILES ) && ! empty( $_FILES ) ) {
            +
            +			/// 
            +			$fields = [
            +				$this->get_field_name( 'gallery' ),
            +				$this->get_field_name( 'avatar_id' ),
            +				$this->get_field_name( 'featured_image' ),
            +			];
            +
            +			foreach ( $_FILES as $key => $value ) {
            +				// allow processing in fixed collection
            +				if ( in_array( $key, $fields ) ) {
            +					$ufile = $_FILES[ $key ];
            +
            +					/// /////
            +					if ( isset( $ufile['name'] ) && is_array( $ufile['name'] ) ) {
            +						$output = [];
            +
            +						foreach ( $ufile['name'] as $f_key => $f_value ) {
            +							$loop_file = [
            +								'name'     => $ufile['name'][ $f_key ],
            +								'type'     => $ufile['type'][ $f_key ],
            +								'tmp_name' => $ufile['tmp_name'][ $f_key ],
            +								'error'    => $ufile['error'][ $f_key ],
            +								'size'     => $ufile['size'][ $f_key ],
            +							];
            +							$new_atm   = $this->upload_image( $loop_file, $post_id );
            +							if ( $new_atm ) {
            +								$_POST[ $key ]                                          = isset( $_POST[ $key ] ) ? sanitize_text_field( $_POST[ $key ] ) : [];
            +								$_POST[ $key ][ $new_atm['attachment_id'] ]             = $new_atm['url'];
            +								$this->new_attachmenet_ids[ $new_atm['attachment_id'] ] = $new_atm['attachment_id'];
            +							}
            +						}
            +
            +					} ///
            +					elseif ( isset( $ufile['name'] ) ) {
            +						$new_atm = $this->upload_image( $ufile, $post_id );
            +						if ( $new_atm ) {
            +							$_POST[ $key ] = $new_atm['attachment_id'];
            +
            +							if ( preg_match( "#id#", $key ) ) {
            +								$_key           = str_replace( "_id", "", $key );
            +								$_POST[ $_key ] = $new_atm['url'];
            +							}
            +							$this->new_attachmenet_ids[ $new_atm['attachment_id'] ] = $new_atm['attachment_id'];
            +						}
            +					}
            +				}
            +			}
            +		}
            +
            +
            +	}
            +
            +	public function on_save_front_data() {
            +
            +		if ( isset( $_POST[ 'nonce_CMB2php' . OPALESTATE_AGENT_PREFIX . 'front' ] ) ) {
            +
            +			$post_id = $this->update_data_agent_or_agency( OPALESTATE_AGENT_PREFIX );
            +
            +			if ( $post_id ) {
            +				OpalEstate_Agent::update_user_data( get_current_user_id() );
            +			}
            +
            +			return opalestate_output_msg_json( true,
            +				__( 'The data updated successful, please wait for redirecting', 'opalestate-pro' ),
            +				[
            +					'heading'  => esc_html__( 'Update Information', 'opalestate-pro' ),
            +					'redirect' => opalestate_get_user_management_page_uri( [ 'tab' => 'agent_profile' ] ),
            +				]
            +			);
            +
            +
            +			return opalestate_output_msg_json( fales,
            +				__( 'Currently, The data could not save!', 'opalestate-pro' ),
            +				[ 'heading' => esc_html__( 'Update Information', 'opalestate-pro' ) ]
            +			);
            +
            +			exit;
            +		}
            +	}
            +
            +	/**
            +	 *
            +	 */
            +	private function get_field_name( $field ) {
            +		return OPALESTATE_AGENT_PREFIX . $field;
            +	}
            +
            +	/**
            +	 *
            +	 */
            +	private function update_data_agent_or_agency( $prefix ) {
            +		global $current_user;
            +
            +		$post_id   = isset( $_POST['object_id'] ) && absint( $_POST['object_id'] ) ? $_POST['object_id'] : 0;
            +		$user_id   = get_current_user_id();
            +		$metaboxes = apply_filters( 'opalestate_before_render_profile_agent_form', [], $post_id );
            +		$metaboxes = apply_filters( 'cmb2_meta_boxes', $metaboxes );
            +
            +		if ( isset( $metaboxes[ $prefix . 'front' ] ) ) {
            +			if ( ! empty( $post_id ) ) {
            +				$old_post  = get_post( $post_id );
            +				$post_date = $old_post->post_date;
            +			} else {
            +				$post_date = '';
            +			}
            +			$post = get_post( $post_id );
            +
            +			$data = [
            +				'ID'           => $post->ID ? $post_id : null,
            +				'post_title'   => sanitize_text_field( $_POST[ $prefix . 'title' ] ),
            +				'post_author'  => $user_id,
            +				'post_type'    => 'opalestate_agent',
            +				'post_date'    => $post_date,
            +				'post_content' => wp_kses( $_POST[ $prefix . 'text' ], '

            ' ), + ]; + + + unset( $_POST[ $prefix . 'title' ] ); + unset( $_POST[ $prefix . 'text' ] ); + + + if ( $data['ID'] > 0 ) { + $post_id = wp_update_post( $data, true ); + } else { + $data['post_status'] = 'pending'; + $post_id = wp_insert_post( $data, true ); + } + + $post = get_post( $post_id ); + + update_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'related_id', $post_id ); + + /* + * Processing upload files + */ + $this->process_upload_files( $post_id, $_POST ); + + cmb2_get_metabox_form( $metaboxes[ $prefix . 'front' ], $post_id ); + $cmb = cmb2_get_metabox( $prefix . 'front', $post_id ); + $sanitized_values = $cmb->get_sanitized_values( $_POST ); + $cmb->save_fields( $post_id, 'post', $sanitized_values ); + /// update + // Create featured image + $featured_image = get_post_meta( $post_id, $prefix . 'featured_image', true ); + + if ( ! empty( $_POST[ $prefix . 'featured_image' ] ) && isset( $_POST[ $prefix . 'featured_image' ] ) ) { + + set_post_thumbnail( $post_id, $_POST[ $prefix . 'featured_image' ] ); + unset( $_POST[ $prefix . 'featured_image' ] ); + } else { + delete_post_thumbnail( $post_id ); + } + + // remove dirty images + $this->remove_dirty_images( $post_id, $user_id ); + // set ready of attachment for use. + if ( $this->new_attachmenet_ids ) { + foreach ( $this->new_attachmenet_ids as $_id ) { + delete_post_meta( $_id, '_pending_to_use_', 1 ); + } + } + + return $post_id; + } + + return false; + } + + public function register_shortcodes() { + + $this->shortcodes = [ + + 'change_agent_profile' => [ 'code' => 'change_agent_profile', 'label' => esc_html__( 'Agent Profile', 'opalestate-pro' ) ], + 'search_agents' => [ 'code' => 'search_agents', 'label' => esc_html__( 'Search Agents', 'opalestate-pro' ) ], + ]; + + foreach ( $this->shortcodes as $shortcode ) { + add_shortcode( 'opalestate_' . $shortcode['code'], [ $this, $shortcode['code'] ] ); + } + + } + + public function archives_query( $query ) { + + if ( $query->is_main_query() && is_post_type_archive( 'opalestate_agent' ) ) { + + $args = []; + + $min = opalestate_options( 'search_agent_min_price', 0 ); + $max = opalestate_options( 'search_agent_max_price', 10000000 ); + + + $search_min_price = isset( $_GET['min_price'] ) ? sanitize_text_field( $_GET['min_price'] ) : ''; + $search_max_price = isset( $_GET['max_price'] ) ? sanitize_text_field( $_GET['max_price'] ) : ''; + + $search_min_area = isset( $_GET['min_area'] ) ? sanitize_text_field( $_GET['min_area'] ) : ''; + $search_max_area = isset( $_GET['max_area'] ) ? sanitize_text_field( $_GET['max_area'] ) : ''; + $s = isset( $_GET['search_text'] ) ? sanitize_text_field( $_GET['search_text'] ) : null; + + + $paged = ( get_query_var( 'paged' ) == 0 ) ? 1 : get_query_var( 'paged' ); + $default = [ + 'post_type' => 'opalestate_agent', + 'posts_per_page' => apply_filters( 'opalestate_agent_per_page', 12 ), + 'paged' => $paged, + ]; + $args = array_merge( $default, $args ); + + $tax_query = []; + + + if ( isset( $_GET['location'] ) && $_GET['location'] != -1 ) { + $tax_query[] = + [ + 'taxonomy' => 'opalestate_location', + 'field' => 'slug', + 'terms' => sanitize_text_field( $_GET['location'] ), + ]; + } + + if ( isset( $_GET['types'] ) && $_GET['types'] != -1 ) { + $tax_query[] = + [ + 'taxonomy' => 'opalestate_types', + 'field' => 'slug', + 'terms' => sanitize_text_field( $_GET['types'] ), + ]; + } + + if ( $tax_query ) { + $args['tax_query'] = [ 'relation' => 'AND' ]; + $args['tax_query'] = array_merge( $args['tax_query'], $tax_query ); + } + + $args['meta_query'] = [ 'relation' => 'AND' ]; + + if ( $search_min_price != $min && is_numeric( $search_min_price ) ) { + array_push( $args['meta_query'], [ + 'key' => OPALESTATE_AGENT_PREFIX . 'target_min_price', + 'value' => $search_min_price, + 'compare' => '>=', + 'type' => 'NUMERIC', + ] ); + } + if ( is_numeric( $search_max_price ) && $search_max_price != $max ) { + array_push( $args['meta_query'], [ + 'key' => OPALESTATE_AGENT_PREFIX . 'target_max_price', + 'value' => $search_max_price, + 'compare' => '<=', + 'type' => 'NUMERIC', + ] ); + } + + + ///// search by address and geo location /// + if ( isset( $_GET['geo_long'] ) && isset( $_GET['geo_lat'] ) ) { + + $prefix = OPALESTATE_AGENT_PREFIX; + if ( $_GET['location_text'] && ( empty( $_GET['geo_long'] ) || empty( $_GET['geo_lat'] ) ) ) { + array_push( $args['meta_query'], [ + 'key' => $prefix . 'map_address', + 'value' => sanitize_text_field( trim( $_GET['location_text'] ) ), + 'compare' => 'LIKE', + 'operator' => 'OR', + ] ); + + } else { + $radius = isset( $_GET['geo_radius'] ) ? sanitize_text_field( $_GET['geo_radius'] ) : 5; + $post_ids = Opalestate_Query::filter_by_location( + sanitize_text_field( $_GET['geo_lat'] ), + sanitize_text_field( $_GET['geo_long'] ), $radius, $prefix ); + + + $args['post__in'] = $post_ids; + $query->set( 'post__in', $post_ids ); + } + } + + if ( isset( $args['tax_query'] ) && $args['tax_query'] ) { + $query->set( 'tax_query', $args['tax_query'] ); + } + if ( isset( $args['meta_query'] ) && $args['meta_query'] ) { + $query->set( 'meta_query', $args['meta_query'] ); + } + } + + return $query; + } + + + /** + * + */ + public function search_agents() { + return opalestate_load_template_path( 'shortcodes/search-agents' ); + } + + /** + * Auto update meta information to post from user data updated or created + */ + public function on_set_role( $user_id ) { + if ( $user_id ) { + + $args = [ + 'post_type' => 'opalestate_agent', + 'posts_per_page' => 10, + ]; + + + $args['meta_key'] = OPALESTATE_AGENT_PREFIX . 'user_id'; + $args['meta_value'] = $user_id; + $args['meta_compare'] = '='; + $args['post_status'] = [ 'publish', 'pending' ]; + + $post = get_posts( $args ); + + if ( empty( $post ) ) { + $agent_id = $this->create_agent( [], $user_id ); + update_post_meta( $agent_id, OPALESTATE_AGENT_PREFIX . 'user_id', $user_id ); + update_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'related_id', $agent_id ); + } + } + } + + public function create_agent( $args = [], $user_id ) { + + $data = get_user_by( 'id', $user_id ); + + $args = wp_parse_args( $args, [ + 'first_name' => $data->first_name, + 'last_name' => $data->last_name, + 'post_author' => $user_id, + 'avatar' => '', + 'job' => '', + 'email' => '', + 'phone' => '', + 'mobile' => '', + 'fax' => '', + 'web' => '', + 'address' => '', + 'twitter' => '', + 'facebook' => '', + 'google' => '', + 'linkedin' => '', + 'instagram' => '', + ] ); + + $agent_id = wp_insert_post( [ + 'post_title' => $args['first_name'] && $args['last_name'] ? $args['first_name'] . ' ' . $args['last_name'] : esc_html__( 'User ID', 'opalestate-pro' ) . ': ' . $user_id, + 'post_content' => '', + 'post_excerpt' => '', + 'post_type' => 'opalestate_agent', + 'post_status' => 'pending', + 'post_author' => $user_id, + ], true ); + + + do_action( 'opalesate_insert_user_agent', $agent_id ); + + return $agent_id; + } + + /** + * + */ + public function render_front_form( $metaboxes, $post_id = 0 ) { + $metabox = new Opalestate_Agent_MetaBox(); + + return $metabox->render_front_form( $metaboxes, $post_id ); + } +} + +Opalestate_Agent_Front::get_instance(); diff --git a/inc/agent/class-opalestate-agent-metabox.php b/inc/agent/class-opalestate-agent-metabox.php new file mode 100755 index 00000000..c8ce1b37 --- /dev/null +++ b/inc/agent/class-opalestate-agent-metabox.php @@ -0,0 +1,225 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Agent_MetaBox extends Opalestate_User_MetaBox { + + /** + * + */ + public function metaboxes_admin_fields( $prefix = '' ) { + if ( ! $prefix ) { + $prefix = OPALESTATE_AGENT_PREFIX; + } + + $fields = []; + + $fields = array_merge_recursive( $fields, + $this->get_base_fields( $prefix ), + $this->get_job_fields( $prefix ), + $this->get_address_fields( $prefix ) + ); + + return apply_filters( 'opalestate_postype_agent_metaboxes_fields', $fields ); + } + + public function metaboxes_target() { + + $prefix = OPALESTATE_AGENT_PREFIX; + $fields = [ + [ + 'id' => "{$prefix}user_id", + 'name' => esc_html__( 'Link to User', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'Enter User ID to show information without using user info', 'opalestate-pro' ), + ], + + [ + 'id' => "{$prefix}target_min_price", + 'name' => esc_html__( 'Target Min Price', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'Enter min price of property which is for sale/rent...', 'opalestate-pro' ), + ], + + [ + 'id' => "{$prefix}target_max_price", + 'name' => esc_html__( 'Target Max Price', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'Enter max price of property which is for sale/rent...', 'opalestate-pro' ), + ], + [ + 'name' => esc_html__( 'Types', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select one, to add new you create in location of estate panel', 'opalestate-pro' ), + 'id' => $prefix . "type", + 'taxonomy' => 'opalestate_types', //Enter Taxonomy Slug + 'type' => 'taxonomy_select', + ], + ]; + + return $fields; + } + + /** + * + */ + public function metaboxes_front_fields( $prefix = '', $post_id = 0 ) { + if ( ! $prefix ) { + $prefix = OPALESTATE_AGENT_PREFIX; + } + $post = get_post( $post_id ); + + $fields = [ + [ + 'id' => $prefix . 'post_type', + 'type' => 'hidden', + 'default' => 'opalestate_agent', + ], + [ + 'name' => esc_html__( 'Title/Name', 'opalestate-pro' ), + 'id' => $prefix . 'title', + 'type' => 'text', + 'default' => ! empty( $post ) ? $post->post_title : '', + 'attributes' => [ + 'required' => 'required', + ], + ], + [ + 'name' => esc_html__( 'Information', 'opalestate-pro' ), + 'id' => $prefix . 'text', + 'type' => 'wysiwyg', + 'default' => ! empty( $post ) ? $post->post_content : '', + 'attributes' => [ + 'required' => 'required', + ], + ], + + [ + 'name' => esc_html__( 'Types', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select one, to add new you create in location of estate panel', 'opalestate-pro' ), + 'id' => $prefix . "type", + 'taxonomy' => 'opalestate_types', //Enter Taxonomy Slug + 'type' => 'taxonomy_select', + + ], + [ + 'id' => "{$prefix}target_min_price", + 'name' => esc_html__( 'Target Min Price', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'Enter min price of property which is for sale/rent...', 'opalestate-pro' ), + ], + + [ + 'id' => "{$prefix}target_max_price", + 'name' => esc_html__( 'Target Max Price', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'Enter max price of property which is for sale/rent...', 'opalestate-pro' ), + 'after_row' => '', + ], + ]; + + + $fields = array_merge_recursive( $fields, + $this->get_base_front_fields( $prefix ), + $this->get_address_fields( $prefix ), + $this->get_social_fields( $prefix ) + ); + + return apply_filters( 'opalestate_postype_agent_metaboxes_fields', $fields ); + } + + + public function get_base_front_fields( $prefix ) { + return [ + [ + 'id' => "{$prefix}featured_image", + 'name' => esc_html__( 'Banner', 'opalestate-pro' ), + 'type' => 'uploader', + 'is_featured' => true, + 'limit' => 1, + 'single' => 1, + 'description' => esc_html__( 'Select one or more images to show as gallery', 'opalestate-pro' ), + 'before_row' => '


            ', + ], + [ + 'name' => esc_html__( 'Avatar Picture', 'opalestate-pro' ), + 'desc' => esc_html__( 'This image will display in user detail and profile box information', 'opalestate-pro' ), + 'id' => $prefix . 'avatar', + 'type' => 'hidden', + 'single' => 1, + 'limit' => 1, + + ], + + [ + 'name' => esc_html__( 'Avatar Picture', 'opalestate-pro' ), + 'desc' => esc_html__( 'This image will display in user detail and profile box information', 'opalestate-pro' ), + 'id' => $prefix . 'avatar_id', + 'type' => 'uploader', + 'single' => 1, + 'limit' => 1, + + ], + + [ + 'name' => esc_html__( 'Email', 'opalestate-pro' ), + 'id' => "{$prefix}email", + 'type' => 'text', + 'before_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Website', 'opalestate-pro' ), + 'id' => "{$prefix}web", + 'type' => 'text_url', + ], + [ + 'name' => esc_html__( 'Phone', 'opalestate-pro' ), + 'id' => "{$prefix}phone", + 'type' => 'text', + ], + + [ + 'name' => esc_html__( 'Mobile', 'opalestate-pro' ), + 'id' => "{$prefix}mobile", + 'type' => 'text', + ], + + [ + 'name' => esc_html__( 'Fax', 'opalestate-pro' ), + 'id' => "{$prefix}fax", + 'type' => 'text', + 'after_row' => '
            ', + ], + ]; + } + + /** + * + */ + public function render_front_form( $metaboxes, $post_id = 0 ) { + $prefix = OPALESTATE_AGENT_PREFIX; + $metaboxes[ $prefix . 'front' ] = [ + 'id' => $prefix . 'front', + 'title' => esc_html__( 'Agent Information', 'opalestate-pro' ), + 'object_types' => [ 'opalestate_agent' ], + 'context' => 'normal', + 'priority' => 'high', + 'show_names' => true, + 'fields' => $this->metaboxes_front_fields( $prefix, $post_id ), + ]; + + return $metaboxes; + } +} diff --git a/inc/agent/class-opalestate-agent-posttype.php b/inc/agent/class-opalestate-agent-posttype.php new file mode 100755 index 00000000..e1ca4cfb --- /dev/null +++ b/inc/agent/class-opalestate-agent-posttype.php @@ -0,0 +1,103 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_PostType_Agent { + + /** + * Opalestate_PostType_Agent constructor. + */ + public function __construct() { + add_action( 'init', [ __CLASS__, 'definition' ] ); + } + + /** + * Register Post type and taxonomies + */ + public static function definition() { + if ( ! is_blog_installed() || post_type_exists( 'opalestate_agent' ) ) { + return; + } + + $labels = [ + 'name' => esc_html__( 'Agents', 'opalestate-pro' ), + 'singular_name' => esc_html__( 'Property', 'opalestate-pro' ), + 'add_new' => esc_html__( 'Add New Agent', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New Agent', 'opalestate-pro' ), + 'edit_item' => esc_html__( 'Edit Agent', 'opalestate-pro' ), + 'new_item' => esc_html__( 'New Agent', 'opalestate-pro' ), + 'all_items' => esc_html__( 'All Agents', 'opalestate-pro' ), + 'view_item' => esc_html__( 'View Agent', 'opalestate-pro' ), + 'search_items' => esc_html__( 'Search Agent', 'opalestate-pro' ), + 'not_found' => esc_html__( 'No Agents found', 'opalestate-pro' ), + 'not_found_in_trash' => esc_html__( 'No Agents found in Trash', 'opalestate-pro' ), + 'parent_item_colon' => '', + 'menu_name' => esc_html__( 'Agents', 'opalestate-pro' ), + ]; + + $labels = apply_filters( 'opalestate_postype_agent_labels', $labels ); + + register_post_type( 'opalestate_agent', + apply_filters( 'opalestate_agent_post_type_parameters', [ + 'labels' => $labels, + 'supports' => [ 'title', 'editor', 'thumbnail', 'comments', 'author', 'excerpt' ], + 'public' => true, + 'has_archive' => true, + 'menu_position' => 51, + 'categories' => [], + 'menu_icon' => 'dashicons-groups', + 'rewrite' => [ 'slug' => esc_html_x( 'agent', 'agent slug', 'opalestate-pro' ) ], + ] ) + ); + + static::register_taxonomies(); + } + + /** + * Register Agency Agency Taxonomy + */ + private static function register_taxonomies() { + /// Register Agent Levels + $labels = [ + 'name' => esc_html__( 'Agent Levels', 'opalestate-pro' ), + 'singular_name' => esc_html__( 'Level', 'opalestate-pro' ), + 'search_items' => esc_html__( 'Search Level', 'opalestate-pro' ), + 'all_items' => esc_html__( 'All Levels', 'opalestate-pro' ), + 'parent_item' => esc_html__( 'Parent Level', 'opalestate-pro' ), + 'parent_item_colon' => esc_html__( 'Parent Level:', 'opalestate-pro' ), + 'edit_item' => esc_html__( 'Edit Level', 'opalestate-pro' ), + 'update_item' => esc_html__( 'Update Level', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New Level', 'opalestate-pro' ), + 'new_item_name' => esc_html__( 'New Level Name', 'opalestate-pro' ), + 'menu_name' => esc_html__( 'Agent Levels', 'opalestate-pro' ), + ]; + /// + register_taxonomy( 'opalestate_agent_level', [ 'opalestate_agent' ], + [ + 'hierarchical' => true, + 'labels' => $labels, + 'show_ui' => true, + 'show_admin_column' => true, + 'query_var' => true, + 'show_in_nav_menus' => true, + 'rewrite' => [ + 'slug' => esc_html_x( 'agent-level', 'agent level slug', 'opalestate-pro' ), + ], + ] ); + } +} + +new Opalestate_PostType_Agent(); diff --git a/inc/agent/class-opalestate-agent-query.php b/inc/agent/class-opalestate-agent-query.php new file mode 100755 index 00000000..0258be50 --- /dev/null +++ b/inc/agent/class-opalestate-agent-query.php @@ -0,0 +1,20 @@ + + * @copyright Copyright (C) 2014 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +// Exit if accessed directly +if ( !defined( 'ABSPATH' ) ) exit; + +class Opalestate_Agent_Query extends OpalEstate_Abstract_Query { + +} \ No newline at end of file diff --git a/inc/agent/class-opalestate-agent.php b/inc/agent/class-opalestate-agent.php new file mode 100755 index 00000000..14c1bcbd --- /dev/null +++ b/inc/agent/class-opalestate-agent.php @@ -0,0 +1,277 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * @class OpalEstate_Agent + * + * @version 1.0 + */ +class OpalEstate_Agent { + + /** + * @var String $author_name + * + * @access protected + */ + protected $author_name; + + /** + * @var Boolean $is_featured + * + * @access protected + */ + protected $is_featured; + + /** + * Constructor + */ + public function __construct( $post_id = null ) { + + global $post; + + if ( $post ) { + $this->post = $post; + $this->post_id = $post_id ? $post_id : get_the_ID(); + $this->author = get_userdata( $post->post_author ); + $this->author_name = ! empty( $this->author ) ? sprintf( '%s %s', $this->author->first_name, $this->author->last_name ) : null; + $this->is_featured = $this->get_meta( 'featured' ); + $this->is_trusted = $this->get_meta( 'trusted' ); + } + } + + public function get_id() { + return $this->post_id; + } + + /** + * Get Collection Of soicals with theirs values + */ + public function get_socials() { + $socials = [ + 'facebook' => '', + 'twitter' => '', + 'pinterest' => '', + 'google' => '', + 'instagram' => '', + 'linkedIn' => '', + ]; + + $output = []; + + foreach ( $socials as $social => $k ) { + + $data = $this->get_meta( $social ); + if ( $data && $data != "#" && ! empty( $data ) ) { + $output[ $social ] = $data; + } + } + + return $output; + } + + /** + * Get url of user avatar by agent id + */ + public static function get_avatar_url( $userID ) { + return get_post_meta( $userID, OPALESTATE_AGENT_PREFIX . "avatar", true ); + } + + /** + * Render list of levels of agent + */ + public function render_level() { + $levels = wp_get_post_terms( $this->get_id(), 'opalestate_agent_level' ); + + if ( empty( $levels ) ) { + return; + } + + $output = ''; + foreach ( $levels as $key => $value ) { + $output .= '' . $value->name . ''; + } + $output .= ''; + + echo $output; + } + + /** + * get meta data value of key without prefix + */ + public function get_meta( $key ) { + return get_post_meta( $this->get_id(), OPALESTATE_AGENT_PREFIX . $key, true ); + } + + + /** + * return true if this agent is featured + */ + public function is_featured() { + return $this->is_featured; + } + + /** + * render block information by id + */ + public static function render_box_info( $post_id ) { + + } + + public static function get_link( $agent_id ) { + $agent = get_post( $agent_id ); + $url = self::get_avatar_url( $agent_id ); + + return [ + 'name' => $agent->post_title, + 'avatar' => $url, + 'link' => get_permalink( $agent->ID ), + ]; + + } + + public static function metaboxes_fields() { + $metabox = new Opalestate_Agent_MetaBox(); + $fields = $metabox->metaboxes_admin_fields(); + + return array_merge_recursive( $fields, $metabox->get_social_fields( OPALESTATE_AGENT_PREFIX ) ); + } + + public static function update_user_data( $user_id ) { + + $fields = self::metaboxes_fields(); + + $others = [ + 'avatar_id' => '', + 'opalestate_agt_map' => '', + 'map' => '', + ]; + foreach ( $fields as $key => $field ) { + $kpos = $field['id']; + $tmp = str_replace( OPALESTATE_AGENT_PREFIX, '', $field['id'] ); + if ( isset( $_POST[ $kpos ] ) && $tmp ) { + $data = is_string( $_POST[ $kpos ] ) ? sanitize_text_field( $_POST[ $kpos ] ) : $_POST[ $kpos ]; + update_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . $tmp, $data ); + } + } + + // update for others + foreach ( $others as $key => $value ) { + $kpos = OPALESTATE_AGENT_PREFIX . $key; + if ( isset( $_POST[ $kpos ] ) ) { + $data = is_string( $_POST[ $kpos ] ) ? sanitize_text_field( $_POST[ $kpos ] ) : $_POST[ $kpos ]; + update_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . $key, $data ); + } + } + } + + /** + * + */ + public function get_trusted() { + return $this->is_trusted; + } + + /** + * + */ + public static function update_data_from_user( $related_id ) { + + + $fields = self::metaboxes_fields(); + + $others = [ + 'avatar_id' => '', + 'map' => '', + ]; + foreach ( $fields as $key => $field ) { + + $tmp = str_replace( OPALESTATE_AGENT_PREFIX, "", $field['id'] ); + $kpos = OPALESTATE_USER_PROFILE_PREFIX . $tmp; + + if ( isset( $_POST[ $kpos ] ) && $tmp ) { + $data = is_string( $_POST[ $kpos ] ) ? sanitize_text_field( $_POST[ $kpos ] ) : $_POST[ $kpos ]; + update_post_meta( $related_id, OPALESTATE_AGENT_PREFIX . $tmp, $data ); + } + } + + // update for others + foreach ( $others as $key => $value ) { + $kpos = OPALESTATE_USER_PROFILE_PREFIX . $key; + if ( isset( $_POST[ $kpos ] ) ) { + $data = is_string( $_POST[ $kpos ] ) ? sanitize_text_field( $_POST[ $kpos ] ) : $_POST[ $kpos ]; + update_post_meta( $related_id, OPALESTATE_AGENT_PREFIX . $key, $data ); + } + } + } + + /** + * Get rating count. + * + * @param string $context What the value is for. Valid values are view and edit. + * @return int + */ + public function get_rating_counts() { + return $this->get_meta( 'rating_count' ) ? $this->get_meta( 'rating_count' ) : 0; + } + + /** + * Get average rating. + * + * @param string $context What the value is for. Valid values are view and edit. + * @return float + */ + public function get_average_rating() { + return $this->get_meta( 'average_rating' ) ? $this->get_meta( 'average_rating' ) : 0; + } + + /** + * Get review count. + * + * @param string $context What the value is for. Valid values are view and edit. + * @return int + */ + public function get_review_count() { + return $this->get_meta( 'review_count' ) ? $this->get_meta( 'review_count' ) : 0; + } + + /** + * + */ + public function get_rating_count_stats() { + return $this->get_meta( 'rating_count_stats' ) ? $this->get_meta( 'rating_count_stats' ) : [ + 5 => 0, + 4 => 0, + 3 => 0, + 2 => 0, + 1 => 0, + ]; + } + + /** + * + */ + public function get_rating_average_stats() { + return $this->get_meta( 'rating_average_stats' ); + } + + public function get_count_listing() { + return 4; + } +} + +?> diff --git a/inc/agent/functions.php b/inc/agent/functions.php new file mode 100755 index 00000000..e69de29b diff --git a/inc/ajax-functions.php b/inc/ajax-functions.php new file mode 100755 index 00000000..eabf0561 --- /dev/null +++ b/inc/ajax-functions.php @@ -0,0 +1,301 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} +function opalestate_gallery_property() { + $post_id = intval( $_POST['property_id'] ); + $gallery = get_post_meta( $post_id, OPALESTATE_PROPERTY_PREFIX . 'gallery', 1 ); + + echo json_encode( [ 'gallery' => $gallery ] ); + die; +} + +add_action( 'wp_ajax_opalestate_gallery_property', 'opalestate_gallery_property' ); +add_action( 'wp_ajax_nopriv_opalestate_gallery_property', 'opalestate_gallery_property' ); +/** + * Searches for users via ajax and returns a list of results + * + * @return void + * @since 1.0 + * + */ +function opalestate_ajax_search_property_users() { + + $search_query = trim( $_GET['q'] ); + + $get_users_args = [ + 'number' => 9999, + 'search' => $search_query . '*', + ]; + + $get_users_args = apply_filters( 'opalestate_search_users_args', $get_users_args ); + + $found_users = apply_filters( 'opalestate_ajax_found_property_users', get_users( $get_users_args ), $search_query ); + + $users = []; + if ( ! empty( $found_users ) ) { + foreach ( $found_users as $user ) { + $users[] = [ + 'id' => $user->ID, + 'name' => $user->display_name, + 'avatar_url' => OpalEstate_User::get_author_picture( $user->ID ), + 'full_name' => $user->display_name, + 'description' => 'okokok', + ]; + } + } + + $output = [ + 'total_count' => count( $users ), + 'items' => $users, + 'incomplete_results' => false, + ]; + echo json_encode( $output ); + + die(); +} + +add_action( 'wp_ajax_opalestate_search_property_users', 'opalestate_ajax_search_property_users' ); + + +add_action( 'wp_ajax_opalestate_ajax_get_state_by_country', "opalestate_ajax_get_state_by_country" ); +function opalestate_ajax_get_state_by_country() { + if ( ! isset( $_POST['country'] ) ) { + die; + } + + $country = sanitize_text_field( $_POST['country'] ); + + $is_search = isset( $_POST['is_search'] ) && $_POST['is_search']; + + $terms = get_terms( [ + 'taxonomy' => 'opalestate_state', + 'orderby' => 'name', + 'order' => 'ASC', + 'hide_empty' => $is_search ? true : false, + 'meta_query' => [ + [ + 'key' => 'opalestate_state_location', + 'value' => $country, + ], + ], + ] ); + + $states = []; + $states[] = [ + 'id' => $is_search ? '-1' : '', + 'text' => esc_html__( 'Select State', 'opalestate-pro' ), + ]; + + if ( $terms ) { + foreach ( $terms as $term ) { + $states[] = [ + 'id' => $term->slug, + 'text' => $term->name, + ]; + } + } + + echo json_encode( $states ); + wp_die(); +} + +add_action( 'wp_ajax_opalestate_ajax_get_city_by_state', "opalestate_ajax_get_city_by_state" ); +function opalestate_ajax_get_city_by_state() { + if ( ! isset( $_POST['state'] ) ) { + die; + } + + $state = sanitize_text_field( $_POST['state'] ); + + $is_search = isset( $_POST['is_search'] ) && $_POST['is_search']; + + $terms = get_terms( [ + 'taxonomy' => 'opalestate_city', + 'orderby' => 'name', + 'order' => 'ASC', + 'hide_empty' => $is_search ? true : false, + 'meta_query' => [ + [ + 'key' => 'opalestate_city_state', + 'value' => $state, + ], + ], + ] ); + + $cities = []; + $cities[] = [ + 'id' => $is_search ? '-1' : '', + 'text' => esc_html__( 'Select City', 'opalestate-pro' ), + ]; + + if ( $terms ) { + foreach ( $terms as $term ) { + $cities[] = [ + 'id' => $term->slug, + 'text' => $term->name, + ]; + } + } + + echo json_encode( $cities ); + wp_die(); +} + +/* set feature property */ +add_action( 'wp_ajax_opalestate_set_feature_property', 'opalestate_set_feature_property' ); +add_action( 'wp_ajax_nopriv_opalestate_set_feature_property', 'opalestate_set_feature_property' ); +if ( ! function_exists( 'opalestate_set_feature_property' ) ) { + function opalestate_set_feature_property() { + + if ( ! isset( $_REQUEST['nonce'] ) && ! wp_verify_nonce( $_REQUEST['nonce'], 'nonce' ) ) { + return; + } + if ( ! isset( $_REQUEST['property_id'] ) ) { + return; + } + update_post_meta( absint( $_REQUEST['property_id'] ), OPALESTATE_PROPERTY_PREFIX . 'featured', 1 ); + + wp_redirect( admin_url( 'edit.php?post_type=opalestate_property' ) ); + exit(); + } +} +/* remove feature property */ +add_action( 'wp_ajax_opalestate_remove_feature_property', 'opalestate_remove_feature_property' ); +add_action( 'wp_ajax_nopriv_opalestate_remove_feature_property', 'opalestate_remove_feature_property' ); +if ( ! function_exists( 'opalestate_remove_feature_property' ) ) { + function opalestate_remove_feature_property() { + if ( ! isset( $_REQUEST['nonce'] ) && ! wp_verify_nonce( $_REQUEST['nonce'], 'nonce' ) ) { + return; + } + + if ( ! isset( $_REQUEST['property_id'] ) ) { + return; + } + + update_post_meta( absint( $_REQUEST['property_id'] ), OPALESTATE_PROPERTY_PREFIX . 'featured', '' ); + wp_redirect( admin_url( 'edit.php?post_type=opalestate_property' ) ); + exit(); + } +} + +/** + * Set Featured Item Following user + */ +add_action( 'wp_ajax_opalestate_toggle_featured_property', 'opalestate_toggle_featured_property' ); +add_action( 'wp_ajax_nopriv_opalestate_toggle_featured_property', 'opalestate_toggle_featured_property' ); + +function opalestate_toggle_featured_property() { + + global $current_user; + wp_get_current_user(); + $user_id = $current_user->ID; + + $property_id = intval( $_POST['property_id'] ); + $post = get_post( $property_id ); + + if ( $post->post_author == $user_id ) { + + $check = apply_filters( 'opalestate_set_feature_property_checked', false ); + if ( $check ) { + do_action( 'opalestate_toggle_featured_property_before', $user_id, $property_id ); + update_post_meta( $property_id, OPALESTATE_PROPERTY_PREFIX . 'featured', 1 ); + echo json_encode( [ 'status' => true, 'msg' => esc_html__( 'Could not set this as featured', 'opalestate-pro' ) ] ); + wp_die(); + } + } + + echo json_encode( [ 'status' => false, 'msg' => esc_html__( 'Could not set this as featured', 'opalestate-pro' ) ] ); + wp_reset_query(); + wp_die(); + +} + + +/** + * load more properties by agency + */ +add_action( 'wp_ajax_get_agency_property', 'opalestate_load_more_agency_property' ); +add_action( 'wp_ajax_nopriv_get_agency_property', 'opalestate_load_more_agency_property' ); + +function opalestate_load_more_agency_property() { + + + $post = [ + 'post_id' => 0, + 'paged' => 1, + 'user_id' => 13, + 'related' => '', + 'limit' => apply_filters( 'opalesate_agency_properties_limit', 5 ), + ]; + + $post = array_merge( $post, $_POST ); + extract( $post ); + + $user_id = get_post_meta( absint( $post_id ), OPALESTATE_AGENCY_PREFIX . 'user_id', true ); + $query = Opalestate_Query::get_agency_property( absint( $post_id ), absint( $user_id ), absint( $limit ), absint( $paged ) ); + + if ( $query->have_posts() ) : + while ( $query->have_posts() ) : $query->the_post(); ?> +
            + +
            + 1, + 'id' => 13, + 'limit' => apply_filters( 'opalesate_agent_properties_limit', 1 ), + ]; + + $post = array_merge( $post, $_POST ); + extract( $post ); + + set_query_var( 'paged', $post['paged'] ); + $query = Opalestate_Query::get_agent_property( null, absint( $post['id'] ), absint( $limit ) ); + + $paged = absint( $post['paged'] ); + if ( $query->have_posts() ) : ?> +
            +
            + have_posts() ) : $query->the_post(); ?> +
            + +
            + +
            +
            + max_num_pages > 1 ): ?> +
            max_num_pages ); ?>
            + + versions = array( + 'v1' => 'Opalestate_API', + ); + + + + add_action( 'init', array( $this, 'add_endpoint' ) ); + add_action( 'wp', array( $this, 'process_query' ), - 1 ); + add_filter( 'query_vars', array( $this, 'query_vars' ) ); + add_action( 'show_user_profile', array( $this, 'user_key_field' ) ); + add_action( 'edit_user_profile', array( $this, 'user_key_field' ) ); + add_action( 'personal_options_update', array( $this, 'update_key' ) ); + add_action( 'edit_user_profile_update', array( $this, 'update_key' ) ); + add_action( 'opalestate_process_api_key', array( $this, 'process_api_key' ) ); + + // Setup a backwards compatibility check for user API Keys + add_filter( 'get_user_metadata', array( $this, 'api_key_backwards_compat' ), 10, 4 ); + + // Determine if JSON_PRETTY_PRINT is available + $this->pretty_print = defined( 'JSON_PRETTY_PRINT' ) ? JSON_PRETTY_PRINT : null; + + // Allow API request logging to be turned off + $this->log_requests = apply_filters( 'opalestate_api_log_requests', $this->log_requests ); + + + } + + /** + * Registers a new rewrite endpoint for accessing the API + * + * @access public + * + * @param array $rewrite_rules WordPress Rewrite Rules + * + * @since 1.1 + */ + public function add_endpoint( $rewrite_rules ) { + add_rewrite_endpoint( 'opalestate-api', EP_ALL ); + } + + /** + * Registers query vars for API access + * + * @access public + * @since 1.1 + * + * @param array $vars Query vars + * + * @return string[] $vars New query vars + */ + public function query_vars( $vars ) { + + $vars[] = 'token'; + $vars[] = 'key'; + $vars[] = 'query'; + $vars[] = 'type'; + $vars[] = 'property'; + $vars[] = 'number'; + $vars[] = 'date'; + $vars[] = 'startdate'; + $vars[] = 'enddate'; + $vars[] = 'donor'; + $vars[] = 'propertyat'; + $vars[] = 'id'; + $vars[] = 'purchasekey'; + $vars[] = 'email'; + + return $vars; + } + + /** + * Retrieve the API versions + * + * @access public + * @since 1.1 + * @return array + */ + public function get_versions() { + return $this->versions; + } + + /** + * Retrieve the API version that was queried + * + * @access public + * @since 1.1 + * @return string + */ + public function get_queried_version() { + return $this->queried_version; + } + + /** + * Retrieves the default version of the API to use + * + * @access public + * @since 1.1 + * @return string + */ + public function get_default_version() { + + $version = get_option( 'opalestate_default_api_version' ); + + if ( defined( 'OPALESTATE_API_VERSION' ) ) { + $version = OPALESTATE_API_VERSION; + } elseif ( ! $version ) { + $version = 'v1'; + } + + return $version; + } + + /** + * Sets the version of the API that was queried. + * + * Falls back to the default version if no version is specified + * + * @access private + * @since 1.1 + */ + private function set_queried_version() { + + global $wp_query; + + $version = $wp_query->query_vars['opalestate-api']; + + if ( strpos( $version, '/' ) ) { + + $version = explode( '/', $version ); + $version = strtolower( $version[0] ); + + $wp_query->query_vars['opalestate-api'] = str_replace( $version . '/', '', $wp_query->query_vars['opalestate-api'] ); + + if ( array_key_exists( $version, $this->versions ) ) { + + $this->queried_version = $version; + + } else { + + $this->is_valid_request = false; + $this->invalid_version(); + } + + } else { + + $this->queried_version = $this->get_default_version(); + + } + + } + + /** + * Validate the API request + * + * Checks for the user's public key and token against the secret key + * + * @access private + * @global object $wp_query WordPress Query + * @uses Opalestate_API::get_user() + * @uses Opalestate_API::invalid_key() + * @uses Opalestate_API::invalid_auth() + * @since 1.1 + * @return void + */ + private function validate_request() { + global $wp_query; + + $this->override = false; + + // Make sure we have both user and api key + if ( ! empty( $wp_query->query_vars['opalestate-api'] ) && ( $wp_query->query_vars['opalestate-api'] != 'properties' || ! empty( $wp_query->query_vars['token'] ) ) ) { + + if ( empty( $wp_query->query_vars['token'] ) || empty( $wp_query->query_vars['key'] ) ) { + $this->missing_auth(); + } + + // Retrieve the user by public API key and ensure they exist + if ( ! ( $user = $this->get_user( $wp_query->query_vars['key'] ) ) ) { + + $this->invalid_key(); + + } else { + + $token = urldecode( $wp_query->query_vars['token'] ); + $secret = $this->get_user_secret_key( $user ); + $public = urldecode( $wp_query->query_vars['key'] ); + + if ( hash_equals( md5( $secret . $public ), $token ) ) { + $this->is_valid_request = true; + } else { + $this->invalid_auth(); + } + } + } elseif ( ! empty( $wp_query->query_vars['opalestate-api'] ) && $wp_query->query_vars['opalestate-api'] == 'properties' ) { + $this->is_valid_request = true; + $wp_query->set( 'key', 'public' ); + } + } + + /** + * Retrieve the user ID based on the public key provided + * + * @access public + * @since 1.1 + * @global WPDB $wpdb Used to query the database using the WordPress + * Database API + * + * @param string $key Public Key + * + * @return bool if user ID is found, false otherwise + */ + public function get_user( $key = '' ) { + global $wpdb, $wp_query; + + if ( empty( $key ) ) { + $key = urldecode( $wp_query->query_vars['key'] ); + } + + if ( empty( $key ) ) { + return false; + } + + $user = get_transient( md5( 'opalestate_api_user_' . $key ) ); + + if ( false === $user ) { + $user = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s LIMIT 1", $key ) ); + set_transient( md5( 'opalestate_api_user_' . $key ), $user, DAY_IN_SECONDS ); + } + + if ( $user != null ) { + $this->user_id = $user; + + return $user; + } + + return false; + } + + public function get_user_public_key( $user_id = 0 ) { + global $wpdb; + + if ( empty( $user_id ) ) { + return ''; + } + + $cache_key = md5( 'opalestate_api_user_public_key' . $user_id ); + $user_public_key = get_transient( $cache_key ); + + if ( empty( $user_public_key ) ) { + $user_public_key = $wpdb->get_var( $wpdb->prepare( "SELECT meta_key FROM $wpdb->usermeta WHERE meta_value = 'opalestate_user_public_key' AND user_id = %d", $user_id ) ); + set_transient( $cache_key, $user_public_key, HOUR_IN_SECONDS ); + } + + return $user_public_key; + } + + public function get_user_secret_key( $user_id = 0 ) { + global $wpdb; + + if ( empty( $user_id ) ) { + return ''; + } + + $cache_key = md5( 'opalestate_api_user_secret_key' . $user_id ); + $user_secret_key = get_transient( $cache_key ); + + if ( empty( $user_secret_key ) ) { + $user_secret_key = $wpdb->get_var( $wpdb->prepare( "SELECT meta_key FROM $wpdb->usermeta WHERE meta_value = 'opalestate_user_secret_key' AND user_id = %d", $user_id ) ); + set_transient( $cache_key, $user_secret_key, HOUR_IN_SECONDS ); + } + + return $user_secret_key; + } + + /** + * Displays a missing authentication error if all the parameters aren't + * provided + * + * @access private + * @uses Opalestate_API::output() + * @since 1.1 + */ + private function missing_auth() { + $error = array(); + $error['error'] = esc_html__( 'You must specify both a token and API key!', 'opalestate-pro' ); + + $this->data = $error; + $this->output( 401 ); + } + + /** + * Displays an authentication failed error if the user failed to provide valid + * credentials + * + * @access private + * @since 1.1 + * @uses Opalestate_API::output() + * @return void + */ + private function invalid_auth() { + $error = array(); + $error['error'] = esc_html__( 'Your request could not be authenticated!', 'opalestate-pro' ); + + $this->data = $error; + $this->output( 403 ); + } + + /** + * Displays an invalid API key error if the API key provided couldn't be + * validated + * + * @access private + * @since 1.1 + * @uses Opalestate_API::output() + * @return void + */ + private function invalid_key() { + $error = array(); + $error['error'] = esc_html__( 'Invalid API key!', 'opalestate-pro' ); + + $this->data = $error; + $this->output( 403 ); + } + + /** + * Displays an invalid version error if the version number passed isn't valid + * + * @access private + * @since 1.1 + * @uses Opalestate_API::output() + * @return void + */ + private function invalid_version() { + $error = array(); + $error['error'] = esc_html__( 'Invalid API version!', 'opalestate-pro' ); + + $this->data = $error; + $this->output( 404 ); + } + + /** + * Listens for the API and then processes the API requests + * + * @access public + * @global $wp_query + * @since 1.1 + * @return void + */ + public function process_query() { + + global $wp_query; + + // Start logging how long the request takes for logging + $before = microtime( true ); + + // Check for opalestate-api var. Get out if not present + if ( empty( $wp_query->query_vars['opalestate-api'] ) ) { + return; + } + + // Determine which version was queried + $this->set_queried_version(); + + // Determine the kind of query + $this->set_query_mode(); + + // Check for a valid user and set errors if necessary + $this->validate_request(); + + // Only proceed if no errors have been noted + if ( ! $this->is_valid_request ) { + return; + } + + if ( ! defined( 'OPALESTATE_DOING_API' ) ) { + define( 'OPALESTATE_DOING_API', true ); + } + + $data = array(); + $this->routes = new $this->versions[$this->get_queried_version()]; + $this->routes->validate_request(); + + switch ( $this->endpoint ) : + + + case 'properties' : + + $property = isset( $wp_query->query_vars['property'] ) ? $wp_query->query_vars['property'] : null; + + $data = $this->routes->get_properties( $property ); + + break; + case 'featured' : + + $property = isset( $wp_query->query_vars['property'] ) ? $wp_query->query_vars['property'] : null; + + $data = $this->routes->get_featured_properties( $property ); + + break; + + case 'agents' : + + $agent = isset( $wp_query->query_vars['agent'] ) ? $wp_query->query_vars['agent'] : null; + + $data = $this->routes->get_agents( $agent ); + + break; + + + endswitch; + + // Allow extensions to setup their own return data + $this->data = apply_filters( 'opalestate_api_output_data', $data, $this->endpoint, $this ); + + $after = microtime( true ); + $request_time = ( $after - $before ); + $this->data['request_speed'] = $request_time; + + // Log this API request, if enabled. We log it here because we have access to errors. + $this->log_request( $this->data ); + + // Send out data to the output function + $this->output(); + } + + /** + * Returns the API endpoint requested + * + * @access public + * @since 1.1 + * @return string $query Query mode + */ + public function get_query_mode() { + + return $this->endpoint; + } + + /** + * Determines the kind of query requested and also ensure it is a valid query + * + * @access public + * @since 1.1 + * @global $wp_query + */ + public function set_query_mode() { + + global $wp_query; + + // Whitelist our query options + $accepted = apply_filters( 'opalestate_api_valid_query_modes', array( + 'agents', + 'properties', + 'featured' + ) ); + + $query = isset( $wp_query->query_vars['opalestate-api'] ) ? $wp_query->query_vars['opalestate-api'] : null; + $query = str_replace( $this->queried_version . '/', '', $query ); + + $error = array(); + + // Make sure our query is valid + if ( ! in_array( $query, $accepted ) ) { + $error['error'] = esc_html__( 'Invalid query!', 'opalestate-pro' ); + + $this->data = $error; + // 400 is Bad Request + $this->output( 400 ); + } + + $this->endpoint = $query; + } + + /** + * Get page number + * + * @access public + * @since 1.1 + * @global $wp_query + * @return int $wp_query->query_vars['page'] if page number returned (default: 1) + */ + public function get_paged() { + global $wp_query; + + return isset( $wp_query->query_vars['page'] ) ? $wp_query->query_vars['page'] : 1; + } + + + /** + * Number of results to display per page + * + * @access public + * @since 1.1 + * @global $wp_query + * @return int $per_page Results to display per page (default: 10) + */ + public function per_page() { + global $wp_query; + + $per_page = isset( $wp_query->query_vars['number'] ) ? $wp_query->query_vars['number'] : 10; + + return apply_filters( 'opalestate_api_results_per_page', $per_page ); + } + + + /** + * + * + */ + public function get_agents( $agent = null ) { + + $agents = array(); + $error = array(); + + if ( $agent == null ) { + $agents['agents'] = array(); + + $property_list = get_posts( array( + 'post_type' => 'opalestate_agent', + 'posts_per_page' => $this->per_page(), + 'suppress_filters' => true, + 'paged' => $this->get_paged() + ) ); + + if ( $property_list ) { + $i = 0; + foreach ( $property_list as $agent_info ) { + $agents['agents'][ $i ] = $this->get_agent_data( $agent_info ); + $i ++; + } + } + } else { + if ( get_post_type( $agent ) == 'opalestate_property' ) { + $agent_info = get_post( $agent ); + + $agents['agents'][0] = $this->get_agent_data( $agent_info ); + + } else { + $error['error'] = sprintf( + /* translators: %s: property */ + esc_html__( 'Form %s not found!', 'opalestate-pro' ), + $agent + ); + + return $error; + } + } + + return $agents; + } + + /** + * + * + */ + public function get_agent_data( $agent_info ){ + $ouput = array(); + + $ouput['info']['id'] = $agent_info->ID; + $ouput['info']['slug'] = $agent_info->post_name; + $ouput['info']['title'] = $agent_info->post_title; + $ouput['info']['create_date'] = $agent_info->post_date; + $ouput['info']['modified_date'] = $agent_info->post_modified; + $ouput['info']['status'] = $agent_info->post_status; + $ouput['info']['link'] = html_entity_decode( $agent_info->guid ); + $ouput['info']['content'] = $agent_info->post_content; + $ouput['info']['thumbnail'] = wp_get_attachment_url( get_post_thumbnail_id( $agent_info->ID ) ); + + + + $agent = new OpalEstate_Agent( $agent_info->ID ); + + $ouput['info']['featured'] = (int)$agent->is_featured(); + $ouput['info']['email'] = get_post_meta( $agent_info->ID, OPALESTATE_AGENT_PREFIX . 'email', true ); + $ouput['info']['address'] = get_post_meta( $agent_info->ID, OPALESTATE_AGENT_PREFIX . 'address', true ); + + $terms = wp_get_post_terms( $agent_info->ID, 'opalestate_agent_location' ); + $ouput['info']['location'] = $terms && !is_wp_error($terms) ? $terms : array(); + + $ouput['socials'] = $agent->get_socials(); + + $ouput['levels'] = wp_get_post_terms( $agent_info->ID, 'opalestate_agent_level' ); + + + return apply_filters( 'opalestate_api_agents', $ouput ); + } + + /** + * Process Get Products API Request + * + * @access public + * @since 1.1 + * + * @param int $property Opalestate Form ID + * + * @return array $customers Multidimensional array of the properties + */ + public function get_featured_properties( $property = null ) { + + $properties = array(); + $error = array(); + + if ( $property == null ) { + $properties['properties'] = array(); + + $property_list = get_posts( array( + 'post_type' => 'opalestate_property', + 'posts_per_page' => $this->per_page(), + 'suppress_filters' => true, + 'paged' => $this->get_paged(), + 'meta_key' => OPALESTATE_PROPERTY_PREFIX . 'featured', + 'meta_value' => 1, + 'meta_compare' => '=' + ) ); + + if ( $property_list ) { + $i = 0; + foreach ( $property_list as $property_info ) { + $properties['properties'][ $i ] = $this->get_property_data( $property_info ); + $i ++; + } + } + } else { + if ( get_post_type( $property ) == 'opalestate_property' ) { + $property_info = get_post( $property ); + + $properties['properties'][0] = $this->get_property_data( $property_info ); + + } else { + $error['error'] = sprintf( + /* translators: %s: property */ + esc_html__( 'Form %s not found!', 'opalestate-pro' ), + $property + ); + + return $error; + } + } + + return $properties; + } + + /** + * Process Get Products API Request + * + * @access public + * @since 1.1 + * + * @param int $property Opalestate Form ID + * + * @return array $customers Multidimensional array of the properties + */ + public function get_properties( $property = null ) { + + $properties = array(); + $error = array(); + + if ( $property == null ) { + $properties['properties'] = array(); + + $property_list = get_posts( array( + 'post_type' => 'opalestate_property', + 'posts_per_page' => $this->per_page(), + 'suppress_filters' => true, + 'paged' => $this->get_paged() + ) ); + + if ( $property_list ) { + $i = 0; + foreach ( $property_list as $property_info ) { + $properties['properties'][ $i ] = $this->get_property_data( $property_info ); + $i ++; + } + } + } else { + if ( get_post_type( $property ) == 'opalestate_property' ) { + $property_info = get_post( $property ); + + $properties['properties'][0] = $this->get_property_data( $property_info ); + + } else { + $error['error'] = sprintf( + /* translators: %s: property */ + esc_html__( 'Form %s not found!', 'opalestate-pro' ), + $property + ); + + return $error; + } + } + + return $properties; + } + + /** + * Opalestaten a opalestate_property post object, generate the data for the API output + * + * @since 1.1 + * + * @param object $property_info The Download Post Object + * + * @return array Array of post data to return back in the API + */ + private function get_property_data( $property_info ) { + + $property = array(); + + $property['info']['id'] = $property_info->ID; + $property['info']['slug'] = $property_info->post_name; + $property['info']['title'] = $property_info->post_title; + $property['info']['create_date'] = $property_info->post_date; + $property['info']['modified_date'] = $property_info->post_modified; + $property['info']['status'] = $property_info->post_status; + $property['info']['link'] = html_entity_decode( $property_info->guid ); + $property['info']['content'] = $property_info->post_content; + $property['info']['thumbnail'] = wp_get_attachment_url( get_post_thumbnail_id( $property_info->ID ) ); + + $data = opalesetate_property( $property_info->ID ); + $gallery = $data->get_gallery(); + $property['info']['gallery'] = isset($gallery[0]) && !empty($gallery[0]) ? $gallery[0]: array(); + $property['info']['price'] = opalestate_price_format( $data->get_price() ); + $property['info']['map'] = $data->get_map(); + $property['info']['address'] = $data->get_address(); + $property['meta'] = $data->get_meta_shortinfo(); + + $property['status'] = $data->get_status(); + $property['locations'] = $data->get_locations(); + $property['amenities'] = $data->get_amenities(); + $property['types'] = $data->get_types_tax(); + + + if ( user_can( $this->user_id, 'view_opalestate_sensitive_data' ) || $this->override ) { + + //Sensitive data here + do_action( 'opalestate_api_sensitive_data' ); + + } + + return apply_filters( 'opalestate_api_properties_property', $property ); + + } + + + + + /** + * Retrieve the output propertyat + * + * Determines whether results should be displayed in XML or JSON + * + * @since 1.1 + * @access public + * + * @return mixed|void + */ + public function get_output_propertyat() { + global $wp_query; + + $propertyat = isset( $wp_query->query_vars['propertyat'] ) ? $wp_query->query_vars['propertyat'] : 'json'; + + return apply_filters( 'opalestate_api_output_propertyat', $propertyat ); + } + + + /** + * Log each API request, if enabled + * + * @access private + * @since 1.1 + * + * @global Opalestate_Logging $opalestate_logs + * @global WP_Query $wp_query + * + * @param array $data + * + * @return void + */ + private function log_request( $data = array() ) { + if ( ! $this->log_requests ) { + return; + } + + /** + * @var Opalestate_Logging $opalestate_logs + */ + global $opalestate_logs; + + /** + * @var WP_Query $wp_query + */ + global $wp_query; + + $query = array( + 'opalestate-api' => $wp_query->query_vars['opalestate-api'], + 'key' => isset( $wp_query->query_vars['key'] ) ? $wp_query->query_vars['key'] : null, + 'token' => isset( $wp_query->query_vars['token'] ) ? $wp_query->query_vars['token'] : null, + 'query' => isset( $wp_query->query_vars['query'] ) ? $wp_query->query_vars['query'] : null, + 'type' => isset( $wp_query->query_vars['type'] ) ? $wp_query->query_vars['type'] : null, + 'property' => isset( $wp_query->query_vars['property'] ) ? $wp_query->query_vars['property'] : null, + 'customer' => isset( $wp_query->query_vars['customer'] ) ? $wp_query->query_vars['customer'] : null, + 'date' => isset( $wp_query->query_vars['date'] ) ? $wp_query->query_vars['date'] : null, + 'startdate' => isset( $wp_query->query_vars['startdate'] ) ? $wp_query->query_vars['startdate'] : null, + 'enddate' => isset( $wp_query->query_vars['enddate'] ) ? $wp_query->query_vars['enddate'] : null, + 'id' => isset( $wp_query->query_vars['id'] ) ? $wp_query->query_vars['id'] : null, + 'purchasekey' => isset( $wp_query->query_vars['purchasekey'] ) ? $wp_query->query_vars['purchasekey'] : null, + 'email' => isset( $wp_query->query_vars['email'] ) ? $wp_query->query_vars['email'] : null, + ); + + $log_data = array( + 'log_type' => 'api_request', + 'post_excerpt' => http_build_query( $query ), + 'post_content' => ! empty( $data['error'] ) ? $data['error'] : '', + ); + + $log_meta = array( + 'request_ip' => opalestate_get_ip(), + 'user' => $this->user_id, + 'key' => isset( $wp_query->query_vars['key'] ) ? $wp_query->query_vars['key'] : null, + 'token' => isset( $wp_query->query_vars['token'] ) ? $wp_query->query_vars['token'] : null, + 'time' => $data['request_speed'], + 'version' => $this->get_queried_version() + ); + } + + + /** + * Retrieve the output data + * + * @access public + * @since 1.1 + * @return array + */ + public function get_output() { + return $this->data; + } + + /** + * Output Query in either JSON/XML. The query data is outputted as JSON + * by default + * + * @since 1.1 + * @global WP_Query $wp_query + * + * @param int $status_code + */ + public function output( $status_code = 200 ) { + /** + * @var WP_Query $wp_query + */ + global $wp_query; + + $propertyat = $this->get_output_propertyat(); + + status_header( $status_code ); + + do_action( 'opalestate_api_output_before', $this->data, $this, $propertyat ); + + switch ( $propertyat ) : + + case 'xml' : + + require_once OPALESTATE_PLUGIN_DIR . 'inc/libraries/array2xml.php'; + $xml = Array2XML::createXML( 'opalestate-pro', $this->data ); + echo $xml->saveXML(); + + break; + + case 'json' : + + header( 'Content-Type: application/json' ); + if ( ! empty( $this->pretty_print ) ) { + echo json_encode( $this->data, $this->pretty_print ); + } else { + echo json_encode( $this->data ); + } + + break; + + + default : + + // Allow other propertyats to be added via extensions + do_action( 'opalestate_api_output_' . $propertyat, $this->data, $this ); + + break; + + endswitch; + + do_action( 'opalestate_api_output_after', $this->data, $this, $propertyat ); + + die(); + } + + /** + * Modify User Profile + * + * Modifies the output of profile.php to add key generation/revocation + * + * @access public + * @since 1.1 + * + * @param object $user Current user info + * + * @return void + */ + function user_key_field( $user ) { + + if ( ( opalestate_get_option( 'api_allow_user_keys', false ) || current_user_can( 'manage_opalestate_settings' ) ) && current_user_can( 'edit_user', $user->ID ) ) { + $user = get_userdata( $user->ID ); + ?> +
            + + + + + + + +
            + + + get_user_public_key( $user->ID ); + $secret_key = $this->get_user_secret_key( $user->ID ); + ?> + opalestate_user_public_key ) ) { ?> + + + +   + +
            +   + +
            +   + +
            + + + +
            + 403 ) ); + + } + + if ( empty( $args['user_id'] ) ) { + wp_die( esc_html__( 'User ID Required.', 'opalestate-pro' ), esc_html__( 'Error', 'opalestate-pro' ), array( 'response' => 401 ) ); + } + + if ( is_numeric( $args['user_id'] ) ) { + $user_id = isset( $args['user_id'] ) ? absint( $args['user_id'] ) : get_current_user_id(); + } else { + $userdata = get_user_by( 'login', $args['user_id'] ); + $user_id = $userdata->ID; + } + $process = isset( $args['opalestate_api_process'] ) ? strtolower( $args['opalestate_api_process'] ) : false; + + if ( $user_id == get_current_user_id() && ! opalestate_get_option( 'allow_user_api_keys' ) && ! current_user_can( 'manage_opalestate_settings' ) ) { + wp_die( + sprintf( + /* translators: %s: process */ + esc_html__( 'You do not have permission to %s API keys for this user.', 'opalestate-pro' ), + $process + ), + esc_html__( 'Error', 'opalestate-pro' ), + array( 'response' => 403 ) + ); + } elseif ( ! current_user_can( 'manage_opalestate_settings' ) ) { + wp_die( + sprintf( + /* translators: %s: process */ + esc_html__( 'You do not have permission to %s API keys for this user.', 'opalestate-pro' ), + $process + ), + esc_html__( 'Error', 'opalestate-pro' ), + array( 'response' => 403 ) + ); + } + + switch ( $process ) { + case 'generate': + if ( $this->generate_api_key( $user_id ) ) { + delete_transient( 'opalestate_total_api_keys' ); + wp_redirect( add_query_arg( 'opalestate-message', 'api-key-generated', 'edit.php?post_type=opalestate_property&page=opalestate-settings&tab=api' ) ); + exit(); + } else { + wp_redirect( add_query_arg( 'opalestate-message', 'api-key-failed', 'edit.php?post_type=opalestate_property&page=opalestate-settings&tab=api' ) ); + exit(); + } + break; + case 'regenerate': + $this->generate_api_key( $user_id, true ); + delete_transient( 'opalestate_total_api_keys' ); + wp_redirect( add_query_arg( 'opalestate-message', 'api-key-regenerated', 'edit.php?post_type=opalestate_property&page=opalestate-settings&tab=api' ) ); + exit(); + break; + case 'revoke': + $this->revoke_api_key( $user_id ); + delete_transient( 'opalestate_total_api_keys' ); + wp_redirect( add_query_arg( 'opalestate-message', 'api-key-revoked', 'edit.php?post_type=opalestate_property&page=opalestate-settings&tab=api' ) ); + exit(); + break; + default; + break; + } + } + + /** + * Generate new API keys for a user + * + * @access public + * @since 1.1 + * + * @param int $user_id User ID the key is being generated for + * @param boolean $regenerate Regenerate the key for the user + * + * @return boolean True if (re)generated succesfully, false otherwise. + */ + public function generate_api_key( $user_id = 0, $regenerate = false ) { + + if ( empty( $user_id ) ) { + return false; + } + + $user = get_userdata( $user_id ); + + if ( ! $user ) { + return false; + } + + $public_key = $this->get_user_public_key( $user_id ); + $secret_key = $this->get_user_secret_key( $user_id ); + + if ( empty( $public_key ) || $regenerate == true ) { + $new_public_key = $this->generate_public_key( $user->user_email ); + $new_secret_key = $this->generate_private_key( $user->ID ); + } else { + return false; + } + + if ( $regenerate == true ) { + $this->revoke_api_key( $user->ID ); + } + + update_user_meta( $user_id, $new_public_key, 'opalestate_user_public_key' ); + update_user_meta( $user_id, $new_secret_key, 'opalestate_user_secret_key' ); + + return true; + } + + /** + * Revoke a users API keys + * + * @access public + * @since 1.1 + * + * @param int $user_id User ID of user to revoke key for + * + * @return string + */ + public function revoke_api_key( $user_id = 0 ) { + + if ( empty( $user_id ) ) { + return false; + } + + $user = get_userdata( $user_id ); + + if ( ! $user ) { + return false; + } + + $public_key = $this->get_user_public_key( $user_id ); + $secret_key = $this->get_user_secret_key( $user_id ); + if ( ! empty( $public_key ) ) { + delete_transient( md5( 'opalestate_api_user_' . $public_key ) ); + delete_transient( md5( 'opalestate_api_user_public_key' . $user_id ) ); + delete_transient( md5( 'opalestate_api_user_secret_key' . $user_id ) ); + delete_user_meta( $user_id, $public_key ); + delete_user_meta( $user_id, $secret_key ); + } else { + return false; + } + + return true; + } + + public function get_version() { + return self::VERSION; + } + + + /** + * Generate and Save API key + * + * Generates the key requested by user_key_field and stores it in the database + * + * @access public + * @since 1.1 + * + * @param int $user_id + * + * @return void + */ + public function update_key( $user_id ) { + if ( current_user_can( 'edit_user', $user_id ) && isset( $_POST['opalestate_set_api_key'] ) ) { + + $user = get_userdata( $user_id ); + + $public_key = $this->get_user_public_key( $user_id ); + $secret_key = $this->get_user_secret_key( $user_id ); + + if ( empty( $public_key ) ) { + $new_public_key = $this->generate_public_key( $user->user_email ); + $new_secret_key = $this->generate_private_key( $user->ID ); + + update_user_meta( $user_id, $new_public_key, 'opalestate_user_public_key' ); + update_user_meta( $user_id, $new_secret_key, 'opalestate_user_secret_key' ); + } else { + $this->revoke_api_key( $user_id ); + } + } + } + + /** + * Generate the public key for a user + * + * @access private + * @since 1.1 + * + * @param string $user_email + * + * @return string + */ + private function generate_public_key( $user_email = '' ) { + $auth_key = defined( 'AUTH_KEY' ) ? AUTH_KEY : ''; + $public = hash( 'md5', $user_email . $auth_key . date( 'U' ) ); + + return $public; + } + + /** + * Generate the secret key for a user + * + * @access private + * @since 1.1 + * + * @param int $user_id + * + * @return string + */ + private function generate_private_key( $user_id = 0 ) { + $auth_key = defined( 'AUTH_KEY' ) ? AUTH_KEY : ''; + $secret = hash( 'md5', $user_id . $auth_key . date( 'U' ) ); + + return $secret; + } + + /** + * Retrieve the user's token + * + * @access private + * @since 1.1 + * + * @param int $user_id + * + * @return string + */ + public function get_token( $user_id = 0 ) { + return hash( 'md5', $this->get_user_secret_key( $user_id ) . $this->get_user_public_key( $user_id ) ); + } + + /** + * API Key Backwards Compatibility + * + * A Backwards Compatibility call for the change of meta_key/value for users API Keys + * + * @since 1.3.6 + * + * @param string $check Whether to check the cache or not + * @param int $object_id The User ID being passed + * @param string $meta_key The user meta key + * @param bool $single If it should return a single value or array + * + * @return string The API key/secret for the user supplied + */ + public function api_key_backwards_compat( $check, $object_id, $meta_key, $single ) { + + if ( $meta_key !== 'opalestate_user_public_key' && $meta_key !== 'opalestate_user_secret_key' ) { + return $check; + } + + $return = $check; + + switch ( $meta_key ) { + case 'opalestate_user_public_key': + $return = Opalestate()->api->get_user_public_key( $object_id ); + break; + case 'opalestate_user_secret_key': + $return = Opalestate()->api->get_user_secret_key( $object_id ); + break; + } + + if ( ! $single ) { + $return = array( $return ); + } + + return $return; + + } + +} diff --git a/inc/class-no-captcha-recaptcha.php b/inc/class-no-captcha-recaptcha.php new file mode 100755 index 00000000..d48ff647 --- /dev/null +++ b/inc/class-no-captcha-recaptcha.php @@ -0,0 +1,160 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * @class OpalEstate_Nocaptcha_Recaptcha + * + * @version 1.0 + */ +class OpalEstate_Nocaptcha_Recaptcha { + /** + * OpalEstate_Nocaptcha_Recaptcha constructor. + */ + public function __construct() { + if ( is_admin() ) { + + add_filter( 'opalestate_settings_3rd_party_subtabs_nav', [ $this, 'admin_tab_setting' ] ); + + add_filter( 'opalestate_settings_3rd_party_subtabs_google_captcha_page_fields', [ $this, 'admin_content_setting' ] ); + } + + if ( opalestate_options( 'show_captcha' ) == 'on' ) { + define( 'WPOPAL_CAPTCHA_LOAED', true ); + $this->theme = opalestate_options( 'captcha_theme', 'light' ); + add_action( 'wp_head', [ $this, 'add_custom_styles' ] ); + + add_action( 'opalestate_message_form_after', [ __CLASS__, 'show_captcha' ] ); + add_action( 'opalestate_process_send_email_before', [ __CLASS__, 'ajax_verify_captcha' ] ); + } + } + + /** + * + */ + public function add_custom_styles() { + $lang = null; + echo '' . "\r\n"; + } + + /** + * + */ + public static function show_captcha() { + + if ( isset( $_GET['captcha'] ) && $_GET['captcha'] == 'failed' ) { + + } + echo '
            '; + } + + /** + * + */ + public static function ajax_verify_captcha() { + $response = isset( $_POST['g-recaptcha-response'] ) ? esc_attr( $_POST['g-recaptcha-response'] ) : ''; + + $remote_ip = $_SERVER["REMOTE_ADDR"]; + + // make a GET request to the Google reCAPTCHA Server + $request = wp_remote_get( + 'https://www.google.com/recaptcha/api/siteverify?secret=' . opalestate_options( 'secret_key' ) . '&response=' . $response . '&remoteip=' . $remote_ip + ); + + // get the request response body + $response_body = wp_remote_retrieve_body( $request ); + + $result = json_decode( $response_body, true ); + + if ( isset( $result['hostname'] ) && ! empty( $result['hostname'] ) && empty( $result['success'] ) ) { + $result['success'] = 1; + } + if ( ! $result['success'] ) { + $return = [ 'status' => false, 'msg' => esc_html__( 'The captcha is not verified, please try again!', 'opalestate-pro' ) ]; + echo json_encode( $return ); + die(); + } + } + + /** + * + */ + public function admin_content_setting( $fields ) { + $fields = apply_filters( 'opalestate_settings_google_captcha', [ + + [ + 'name' => esc_html__( 'Show Captcha In Form', 'opalestate-pro' ), + 'desc' => __( 'Enable google captch in contact , register form. After Set yes, you change setting in Google Captcha Tab. Register here: https://www.google.com/recaptcha/admin Version 2', + 'opalestate-pro' ), + 'id' => 'show_captcha', + 'type' => 'switch', + 'options' => [ + 'off' => esc_html__( 'No', 'opalestate-pro' ), + 'on' => esc_html__( 'Yes', 'opalestate-pro' ), + ], + 'default' => 'on', + ], + + [ + 'name' => esc_html__( 'Google Captcha page Settings', 'opalestate-pro' ), + 'desc' => '
            ', + 'id' => 'opalestate_title_google_captcha_settings', + 'type' => 'title', + ], + + [ + 'name' => esc_html__( 'Site Key', 'opalestate-pro' ), + 'desc' => esc_html__( 'Used for displaying the CAPTCHA. Grab it %s', 'opalestate-pro' ), + 'id' => 'site_key', + 'type' => 'text', + ], + + [ + 'name' => esc_html__( 'Secret key', 'opalestate-pro' ), + 'desc' => esc_html__( 'Used for communication between your site and Google. Grab it.', 'opalestate-pro' ), + 'id' => 'secret_key', + 'type' => 'text', + ], + + [ + 'name' => esc_html__( 'Theme', 'opalestate-pro' ), + 'desc' => esc_html__( 'Display captcha box with color style.', 'opalestate-pro' ), + 'id' => 'captcha_theme', + 'type' => 'select', + 'options' => [ + 'light' => esc_html__( 'Light', 'opalestate-pro' ), + 'dark' => esc_html__( 'Dark', 'opalestate-pro' ), + ], + ], + + ] ); + + return $fields; + } + + /** + * + */ + public function admin_tab_setting( $tabs ) { + $tabs['google_captcha_page'] = esc_html__( 'Google Captcha', 'opalestate-pro' ); + + return $tabs; + } +} + +new OpalEstate_Nocaptcha_Recaptcha(); diff --git a/inc/class-opalestate-email.php b/inc/class-opalestate-email.php new file mode 100755 index 00000000..266235bd --- /dev/null +++ b/inc/class-opalestate-email.php @@ -0,0 +1,458 @@ + + * @copyright Copyright (C) 2014 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +// Exit if accessed directly +if ( !defined( 'ABSPATH' ) ) exit; + +/** + * @class OpalMembership_Checkout + * + * @version 1.0 + */ +class Opalestate_Emails { + + + /** + * init action to automatic send email when user edit or submit a new submission and init setting form in plugin setting of admin + */ + public static function init() { + + self::load(); + + add_action( 'opalestate_processed_new_submission' , array( __CLASS__ , 'new_submission_email'), 10, 2 ); + //add_action( 'opalestate_processed_edit_submission' , array( __CLASS__ , 'new_submission_email'), 10, 2 ); + if( is_admin() ){ + add_filter( 'opalestate_settings_tabs', array( __CLASS__, 'setting_email_tab'), 1 ); + add_filter( 'opalestate_registered_emails_settings', array( __CLASS__, 'setting_email_fields'), 10, 1 ); + } + + $enable_approve_property_email = opalestate_get_option( 'enable_approve_property_email' ); + + if ( $enable_approve_property_email == 'on' ) { + add_action( 'transition_post_status', array( __CLASS__, 'send_email_when_publish_property') , 10, 3 ); + add_action( 'opalestate_processed_approve_publish_property', array( __CLASS__, 'approve_publish_property_email') , 10, 1 ); + } + + /** + * Send email when User contact via Enquiry Form and Contact Form + */ + add_action( 'opalestate_send_email_notifycation', array(__CLASS__,'send_notifycation') ); + add_action( 'opalestate_send_email_submitted', array(__CLASS__,'new_submission_email') ); + add_action( 'opalestate_send_email_request_reviewing', array( __CLASS__, 'send_email_request_reviewing') ); + } + + /** + * + */ + public static function load() { + + require_once OPALESTATE_PLUGIN_DIR . 'inc/email/class-opalestate-abs-email-template.php'; + require_once OPALESTATE_PLUGIN_DIR . 'inc/email/class-opalestate-email-notifycation.php'; + require_once OPALESTATE_PLUGIN_DIR . 'inc/email/class-opalestate-request-viewing.php'; + require_once OPALESTATE_PLUGIN_DIR . 'inc/email/class-opalestate-new-submitted.php'; + require_once OPALESTATE_PLUGIN_DIR . 'inc/email/class-opalesate-approve.php'; + } + + /** + * Send Email Notifycation with two types: Enquiry or Contact + */ + public static function send_notifycation ( $content ) { + + $mail = new OpalEstate_Send_Email_Notification() ; + $mail->set_args ( $content ); + + $return = self::send_mail_now( $mail ); + + if( isset($content['data']) ){ + $return['data'] = $content['data']; + } + echo json_encode( $return ); die(); + } + + + + /** + * send email if agent submit a new property + */ + public static function new_submission_email( $user_id, $post_id ){ + + $mail = new OpalEstate_Send_Email_New_Submitted() ; + + $mail->set_pros( $post_id, $user_id ); + + $return = self::send_mail_now( $mail ); + + + echo json_encode( $return ); die(); + + } + + /** + * Send email to requet viewing a property + */ + public static function send_email_request_reviewing( $content ){ + + $mail = new OpalEstate_Send_Email_Request_Reviewing(); + $mail->set_args( $content ); + + $return = self::send_mail_now( $mail ); + + + echo json_encode( $return ); die(); + + } + + /** + * + */ + public static function send_mail_now( $mail ){ + + $from_name = $mail->from_name(); + $from_email = $mail->from_email(); + $headers = sprintf( "From: %s <%s>\r\n Content-type: text/html", $from_name, $from_email ); + + $subject = $mail->get_subject(); + $message = $mail->get_body(); + + if( $mail->to_email() ) { + + if( $mail->get_cc() ){ + $status = @wp_mail( $mail->get_cc(), $subject, $message, $headers ); + } + + $status = @wp_mail( $mail->to_email(), $subject, $message, $headers ); + $return = array( 'status' => true, 'msg' => esc_html__( 'Message has been successfully sent.', 'opalestate-pro' ) ); + + } else { + $return = array( 'status' => true, 'msg' => esc_html__( 'Message has been successfully sent.', 'opalestate-pro' ) ); + } + + return $return; + } + + /** + * + */ + public static function send_email_when_publish_property( $new_status, $old_status, $post ) { + + if( is_object( $post ) ){ + if ( $post->post_type == 'opalestate_property' ) { + if ( $new_status != $old_status ) { + if ($new_status == 'publish' ) { + if ($old_status == 'draft' || $old_status == 'pending') { + // Send email + $post_id = $post->ID; + do_action( "opalestate_processed_approve_publish_property", $post_id ); + } + } + } + } + } + + } + + /** + * add new tab Email in opalestate -> setting + */ + public static function setting_email_tab( $tabs ){ + + $tabs['emails'] = esc_html__( 'Email', 'opalestate-pro' ); + return $tabs; + } + + public static function newproperty_email_body(){ + + } + + public static function approve_email_body(){ + + } + + /** + * render setting email fields with default values + */ + public static function setting_email_fields( $fields ){ + + $contact_list_tags = '
            +

            Use the following tags to automatically add property information to the emails. Tags labeled with an asterisk (*) can be used in the email subject as well.

            + +
            + {receive_name} Name of the agent who made the property +
            + +
            + {property_link} Property of the user who made the property +
            + +
            + {name} Name of the user who contact via email form +
            + +
            + {email} Email of the user who contact via email form +
            + +
            + {property_link} * Link of the property +
            + +
            + {message} * Message content of who sent via form +
            + +
            '; + + $list_tags = '
            +

            Use the following tags to automatically add property information to the emails. Tags labeled with an asterisk (*) can be used in the email subject as well.

            + +
            + {property_name} Email of the user who made the property +
            + +
            + {property_link} Email of the user who made the property +
            + +
            + {user_email} Email of the user who made the property +
            + +
            + {submitted_date} Email of the user who made the property +
            + +
            + {user_name} * Name of the user who made the property +
            + +
            + {date} * Date and time of the property +
            + +
            + {site_name} The name of this website +
            +
            + {site_link} A link to this website +
            +
            + {current_time} Current date and time +
            '; + + $list_tags = apply_filters( 'opalestate_email_tags', $list_tags ); + + + $fields = array( + 'id' => 'options_page', + 'title' => esc_html__( 'Email Settings', 'opalestate-pro' ), + 'show_on' => array( 'key' => 'options-page', 'value' => array( 'opalestate_settings' ), ), + 'fields' => apply_filters( 'opalestate_settings_emails', array( + array( + 'name' => esc_html__( 'Email Settings', 'opalestate-pro' ), + 'desc' => '
            ', + 'id' => 'opalestate_title_email_settings_1', + 'type' => 'title' + ), + array( + 'id' => 'from_name', + 'name' => esc_html__( 'From Name', 'opalestate-pro' ), + 'desc' => esc_html__( 'The name donation receipts are said to come from. This should probably be your site or shop name.', 'opalestate-pro' ), + 'default' => get_bloginfo( 'name' ), + 'type' => 'text' + ), + array( + 'id' => 'from_email', + 'name' => esc_html__( 'From Email', 'opalestate-pro' ), + 'desc' => esc_html__( 'Email to send donation receipts from. This will act as the "from" and "reply-to" address.', 'opalestate-pro' ), + 'default' => get_bloginfo( 'admin_email' ), + 'type' => 'text' + ), + + + + array( + 'name' => esc_html__( 'Email Submission Templates (Template Tags)', 'opalestate-pro' ), + 'desc' => $list_tags.'

            ', + 'id' => 'opalestate_title_email_settings_2', + 'type' => 'title' + ), + + + + array( + 'name' => esc_html__( 'Notification For New Property Submission', 'opalestate-pro' ), + 'desc' => '
            ', + 'id' => 'opalestate_title_email_settings_3', + 'type' => 'title' + ), + + + array( + 'id' => 'newproperty_email_subject', + 'name' => esc_html__( 'Email Subject', 'opalestate-pro' ), + 'type' => 'text', + 'desc' => esc_html__( 'The email subject for admin notifications.', 'opalestate-pro' ), + 'attributes' => array( + 'placeholder' => 'Your package is expired', + 'rows' => 3, + ), + 'default' => esc_html__( 'New Property Listing Submitted: {property_name}', 'opalestate-pro' ) + + ), + array( + 'id' => 'newproperty_email_body', + 'name' => esc_html__( 'Email Body', 'opalestate-pro' ), + 'type' => 'wysiwyg', + 'desc' => esc_html__( 'Enter the email an admin should receive when an initial payment request is made.', 'opalestate-pro' ), + 'default' => OpalEstate_Send_Email_New_Submitted::get_default_template(), + ), + //------------------------------------------ + array( + 'name' => esc_html__( 'Approve property for publish', 'opalestate-pro' ), + 'desc' => '
            ', + 'id' => 'opalestate_title_email_settings_4', + 'type' => 'title' + ), + + array( + 'name' => esc_html__( 'Enable approve property email', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable approve property email.', 'opalestate-pro' ), + 'id' => 'enable_approve_property_email', + 'type' => 'switch', + 'options' => array( + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ), + 'default' => 'off', + ), + + array( + 'id' => 'approve_email_subject', + 'name' => esc_html__( 'Email Subject', 'opalestate-pro' ), + 'type' => 'text', + 'desc' => esc_html__( 'The email subject a user should receive when they make an initial property request.', 'opalestate-pro' ), + 'attributes' => array( + 'placeholder' => 'Your property at I Love WordPress is pending',get_bloginfo( 'name' ), + 'rows' => 3, + ), + 'default' => esc_html__( 'New Property Listing Submitted: {property_name}', 'opalestate-pro' ) + ), + + array( + 'id' => 'approve_email_body', + 'name' => esc_html__( 'Email Body', 'opalestate-pro' ), + 'type' => 'wysiwyg', + 'desc' => esc_html__( 'Enter the email a user should receive when they make an initial payment request.', 'opalestate-pro' ), + 'default' => OpalEstate_Send_Email_Approve::get_default_template(), + ), + + /// email contact template //// + array( + 'name' => esc_html__( 'Email Contact Templates (Template Tags)', 'opalestate-pro' ), + 'desc' => $contact_list_tags.'

            ', + 'id' => 'opalestate_title_email_settings_6', + 'type' => 'title' + ), + + array( + 'id' => 'contact_email_subject', + 'name' => esc_html__( 'Email Subject', 'opalestate-pro' ), + 'type' => 'text', + 'desc' => esc_html__( 'The email subject a user should receive when they make an initial property request.', 'opalestate-pro' ), + 'attributes' => array( + 'placeholder' => 'Your property at I Love WordPress is pending',get_bloginfo( 'name' ), + 'rows' => 3, + ), + 'default' => esc_html__('You got a message', 'opalestate-pro') + ), + + array( + 'id' => 'contact_email_body', + 'name' => esc_html__( 'Email Body', 'opalestate-pro' ), + 'type' => 'wysiwyg', + 'desc' => trim(preg_replace('/\t+/', '', "Hi {receive_name},
            + You have got message from {name} with email {email}. Here is detail: +
            +
            + {message} +
            +  
            +
            + This message was sent by {site_link} on {current_time}.")) + ) + ) + ) + ); + + return $fields; + } + + /** + * get data of newrequest email + * + * @var $args array: property_id , $body + * @return text: message + */ + public static function replace_shortcode( $args, $body ) { + + $tags = array( + 'user_name' => "", + 'user_mail' => "", + 'submitted_date' => "", + 'property_name' => "", + 'site_name' => '', + 'site_link' => '', + 'property_link' => '', + ); + $tags = array_merge( $tags, $args ); + + extract( $tags ); + + $tags = array( "{user_mail}", + "{user_name}", + "{submitted_date}", + "{site_name}", + "{site_link}", + "{current_time}", + '{property_name}', + '{property_link}'); + + $values = array( $user_mail, + $user_name , + $submitted_date , + get_bloginfo( 'name' ) , + get_home_url(), + date("F j, Y, g:i a"), + $property_name, + $property_link + ); + + $message = str_replace($tags, $values, $body); + + return $message; + } + + public static function approve_publish_property_email( $post_id ) { + + $mail = new OpalEstate_Send_Email_Approve(); + $mail->set_pros( $post_id ); + + $return = self::send_mail_now( $mail ); + + echo json_encode( $return ); die(); + } + +} + +Opalestate_Emails::init(); \ No newline at end of file diff --git a/inc/class-opalestate-enqueue.php b/inc/class-opalestate-enqueue.php new file mode 100755 index 00000000..5020a829 --- /dev/null +++ b/inc/class-opalestate-enqueue.php @@ -0,0 +1,216 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * @class OpalEstate_Enqueue + * + * @version 1.0 + */ +class OpalEstate_Enqueue { + + /** + * Constructor + */ + public function __construct() { + + add_action( 'wp_enqueue_scripts', [ $this, 'load_scripts' ] ); + add_action( 'wp_head', [ $this, 'add_custom_styles' ] ); + } + + /** + * Load javascript and css + */ + public function load_scripts() { + $api = opalestate_get_map_api_uri(); + + wp_enqueue_script( 'opalestate-google-maps', $api, null, '0.0.1', false ); + + wp_enqueue_script( 'infobox', OPALESTATE_PLUGIN_URL . 'assets/js/infobox.js', [ 'jquery' ], OPALESTATE_VERSION, false ); + wp_enqueue_script( 'markerclusterer', OPALESTATE_PLUGIN_URL . 'assets/js/markerclusterer.js', [ 'jquery' ], '1.3', false ); + + wp_enqueue_script( 'opalestate-scripts', OPALESTATE_PLUGIN_URL . 'assets/js/opalestate.js', [ 'jquery' ], OPALESTATE_VERSION, true ); + wp_enqueue_script( 'opalestate-country-select', OPALESTATE_PLUGIN_URL . 'assets/js/country-select.js', [ 'jquery' ], OPALESTATE_VERSION, true ); + wp_enqueue_script( 'noUiSlider', OPALESTATE_PLUGIN_URL . 'assets/js/nouislider.min.js', [ 'jquery' ], '1.0.0', true ); + wp_enqueue_script( 'fitvids', OPALESTATE_PLUGIN_URL . 'assets/js/jquery.fitvids.js', [ 'jquery' ], '1.0.0', true ); + + // load google map for searchable + wp_enqueue_script( 'opalestate-gmap', OPALESTATE_PLUGIN_URL . 'assets/js/frontend/googlemaps.js', [ 'jquery' ], '1.3', false ); + wp_enqueue_script( 'opalestate-messages', OPALESTATE_PLUGIN_URL . 'assets/js/frontend/property.js', [ 'jquery' ], '1.3', false ); + + + wp_enqueue_style( 'opalestate-style', OPALESTATE_PLUGIN_URL . '/assets/opalestate.css' ); + + wp_enqueue_style( 'font-awesome', OPALESTATE_PLUGIN_URL . 'assets/3rd/fontawesome/css/all.min.css', null, '1.3', false ); + + // load tooltips css3 + wp_enqueue_style( 'hint', OPALESTATE_PLUGIN_URL . 'assets/hint.min.css', null, '1.3', false ); + // load tooltips css3 + wp_enqueue_style( 'select2', OPALESTATE_PLUGIN_URL . 'assets/3rd/select2/css/select2.min.css', null, '1.3', false ); + wp_enqueue_script( 'select2', OPALESTATE_PLUGIN_URL . 'assets/3rd/select2/js/select2.min.js', null, '1.3', false ); + + wp_register_script( 'chart-js', OPALESTATE_PLUGIN_URL . 'assets/js/chart.min.js', null, '2.8.0', true ); + wp_register_style( 'tooltipster', OPALESTATE_PLUGIN_URL . 'assets/3rd/tooltipster/css/tooltipster.bundle.min.css', [], false ); + wp_register_script( 'tooltipster', OPALESTATE_PLUGIN_URL . 'assets/3rd/tooltipster/js/tooltipster.bundle.min.js', [ 'jquery' ], false, true ); + + if ( is_single_property() ) { + wp_enqueue_script( 'chart-js' ); + } + + if ( is_single_property() || is_single_agent() || is_single_agency() ) { + wp_enqueue_style( 'tooltipster' ); + wp_enqueue_script( 'tooltipster' ); + } + + // load global variables + wp_localize_script( 'opalestate-scripts', 'opalesateJS', + [ + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + 'siteurl' => get_template_directory_uri(), + 'mapiconurl' => OPALESTATE_PLUGIN_URL . 'assets/map/', + 'rtl' => is_rtl() ? 'true' : 'false', + 'confirmed' => esc_html__( 'Are you sure to remove?', 'opalestate-pro' ), + 'error_upload_size' => esc_html__( 'This file is has large volume size, please try to upload other.', 'opalestate-pro' ), + 'size_image' => opalestate_options( 'upload_image_max_size', 0.5 ) * 1000000, + 'mfile_image' => opalestate_options( 'upload_image_max_files', 10 ), + 'size_other' => opalestate_options( 'upload_other_max_size', 0.8 ) * 1000000, + 'mfile_other' => opalestate_options( 'upload_other_max_files', 10 ), + ] ); + + /// + $this->register_enqueue(); + } + + /** + * Register and enqueue javascript, css library + */ + public function register_enqueue() { + wp_register_script( + 'jquery-modernizr', + OPALESTATE_PLUGIN_URL . '/assets/3rd/magnific-popup/jquery.magnific-popup.min.js', + [ + 'jquery', + ], + '4.4.3', + true + ); + wp_enqueue_script( 'jquery-magnific-popup' ); + wp_register_script( 'jquery-sticky-kit', trailingslashit( OPALESTATE_PLUGIN_URL ) . 'assets/3rd/sticky/jquery.sticky-kit.min.js', [], null, true ); + wp_enqueue_script( 'jquery-sticky-kit' ); + wp_enqueue_script( 'opalestate-elementor', OPALESTATE_PLUGIN_URL . 'assets/js/frontend/elementor.js', [], null, true ); + wp_enqueue_script( 'jquery-ui-datepicker' ); + wp_enqueue_style( 'jquery-ui-datepicker-style', OPALESTATE_PLUGIN_URL . '/assets/3rd/datepicker.css' ); + /// + wp_register_script( 'jquery-toast', + OPALESTATE_PLUGIN_URL . 'assets/3rd/toast/jquery.toast.js', [], null, true ); + + wp_enqueue_script( 'jquery-toast' ); + + wp_register_script( + 'jquery-swiper', + OPALESTATE_PLUGIN_URL . '/assets/3rd/swiper/js/swiper.min.js', + [ + 'jquery', + ], + '4.4.3', + true + ); + + wp_enqueue_script( 'jquery-swiper' ); + } + + /** + * Add custom styles. + */ + public function add_custom_styles() { + $custom = ''; + $status_color = $this->add_custom_property_status_color(); + if ( $status_color ) { + $custom .= $status_color; + } + + $label_color = $this->add_custom_property_label_color(); + if ( $label_color ) { + $custom .= $label_color; + } + + if ( $custom ) { + echo ''; + } + } + + /** + * Add custom property status color. + * + * @return string + */ + public function add_custom_property_status_color() { + $statuses = Opalestate_Taxonomy_Status::get_list(); + $custom = ''; + + if ( $statuses ) { + foreach ( $statuses as $status ) { + $bg = get_term_meta( $status->term_id, 'opalestate_status_lb_bg', true ); + $color = get_term_meta( $status->term_id, 'opalestate_status_lb_color', true ); + if ( $bg || $color ) { + $custom .= '.property-status-' . trim( $status->slug ) . ' { '; + if ( $bg ) { + $custom .= 'background-color:' . $bg . ' !important;'; + } + if ( $color ) { + $custom .= 'color:' . $color . '!important'; + } + $custom .= ' } '; + } + } + } + + return $custom; + } + + /** + * Add custom property status color. + * + * @return string + */ + public function add_custom_property_label_color() { + $labels = Opalestate_Taxonomy_Label::get_list(); + $custom = ''; + + if ( $labels ) { + foreach ( $labels as $label ) { + $bg = get_term_meta( $label->term_id, 'opalestate_label_lb_bg', true ); + $color = get_term_meta( $label->term_id, 'opalestate_label_lb_color', true ); + if ( $bg || $color ) { + $custom .= '.property-label-' . trim( $label->slug ) . ' { '; + if ( $bg ) { + $custom .= 'background-color:' . $bg . ' !important;'; + } + if ( $color ) { + $custom .= 'color:' . $color . '!important'; + } + $custom .= ' } '; + } + } + } + + return $custom; + } + +} + +new OpalEstate_Enqueue(); diff --git a/inc/class-opalestate-html.php b/inc/class-opalestate-html.php new file mode 100755 index 00000000..5762c372 --- /dev/null +++ b/inc/class-opalestate-html.php @@ -0,0 +1,395 @@ + 'user_id', + 'value' => isset( $args['default'] ) ? $args['default'] : null, + 'placeholder' => esc_html__( 'Enter username', 'opalestate-pro' ), + 'label' => null, + 'desc' => null, + 'class' => '', + 'disabled' => false, + 'autocomplete' => 'off', + 'data' => false, + ]; + + $args = wp_parse_args( $args, $defaults ); + + $args['class'] = 'opalestate-ajax-user-search ' . $args['class']; + + $output = ''; + $output .= $this->text_field( $args ); + $output .= ''; + $output .= ''; + + return $output; + } + + /** + * Text Field + * + * Renders an HTML Text field. + * + * @param array $args Arguments for the text field. + * + * @return string The text field. + * @since 1.0 + * @access public + * + */ + public function text_field( $field_args, $args = [] ) { + + + $defaults = [ + 'id' => '', + 'value' => isset( $field_args['default'] ) ? $field_args['default'] : null, + 'name' => '', + 'description' => null, + 'placeholder' => '', + 'class' => 'regular-text form-control', + 'disabled' => false, + 'autocomplete' => 'off', + 'data' => false, + 'default' => '', + 'required' => false, + ]; + + $args = wp_parse_args( $field_args, $defaults ); + + $disabled = ''; + if ( $args['disabled'] ) { + $disabled = ' disabled="disabled"'; + } + + $data = ''; + if ( ! empty( $args['data'] ) ) { + foreach ( $args['data'] as $key => $value ) { + $data .= 'data-' . $key . '="' . $value . '" '; + } + } + + if ( $args['required'] ) { + $data .= ' required="required" '; + } + + $output = ''; + + $output .= ''; + + + $output .= ''; + + if ( ! empty( $args['description'] ) ) { + $output .= '' . esc_html( $args['description'] ) . ''; + } + + $output .= ''; + + return $output; + } + + /** + * Date Picker + * + * Renders a date picker field. + * + * @param array $args Arguments for the date picker. + * + * @return string The date picker. + * @since 1.5 + * @access public + * + */ + public function date_field( $args = [] ) { + + if ( empty( $args['class'] ) ) { + $args['class'] = 'opalestate-datepicker form-control'; + } elseif ( ! strpos( $args['class'], 'opalestate-datepicker' ) ) { + $args['class'] .= ' opalestate-datepicker form-control'; + } + + return $this->text_field( $args ); + } + + /** + * Textarea + * + * Renders an HTML textarea. + * + * @param array $args Arguments for the textarea. + * + * @return string The textarea. + * @since 1.0 + * @access public + * + */ + public function textarea_field( $args = [] ) { + $defaults = [ + 'name' => '', + 'value' => isset( $args['default'] ) ? $args['default'] : null, + 'label' => null, + 'description' => null, + 'class' => 'large-text', + 'disabled' => false, + ]; + + $args = wp_parse_args( $args, $defaults ); + + $disabled = ''; + if ( $args['disabled'] ) { + $disabled = ' disabled="disabled"'; + } + + $output = ''; + + $output .= ''; + + $data = ''; + if ( $args['required'] ) { + $data .= ' required="required" '; + } + + $output .= ''; + + if ( ! empty( $args['description'] ) ) { + $output .= '' . esc_html( $args['description'] ) . ''; + } + + $output .= ''; + + return $output; + } + + /** + * Dropdown + * + * Renders an HTML Dropdown. + * + * @param array $args Arguments for the dropdown. + * + * @return string The dropdown. + * @since 1.0 + * @access public + * + */ + public function select_field( $field_args = [] ) { + $defaults = [ + 'options' => [], + 'name' => null, + 'class' => 'form-control', + 'id' => '', + 'autocomplete' => 'off', + 'selected' => 0, + 'chosen' => false, + 'placeholder' => null, + 'multiple' => false, + 'select_atts' => false, + 'show_option_all' => esc_html__( 'All', 'opalestate-pro' ), + 'show_option_none' => esc_html__( 'None', 'opalestate-pro' ), + 'data' => [], + 'readonly' => false, + 'disabled' => false, + 'required' => '', + ]; + + $args = wp_parse_args( $field_args, $defaults ); + + $data_elements = ''; + foreach ( $args['data'] as $key => $value ) { + $data_elements .= ' data-' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"'; + } + + $multiple = ''; + if ( $args['multiple'] ) { + $multiple = 'MULTIPLE'; + } + + if ( $args['chosen'] ) { + $args['class'] .= ' opalestate-select-chosen'; + } + + $placeholder = ''; + if ( $args['placeholder'] ) { + $placeholder = $args['placeholder']; + } + + $output = ''; + + $data = ''; + if ( $args['required'] ) { + $data .= ' required="required" '; + } + + $output .= sprintf( + ''; + + return $output; + } + + public function hidden_field( $args ) { + $defaults = [ + 'id' => '', + 'value' => isset( $args['default'] ) ? $args['default'] : null, + 'name' => '', + 'description' => null, + 'placeholder' => '', + 'class' => 'regular-text form-control', + 'disabled' => false, + 'autocomplete' => 'off', + 'data' => false, + 'default' => '', + 'required' => false, + ]; + $args = wp_parse_args( $args, $defaults ); + + $output = ''; + + return $output; + } + + public function render_field( $field ) { + switch ( $field['type'] ) { + case 'date': + + return $this->date_field( $field ); + + break; + + case 'text': + + return $this->text_field( $field ); + + break; + case 'hidden': + + return $this->hidden_field( $field ); + + break; + + case 'textarea': + + return $this->textarea_field( $field ); + + break; + case 'user': + + return $this->ajax_user_search( $field ); + + break; + + case 'select': + return $this->select_field( $field ); + break; + default: + # code... + break; + } + } + + public function render_form( $fields ) { + static $id_counter = 0; + if ( function_exists( 'wp_unique_id' ) ) { + $form_id = wp_unique_id( 'opalestate-form-' ); + } else { + $form_id = 'opalestate-form-' . (string) ++$id_counter; + } + + $output = ''; + $this->form_id = $form_id; + foreach ( $fields as $field ) { + $wrap = ''; + if ( isset( $field['before_row'] ) ) { + $wrap .= $field['before_row']; + } + $wrap .= '
            '; + $wrap .= $this->render_field( $field ); + $wrap .= '
            '; + + if ( isset( $field['after_row'] ) ) { + $wrap .= $field['after_row']; + } + + $output .= $wrap; + } + + return $output; + } +} diff --git a/inc/class-opalestate-install.php b/inc/class-opalestate-install.php new file mode 100755 index 00000000..6109c52f --- /dev/null +++ b/inc/class-opalestate-install.php @@ -0,0 +1,252 @@ +add_roles(); + $roles->add_caps(); + } + + /** + * Default options. + * + * Sets up the default options used on the settings page. + */ + private static function create_options() { + global $opalestate_options; + + // Add Upgraded From Option + $current_version = get_option( 'opalestate_version' ); + if ( $current_version ) { + update_option( 'opalestate_version_upgraded_from', $current_version ); + } + + // Setup some default options + $options = []; + + //Fresh Install? Setup Test Mode, Base Country (US), Test Gateway, Currency + if ( empty( $current_version ) ) { + $options['test_mode'] = 1; + $options['currency'] = 'USD'; + $options['currency_position'] = 'before'; + $options['measurement_unit'] = 'sq ft'; + $options['google_map_api_keys'] = 'AIzaSyCfMVNIa7khIqYHCw6VBn8ShUWWm4tjbG8'; + $options['admin_approve'] = 'on'; + $options['require_input_price'] = 'on'; + $options['from_name'] = get_bloginfo( 'name' ); + $options['from_email'] = get_bloginfo( 'admin_email' ); + $options['message_log'] = 1; + + $options[ OPALESTATE_PROPERTY_PREFIX . 'bedrooms_opt' ] = 1; + $options[ OPALESTATE_PROPERTY_PREFIX . 'parking_opt' ] = 1; + $options[ OPALESTATE_PROPERTY_PREFIX . 'bathrooms_opt' ] = 1; + $options[ OPALESTATE_PROPERTY_PREFIX . 'areasize_opt' ] = 1; + $options[ OPALESTATE_PROPERTY_PREFIX . 'price_opt' ] = 1; + $options[ OPALESTATE_PROPERTY_PREFIX . 'bedrooms_opt_v' ] = 1; + $options[ OPALESTATE_PROPERTY_PREFIX . 'parking_opt_v' ] = 1; + $options[ OPALESTATE_PROPERTY_PREFIX . 'bathrooms_opt_v' ] = 1; + $options[ OPALESTATE_PROPERTY_PREFIX . 'areasize_opt_v' ] = 1; + $options[ OPALESTATE_PROPERTY_PREFIX . 'price_opt_v' ] = 1; + + $options['enable_single_amenities'] = 'on'; + $options['enable_single_facilities'] = 'on'; + $options['enable_single_attachments'] = 'on'; + $options['enable_single_video'] = 'on'; + $options['enable_single_map'] = 'on'; + $options['enable_single_nearby'] = 'on'; + $options['enable_single_walkscores'] = 'on'; + $options['enable_single_apartments'] = 'on'; + $options['enable_single_floor_plans'] = 'on'; + $options['enable_single_views_statistics'] = 'on'; + $options['single_views_statistics_limit'] = 8; + + $options['enable_property_reviews'] = 'on'; + $options['enable_agency_reviews'] = 'on'; + $options['enable_agent_reviews'] = 'on'; + + $options['enable_submission_tab_media'] = 'on'; + $options['enable_submission_tab_location'] = 'on'; + $options['enable_submission_tab_amenities'] = 'on'; + $options['enable_submission_tab_facilities'] = 'on'; + $options['enable_submission_tab_apartments'] = 'on'; + $options['enable_submission_tab_floor_plans'] = 'on'; + + } + + // Checks if the Success Page option exists AND that the page exists + if ( ! get_post( opalestate_get_option( 'user_management_page' ) ) ) { + // Purchase Confirmation (Success) Page + $profile_page = wp_insert_post( + [ + 'post_title' => esc_html__( 'User Dashboard Page', 'opalestate-pro' ), + 'post_content' => esc_html__( '', 'opalestate-pro' ), + 'post_status' => 'publish', + 'post_author' => 1, + 'post_type' => 'page', + 'comment_status' => 'closed', + 'page_template' => 'user-management.php', + ] + ); + + // Store our page IDs + $options['user_management_page'] = $profile_page; + } + + // Checks if the Success Page option exists AND that the page exists + if ( ! get_post( opalestate_get_option( 'user_myaccount_page' ) ) ) { + $saved_link_page = wp_insert_post( + [ + 'post_title' => esc_html__( 'My Account', 'opalestate-pro' ), + 'post_content' => esc_html__( '[opalestate_myaccount]', 'opalestate-pro' ), + 'post_status' => 'publish', + 'post_author' => 1, + 'post_type' => 'page', + 'comment_status' => 'closed', + ] + ); + + // Store our page IDs + $options['user_myaccount_page'] = $saved_link_page; + } + + // Checks if the Success Page option exists AND that the page exists + if ( ! get_post( opalestate_get_option( 'submission_page' ) ) ) { + // Purchase Confirmation (Success) Page + $submission_page = wp_insert_post( + [ + 'post_title' => esc_html__( 'Property Submission Page', 'opalestate-pro' ), + 'post_content' => esc_html__( '[opalestate_submission]', 'opalestate-pro' ), + 'post_status' => 'publish', + 'post_author' => 1, + 'post_type' => 'page', + 'comment_status' => 'closed', + ] + ); + + // Store our page IDs + $options['submission_page'] = $submission_page; + } + + // Checks if the Success Page option exists AND that the page exists + if ( ! get_post( opalestate_get_option( 'search_map_properties_page' ) ) ) { + // Purchase Confirmation (Success) Page + $search_map_properties_page = wp_insert_post( + [ + 'post_title' => esc_html__( 'Search Map Properties Page', 'opalestate-pro' ), + 'post_content' => esc_html__( '[opalestate_search_map_properties]', 'opalestate-pro' ), + 'post_status' => 'publish', + 'post_author' => 1, + 'post_type' => 'page', + 'comment_status' => 'closed', + 'page_template' => 'fullwidth-page.php', + ] + ); + + // Store our page IDs + $options['search_map_properties_page'] = $search_map_properties_page; + } + + // Populate some default values + update_option( 'opalestate_settings', array_merge( $opalestate_options, $options ) ); + + // Add a temporary option to note that Give pages have been created + set_transient( '_opalestate_installed', $options, 30 ); + } + + /** + * Update Opalestate version to current. + */ + private static function update_opalestate_version() { + update_option( 'opalestate_version', OPALESTATE_VERSION ); + } +} + +/** + * Install user roles on sub-sites of a network + * + * Roles do not get created when Give is network activation so we need to create them during admin_init + * + * @return void + * @since 1.0 + */ +function opalestate_install_roles_on_network() { + global $wp_roles; + + if ( ! is_object( $wp_roles ) ) { + return; + } + + if ( ! array_key_exists( 'opalestate_manager', $wp_roles->roles ) ) { + $roles = new Opalestate_Roles; + $roles->add_roles(); + $roles->add_caps(); + } else { + // remove_role( 'opalestate_manager' ); + // remove_role( 'opalestate_manager' ); + // $roles = new Opalestate_Roles; + // $roles->remove_caps(); + } +} + +add_action( 'admin_init', 'opalestate_install_roles_on_network' ); diff --git a/inc/class-opalestate-roles.php b/inc/class-opalestate-roles.php new file mode 100755 index 00000000..f755ec07 --- /dev/null +++ b/inc/class-opalestate-roles.php @@ -0,0 +1,273 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * Opalestate_Roles Class + * + * This class handles the role creation and assignment of capabilities for those roles. + * + * These roles let us have Opalestate Accountants, Opalestate Workers, etc, each of whom can do + * certain things within the plugin + * + * @since 1.0.0 + */ +class Opalestate_Roles { + + /** + * Get things going + * + * @since 1.0.0 + */ + public function __construct() { + + add_filter( 'opalestate_map_meta_cap', array( $this, 'meta_caps' ), 10, 4 ); + } + + /** + * Add new shop roles with default WP caps + * + * @access public + * @since 1.0.0 + * @return void + */ + public function add_roles() { + add_role( 'opalestate_manager', esc_html__( 'Opal Estate Manager', 'opalestate-pro' ), array( + 'read' => true, + 'edit_posts' => true, + 'delete_posts' => true, + 'unfiltered_html' => true, + 'upload_files' => true, + 'export' => true, + 'import' => true, + 'delete_others_pages' => true, + 'delete_others_posts' => true, + 'delete_pages' => true, + 'delete_private_pages' => true, + 'delete_private_posts' => true, + 'delete_published_pages' => true, + 'delete_published_posts' => true, + 'edit_others_pages' => true, + 'edit_others_posts' => true, + 'edit_pages' => true, + 'edit_private_pages' => true, + 'edit_private_posts' => true, + 'edit_published_pages' => true, + 'edit_published_posts' => true, + 'manage_categories' => true, + 'manage_links' => true, + 'moderate_comments' => true, + 'publish_pages' => true, + 'publish_posts' => true, + 'read_private_pages' => true, + 'read_private_posts' => true + ) ); + + add_role( 'opalestate_agent', esc_html__( 'Opal Estate Agent', 'opalestate-pro' ), array( + 'read' => true, + 'edit_posts' => false, + 'upload_files' => true, + 'delete_posts' => false, + 'publish_posts' => false, + 'upload_files' =>true, + 'edit_attachments' =>true, + 'delete_attachments' =>true, + 'delete_post' => true, + ) ); + + add_role( 'opalestate_agency', esc_html__( 'Opal Estate Agency', 'opalestate-pro' ), array( + 'read' => true, + 'edit_posts' => false, + 'upload_files' => true, + 'delete_posts' => false, + 'publish_posts' => false, + ) ); + + } + + /** + * Add new shop-specific capabilities + * + * @access public + * @since 1.0.0 + * @global WP_Roles $wp_roles + * @return void + */ + public function add_caps() { + global $wp_roles; + + if ( class_exists('WP_Roles') ) { + if ( ! isset( $wp_roles ) ) { + $wp_roles = new WP_Roles(); + } + } + + if ( is_object( $wp_roles ) ) { + $wp_roles->add_cap( 'opalestate_manager', 'view_opalestate_reports' ); + $wp_roles->add_cap( 'opalestate_manager', 'view_opalestate_sensitive_data' ); + $wp_roles->add_cap( 'opalestate_manager', 'export_opalestate_reports' ); + $wp_roles->add_cap( 'opalestate_manager', 'manage_opalestate_settings' ); + + $wp_roles->add_cap( 'administrator', 'view_opalestate_reports' ); + $wp_roles->add_cap( 'administrator', 'view_opalestate_sensitive_data' ); + $wp_roles->add_cap( 'administrator', 'export_opalestate_reports' ); + $wp_roles->add_cap( 'administrator', 'manage_opalestate_settings' ); + + // Add the main post type capabilities + $capabilities = $this->get_core_caps(); + foreach ( $capabilities as $cap_group ) { + foreach ( $cap_group as $cap ) { + $wp_roles->add_cap( 'opalestate_manager', $cap ); + $wp_roles->add_cap( 'administrator', $cap ); + $wp_roles->add_cap( 'opalestate_agent', $cap ); + } + } + + $wp_roles->add_cap( 'opalestate_accountant', 'edit_opalestate_properties' ); + $wp_roles->add_cap( 'opalestate_accountant', 'read_private_forms' ); + $wp_roles->add_cap( 'opalestate_accountant', 'view_opalestate_reports' ); + $wp_roles->add_cap( 'opalestate_accountant', 'export_opalestate_reports' ); + $wp_roles->add_cap( 'opalestate_accountant', 'edit_opalestate_payments' ); + + } + } + + /** + * Gets the core post type capabilities + * + * @access public + * @since 1.0.0 + * @return array $capabilities Core post type capabilities + */ + public function get_core_caps() { + $capabilities = array(); + + $capability_types = array( 'opalestate_properties', 'opalestate_agents' ); + + foreach ( $capability_types as $capability_type ) { + $capabilities[ $capability_type ] = array( + // Post type + "edit_{$capability_type}", + "read_{$capability_type}", + "delete_{$capability_type}", + "edit_{$capability_type}s", + "edit_others_{$capability_type}s", + "publish_{$capability_type}s", + "read_private_{$capability_type}s", + "delete_{$capability_type}s", + "delete_private_{$capability_type}s", + "delete_published_{$capability_type}s", + "delete_others_{$capability_type}s", + "edit_private_{$capability_type}s", + "edit_published_{$capability_type}s", + + // Terms + "manage_{$capability_type}_terms", + "edit_{$capability_type}_terms", + "delete_{$capability_type}_terms", + "assign_{$capability_type}_terms", + + // Custom + "view_{$capability_type}_stats" + ); + } + + return $capabilities; + } + + /** + * Map meta caps to primitive caps + * + * @access public + * @since 2.0 + * @return array $caps + */ + public function meta_caps( $caps, $cap, $user_id, $args ) { + + switch( $cap ) { + + case 'view_opalestate_properties_stats' : + + if( empty( $args[0] ) ) { + break; + } + + $form = get_post( $args[0] ); + if ( empty( $form ) ) { + break; + } + + if( user_can( $user_id, 'view_opalestate_reports' ) || $user_id == $form->post_author ) { + $caps = array(); + } + + break; + } + + return $caps; + + } + + /** + * Remove core post type capabilities (called on uninstall) + * + * @access public + * @since 1.0 + * @return void + */ + public function remove_caps() { + + global $wp_roles; + + if ( class_exists( 'WP_Roles' ) ) { + if ( ! isset( $wp_roles ) ) { + $wp_roles = new WP_Roles(); + } + } + + if ( is_object( $wp_roles ) ) { + /** Opalestate Manager Capabilities */ + $wp_roles->remove_cap( 'opalestate_manager', 'view_opalestate_reports' ); + $wp_roles->remove_cap( 'opalestate_manager', 'view_opalestate_sensitive_data' ); + $wp_roles->remove_cap( 'opalestate_manager', 'export_opalestate_reports' ); + $wp_roles->remove_cap( 'opalestate_manager', 'manage_opalestate_settings' ); + + /** Site Administrator Capabilities */ + $wp_roles->remove_cap( 'administrator', 'view_opalestate_reports' ); + $wp_roles->remove_cap( 'administrator', 'view_opalestate_sensitive_data' ); + $wp_roles->remove_cap( 'administrator', 'export_opalestate_reports' ); + $wp_roles->remove_cap( 'administrator', 'manage_opalestate_settings' ); + + /** Remove the Main Post Type Capabilities */ + $capabilities = $this->get_core_caps(); + + foreach ( $capabilities as $cap_group ) { + foreach ( $cap_group as $cap ) { + $wp_roles->remove_cap( 'opalestate_manager', $cap ); + $wp_roles->remove_cap( 'administrator', $cap ); + $wp_roles->remove_cap( 'opalestate_agent', $cap ); + } + } + + /** Shop Accountant Capabilities */ + $wp_roles->remove_cap( 'opalestate_accountant', 'edit_opalestate_properties' ); + $wp_roles->remove_cap( 'opalestate_accountant', 'read_private_forms' ); + $wp_roles->remove_cap( 'opalestate_accountant', 'view_opalestate_reports' ); + $wp_roles->remove_cap( 'opalestate_accountant', 'export_opalestate_reports' ); + } + } +} \ No newline at end of file diff --git a/inc/class-template-loader.php b/inc/class-template-loader.php new file mode 100755 index 00000000..56d82487 --- /dev/null +++ b/inc/class-template-loader.php @@ -0,0 +1,142 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Template_Loader { + + /** + * Initialize template loader + * + * @access public + * @return void + */ + public static function init() { + add_filter( 'template_include', [ __CLASS__, 'templates' ] ); + } + + /** + * Default templates + * + * @access public + * @param $template + * @return string + * @throws Exception + */ + public static function templates( $template ) { + $post_type = get_post_type(); + $custom_post_types = [ 'opalestate_property', 'opalestate_agent', 'opalestate_agency' ]; + + if ( in_array( $post_type, $custom_post_types ) ) { + + + if ( is_tax( 'opalestate_agency' ) ) { + return self::locate( 'single-opalestate_agency' ); + } + + if ( is_archive() ) { + return self::locate( 'archive-' . $post_type ); + } + + if ( is_single() ) { + return self::locate( 'single-' . $post_type ); + } + } + + if ( is_post_type_archive( 'opalestate_agency' ) ) { + return self::locate( 'archive-opalestate_agency' ); + } + + if ( is_post_type_archive( 'opalestate_agent' ) ) { + return self::locate( 'archive-opalestate_agent' ); + } + + return $template; + } + + /** + * Gets template path + * + * @access public + * @param $name + * @param $plugin_dir + * @return string + * @throws Exception + */ + public static function locate( $name, $plugin_dir = OPALESTATE_PLUGIN_DIR, $warning = true ) { + $template = ''; + + // Current theme base dir + if ( ! empty( $name ) ) { + $template = locate_template( "{$name}.php" ); + } + + // Child theme + if ( ! $template && ! empty( $name ) && file_exists( get_stylesheet_directory() . "/opalestate/{$name}.php" ) ) { + $template = get_stylesheet_directory() . "/opalestate/{$name}.php"; + } + + // Original theme + if ( ! $template && ! empty( $name ) && file_exists( get_template_directory() . "/opalestate/{$name}.php" ) ) { + $template = get_template_directory() . "/opalestate/{$name}.php"; + } + + // Plugin + if ( ! $template && ! empty( $name ) && file_exists( $plugin_dir . "/templates/{$name}.php" ) ) { + $template = $plugin_dir . "/templates/{$name}.php"; + } + + // Nothing found + if ( empty( $template ) && $warning ) { + throw new Exception( "Template /templates/{$name}.php in plugin dir {$plugin_dir} not found." ); + } + + return $template; + } + + + /** + * Loads template content + * + * @param string $name + * @param array $args + * @param string $plugin_dir + * @return string + * @throws Exception + */ + public static function get_template_part( $name, $args = [], $slug = null ) { + if ( is_array( $args ) && count( $args ) > 0 ) { + extract( $args, EXTR_SKIP ); + } + + if ( $slug ) { + $path = self::locate( $name . '-' . $slug, OPALESTATE_PLUGIN_DIR, false ); + if ( empty( $path ) ) { + $path = self::locate( $name, OPALESTATE_PLUGIN_DIR ); + } + } else { + $path = self::locate( $name, OPALESTATE_PLUGIN_DIR ); + } + + ob_start(); + include $path; + $result = ob_get_contents(); + ob_end_clean(); + + return $result; + } +} + +Opalestate_Template_Loader::init(); diff --git a/inc/classes/class-opalestate-abs-query.php b/inc/classes/class-opalestate-abs-query.php new file mode 100755 index 00000000..7b006347 --- /dev/null +++ b/inc/classes/class-opalestate-abs-query.php @@ -0,0 +1,141 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * @class OpalEstate_Agent + * + * @version 1.0 + */ +class OpalEstate_Abstract_Query{ + + /** + * Preserve args + * + * @since $id + * @access public + * + * @var string + */ + public $group; + + /** + * Preserve args + * + * @since $id + * @access public + * + * @var array + */ + public $_args = array(); + + /** + * The args to pass to the give_get_payments() query + * + * @since $id + * @access public + * + * @var array + */ + public $args = array(); + + /** + * The collection found based on the criteria set + * + * @since $id + * @access public + * + * @var array + */ + public $collection = array(); + + public function set_filters() { + } + + public function unset_filters() { + } + + + public function get_list(){ + + } + + public function status() { + } + + public function page() { + } + + /** + * Posts Per Page + * + * @since 1.0 + * @access public + * + * @return void + */ + public function per_page() { + } + + /** + * Order by + * + * @since 1.0 + * @access public + * + * @return void + */ + public function orderby() { + } + + public function get_by_user() { + + } + + public function search () { + + } + + /** + * Set a query variable. + * + * @since 1.0 + * @access public + * + * @param $query_var + * @param $value + */ + public function __set( $query_var, $value ) { + if ( in_array( $query_var, array( 'meta_query', 'tax_query' ) ) ) { + $this->args[ $query_var ][] = $value; + } else { + $this->args[ $query_var ] = $value; + } + } + + /** + * Unset a query variable. + * + * @since 1.0 + * @access public + * + * @param $query_var + */ + public function __unset( $query_var ) { + unset( $this->args[ $query_var ] ); + } +} \ No newline at end of file diff --git a/inc/classes/class-opalestate-cache.php b/inc/classes/class-opalestate-cache.php new file mode 100755 index 00000000..786ee4f4 --- /dev/null +++ b/inc/classes/class-opalestate-cache.php @@ -0,0 +1,686 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} +class Opalestate_Cache { + + /** + * Instance. + * + * @since 1.8.7 + * @access private + * @var Opalestate_Cache + */ + static private $instance; + + /** + * Flag to check if caching enabled or not. + * + * @since 2.0 + * @access private + * @var + */ + private $is_cache; + + /** + * Singleton pattern. + * + * @since 1.8.7 + * @access private + * Opalestate_Cache constructor. + */ + private function __construct() { + } + + + /** + * Get instance. + * + * @since 1.8.7 + * @access public + * @return static + */ + public static function get_instance() { + if ( ! isset( self::$instance ) && ! ( self::$instance instanceof Opalestate_Cache ) ) { + self::$instance = new Opalestate_Cache(); + } + + return self::$instance; + } + + /** + * Setup hooks. + * + * @since 1.8.7 + * @access public + */ + public function setup() { + // Currently enable cache only for backend. + self::$instance->is_cache = ( defined( 'GIVE_CACHE' ) ? GIVE_CACHE : opalestate_is_setting_enabled( opalestate_get_option( 'cache', 'enabled' ) ) ) && is_admin(); + + // weekly delete all expired cache. + Give_Cron::add_weekly_event( array( $this, 'delete_all_expired' ) ); + + add_action( 'save_post_opalestate_forms', array( $this, 'delete_form_related_cache' ) ); + add_action( 'save_post_opalestate_payment', array( $this, 'delete_payment_related_cache' ) ); + add_action( 'opalestate_deleted_opalestate-donors_cache', array( $this, 'delete_donor_related_cache' ), 10, 3 ); + add_action( 'opalestate_deleted_opalestate-donations_cache', array( $this, 'delete_donations_related_cache' ), 10, 3 ); + + add_action( 'opalestate_save_settings_opalestate_settings', array( __CLASS__, 'flush_cache' ) ); + + add_action( 'wp', array( __CLASS__, 'prevent_caching' ) ); + add_action( 'admin_notices', array( $this, '__notices' ) ); + } + + /** + * Prevent caching on certain pages + * + * @since 2.0.5 + * @access public + * @credit WooCommerce + */ + public static function prevent_caching() { + if ( ! is_blog_installed() ) { + return; + } + + $page_ids = array_filter( array( + opalestate_get_option( 'success_page' ), + opalestate_get_option( 'failure_page' ), + opalestate_get_option( 'history_page' ), + ) ); + + if ( + is_page( $page_ids ) + || is_singular( 'opalestate_forms' ) + ) { + self::set_nocache_constants(); + nocache_headers(); + } + } + + /** + * Set constants to prevent caching by some plugins. + * + * @since 2.0.5 + * @access public + * @credit WooCommerce + * + * @param mixed $return Value to return. Previously hooked into a filter. + * + * @return mixed + */ + public static function set_nocache_constants( $return = true ) { + + return $return; + } + + /** + * Notices function. + * + * @since 2.0.5 + * @access public + * @credit WooCommerce + */ + public function __notices() { + if ( ! function_exists( 'w3tc_pgcache_flush' ) || ! function_exists( 'w3_instance' ) ) { + return; + } + + $config = w3_instance( 'W3_Config' ); + $enabled = $config->get_integer( 'dbcache.enabled' ); + $settings = array_map( 'trim', $config->get_array( 'dbcache.reject.sql' ) ); + + if ( $enabled && ! in_array( 'opalestate-pro', $settings, true ) ) { + ?> +
            +

            database caching to work with Give you must add %1$s to the "Ignored query stems" option in W3 Total Cache settings.', 'opalestate-pro' ), 'opalestate', esc_url( admin_url( 'admin.php?page=w3tc_dbcache#dbcache_reject_sql' ) ) ) ); ?>

            +
            + $data, + 'expiration' => ! is_null( $expiration ) + ? ( $expiration + current_time( 'timestamp', 1 ) ) + : null, + ); + + $result = update_option( $cache_key, $option_value, false ); + + return $result; + } + + /** + * Delete cache. + * + * Note: only for internal use + * + * @since 1.8.7 + * + * @param string|array $cache_keys + * + * @return bool|WP_Error + */ + public static function delete( $cache_keys ) { + $result = true; + $invalid_keys = array(); + + if ( ! empty( $cache_keys ) ) { + $cache_keys = is_array( $cache_keys ) ? $cache_keys : array( $cache_keys ); + + foreach ( $cache_keys as $cache_key ) { + if ( ! self::is_valid_cache_key( $cache_key ) ) { + $invalid_keys[] = $cache_key; + $result = false; + } + + delete_option( $cache_key ); + } + } + + if ( ! $result ) { + $result = new WP_Error( + 'opalestate_invalid_cache_key', + __( 'Cache key format should be opalestate_cache_*', 'opalestate-pro' ), + $invalid_keys + ); + } + + return $result; + } + + /** + * Delete all logging cache. + * + * Note: only for internal use + * + * @since 1.8.7 + * @access public + * @global wpdb $wpdb + * + * @param bool $force If set to true then all cached values will be delete instead of only expired + * + * @return bool + */ + public static function delete_all_expired( $force = false ) { + global $wpdb; + $options = $wpdb->get_results( + $wpdb->prepare( + "SELECT option_name, option_value + FROM {$wpdb->options} + Where option_name + LIKE '%%%s%%'", + 'opalestate_cache' + ), + ARRAY_A + ); + + // Bailout. + if ( empty( $options ) ) { + return false; + } + + $current_time = current_time( 'timestamp', 1 ); + + // Delete log cache. + foreach ( $options as $option ) { + $option['option_value'] = maybe_unserialize( $option['option_value'] ); + + if ( + ( + ! self::is_valid_cache_key( $option['option_name'] ) + || ! is_array( $option['option_value'] ) // Backward compatibility (<1.8.7). + || ! array_key_exists( 'expiration', $option['option_value'] ) // Backward compatibility (<1.8.7). + || empty( $option['option_value']['expiration'] ) + || ( $current_time < $option['option_value']['expiration'] ) + ) + && ! $force + ) { + continue; + } + + self::delete( $option['option_name'] ); + } + } + + + /** + * Get list of options like. + * + * Note: only for internal use + * + * @since 1.8.7 + * @access public + * + * @param string $option_name + * @param bool $fields + * + * @return array + */ + public static function get_options_like( $option_name, $fields = false ) { + global $wpdb; + + $field_names = $fields ? 'option_name, option_value' : 'option_name'; + + if ( $fields ) { + $options = $wpdb->get_results( + $wpdb->prepare( + "SELECT {$field_names } + FROM {$wpdb->options} + Where option_name + LIKE '%%%s%%'", + "opalestate_cache_{$option_name}" + ), + ARRAY_A + ); + } else { + $options = $wpdb->get_col( + $wpdb->prepare( + "SELECT * + FROM {$wpdb->options} + Where option_name + LIKE '%%%s%%'", + "opalestate_cache_{$option_name}" + ), + 1 + ); + } + + if ( ! empty( $options ) && $fields ) { + foreach ( $options as $index => $option ) { + $option['option_value'] = maybe_unserialize( $option['option_value'] ); + $options[ $index ] = $option; + } + } + + return $options; + } + + /** + * Check cache key validity. + * + * @since 1.8.7 + * @access public + * + * @param $cache_key + * + * @return bool + */ + public static function is_valid_cache_key( $cache_key ) { + $is_valid = ( false !== strpos( $cache_key, 'opalestate_cache_' ) ); + + + /** + * Filter the flag which tell about cache key valid or not + * + * @since 2.0 + */ + return apply_filters( 'opalestate_is_valid_cache_key', $is_valid, $cache_key ); + } + + + /** + * Get cache from group + * + * @since 2.0 + * @access public + * + * @param int $id + * @param string $group + * + * @return mixed + */ + public static function get_group( $id, $group = '' ) { + $cached_data = null; + + // Bailout. + if ( self::$instance->is_cache && ! empty( $id ) ) { + $group = self::$instance->filter_group_name( $group ); + + $cached_data = wp_cache_get( $id, $group ); + $cached_data = false !== $cached_data ? $cached_data : null; + } + + return $cached_data; + } + + /** + * Cache small chunks inside group + * + * @since 2.0 + * @access public + * + * @param int $id + * @param mixed $data + * @param string $group + * @param int $expire + * + * @return bool + */ + public static function set_group( $id, $data, $group = '', $expire = 0 ) { + $status = false; + + // Bailout. + if ( ! self::$instance->is_cache || empty( $id ) ) { + return $status; + } + + $group = self::$instance->filter_group_name( $group ); + + $status = wp_cache_set( $id, $data, $group, $expire ); + + return $status; + } + + /** + * Cache small db query chunks inside group + * + * @since 2.0 + * @access public + * + * @param int $id + * @param mixed $data + * + * @return bool + */ + public static function set_db_query( $id, $data ) { + $status = false; + + // Bailout. + if ( ! self::$instance->is_cache || empty( $id ) ) { + return $status; + } + + return self::set_group( $id, $data, 'opalestate-db-queries', 0 ); + } + + /** + * Get cache from group + * + * @since 2.0 + * @access public + * + * @param string $id + * + * @return mixed + */ + public static function get_db_query( $id ) { + return self::get_group( $id, 'opalestate-db-queries' ); + } + + /** + * Delete group cache + * + * @since 2.0 + * @access public + * + * @param int|array $ids + * @param string $group + * @param int $expire + * + * @return bool + */ + public static function delete_group( $ids, $group = '', $expire = 0 ) { + $status = false; + + // Bailout. + if ( ! self::$instance->is_cache || empty( $ids ) ) { + return $status; + } + + $group_prefix = $group; + $group = self::$instance->filter_group_name( $group ); + + // Delete single or multiple cache items from cache. + if ( ! is_array( $ids ) ) { + $status = wp_cache_delete( $ids, $group ); + self::$instance->get_incrementer( true ); + + /** + * Fire action when cache deleted for specific id. + * + * @since 2.0 + * + * @param string $ids + * @param string $group + * @param int $expire + */ + do_action( "opalestate_deleted_{$group_prefix}_cache", $ids, $group, $expire, $status ); + + } else { + foreach ( $ids as $id ) { + $status = wp_cache_delete( $id, $group ); + self::$instance->get_incrementer( true ); + + /** + * Fire action when cache deleted for specific id . + * + * @since 2.0 + * + * @param string $ids + * @param string $group + * @param int $expire + */ + do_action( "opalestate_deleted_{$group_prefix}_cache", $id, $group, $expire, $status ); + } + } + + return $status; + } + + + /** + * Get unique incrementer. + * + * @see https://core.trac.wordpress.org/ticket/4476 + * @see https://www.tollmanz.com/invalidation-schemes/ + * + * @since 2.0 + * @access public + * + * @param bool $refresh + * @param string $incrementer_key + * + * @return string + */ + public function get_incrementer( $refresh = false, $incrementer_key = 'opalestate-cache-incrementer-db-queries' ) { + $incrementer_value = wp_cache_get( $incrementer_key ); + + if ( false === $incrementer_value || true === $refresh ) { + $incrementer_value = (string) microtime( true ); + wp_cache_set( $incrementer_key, $incrementer_value ); + } + + return $incrementer_value; + } + + + /** + * Flush cache on cache setting enable/disable + * Note: only for internal use + * + * @since 2.0 + * @access public + * + * @param bool $force Delete cache forcefully. + * + * @return bool + */ + public static function flush_cache( $force = false ) { + + return false; + } + + + /** + * Filter the group name + * + * @since 2.0 + * @access private + * + * @param $group + * + * @return mixed + */ + private function filter_group_name( $group ) { + /** + * Filter the group name + * + * @since 2.1.0 + */ + $filtered_group = apply_filters( 'opalestate_cache_filter_group_name', '', $group ); + + if ( empty( $filtered_group ) ) { + + switch ( $group ) { + case 'opalestate-db-queries': + $incrementer = self::$instance->get_incrementer(); + break; + + default: + $incrementer = self::$instance->get_incrementer( false, 'opalestate-cache-incrementer' ); + + } + + $current_blog_id = get_current_blog_id(); + $filtered_group = "{$group}_{$current_blog_id}_{$incrementer}"; + } + + return $filtered_group; + } + + + /** + * Disable cache. + * + * @since 2.0 + * @access public + */ + public static function disable() { + self::get_instance()->is_cache = false; + } + + /** + * Enable cache. + * + * @since 2.0 + * @access public + */ + public static function enable() { + self::get_instance()->is_cache = true; + } +} + +// Initialize +Opalestate_Cache::get_instance()->setup(); diff --git a/inc/classes/class-opalestate-geolocation.php b/inc/classes/class-opalestate-geolocation.php new file mode 100755 index 00000000..c33a3b4c --- /dev/null +++ b/inc/classes/class-opalestate-geolocation.php @@ -0,0 +1,111 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} +class OpalEstate_GeoLocation { + + /* + * function to geocode address, it will return false if unable to geocode address + */ + public static function get_points_in_miles( $latitude, $longitude, $miles ) { + + $equator = 69.172; + + $maxlat = $latitude + $miles / $EQUATOR_LAT_MILE; + $minlat = $latitude - ($maxlat - $latitude); + $maxlong = $longitude + $miles / (cos($minlat * M_PI / 180) * $equator); + $minlong = $longitude - ($maxlong - $longitude); + + return array( + 'minlat' => $minlat, + 'maxlat' => $maxlat, + 'minlong' => $minlong, + 'maxlong' => $maxlong + ); + } + + /* + * function to geocode address, it will return false if unable to geocode address + */ + public static function calculate( $lat1, $long1, $lat2, $long2 ) { + + $EARTH_RADIUS_MILES = 3963; + $dist = 0; + + //convert degrees to radians + $lat1 = $lat1 * M_PI / 180; + $long1 = $long1 * M_PI / 180; + $lat2 = $lat2 * M_PI / 180; + $long2 = $long2 * M_PI / 180; + + if ($lat1 != $lat2 || $long1 != $long2) { + + $dist = sin($lat1) * sin($lat2) + cos($lat1) * cos($lat2) * cos($long2 - $long1); + $dist = $EARTH_RADIUS_MILES * (-1 * atan($dist / sqrt(1 - $dist * $dist)) + M_PI / 2); + } + return $dist; + } + + /* + * function to geocode address, it will return false if unable to geocode address + */ + public static function geocode( $address ){ + + // url encode the address + $address = urlencode($address); + + // google map geocode api url + $url = opalestate_get_map_search_api_uri( $address ); + + // get the json response + // $resp_json = file get contents($url); + $resp_json = wp_remote_get($url); + + // decode the json + $resp = json_decode($resp_json, true); + + + // response status will be 'OK', if able to geocode given address + if($resp['status']=='OK'){ + + // get the important data + $lati = isset($resp['results'][0]['geometry']['location']['lat']) ? $resp['results'][0]['geometry']['location']['lat'] : ""; + $longi = isset($resp['results'][0]['geometry']['location']['lng']) ? $resp['results'][0]['geometry']['location']['lng'] : ""; + $formatted_address = isset($resp['results'][0]['formatted_address']) ? $resp['results'][0]['formatted_address'] : ""; + + // verify if data is complete + if($lati && $longi && $formatted_address){ + // put the data in the array + $data_arr = array(); + array_push( + $data_arr, + $lati, + $longi, + $formatted_address + ); + + return $data_arr; + + }else{ + return false; + } + } + + else{ + return false; + } + } +} diff --git a/inc/classes/class-opalestate-metabox-user.php b/inc/classes/class-opalestate-metabox-user.php new file mode 100755 index 00000000..86e71463 --- /dev/null +++ b/inc/classes/class-opalestate-metabox-user.php @@ -0,0 +1,290 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_User_MetaBox { + + public function get_front_base_field( $prefix ) { + $management = [ + [ + 'name' => esc_html__( 'Avatar Picture', 'opalestate-pro' ), + 'desc' => esc_html__( 'This image will display in user detail and profile box information', 'opalestate-pro' ), + 'id' => $prefix . 'avatar', + 'type' => 'hidden', + 'single' => 1, + 'limit' => 1, + ], + + [ + 'name' => esc_html__( 'Avatar Picture', 'opalestate-pro' ), + 'desc' => esc_html__( 'This image will display in user detail and profile box information', 'opalestate-pro' ), + 'id' => $prefix . 'avatar_id', + 'type' => 'uploader', + 'single' => 1, + 'limit' => 1, + + ], + + [ + 'id' => 'first_name', + 'name' => esc_html__( 'First Name', 'opalestate-pro' ), + 'type' => 'text', + 'attributes' => [ + 'required' => 'required', + ], + ], + [ + 'id' => 'last_name', + 'name' => esc_html__( 'Last Name', 'opalestate-pro' ), + 'type' => 'text', + 'attributes' => [ + 'required' => 'required', + ], + ], + [ + 'id' => 'description', + 'name' => esc_html__( 'Biographical Info', 'opalestate-pro' ), + 'type' => 'textarea', + 'description' => esc_html__( 'Share a little biographical information to fill out your profile. This may be shown publicly.', 'opalestate-pro' ), + 'after_row' => '
            ', + ], + ]; + + + return $management; + } + + public function get_avatar_fields( $prefix ) { + return [ + [ + 'name' => esc_html__( 'Avatar Pictures', 'opalestate-pro' ), + 'desc' => esc_html__( 'This image will display in user detail and profile box information', 'opalestate-pro' ), + 'id' => $prefix . 'avatar', + 'type' => is_admin() ? 'file' : 'opal_upload', + 'avatar' => true, + + ], + ]; + } + + public function get_address_fields( $prefix ) { + return [ + [ + 'name' => esc_html__( 'Location', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select one, to add new you create in location of estate panel', 'opalestate-pro' ), + 'id' => $prefix . "location", + 'taxonomy' => 'opalestate_location', //Enter Taxonomy Slug + 'type' => 'taxonomy_select', + 'before_row' => '
            ', + + ], + [ + 'name' => esc_html__( 'State / Province', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select one, to add new you create in state of estate panel', 'opalestate-pro' ), + 'id' => $prefix . "state", + 'taxonomy' => 'opalestate_state', //Enter Taxonomy Slug + 'type' => 'taxonomy_select', + ], + [ + 'name' => esc_html__( 'City / Town', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select one, to add new you create in city of estate panel', 'opalestate-pro' ), + 'id' => $prefix . "city", + 'taxonomy' => 'opalestate_city', //Enter Taxonomy Slug + 'type' => 'taxonomy_select', + 'after_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Address', 'opalestate-pro' ), + 'id' => "{$prefix}address", + 'type' => 'text', + 'attributes' => [ + 'required' => 'required', + ], + ], + [ + 'id' => "{$prefix}map", + 'name' => esc_html__( 'Map Location', 'opalestate-pro' ), + 'type' => 'opal_map', + 'sanitization_cb' => 'opal_map_sanitise', + 'split_values' => true, + 'attributes' => [ + 'required' => 'required', + ], + ], + ]; + } + + public function get_job_fields( $prefix ) { + return [ + [ + 'name' => esc_html__( 'Job', 'opalestate-pro' ), + 'id' => "{$prefix}job", + 'type' => 'text', + 'before_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Company', 'opalestate-pro' ), + 'id' => "{$prefix}company", + 'type' => 'text', + 'after_row' => '
            ', + ], + ]; + } + + public function get_office_fields( $prefix ) { + return $this->get_base_fields( $prefix ); + } + + public function get_base_front_fields( $prefix ) { + return [ + [ + 'name' => esc_html__( 'Email', 'opalestate-pro' ), + 'id' => "{$prefix}email", + 'type' => 'text', + 'before_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Website', 'opalestate-pro' ), + 'id' => "{$prefix}web", + 'type' => 'text_url', + ], + [ + 'name' => esc_html__( 'Phone', 'opalestate-pro' ), + 'id' => "{$prefix}phone", + 'type' => 'text', + ], + + [ + 'name' => esc_html__( 'Mobile', 'opalestate-pro' ), + 'id' => "{$prefix}mobile", + 'type' => 'text', + ], + + [ + 'name' => esc_html__( 'Fax', 'opalestate-pro' ), + 'id' => "{$prefix}fax", + 'type' => 'text', + 'after_row' => '
            ', + ], + ]; + } + + public function get_base_fields( $prefix ) { + return [ + [ + 'id' => "{$prefix}featured", + 'name' => esc_html__( 'Is Featured', 'opalestate-pro' ), + 'type' => 'switch', + 'description' => esc_html__( 'Set member as featured', 'opalestate-pro' ), + 'options' => [ + 0 => esc_html__( 'No', 'opalestate-pro' ), + 1 => esc_html__( 'Yes', 'opalestate-pro' ), + ], + ], + + [ + 'id' => "{$prefix}trusted", + 'name' => esc_html__( 'Trusted', 'opalestate-pro' ), + 'type' => 'switch', + 'description' => esc_html__( 'Set this member as Trusted Member', 'opalestate-pro' ), + 'options' => [ + 0 => esc_html__( 'No', 'opalestate-pro' ), + 1 => esc_html__( 'Yes', 'opalestate-pro' ), + ], + ], + + [ + 'name' => esc_html__( 'Avatar Pictures', 'opalestate-pro' ), + 'desc' => esc_html__( 'This image will display in user detail and profile box information', 'opalestate-pro' ), + 'id' => $prefix . 'avatar', + 'type' => is_admin() ? 'file' : 'uploader', + 'single' => true, + 'avatar' => true, + ], + + [ + 'name' => esc_html__( 'Email', 'opalestate-pro' ), + 'id' => "{$prefix}email", + 'type' => 'text', + 'before_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Website', 'opalestate-pro' ), + 'id' => "{$prefix}web", + 'type' => 'text_url', + ], + [ + 'name' => esc_html__( 'Phone', 'opalestate-pro' ), + 'id' => "{$prefix}phone", + 'type' => 'text', + ], + + [ + 'name' => esc_html__( 'Mobile', 'opalestate-pro' ), + 'id' => "{$prefix}mobile", + 'type' => 'text', + ], + + [ + 'name' => esc_html__( 'Fax', 'opalestate-pro' ), + 'id' => "{$prefix}fax", + 'type' => 'text', + 'after_row' => '
            ', + ], + ]; + } + + public function get_social_fields( $prefix ) { + return [ + [ + 'name' => esc_html__( 'Twitter', 'opalestate-pro' ), + 'id' => "{$prefix}twitter", + 'type' => 'text_url', + 'before_row' => '
            ', + ], + + [ + 'name' => esc_html__( 'Facebook', 'opalestate-pro' ), + 'id' => "{$prefix}facebook", + 'type' => 'text_url', + ], + + [ + 'name' => esc_html__( 'Google', 'opalestate-pro' ), + 'id' => "{$prefix}google", + 'type' => 'text_url', + ], + + [ + 'name' => esc_html__( 'LinkedIn', 'opalestate-pro' ), + 'id' => "{$prefix}linkedin", + 'type' => 'text_url', + ], + + [ + 'name' => esc_html__( 'Pinterest', 'opalestate-pro' ), + 'id' => "{$prefix}pinterest", + 'type' => 'text_url', + ], + [ + 'name' => esc_html__( 'Instagram', 'opalestate-pro' ), + 'id' => "{$prefix}instagram", + 'type' => 'text_url', + 'after_row' => '
            ', + ], + ]; + } +} diff --git a/inc/classes/class-opalestate-multilingual.php b/inc/classes/class-opalestate-multilingual.php new file mode 100755 index 00000000..2c788b56 --- /dev/null +++ b/inc/classes/class-opalestate-multilingual.php @@ -0,0 +1,157 @@ +check(); + } + } + + /** + * Get the current language. + * + * @return string|null + */ + public function get_current_language() { + return $this->current_language ?: null; + } + + /** + * Get the main language. + * + * @return string|null + */ + public function get_default_language() { + return $this->default_language ?: null; + } + + /** + * Get the original post. + * + * @param int $post_id The post ID. + * @return int + */ + public function get_original_post( $post_id ) { + return $this->get_original_object( $post_id, 'post' ); + } + + /** + * Get the original object ID (post, taxonomy, etc...). + * + * @param int $id The object id. + * @param string $type Optional, post type or taxonomy name of the object, defaults to 'post'. + * @return int|null + */ + public function get_original_object( $id, $type = 'post' ) { + return icl_object_id( $id, $type, true, $this->get_default_language() ); + } + + /** + * Perform check the language. + * + * @access private + */ + public function check() { + switch ( true ) { + case ( static::is_wpml() ): + global $sitepress; + $this->current_language = $sitepress->get_current_language(); + $this->default_language = $sitepress->get_default_language(); + break; + + case ( static::is_polylang() ): + $this->default_language = pll_default_language( 'slug' ); + $this->current_language = pll_current_language( 'slug' ); + break; + } + } + + /** + * Sets the specified language. + * + * @param string|null $language The language name. + * @return void + */ + public function set_language( $language = null ) { + if ( static::is_polylang() ) { + $this->set_polylang_language( $language ); + } elseif ( static::is_wpml() ) { + global $sitepress; + $sitepress->switch_lang( $language, ! headers_sent() ); + } + } + + /** + * Sets the specified language on PLL. + * + * @sse \PLL_Choose_Lang::set_language() + * + * @param string|null $language The language name. + * @return void + */ + public function set_polylang_language( $language = null ) { + if ( ! static::is_polylang() ) { + return; + } + + /* @var \Polylang $polylang */ + $polylang = PLL(); + + // In frontend, if no language given, get the preferred language + // according to the browser preferences. + if ( empty( $language ) && ( ! is_admin() && ! defined( 'DOING_CRON' ) ) ) { + $curlang = $polylang->choose_lang->get_preferred_language(); + } else { + $curlang = $polylang->model->get_language( trim( $language ) ); + } + + if ( $curlang instanceof \PLL_Language ) { + $polylang->curlang = $curlang; + $GLOBALS['text_direction'] = $curlang->is_rtl ? 'rtl' : 'ltr'; // @codingStandardsIgnoreLine + } + } + + /** + * Determine if we're using WPML. + * + * Since PolyLang has a compatibility layer for WPML, we'll have to consider that too. + * + * @return bool + */ + public static function is_wpml() { + return ( defined( 'ICL_SITEPRESS_VERSION' ) && ! static::is_polylang() ); + } + + /** + * Determine if we're using PolyLang. + * + * @return bool + */ + public static function is_polylang() { + return class_exists( 'Polylang' ) && function_exists( 'pll_current_language' ); + } +} diff --git a/inc/classes/class-opalestate-session.php b/inc/classes/class-opalestate-session.php new file mode 100755 index 00000000..60a91c1b --- /dev/null +++ b/inc/classes/class-opalestate-session.php @@ -0,0 +1,299 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * Give_Session Class + * + * @since 1.0 + */ +class Opalestate_Session { + + /** + * Holds our session data + * + * @var array + * @access private + * @since 1.0 + */ + private $session; + + /** + * Whether to use PHP $_SESSION or WP_Session + * + * @var bool + * @access private + * @since 1.0 + */ + private $use_php_sessions = false; + + /** + * Expiration Time + * + * @var int + * @access private + * @since 1.0 + */ + private $exp_option = false; + + /** + * Session index prefix + * + * @var string + * @access private + * @since 1.0 + */ + private $prefix = ''; + + /** + * Get things started + * + * Defines our WP_Session constants, includes the necessary libraries and + * retrieves the WP Session instance + * + * @since 1.0 + */ + public function __construct() { + + $this->use_php_sessions = $this->use_php_sessions(); + $this->exp_option = 604800; //opalestate_get_option( 'session_lifetime' ); + + if ( $this->use_php_sessions ) { + + if ( is_multisite() ) { + $this->prefix = '_' . get_current_blog_id(); + } + + // Use PHP SESSION (must be enabled via the OPALMEMBERSHIP_USE_PHP_SESSIONS constant) + add_action( 'init', array( $this, 'maybe_start_session' ), - 2 ); + + } else { + + // Use WP_Session (default) + if ( ! defined( 'WP_SESSION_COOKIE' ) ) { + define( 'WP_SESSION_COOKIE', 'opalestate_wp_session' ); + } + + if ( ! class_exists( 'Recursive_ArrayAccess' ) ) { + // require_once OPALESTATE_PLUGIN_DIR . 'inc/libraries/class-recursive-arrayaccess.php'; + } + + if ( ! class_exists( 'WP_Session' ) ) { + require_once OPALESTATE_PLUGIN_DIR . 'inc/libraries/wp_session/class-wp-session.php'; + require_once OPALESTATE_PLUGIN_DIR . 'inc/libraries/wp-session.php'; + } + + add_filter( 'wp_session_expiration_variant', array( $this, 'set_expiration_variant_time' ), 99999 ); + add_filter( 'wp_session_expiration', array( $this, 'set_expiration_time' ), 99999 ); + + } + + if ( empty( $this->session ) && ! $this->use_php_sessions ) { + add_action( 'plugins_loaded', array( $this, 'init' ), - 1 ); + } else { + add_action( 'init', array( $this, 'init' ), - 1 ); + } + + } + + /** + * Setup the WP_Session instance + * + * @access public + * @since 1.0 + * @return array $this->session + */ + public function init() { + + if ( $this->use_php_sessions ) { + $this->session = isset( $_SESSION[ 'opalestate-pro' . $this->prefix ] ) && is_array( $_SESSION[ 'opalestate-pro' . $this->prefix ] ) ? $_SESSION[ 'opalestate-pro' . $this->prefix ] : array(); + } else { + $this->session = WP_Session::get_instance(); + } + + return $this->session; + } + + /** + * Retrieve session ID + * + * @access public + * @since 1.0 + * @return string Session ID + */ + public function get_id() { + return $this->session->session_id; + } + + /** + * Retrieve a session variable + * + * @access public + * @since 1.0 + * + * @param string $key Session key + * + * @return string Session variable + */ + public function get( $key = '', $default = false ) { + $key = sanitize_key( $key ); + + return isset( $this->session[ $key ] ) ? maybe_unserialize( $this->session[ $key ] ) : $default; + } + + /** + * Set a session variable + * + * @since 1.0 + * + * @param $key $_SESSION key + * @param $value $_SESSION variable + * + * @return mixed Session variable + */ + public function set( $key, $value ) { + + $key = sanitize_key( $key ); + + if ( is_array( $value ) ) { + $this->session[ $key ] = serialize( $value ); + } else { + $this->session[ $key ] = $value; + } + + if ( $this->use_php_sessions ) { + $_SESSION[ 'opalestate-pro' . $this->prefix ] = $this->session; + } + + return $this->session[ $key ]; + } + + /** + * Set Cookie Variant Time + * + * @description Force the cookie expiration variant time to custom expiration option, less and hour; defaults to 23 hours (set_expiration_variant_time used in WP_Session) + * + * @access public + * @since 1.0 + * + * @return int + */ + public function set_expiration_variant_time() { + return ( ! empty( $this->exp_option ) ? ( intval( $this->exp_option ) - 3600 ) : 30 * 60 * 23 ); + } + + /** + * Set the Cookie Expiration + * + * @description Force the cookie expiration time if set, default to 24 hours + * + * @access public + * @since 1.0 + * + * @return int + */ + public function set_expiration_time() { + return ( ! empty( $this->exp_option ) ? intval( $this->exp_option ) : 30 * 60 * 24 ); + } + + /** + * Starts a new session if one hasn't started yet. + * + * @return null + * Checks to see if the server supports PHP sessions + * or if the OPALMEMBERSHIP_USE_PHP_SESSIONS constant is defined + * + * @access public + * @since 1.0 + * @return bool $ret True if we are using PHP sessions, false otherwise + */ + public function use_php_sessions() { + + $ret = false; + + // If the database variable is already set, no need to run autodetection + $opalestate_use_php_sessions = (bool) get_option( 'opalestate_use_php_sessions' ); + + if ( ! $opalestate_use_php_sessions ) { + + // Attempt to detect if the server supports PHP sessions + if ( function_exists( 'session_start' ) && ! ini_get( 'safe_mode' ) ) { + + $this->set( 'opalestate_use_php_sessions', 1 ); + + if ( $this->get( 'opalestate_use_php_sessions' ) ) { + + $ret = true; + + // Set the database option + update_option( 'opalestate_use_php_sessions', true ); + + } + + } + + } else { + $ret = $opalestate_use_php_sessions; + } + + // Enable or disable PHP Sessions based on the OPALMEMBERSHIP_USE_PHP_SESSIONS constant + if ( defined( 'OPALMEMBERSHIP_USE_PHP_SESSIONS' ) && OPALMEMBERSHIP_USE_PHP_SESSIONS ) { + $ret = true; + } else if ( defined( 'OPALMEMBERSHIP_USE_PHP_SESSIONS' ) && ! OPALMEMBERSHIP_USE_PHP_SESSIONS ) { + $ret = false; + } + + return (bool) apply_filters( 'opalestate_use_php_sessions', $ret ); + } + + /** + * Maybe Start Session + * + * @description Starts a new session if one hasn't started yet. + * @see http://php.net/manual/en/function.session-set-cookie-params.php + */ + public function maybe_start_session() { + +// session_destroy(); //Uncomment for testing ONLY + + if ( ! session_id() && ! headers_sent() ) { + $lifetime = current_time( 'timestamp' ) + $this->set_expiration_time(); + session_start(); + setcookie( session_name(), session_id(), $lifetime ); // + setcookie( session_name() . '_expiration', $lifetime, $lifetime ); + } + } + + /** + * Get Session Expiration + * + * @description Looks at the session cookies and returns the expiration date for this session if applicable + * + */ + public function get_session_expiration() { + + $expiration = false; + + if ( session_id() && isset( $_COOKIE[ session_name() . '_expiration' ] ) ) { + $expiration = date( 'D, d M Y h:i:s', intval( $_COOKIE[ session_name() . '_expiration' ] ) ); + } + + return $expiration; + } + +} + diff --git a/inc/classes/class-opalestate-walkscore.php b/inc/classes/class-opalestate-walkscore.php new file mode 100755 index 00000000..494caf9b --- /dev/null +++ b/inc/classes/class-opalestate-walkscore.php @@ -0,0 +1,185 @@ + + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * An implementation of the Walk Score API in PHP. + * + * @see http://www.walkscore.com/ + */ +class Opalestate_WalkScore { + + /** + * Constructs a WalkScore object + * + * @param string $wsapikey + * Walk Score API key obtainable at http://www.walkscore.com/request-api-key.php + */ + function __construct($wsapikey) { + // a Walk Score API key is required + if (!isset($wsapikey)) { + throw new Exception("Walk Score API key required"); + } + $this->wsapikey = $wsapikey; + } + + /** + * Makes the API call using curl + * + * @param string $url + * The URL to send the request to + * @param array $options + * The options to send as the query appended to the URL + */ + private function make_api_call($url, $options) { + $options['wsapikey'] = $this->wsapikey; + $options['format'] = 'json'; + $query = http_build_query($options); + $response_url = $url . '?' . $query; + + $response = wp_remote_get($response_url); + $response = wp_remote_retrieve_body( $response ); + $response = json_decode($response); + + return $response; + } + + /** + * Implement the Walk Score Public Transit API + * + * @param string $call + * Which call to make to the Public Transit API + * - score: Returns the Transit Score for a given location. + * - stop search: Returns information about stops near a given location. + * - network search: Returns connected stops and routes near a given location. + * - stop detail: Returns details for a single stop. + * - route detail: eturns details for a single route. + * - supported cities: Returns a list of cities for which scores are available. + * @param array $options + * Options to send to the Public Transit API. Keys and values are dependent + * on the call made. + * @return + * An object containing the results of the call. + * @see http://www.walkscore.com/services/public-transit-api.php + */ + public function PublicTransit($call, $options = array()) { + + $api_url = 'http://transit.walkscore.com/transit/'; + $calls = array( + 'score' => 'score/', + 'stop search' => 'search/stops/', + 'network search' => 'search/network/', + 'stop detail' => 'stop/ID/', + 'route detail' => 'route/ID/', + 'supported cities' => 'supported/cities/', + ); + + + $api_url .= $calls[$call]; + return $this->make_api_call($api_url, $options); + } + + /** + * Implementation of the Walk Score API + * + * @param array $options + * An array of options. The array keys to pass are: + * - mode: string, one of 'walk', 'bike', 'drive', or 'transit'. + * - origin: string containing a comma-separated lat,lng. + * - destination: string containing a comma-separated lat,lng. + * @todo Multiple destinations. + * @ see http://www.walkscore.com/professional/travel-time-api.php + */ + public function TravelTime($options = array()) { + if (!is_array($options)) { + throw new Exception("Input parameter must be an array."); + } + $modes = array('walk', 'bike', 'drive', 'transit'); + if (!in_array($options['mode'], $modes)) { + throw new Exception("Mode parameter must be one of 'walk', 'bike', 'drive', or 'transit'."); + } + $response = $this->make_api_call('http://www.walkscore.com/api/v1/traveltime/json', $options); + return $response->response; + } + + /** + * Implementation of the Walk Score API + * + * @param array $options + * An array of options. The array keys to pass are: + * - address: string containing the street address of the location + * - lat: string or number containing the latitude of the location + * - lon: string or number containing the longitude of the location + * @return + * An object containing the results of the call. An added property + * called status_description gives a human-readable description of + * the numeric status code returned in the object + * @see http://www.walkscore.com/services/api.php + */ + public function WalkScore($options = array()) { + if (!is_array($options)) { + throw new Exception("Input parameter must be an array."); + } + + $response = $this->make_api_call('http://api.walkscore.com/score', $options); + + // stuff the status code description in the response object + // so you don't have to look it up on the Walk Score website + $status_descriptions = array( + 1 => 'Walk Score successfully returned.', + 2 => 'Score is being calculated and is not currently available.', + 30 => 'Invalid latitude/longitude.', + 40 => 'Your WSAPIKEY is invalid.', + 41 => 'Your daily API quota has been exceeded.', + 42 => 'Your IP address has been blocked.', + ); + + $response->status_description = $status_descriptions[$response->status]; + + return $response; + } + + /** + * Implementation of the Walk Shed API + * + * @param array $options + * An array of options. The array keys to pass are: + * - lat: string or number containing the latitude of the location + * - lon: string or number containing the longitude of the location + * @return + * An object containing the results of the call. An added property + * called status_description gives a human-readable description of + * the numeric status code returned in the object + * @see http://www.walkscore.com/services/api.php + */ + public function WalkShed($options = array()) { + + if (!is_array($options)) { + throw new Exception("Input parameter must be an array."); + } + + $response = $this->make_api_call('http://api.walkscore.com/walk_shed', $options); + + // stuff the status code description in the response object + // so you don't have to look it up on the Walk Score website + $status_descriptions = array( + 1 => 'Walk shed successfully returned.', + 2 => 'Walk shed unavailable.', + 30 => 'Invalid latitude/longitude.', + 31 => 'Walk Score API internal error.', + 40 => 'Your WSAPIKEY is invalid.', + 41 => 'Your daily API quota has been exceeded.', + ); + $response->status_description = $status_descriptions[$response->status]; + + return $response; + } +} diff --git a/inc/classes/class-opalestate-yelp.php b/inc/classes/class-opalestate-yelp.php new file mode 100755 index 00000000..0cc3d7f7 --- /dev/null +++ b/inc/classes/class-opalestate-yelp.php @@ -0,0 +1,250 @@ + + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Yelp { + // API constants, you shouldn't have to change these. + const API_HOST = "https://api.yelp.com"; + const SEARCH_PATH = "/v3/businesses/search"; + const BUSINESS_PATH = "/v3/businesses/"; // Business ID will come after slash. + const TOKEN_PATH = "/oauth2/token"; + const GRANT_TYPE = "client_credentials"; + + public static function get_client_id() { + return opalestate_get_option( 'yelp_app_id', '' ); + } + + public static function get_app_secret() { + return opalestate_get_option( 'yelp_app_secret', '' ); + } + + public static function get_app_key() { + return opalestate_get_option( 'yelp_app_key', '' ); + } + + public static function get_categories() { + return opalestate_get_option( 'yelp_categories', [] ); + } + + public static function get_category_results_limit() { + return opalestate_get_option( 'yelp_number_results', 3 ); + } + + /** + * Given a bearer token, send a GET request to the API. + * + * @return OAuth bearer token, obtained using client_id and client_secret. + */ + public function obtain_bearer_token() { + $yelp_client_id = static::get_client_id(); + $yelp_client_secret = static::get_app_secret(); + $yelp_app_key = static::get_app_key(); + + return $yelp_app_key; + } + + + /** + * Makes a request to the Yelp API and returns the response + * + * @param $bearer_token API bearer token from obtain_bearer_token + * @param $host The domain host of the API + * @param $path The path of the API after the domain. + * @param $url_params Array of query-string parameters. + * @return The JSON response from the request + */ + public function request( $bearer_token, $host, $path, $url_params = [] ) { + // Send Yelp API Call + try { + $url = $host . $path . "?" . http_build_query( $url_params ); + $args = [ + 'timeout' => 30, + 'redirection' => 10, + 'httpversion' => CURL_HTTP_VERSION_1_1, + 'user-agent' => '', + 'headers' => [ + 'authorization' => 'Bearer ' . $bearer_token, + ], + 'sslverify' => false, + ]; + + $response = wp_remote_get( $url, $args ); + $response = wp_remote_retrieve_body( $response ); + } catch ( Exception $e ) { + + } + + return $response; + } + + /** + * Query the Search API by a search term and location + * + * @param $bearer_token API bearer token from obtain_bearer_token + * @param $term The search term passed to the API + * @param $location The search location passed to the API + * @return The JSON response from the request + */ + public function search( $bearer_token, $term, $latitude, $longitude ) { + $url_params = []; + + $url_params['term'] = $term; + $url_params['latitude'] = $latitude; + $url_params['longitude'] = $longitude; + $url_params['limit'] = static::get_category_results_limit(); + + return $this->request( $bearer_token, static::API_HOST, static::SEARCH_PATH, $url_params ); + } + + /** + * Query the Business API by business_id + * + * @param $bearer_token API bearer token from obtain_bearer_token + * @param $business_id The ID of the business to query + * @return The JSON response from the request + */ + public function get_business( $bearer_token, $business_id ) { + $business_path = $GLOBALS['BUSINESS_PATH'] . urlencode( $business_id ); + + return $this->request( $bearer_token, $GLOBALS['API_HOST'], $business_path ); + } + + public function query_api( $term, $latitude, $longitude ) { + $bearer_token = $this->obtain_bearer_token(); + + $response = json_decode( $this->search( $bearer_token, $term, $latitude, $longitude ) ); + + return $response; + } + + public function get_results( $term, $latitude, $longitude ) { + if ( ! static::get_categories() ) { + return false; + } + + $results = $this->query_api( $term, $latitude, $longitude ); + if ( isset( $results->error ) && $results->error ) { + return false; + } + + return $results; + } + + public static function get_all_categories() { + return apply_filters( 'opalestate_yelp_all_categories', + [ + 'active' => [ + 'category' => esc_html__( 'Active Life', 'opalestate-pro' ), + 'category_sign' => 'fa fa-bicycle', + ], + 'arts' => [ + 'category' => esc_html__( 'Arts & Entertainment', 'opalestate-pro' ), + 'category_sign' => 'fa fa-music', + ], + 'auto' => [ + 'category' => esc_html__( 'Automotive', 'opalestate-pro' ), + 'category_sign' => 'fa fa-car', + ], + 'beautysvc' => [ + 'category' => esc_html__( 'Beauty & Spas', 'opalestate-pro' ), + 'category_sign' => 'fa fa-female', + ], + 'education' => [ + 'category' => esc_html__( 'Education', 'opalestate-pro' ), + 'category_sign' => 'fa fa-graduation-cap', + ], + 'eventservices' => [ + 'category' => esc_html__( 'Event Planning & Services', 'opalestate-pro' ), + 'category_sign' => 'fa fa-birthday-cake', + ], + 'financialservices' => [ + 'category' => esc_html__( 'Financial Services', 'opalestate-pro' ), + 'category_sign' => 'fa fa-money', + ], + 'food' => [ + 'category' => esc_html__( 'Food', 'opalestate-pro' ), + 'category_sign' => 'fa fa fa-cutlery', + ], + 'health' => [ + 'category' => esc_html__( 'Health & Medical', 'opalestate-pro' ), + 'category_sign' => 'fa fa-medkit', + ], + 'homeservices' => [ + 'category' => esc_html__( 'Home Services ', 'opalestate-pro' ), + 'category_sign' => 'fa fa-wrench', + ], + 'hotelstravel' => [ + 'category' => esc_html__( 'Hotels & Travel', 'opalestate-pro' ), + 'category_sign' => 'fa fa-bed', + ], + 'localflavor' => [ + 'category' => esc_html__( 'Local Flavor', 'opalestate-pro' ), + 'category_sign' => 'fa fa-coffee', + ], + 'localservices' => [ + 'category' => esc_html__( 'Local Services', 'opalestate-pro' ), + 'category_sign' => 'fa fa-dot-circle-o', + ], + 'massmedia' => [ + 'category' => esc_html__( 'Mass Media', 'opalestate-pro' ), + 'category_sign' => 'fa fa-television', + ], + 'nightlife' => [ + 'category' => esc_html__( 'Nightlife', 'opalestate-pro' ), + 'category_sign' => 'fa fa-glass', + ], + 'pets' => [ + 'category' => esc_html__( 'Pets', 'opalestate-pro' ), + 'category_sign' => 'fa fa-paw', + ], + 'professional' => [ + 'category' => esc_html__( 'Professional Services', 'opalestate-pro' ), + 'category_sign' => 'fa fa-suitcase', + ], + 'publicservicesgovt' => [ + 'category' => esc_html__( 'Public Services & Government', 'opalestate-pro' ), + 'category_sign' => 'fa fa-university', + ], + 'realestate' => [ + 'category' => esc_html__( 'Real Estate', 'opalestate-pro' ), + 'category_sign' => 'fa fa-building-o', + ], + 'religiousorgs' => [ + 'category' => esc_html__( 'Religious Organizations', 'opalestate-pro' ), + 'category_sign' => 'fa fa-cloud', + ], + 'restaurants' => [ + 'category' => esc_html__( 'Restaurants', 'opalestate-pro' ), + 'category_sign' => 'fa fa-cutlery', + ], + 'shopping' => [ + 'category' => esc_html__( 'Shopping', 'opalestate-pro' ), + 'category_sign' => 'fa fa-shopping-bag', + ], + 'transport' => [ + 'category' => esc_html__( 'Transportation', 'opalestate-pro' ), + 'category_sign' => 'fa fa-bus', + ], + ] + ); + } + + public static function get_all_categories_options() { + $categories = static::get_all_categories(); + + $options = []; + foreach ( $categories as $key => $term ) { + $options[ $key ] = $term['category']; + } + + return $options; + } +} diff --git a/inc/cli/export.php b/inc/cli/export.php new file mode 100755 index 00000000..24eaaf3b --- /dev/null +++ b/inc/cli/export.php @@ -0,0 +1,646 @@ +path = OPALESTATE_PLUGIN_DIR; + + // $this->cfg = json_decode( file get contents( $this->path.'project.json' ) ); + $this->cfg = json_decode( wp_remote_get( $this->path.'project.json' ) ); + + $this->server = $this->cfg->server; + $this->oldurl = $this->cfg->oldurl; + $this->theme = $this->cfg->theme; + $this->name = $this->cfg->name; + $this->subpath = $this->cfg->subpath; + } + + /** + * Write data in file + */ + private function output_file_content( $file_path, $output ) { + $fp = fopen( $file_path, 'w+' ); + fwrite( $fp, $output ); + fclose( $fp ); + } + + /** + * Get more options + */ + public function get_more_options(){ + $data = array( + 'header' => 'header-1', + 'footer' => 'footer-1', + 'page' => 'home-1' + ); + + if( isset($this->cfg->active) && $this->cfg->active ) { + $data = (array) $this->cfg->active; + } + + return array( + 'active' => $data, + 'oldurl' => $this->oldurl, + 'server' => $this->server, + "samples" => array( + 'post' => array(), + 'product' => array() + ) + ); + } + + /** + * Export theme options in customizer + */ + public function options(){ + return array(); + $thememods = get_option( 'theme_mods_' . $this->theme ); + $file = $this->path.'/sample/thememods.json'; + $ids = array(); + foreach( $thememods as $key => $mod ){ + + + if( is_string($mod) ){ + // $thememods[$key] = $this->_replace_uri( $mod, $this->oldurl, "SITE_URL_HERE"); + if( preg_match( "#jpg|png|gif|svg#", $mod) && $mod ){ + $ids[$key] = $this->find_image_id_byguid( $mod ); + } + } + if( isset($thememods['wpopal_customize_css']) ){ + unset( $thememods['wpopal_customize_css'] ); + } + + if( isset($thememods['osf_theme_custom_style']) ){ + unset( $thememods['osf_theme_custom_style'] ); + } + + if( isset($thememods['sidebars_widgets']) ){ + unset( $thememods['sidebars_widgets'] ); + } + + /// + if( $key == 'custom_logo' && $mod ){ + $ids[$key] = $mod; + } + + } + + + $attachments = array(); + + if( $ids ){ + foreach( $ids as $id ) { + $post = get_post( $id ); + if( $post ) { + $attachments[$post->ID] = array( + 'id' => $post->ID, + 'guid' => wp_get_attachment_url( $post->ID ), + 'post_parent' => $post->post_parent, + 'post_name' => $post->post_name, + 'post_date' => $post->post_date ); + } + } + } + + $options = array( + 'woocommerce_single_image_width' => '', + 'woocommerce_thumbnail_image_width' => '', + 'woocommerce_thumbnail_cropping' => '', + 'woocommerce_thumbnail_cropping_custom_height' => '', + 'woocommerce_thumbnail_cropping_custom_width' => '', + "woocommerce_shop_page_id" => '', + "woocommerce_cart_page_id" => '', + 'woocommerce_checkout_page_id' => '', + 'woocommerce_myaccount_page_id' => '', + 'woocommerce_terms_page_id' => '', + 'yith_wcwl_wishlist_page_id' => '' + + ); + + foreach( $options as $key => $value ){ + $value = get_option( $key ); + if( empty($value) ) { + unset( $options[$key] ); + continue; + } + $options[$key] = $value; + } + + $options['page_for_posts'] = 'Blog'; + if( function_exists( 'wp_get_custom_css_post' ) ) { + $options['wp_css'] = wp_get_custom_css(); + } + $data = array( 'thememods' => $thememods, 'attachments' => $attachments, "options" => $options ); + + + + // $this->output_file_content( $file, wp_json_encode($data ,JSON_PRETTY_PRINT ) ); + + return $data; + } + + /** + * Replace URI in xml + */ + public function _replace_uri( $str, $oldurl, $server ){ + $str = str_replace( str_replace("/","\/", $oldurl ), str_replace("/","\/", $server ), $str ); + $str = str_replace( $oldurl, $server, $str ); + $str = str_replace( str_replace("/","\\\\\\/", $oldurl ), str_replace("/","\\\\\\/", $server ), $str ); + return $str; + } + + /** + * Export config samples + */ + public function config_samples( $dev=0 ){ + + + $data['samples'] = array(); + + + $file = $this->path.$this->cfg->folder_source.'/samples.json'; + + + $niches = $this->cfg->niches; + + $single = $this->cfg->single; + + $key = 0; + $data['samples'][] = array( + "name" => isset($single->name)?$single->name:"Sample", + "key" => "niche-".$key, + "url" => isset($single->url)?$single->url:"", + "demo" => isset($single->demo)?$single->demo:"", + "preview" => $this->cfg->server_source.'/screenshot.png', + "sample" => $this->cfg->server_source.'/data.zip' + ); + + $this->output_file_content( $file, wp_json_encode($data ) ); + /// + //$file = $this->path.'/wp-content/themes/'.$this->cfg->theme.'/project.json'; + //$data = $this->cfg->themeinfo; + //$this->output_file_content( $file, json_encode($data , JSON_PRETTY_PRINT ) ); + } + + /** + * Export all pages + */ + public function pages(){ + + return array(); + $excludes = array(); + + global $wpdb; + + $post_type = 'page'; + /// items + + $where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s and {$wpdb->posts}.post_content LIKE '%opalestate_%'", $post_type ); + + + // grab a snapshot of post IDs, just in case it changes during the export + $post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE $where" ); + + $data = $this->export_json_ids( $post_ids, $excludes, $isattachement ); + + echo '
            ' . print_r( $data ,1 );die;
            +
            +			//$file = $this->path.'sample/pages.json'; 
            +			// $this->output_file_content( $file, wp_json_encode($data ) );
            +			return $data; 
            +
            +		}
            +
            +		/**
            +		 * Export all pages 
            +		 */
            +		public function data_posttypes(){
            +
            +			$excludes = array();
            +
            +			$data = $this->export_posttype( array(  
            +				'opalestate_agent', 
            +				'opalestate_agency', 
            +				'opalestate_agent_ft', 
            +				'opalestate_agency_ft', 
            +				'opalestate_rating_ft', 
            +				'opalestate_property'
            +			), $excludes );
            +
            +		//	$file = ABSPATH.'src/json/elementor.json'; 
            +		//	$this->output_file_content( $file, wp_json_encode($data ) );
            +
            +			return $data; 
            +
            +		}
            +
            +		/**
            +		 * get all attachments by post ids
            +		 */
            +		protected function get_attachment( $post_ids ) {
            +	        $attachments = array();
            +	        foreach ( $post_ids as $post_id) { 
            +	             
            +	            $value = get_post_meta($post_id, '_thumbnail_id', true);
            +	            if ( $value ) {
            +	                $attachments = array_merge( $attachments, array($value) );
            +	            }
            +	           
            +
            +	            $attachArgs  = array(
            +	                'post_parent'  => $post_id,
            +	                'post_type'    => 'attachment',
            +	                'numberposts'  => -1,
            +	                'post__not_in' => $attachments, //To skip duplicates
            +	            );
            +	            $attachList  = get_children($attachArgs, ARRAY_A);
            +	            $attachments = array_merge($attachments, array_keys($attachList));
            +	       	}
            +
            +			$ids = $this->get_images_posts( $post_ids );
            +			if( $ids ){
            +				$attachments = array_merge( $ids, $attachments );
            +			}
            +
            +	        return $attachments;
            +	    }
            +
            +	    /**
            +	     * Export data posts by post type with attachments
            +	     */
            +	    protected function export_posttype( $post_type, $excludes=array(), $isattachement=true ) {
            +
            +			global $wpdb;
            +	
            +			/// items 
            +			
            +			if( is_array($post_type) ){
            +				$tmp   = "'".implode( "','", $post_type )."'";
            +				$where = "{$wpdb->posts}.post_type IN( ".$tmp ." )";
            +			} else {
            +				$where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $post_type );
            +			}
            +
            +			// grab a snapshot of post IDs, just in case it changes during the export
            +			$post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE $where" );
            +
            +			return $this->export_json_ids( $post_ids, $excludes, $isattachement  );
            +
            +		}
            +
            +		public function aa(){
            +			global $wpdb;
            +			$postmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE  post_id = %d",  240) );
            +			
            +					$exls = array(
            +						'_edit_last',
            +						'_edit_lock',
            +						'_elementor_version',
            +						'_menu_item_type',
            +						'_menu_item_menu_item_parent',
            +						'_menu_item_object_id',
            +						'_menu_item_object',
            +						'_menu_item_target',
            +						'_menu_item_classes',
            +						'_menu_item_xfn',
            +						'_menu_item_url',
            +						'_elementor_css'
            +					);
            +
            +					$tmp = array();
            +					foreach( $postmeta as $key => $meta ){
            +						unset( $postmeta[$key]->post_id );
            +						unset( $postmeta[$key]->meta_id );
            +						foreach( $exls as $exl ){
            +							if( $meta->meta_key == $exl ){
            +								unset( $postmeta[$key] );
            +							}
            +						}
            +					}	
            +					foreach( $postmeta as $key => $meta ){
            +						$tmp[$meta->meta_key] = $meta->meta_value;
            +					}
            +		}
            +
            +		/**
            +		 * export json data by ids
            +		 */
            +		protected function export_json_ids( $post_ids , $excludes,  $isattachement ){
            +			global $wpdb;
            +
            +			$output = array();
            +
            +			$export = array();
            +
            +			if( $isattachement ){
            +				$ids = $this->get_attachment( $post_ids ); 
            +
            +
            +		 		if( $ids ){
            +
            +					$where = 'WHERE ID IN (' . join( ',', $ids ) . ')';
            +					$posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" );
            +
            +					$export['attachments'] = array();
            +					foreach( $posts as $post ) {
            +						$export['attachments'][$post->ID] = array(
            +							'id'	=> $post->ID,
            +						 'guid'=>  wp_get_attachment_url( $post->ID ), 
            +						 'post_parent' => $post->post_parent,
            +						  'post_name' => $post->post_name, 
            +						  'post_date' => $post->post_date  );
            +					}	
            +				}	
            +			}
            +				
            +			while ( $next_posts = array_splice( $post_ids, 0, 20 ) ) {
            +				
            +				$where = 'ID IN (' . join( ',', $next_posts ) . ')';
            +				$posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} WHERE post_status='publish' and  $where" );
            +
            +				// Begin Loop.
            +				foreach ( $posts as $post ) {
            +
            +					if( in_array($post->ID , $excludes) ){
            +						continue; 
            +					}
            +
            +					setup_postdata( $post );
            +					$data = array();
            +					if ( get_post_meta( $post->ID, '_elementor_edit_mode', true ) === 'builder' ) {
            +						$post->post_content = "";
            +					}
            +
            +					$post->guid =  $this->_replace_uri( $post->guid, $this->oldurl, "SITE_URL_HERE" );
            +
            +					$excludes = array(
            +						'guid', 
            +						'to_ping', 
            +						'pinged',
            +						'post_content_filtered',
            +						'post_mime_type',
            +						'comment_count',
            +						'filter',
            +						'post_modified',
            +						'post_modified_gmt'
            +					);
            +
            +					foreach( $excludes as $exl ){
            +						if( isset($post->$exl) ){
            +							unset( $post->$exl );
            +						}
            +					}
            +
            +					$data['post'] =  $post;
            +					// meta data
            +					$postmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE  post_id = %d", $post->ID ) );
            +
            +					$exls = array(
            +						'_edit_last',
            +						'_edit_lock',
            +						'_elementor_version',
            +						'_menu_item_type',
            +						'_menu_item_menu_item_parent',
            +						'_menu_item_object_id',
            +						'_menu_item_object',
            +						'_menu_item_target',
            +						'_menu_item_classes',
            +						'_menu_item_xfn',
            +						'_menu_item_url',
            +						'_elementor_css'
            +					);
            +
            +					$tmp = array();
            +					foreach( $postmeta as $key => $meta ){
            +						unset( $postmeta[$key]->post_id );
            +						unset( $postmeta[$key]->meta_id );
            +						foreach( $exls as $exl ){
            +							if( $meta->meta_key == $exl ){
            +								unset( $postmeta[$key] );
            +							}
            +						}
            +					}	
            +					foreach( $postmeta as $key => $meta ){
            +						$tmp[$meta->meta_key] = $meta->meta_value;
            +					}
            +
            +					$data['postmeta'] = $tmp; 
            +
            +					
            +
            +					if ( $post->post_type == 'attachment' ){
            +						$data['attachment_url'] = wp_get_attachment_url( $post->ID );
            +					}
            +
            +					
            +					$data['thumbnail_id'] = get_post_meta( $post->ID, '_thumbnail_id', true );
            +
            +                    // taxonomy
            +                    $taxonomies = get_object_taxonomies( $post->post_type );
            +
            +                    if ( !empty( $taxonomies ) ) {
            +
            +                        $data['taxonomy'] = array();
            +                        $terms = wp_get_object_terms( $post->ID, $taxonomies );
            +
            +                        foreach ( (array) $terms as $term ) {
            +
            +                            if( $term->taxonomy == 'nav_menu' ){
            +                                continue;
            +                            }
            +
            +                            $t = array(
            +                                $term->taxonomy => array (
            +                                    $term->slug	 => $term->name
            +                                )
            +                            );
            +                            $data['taxonomy'][] = $t;
            +                        }
            +                    }
            +
            +                    $output [] = $data;
            +				}
            +			}
            +	
            +			$export['posts'] = $output;
            +			return $export; 	
            +		}
            +
            +		/**
            +		 * find attachment post id by guid
            +		 */
            +		private function find_image_id_byguid( $image_url ) {
            +			global $wpdb;
            +			$attachment = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE guid LIKE '%".$image_url."%';" );
            +
            +			return isset($attachment[0])?$attachment[0]:0;
            +		}
            +
            +		/**
            +		 * find all images:svg,git,png,jpg  in data setting of elementor
            +		 */
            + 		private function get_images_posts( $ids ){
            + 			$mids = array();
            + 			$images = array();
            +			foreach( $ids as $id ){
            +				if ( get_post_meta( $id, '_elementor_edit_mode', true ) === 'builder' ) {
            +					$data = json_decode( get_post_meta( $id, '_elementor_data', true ), ARRAY_A );
            +					if( $data ){
            +						$string = "start".print_r( $data , true )."end";
            +						$pattern = '~(http.*\.)(jpe?g|png|svg|gif|[tg]iff?|svg)~i';
            +						$m = preg_match_all($pattern,$string,$matches);
            +						if( $matches[0] ){ 	 
            +							foreach( $matches[0] as $img ){
            +								$pattern = '#(/\d+/\d+/(.*))$#';
            +								$a = preg_match( $pattern , $img, $m );
            +								if( isset($m[1]) ){  	///echo '
            ' . print_r( $data, 1 );die;
            +									$_id = $this->find_image_id_byguid( $m[1] );
            +									if( $_id ) {
            +										$mids[$_id] = $_id;
            +									} else {
            +										$images[] = $img;
            +									}	
            +								}
            +							}
            +						}
            +					}
            +				}
            +			}
            +			echo '
             Missing Images:' . print_r( $images , 1 );  //die; 
            +			return $mids;
            + 		}
            +
            +
            + 		public function sample(){
            + 			$data = array();
            + 		
            + 			return $data; 
            + 		}
            + 		
            +
            + 		public function download_images( $attachments, $jcontent ){
            +			
            +			$folder = $this->path .'/'.$this->cfg->folder_source.'/images';  
            +
            +			if( is_dir($folder) ){
            +				$file = new Filesystem();
            +				$file->deleteDirectory( $folder );
            +			}
            + 
            +			if( !is_dir($folder) ){
            +				mkdir( $folder ); 
            +			}
            + 
            +	 		$url = $this->cfg->server_source.'/images/';
            +
            +	 		$replaces = array();
            +			foreach( $attachments  as $attachment ){
            +				$guid = str_replace( $this->server  , $this->oldurl, $attachment['guid'] ) ; 
            +				// $image = file get contents(  $guid );
            +				$image = wp_remote_get(  $guid );
            +				$name = basename( $attachment['guid'] );
            +				$path = $folder.'/'.$name;	
            +				file_put_contents( $path, $image );
            +
            +				$guid 	 = $attachment['guid'];
            +				$newurl  = $url.$name;
            +				$replaces[$guid] = $newurl;
            +			}
            +
            + 			foreach( $replaces as $key => $replace ){  
            + 				$jcontent = $this->_replace_uri( $jcontent, $key, $replace); 
            + 			}
            + 
            + 			return $jcontent;
            +		}	
            +
            +		/**
            +		 * export all sample data
            +		 */
            + 		public function source(){
            +
            + 			// $content = file get contents( $this->path.'/sample/data.json' );
            + 			$content = wp_remote_get( $this->path.'/sample/data.json' );
            +
            + 			$data = json_decode( $content, true );
            + 			
            + 			$file = new Filesystem();
            +
            + 			$content = $this->download_images(  $data['attachments'], $content ); 
            +
            + 			$file = $this->path.'/'.$this->cfg->folder_source.'/data.json';
            +		 	$this->output_file_content( $file,  $content );
            +
            +		 	$zip = new ZipArchive;
            +			if ($zip->open( $this->path.'/'.$this->cfg->folder_source .'/data.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
            +			    $zip->addFile( $file, 'data.json');
            +			    $zip->close();
            +			    echo 'ok';
            +			} else {
            +			    echo 'failed';
            +			}
            + 		}
            +
            +		/**
            +		 * export all sample data
            +		 */
            +		public function data(){
            +
            +			$this->fix_images_parents();
            +			$data = $this->pages();
            +
            +			$data = array_merge_recursive( 
            +				$data,
            +				$this->data_posttypes(),
            +				$this->options(), 
            +				$this->get_more_options(),
            +				$this->sample()			
            +			); 
            + 
            +
            +
            +			$data = apply_filters( 'opaltools_single_wp_cli_exporter', $data , $this->cfg  );
            +			
            +			$file = $this->path.'sample/data.json'; 
            + 			
            +
            + 			/// 
            + 			$attachments = array(); 
            + 			foreach (  $data['attachments'] as $key => $value ) {
            + 				$attachments[$value['id']] = $value; 
            + 			}
            +
            + 			$data['attachments'] = $attachments; 
            + 			
            + 			$content = $this->_replace_uri( json_encode($data , JSON_PRETTY_PRINT ), $this->oldurl, $this->server ); 
            + 			$content = str_replace( $this->cfg->theme, $this->cfg->domain, $content );
            +
            +			$this->output_file_content( $file, $content );
            +
            +			$this->config_samples();
            +			$this->source();
            +		}	
            +
            +		public function fix_images_parents(){
            +			global $wpdb;
            +
            +			$fixs = array(
            +				'product-',
            +				'bg-slider',
            +				'slide-',
            +				'bg-slide'
            +			);
            +
            +			foreach( $fixs  as $fix ) {  
            +				$wpdb->query( "UPDATE wp_posts SET post_parent=0 WHERE post_title LIKE '".$fix."%'" );
            +			}
            +		}
            +	}
            +
            +	WP_CLI::add_command( 'opalestate', new OpalEstate_Command );
            +?>
            diff --git a/inc/email/class-opalesate-approve.php b/inc/email/class-opalesate-approve.php
            new file mode 100755
            index 00000000..00d73846
            --- /dev/null
            +++ b/inc/email/class-opalesate-approve.php
            @@ -0,0 +1,110 @@
            +
            + * @copyright  Copyright (C) 2019 wpopal.com. All Rights Reserved.
            + * @license    GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
            + *
            + * @website  http://www.wpopal.com
            + * @support  http://www.wpopal.com/support/forum.html
            + */
            + 
            +if ( ! defined( 'ABSPATH' ) ) {
            +	exit; // Exit if accessed directly
            +}
            +
            +/**
            + * @class   OpalEstate_Send_Email_Notification
            + *
            + * @version 1.0
            + */
            +class OpalEstate_Send_Email_Approve extends OpalEstate_Abstract_Email_Template {
            + 
            +	/**
            +	 *  
            +	 */
            +	public function get_subject () {
            +		$propety_title = '' ;
            +		return sprintf( esc_html__( 'New Property Listing Submitted: {property_name}', 'opalestate-pro' ),  $propety_title );
            +	}
            +
            +	/**
            +	 * get collection of key and value base on tags which using to replace custom tags
            +	 */
            +	public  function set_pros(  $property_id  ){
            +	 	
            +	 	$property 	   = get_post( $property_id );
            +		$user    	   = get_userdata( $property->post_author ); 
            +		$email 		   = get_user_meta( $property->post_author, OPALESTATE_USER_PROFILE_PREFIX . 'email', true ); 
            + 		$email  	   = $email ? $email : $user->data->user_email;
            +
            +		$this->args = array(
            +			'receiver_email'	 => $email,
            +			'user_mail' 		 => $email,
            +			'user_name'			 => $user->display_name,
            +			'submitted_date'	 => $property->post_date,
            +			'property_name'	 	 => $property->post_title,
            +			'property_link'		 => get_permalink( $property_id ),
            +    		'current_time'		=>  date("F j, Y, g:i a"),
            +		); 
            +
            +		return $this->args ;
            +	}
            +
            +	/**
            +	 *  
            +	 */
            +	public function get_content_template() {
            + 		return opalestate_load_template_path( 'emails/request-reviewing' );
            +	}	
            +
            +	/**
            +	 *
            +	 */
            +	public static function get_default_template() {
            +		
            +		return trim(preg_replace('/\t+/', '', "Hi {user_name},
            +
            + Thank you so much for submitting to {site_name}. +
            + We have completed the auditing process for your property '{property_name}' and are pleased to inform you that your submission has been accepted. +
            +
            + Thanks again for your contribution +
            +  
            +
            + This message was sent by {site_link} on {current_time}.")); + } + + /** + * + */ + public function to_email () { + return $this->args ['receiver_email']; + } + + /** + * + */ + public function cc_email () { + return $this->args ['sender_email']; + } + + /** + * + */ + public function get_body() { + + $post = get_post( $this->args['post_id'] ); + + $this->args['email'] = $this->args['receiver_email']; + $this->args['property_link'] = $post->post_title; + + return parent::get_body(); + } +} +?> \ No newline at end of file diff --git a/inc/email/class-opalestate-abs-email-template.php b/inc/email/class-opalestate-abs-email-template.php new file mode 100755 index 00000000..8f7d7c6c --- /dev/null +++ b/inc/email/class-opalestate-abs-email-template.php @@ -0,0 +1,125 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * @class OpalEstate_Send_Email_Notification + * + * @version 1.0 + */ +class OpalEstate_Abstract_Email_Template { + + public $args = array(); + + /** + * Get the unique email notification key. + * + * @return string + */ + public function get_key() { + return 'opalestate-notification'; + } + + /** + * Get the friendly name for this email notification. + * + * @return string + */ + public function get_title() { + return esc_html__( 'Admin Notice of Expiring Job Listings', 'opalestate-pro' ); + } + + /** + * Get the description for this email notification. + * + * @type abstract + * @return string + */ + public function get_description() { + return esc_html__( 'Send notices to the site administrator before a job listing expires.', 'opalestate-pro' ); + } + + public function to_email () { + + } + + public function get_content_template() { + + } + + + public function set_args ( $args ) { + return $this->args = $args; + } + + public function replace_tags ( $template ) { + + $args = $this->args; + $default = array( + 'receiver_name' => '', + 'name' => '', + 'receiver_email' => '', + 'property_link' => '', + 'message' => '', + 'site_name' => bloginfo(), + 'site_link' => get_home_url(), + 'current_time' => date("F j, Y, g:i a"), + 'phone' => '' + ); + + $args = array_merge( $default, $args ); + + $tags = array(); + $values = array() ; + + foreach ( $args as $key => $value ) { + $tags[] = "{".$key."}"; + $values[] = $value; + } + + $message = str_replace( $tags, $values, $template ); + + return $message; + } + + public function get_subject () { + + } + + public function from_email() { + return opalestate_get_option( 'from_email' , get_bloginfo( 'admin_email' ) ); + } + + public function from_name() { + return opalestate_get_option('from_name', get_bloginfo( 'name' ) ); + } + + public function get_cc() { + + } + + + public function get_body(){ + + $template = $this->get_content_template(); + return $this->replace_tags( $template ); + } + + public function get_plain_text_body () { + + } +} diff --git a/inc/email/class-opalestate-email-notifycation.php b/inc/email/class-opalestate-email-notifycation.php new file mode 100755 index 00000000..220a7d7d --- /dev/null +++ b/inc/email/class-opalestate-email-notifycation.php @@ -0,0 +1,74 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * @class OpalEstate_Send_Email_Notification + * + * @version 1.0 + */ +class OpalEstate_Send_Email_Notification extends OpalEstate_Abstract_Email_Template { + + public $type = ''; + + /** + * Send Email + */ + public function get_subject () { + switch ( $this->type ) { + case 'enquiry': + $subject = html_entity_decode( esc_html__('You got a message enquiry', 'opalestate-pro') ); + break; + + default: + $subject = html_entity_decode( esc_html__('You got a message contact', 'opalestate-pro') ); + break; + } + + return $subject; + } + + /** + * Send Email + */ + public function get_content_template() { + + switch ( $this->type ) { + case 'enquiry': + return opalestate_load_template_path( 'emails/enquiry' ); + break; + + default: + return opalestate_load_template_path( 'emails/contact' ); + break; + } + } + + public function to_email () { + return $this->args ['receiver_email']; + } + + public function cc_email () { + return $this->args ['sender_email']; + } + + public function get_body() { + $this->args['email'] = $this->args['receiver_email']; + return parent::get_body(); + } +} +?> \ No newline at end of file diff --git a/inc/email/class-opalestate-new-submitted.php b/inc/email/class-opalestate-new-submitted.php new file mode 100755 index 00000000..76cf91b6 --- /dev/null +++ b/inc/email/class-opalestate-new-submitted.php @@ -0,0 +1,110 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * @class OpalEstate_Send_Email_Notification + * + * @version 1.0 + */ +class OpalEstate_Send_Email_New_Submitted extends OpalEstate_Abstract_Email_Template { + + /** + * Send Email + */ + public function get_subject () { + $propety_title = '' ; + $d = esc_html__( 'New Property Listing Submitted: {property_name}', 'opalestate-pro' ); + $s = opalestate_get_option( 'newproperty_email_subject' , $d ); + return $s; + } + + /** + * get collection of key and value base on tags which using to replace custom tags + */ + public function set_pros( $property_id, $user_id ){ + + $property = get_post( $property_id ); + $user = get_userdata( $property->post_author ); + $email = get_user_meta( $property->post_author, OPALESTATE_USER_PROFILE_PREFIX . 'email', true ); + $email = $email ? $email : $user->data->user_email; + + $this->args = array( + 'receiver_email' => $email, + 'user_mail' => $email, + 'user_name' => $user->display_name, + 'submitted_date' => $property->post_date, + 'property_name' => $property->post_title, + 'property_link' => get_permalink( $property_id ), + 'current_time' => date("F j, Y, g:i a"), + ); + + return $this->args ; + } + + + /** + * Send Email + */ + public function get_content_template() { + + $body = opalestate_get_option( 'newproperty_email_body', self::newproperty_email_body() ); + + return $body; + } + + /** + * Send Email + */ + public static function get_default_template() { + + return trim(preg_replace('/\t+/', '',' + Hi {user_name}, +
            + Thanks you so much for submitting {property_name} at {site_name}:
            + Give us a few moments to make sure that we are got space for you. You will receive another email from us soon. + If this request was made outside of our normal working hours, we may not be able to confirm it until we are open again. +
            + You may review your property at any time by logging in to your client area. +
            + This message was sent by {site_link} on {current_time}.' + ) ); + } + + /** + * Send Email + */ + public function to_email () { + return $this->args ['receiver_email']; + } + + /** + * Send Email + */ + public function cc_email () { + return $this->args ['sender_email']; + } + + /** + * Send Email + */ + public function get_body() { + + return parent::get_body(); + } +} +?> \ No newline at end of file diff --git a/inc/email/class-opalestate-request-viewing.php b/inc/email/class-opalestate-request-viewing.php new file mode 100755 index 00000000..217163a3 --- /dev/null +++ b/inc/email/class-opalestate-request-viewing.php @@ -0,0 +1,70 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * @class OpalEstate_Send_Email_Notification + * + * @version 1.0 + */ +class OpalEstate_Send_Email_Request_Reviewing extends OpalEstate_Abstract_Email_Template { + + /** + * Send Email + */ + public function get_subject () { + $propety_title = '' ; + return sprintf( esc_html__( 'You have a message request reviewing: %s at', 'opalestate-pro' ), $propety_title ); + } + + /** + * Send Email + */ + public function get_content_template() { + return opalestate_load_template_path( 'emails/request-reviewing' ); + } + + /** + * Send Email + */ + public function to_email () { + return $this->args ['receiver_email']; + } + + /** + * Send Email + */ + public function cc_email () { + return $this->args ['sender_email']; + } + + /** + * Send Email + */ + public function get_body() { + + $post = get_post( $this->args['post_id'] ); + + $this->args['email'] = $this->args['receiver_email']; + $this->args['property_link'] = get_permalink( $post->ID ); + $this->args['property_name'] = $post->post_title; + + + return parent::get_body(); + } +} +?> \ No newline at end of file diff --git a/inc/function-search-fields.php b/inc/function-search-fields.php new file mode 100755 index 00000000..5201a5c5 --- /dev/null +++ b/inc/function-search-fields.php @@ -0,0 +1,129 @@ + + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * Render field template. + * + * @param string $field Field. + * @param string $label Label. + * @param string $type Type. + */ +function opalestate_property_render_field_template( $field, $label, $type = 'select' ) { + $qvalue = isset( $_GET['info'][ $field ] ) ? sanitize_text_field( $_GET['info'][ $field ] ) : ''; + $template = ''; + $template = apply_filters( 'opalestate_property_render_search_field_template', $field, $label ); + $template = apply_filters( 'opalestate_property_' . $field . '_field_template', $template ); + + if ( $template == $field ) { + $template = ''; + } + + if ( empty( $template ) ) { + switch ( $type ) { + case 'input': ?> + +
            + + +
            + + +
            +
            + + ' . esc_html( $label ) . ''; + + $template .= ''; + $template = sprintf( $template, $field, $label ); + + break; + } + } + + echo $template; // WPCS: XSS OK. +} + +/** + * Render area size field. + */ +function opalestate_property_areasize_field_template( $template = '' ) { + $search_min = isset( $_GET['min_area'] ) ? sanitize_text_field( $_GET['min_area'] ) : opalestate_options( 'search_min_area', 0 ); + $search_max = isset( $_GET['max_area'] ) ? sanitize_text_field( $_GET['max_area'] ) : opalestate_options( 'search_max_area', 1000 ); + + $data = [ + 'id' => 'area', + 'unit' => opalestate_options( 'measurement_unit', 'sq ft' ) . ' ', + 'ranger_min' => opalestate_options( 'search_min_area', 0 ), + 'ranger_max' => opalestate_options( 'search_max_area', 1000 ), + 'input_min' => $search_min, + 'input_max' => $search_max, + ]; + + opalesate_property_slide_ranger_template( esc_html__( 'Area', 'opalestate-pro' ), $data ); + + return; +} + +add_filter( "opalestate_property_areasize_field_template", 'opalestate_property_areasize_field_template' ); + +/** + * Render slider ranger template. + * + * @param $label + * @param $data + */ +function opalesate_property_slide_ranger_template( $label, $data ) { + $default = [ + 'id' => 'price', + 'unit' => '', + 'decimals' => 0, + 'ranger_min' => 0, + 'ranger_max' => 1000, + 'input_min' => 0, + 'input_max' => 1000, + 'unit_position' => 'postfix', + 'mode' => 2, + 'start' => '', + ]; + + $data = array_merge( $default, $data ); + + extract( $data ); + ?> + +
            + ' : ''; ?> + + + +
            + + + + + + + +
            + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Array2XML { + + private static $xml = null; + private static $encoding = 'UTF-8'; + + /** + * Initialize the root XML node [optional] + * @param $version + * @param $encoding + * @param $format_output + */ + public static function init($version = '1.0', $encoding = 'UTF-8', $format_output = true) { + self::$xml = new DomDocument($version, $encoding); + self::$xml->formatOutput = $format_output; + self::$encoding = $encoding; + } + + /** + * Convert an Array to XML + * @param string $node_name - name of the root node to be converted + * @param array $arr - aray to be converterd + * @return DomDocument + */ + public static function &createXML($node_name, $arr=array()) { + $xml = self::getXMLRoot(); + $xml->appendChild(self::convert($node_name, $arr)); + + self::$xml = null; // clear the xml node in the class for 2nd time use. + return $xml; + } + + /** + * Convert an Array to XML + * @param string $node_name - name of the root node to be converted + * @param array $arr - aray to be converterd + * @return DOMNode + */ + private static function &convert($node_name, $arr=array()) { + + //print_arr($node_name); + $xml = self::getXMLRoot(); + $node = $xml->createElement($node_name); + + if(is_array($arr)){ + // get the attributes first.; + if(isset($arr['@attributes'])) { + foreach($arr['@attributes'] as $key => $value) { + if(!self::isValidTagName($key)) { + throw new Exception('[Array2XML] Illegal character in attribute name. attribute: '.$key.' in node: '.$node_name); + } + $node->setAttribute($key, self::bool2str($value)); + } + unset($arr['@attributes']); //remove the key from the array once done. + } + + // check if it has a value stored in @value, if yes store the value and return + // else check if its directly stored as string + if(isset($arr['@value'])) { + $node->appendChild($xml->createTextNode(self::bool2str($arr['@value']))); + unset($arr['@value']); //remove the key from the array once done. + //return from recursion, as a note with value cannot have child nodes. + return $node; + } else if(isset($arr['@cdata'])) { + $node->appendChild($xml->createCDATASection(self::bool2str($arr['@cdata']))); + unset($arr['@cdata']); //remove the key from the array once done. + //return from recursion, as a note with cdata cannot have child nodes. + return $node; + } + } + + //create subnodes using recursion + if(is_array($arr)){ + // recurse to get the node for that key + foreach($arr as $key=>$value){ + if(!self::isValidTagName($key)) { + throw new Exception('[Array2XML] Illegal character in tag name. tag: '.$key.' in node: '.$node_name); + } + if(is_array($value) && is_numeric(key($value))) { + // MORE THAN ONE NODE OF ITS KIND; + // if the new array is numeric index, means it is array of nodes of the same kind + // it should follow the parent key name + foreach($value as $k=>$v){ + $node->appendChild(self::convert($key, $v)); + } + } else { + // ONLY ONE NODE OF ITS KIND + $node->appendChild(self::convert($key, $value)); + } + unset($arr[$key]); //remove the key from the array once done. + } + } + + // after we are done with all the keys in the array (if it is one) + // we check if it has any text value, if yes, append it. + if(!is_array($arr)) { + $node->appendChild($xml->createTextNode(self::bool2str($arr))); + } + + return $node; + } + + /* + * Get the root XML node, if there isn't one, create it. + */ + private static function getXMLRoot(){ + if(empty(self::$xml)) { + self::init(); + } + return self::$xml; + } + + /* + * Get string representation of boolean value + */ + private static function bool2str($v){ + //convert boolean to text value. + $v = $v === true ? 'true' : $v; + $v = $v === false ? 'false' : $v; + return $v; + } + + /* + * Check if the tag name or attribute name contains illegal characters + * Ref: http://www.w3.org/TR/xml/#sec-common-syn + */ + private static function isValidTagName($tag){ + $pattern = '/^[a-z_]+[a-z0-9\:\-\.\_]*[^:]*$/i'; + return preg_match($pattern, $tag, $matches) && $matches[0] == $tag; + } +} +?> diff --git a/inc/libraries/wp-session.php b/inc/libraries/wp-session.php new file mode 100755 index 00000000..692b8c16 --- /dev/null +++ b/inc/libraries/wp-session.php @@ -0,0 +1,178 @@ +cache_expiration(); +} + +/** + * Alias of wp_session_write_close() + */ +function wp_session_commit() { + wp_session_write_close(); +} + +/** + * Load a JSON-encoded string into the current session. + * + * @param string $data + */ +function wp_session_decode( $data ) { + $wp_session = WP_Session::get_instance(); + + return $wp_session->json_in( $data ); +} + +/** + * Encode the current session's data as a JSON string. + * + * @return string + */ +function wp_session_encode() { + $wp_session = WP_Session::get_instance(); + + return $wp_session->json_out(); +} + +/** + * Regenerate the session ID. + * + * @param bool $delete_old_session + * + * @return bool + */ +function wp_session_regenerate_id( $delete_old_session = false ) { + $wp_session = WP_Session::get_instance(); + + $wp_session->regenerate_id( $delete_old_session ); + + return true; +} + +/** + * Start new or resume existing session. + * + * Resumes an existing session based on a value sent by the _wp_session cookie. + * + * @return bool + */ +function wp_session_start() { + $wp_session = WP_Session::get_instance(); + do_action( 'wp_session_start' ); + + return $wp_session->session_started(); +} +add_action( 'plugins_loaded', 'wp_session_start' ); + +/** + * Return the current session status. + * + * @return int + */ +function wp_session_status() { + $wp_session = WP_Session::get_instance(); + + if ( $wp_session->session_started() ) { + return PHP_SESSION_ACTIVE; + } + + return PHP_SESSION_NONE; +} + +/** + * Unset all session variables. + */ +function wp_session_unset() { + $wp_session = WP_Session::get_instance(); + + $wp_session->reset(); +} + +/** + * Write session data and end session + */ +function wp_session_write_close() { + $wp_session = WP_Session::get_instance(); + + $wp_session->write_data(); + do_action( 'wp_session_commit' ); +} +add_action( 'shutdown', 'wp_session_write_close' ); + +/** + * Clean up expired sessions by removing data and their expiration entries from + * the WordPress options table. + * + * This method should never be called directly and should instead be triggered as part + * of a scheduled task or cron job. + */ +function wp_session_cleanup() { + global $wpdb; + + if ( defined( 'WP_SETUP_CONFIG' ) ) { + return; + } + + if ( ! defined( 'WP_INSTALLING' ) ) { + $expiration_keys = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE option_name LIKE '_wp_session_expires_%'" ); + + $now = current_time( 'timestamp' ); + $expired_sessions = array(); + + foreach( $expiration_keys as $expiration ) { + + // If the session has expired + if ( $now > intval( $expiration->option_value ) ) { + + // Get the session ID by parsing the option_name + $session_id = substr( $expiration->option_name, 20 ); + + if( (int) -1 === (int) $session_id || ! preg_match( '/^[a-f0-9]{32}$/', $session_id ) ) { + continue; + } + + $expired_sessions[] = $expiration->option_name; + $expired_sessions[] = esc_sql( "_wp_session_$session_id" ); + } + } + + // Delete all expired sessions in a single query + if ( ! empty( $expired_sessions ) ) { + $option_names = implode( "','", $expired_sessions ); + $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name IN ('$option_names')" ); + } + } + + // Allow other plugins to hook in to the garbage collection process. + do_action( 'wp_session_cleanup' ); +} +add_action( 'wp_session_garbage_collection', 'wp_session_cleanup' ); + +/** + * Register the garbage collector as a twice daily event. + */ +function wp_session_register_garbage_collection() { + if ( ! wp_next_scheduled( 'wp_session_garbage_collection' ) ) { + wp_schedule_event( current_time( 'timestamp' ), 'twicedaily', 'wp_session_garbage_collection' ); + } +} +add_action( 'wp', 'wp_session_register_garbage_collection' ); diff --git a/inc/libraries/wp_session/class-wp-session.php b/inc/libraries/wp_session/class-wp-session.php new file mode 100755 index 00000000..66e20023 --- /dev/null +++ b/inc/libraries/wp_session/class-wp-session.php @@ -0,0 +1,341 @@ +session_id = stripslashes( $_COOKIE[WP_SESSION_COOKIE] ); + } else { + $this->session_id = $this->generate_id(); + } + + $this->expires = time() + intval( apply_filters( 'wp_session_expiration', 24 * 60 ) ); + + $this->read_data(); + + setcookie( WP_SESSION_COOKIE, $this->session_id, $this->expires, COOKIEPATH, COOKIE_DOMAIN ); + } + + /** + * Generate a cryptographically strong unique ID for the session token. + * + * @return string + */ + private function generate_id() { + require_once ABSPATH . 'wp-includes/class-phpass.php'; + $hasher = new PasswordHash( 8, false ); + + return md5( $hasher->get_random_bytes( 32 ) ); + } + + /** + * Read data from a transient for the current session. + * + * Automatically resets the expiration time for the session transient to some time in the future. + * + * @return array + */ + private function read_data() { + $this->touch_session(); + $this->container = get_option( "_wp_session_{$this->session_id}", array() ); + return $this->container; + } + + /** + * Write the data from the current session to the data storage system. + */ + public function write_data() { + $session_list = get_option( '_wp_session_list', array() ); + + $this->touch_session(); + + update_option( "_wp_session_{$this->session_id}", $this->container ); + } + + private function touch_session() { + $session_list = get_option( '_wp_session_list', array() ); + + $session_list[ $this->session_id ] = $this->expires; + + foreach( $session_list as $id => $expires ) { + if ( time() > $this->expires ) { + delete_option( "_wp_session_{$id}" ); + unset( $session_list[$id] ); + } + } + + update_option( '_wp_session_list', $session_list ); + } + + /** + * Output the current container contents as a JSON-encoded string. + * + * @return string + */ + public function json_out() { + return json_encode( $this->container ); + } + + /** + * Decodes a JSON string and, if the object is an array, overwrites the session container with its contents. + * + * @param string $data + * + * @return bool + */ + public function json_in( $data ) { + $array = json_decode( $data ); + + if ( is_array( $array ) ) { + $this->container = $array; + return true; + } + + return false; + } + + /** + * Regenerate the current session's ID. + * + * @param bool $delete_old Flag whether or not to delete the old session data from the server. + */ + public function regenerate_id( $delete_old = false ) { + if ( $delete_old ) { + delete_option( "_wp_session_{$this->session_id}" ); + + $session_list = get_option( '_wp_session_list', array() ); + unset ($session_list[ $this->session_id ] ); + update_option( '_wp_session_list', $session_list ); + } + + $this->session_id = $this->generate_id(); + + setcookie( WP_SESSION_COOKIE, $this->session_id, time() + $this->expires, COOKIEPATH, COOKIE_DOMAIN ); + } + + /** + * Check if a session has been initialized. + * + * @return bool + */ + public function session_started() { + return !!self::$instance; + } + + /** + * Return the read-only cache expiration value. + * + * @return int + */ + public function cache_expiration() { + return $this->expires; + } + + /** + * Flushes all session variables. + */ + public function reset() { + $this->container = array(); + } + + /*****************************************************************/ + /* ArrayAccess Implementation */ + /*****************************************************************/ + + /** + * Whether a offset exists + * + * @link http://php.net/manual/en/arrayaccess.offsetexists.php + * + * @param mixed $offset An offset to check for. + * + * @return boolean true on success or false on failure. + */ + public function offsetExists( $offset ) { + return isset( $this->container[ $offset ]) ; + } + + /** + * Offset to retrieve + * + * @link http://php.net/manual/en/arrayaccess.offsetget.php + * + * @param mixed $offset The offset to retrieve. + * + * @return mixed Can return all value types. + */ + public function offsetGet( $offset ) { + return isset( $this->container[ $offset ] ) ? $this->container[ $offset ] : null; + } + + /** + * Offset to set + * + * @link http://php.net/manual/en/arrayaccess.offsetset.php + * + * @param mixed $offset The offset to assign the value to. + * @param mixed $value The value to set. + * + * @return void + */ + public function offsetSet( $offset, $value ) { + if ( is_null( $offset ) ) { + $this->container[] = $value; + } else { + $this->container[ $offset ] = $value; + } + } + + /** + * Offset to unset + * + * @link http://php.net/manual/en/arrayaccess.offsetunset.php + * + * @param mixed $offset The offset to unset. + * + * @return void + */ + public function offsetUnset( $offset ) { + unset( $this->container[ $offset ] ); + } + + /*****************************************************************/ + /* Iterator Implementation */ + /*****************************************************************/ + + /** + * Current position of the array. + * + * @link http://php.net/manual/en/iterator.current.php + * + * @return mixed + */ + public function current() { + return current( $this->container ); + } + + /** + * Key of the current element. + * + * @link http://php.net/manual/en/iterator.key.php + * + * @return mixed + */ + public function key() { + return key( $this->container ); + } + + /** + * Move the internal point of the container array to the next item + * + * @link http://php.net/manual/en/iterator.next.php + * + * @return void + */ + public function next() { + next( $this->container ); + } + + /** + * Rewind the internal point of the container array. + * + * @link http://php.net/manual/en/iterator.rewind.php + * + * @return void + */ + public function rewind() { + reset( $this->container ); + } + + /** + * Is the current key valid? + * + * @link http://php.net/manual/en/iterator.rewind.php + * + * @return bool + */ + public function valid() { + return $this->offsetExists( $this->key() ); + } + + /*****************************************************************/ + /* Countable Implementation */ + /*****************************************************************/ + + /** + * Get the count of elements in the container array. + * + * @link http://php.net/manual/en/countable.count.php + * + * @return int + */ + public function count() { + return count( $this->container ); + } +} \ No newline at end of file diff --git a/inc/libraries/wp_session/wp-session.php b/inc/libraries/wp_session/wp-session.php new file mode 100755 index 00000000..13910e7d --- /dev/null +++ b/inc/libraries/wp_session/wp-session.php @@ -0,0 +1,118 @@ +cache_expiration(); +} + +/** + * Alias of wp_session_write_close() + */ +function wp_session_commit() { + wp_session_write_close(); +} + +/** + * Load a JSON-encoded string into the current session. + * + * @param string $data + */ +function wp_session_decode( $data ) { + $wp_session = WP_Session::get_instance(); + + return $wp_session->json_in( $data ); +} + +/** + * Encode the current session's data as a JSON string. + * + * @return string + */ +function wp_session_encode() { + $wp_session = WP_Session::get_instance(); + + return $wp_session->json_out(); +} + +/** + * Regenerate the session ID. + * + * @param bool $delete_old_session + * + * @return bool + */ +function wp_session_regenerate_id( $delete_old_session = false ) { + $wp_session = WP_Session::get_instance(); + + $wp_session->regenerate_id( $delete_old_session ); + + return true; +} + +/** + * Start new or resume existing session. + * + * Resumes an existing session based on a value sent by the _wp_session cookie. + * + * @return bool + */ +function wp_session_start() { + $wp_session = WP_Session::get_instance(); + + $wp_session = WP_Session::get_instance(); + do_action( 'wp_session_start' ); + + return $wp_session->session_started(); +} +add_action( 'plugins_loaded', 'wp_session_start' ); + +/** + * Return the current session status. + * + * @return int + */ +function wp_session_status() { + $wp_session = WP_Session::get_instance(); + + if ( $wp_session->session_started() ) { + return PHP_SESSION_ACTIVE; + } + + return PHP_SESSION_NONE; +} + +/** + * Unset all session variables. + */ +function wp_session_unset() { + $wp_session = WP_Session::get_instance(); + + $wp_session->reset(); +} + +/** + * Write session data and end session + */ +function wp_session_write_close() { + $wp_session = WP_Session::get_instance(); + + $wp_session->write_data(); + do_action( 'wp_session_commit' ); +} +add_action( 'shutdown', 'wp_session_write_close' ); \ No newline at end of file diff --git a/inc/message/class-opalestate-message.php b/inc/message/class-opalestate-message.php new file mode 100755 index 00000000..ad5fb2e3 --- /dev/null +++ b/inc/message/class-opalestate-message.php @@ -0,0 +1,757 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * OpalEstate_User_Message Class + * + * @since 1.0.0 + */ +class OpalEstate_User_Message { + + /** + * + */ + protected $user_id = 0; + + protected $is_log; + + /** + * + */ + public static function get_instance() { + static $_instance; + if ( ! $_instance ) { + $_instance = new self(); + } + + return $_instance; + } + + public function get_types() { + + return [ + 'request_view' => '', + 'contact' => '', + 'send_equiry' => '', + ]; + } + + /** + * + */ + public function __construct() { + + add_action( 'init', [ $this, 'init' ] ); + + /// process ajax send message + add_action( 'wp_ajax_send_email_contact', [ $this, 'process_send_email' ] ); + add_action( 'wp_ajax_nopriv_send_email_contact', [ $this, 'process_send_email' ] ); + + // process ajax + add_action( 'wp_ajax_send_email_contact_reply', [ $this, 'process_send_reply_email' ] ); + add_action( 'wp_ajax_nopriv_send_email_contact_reply', [ $this, 'process_send_reply_email' ] ); + + add_filter( 'opalestate_user_content_messages_page', [ $this, 'render_user_content_page' ] ); + } + + /** + * Set values when user logined in system + */ + public function init() { + + global $current_user; + wp_get_current_user(); + + $this->user_id = $current_user->ID; + $this->is_log = opalestate_get_option( 'message_log' ); + } + + /** + * Set values when user logined in system + */ + public function send_equiry( $post, $member ) { + + $default = [ + 'send_equiry_name' => '', + 'action' => '', + 'post_id' => '', + 'sender_id' => '', + 'email' => '', + 'phone' => '', + 'message' => '', + 'message_action' => '', + ]; + $post = array_merge( $default, $post ); + + + $post['property_link'] = (int) $post['post_id'] ? get_permalink( $post['post_id'] ) : get_home_url(); + $post['receive_name'] = $member['name']; + $subject = html_entity_decode( esc_html__( 'You got a message', 'opalestate-pro' ) ); + $post['receiver_name'] = $member['receiver_name']; + + $output = [ + 'subject' => $subject, + 'name' => $member['name'], + 'receiver_email' => $member['receiver_email'], + 'receiver_id' => $member['receiver_id'], + 'sender_id' => get_current_user_id(), + 'sender_email' => $post['email'], + 'phone' => $post['phone'], + 'message' => $post['message'], + 'post_id' => $post['post_id'], + 'type' => 'send_enquiry', + ]; + + if ( $output['sender_id'] == $output['receiver_id'] ) { + // return false; + } + + return $output; + } + + /** + * Set values when user logined in system + */ + public function send_contact( $post ) { + + $member = get_post( $post['post_id'] ); + + if ( $member->post_type == 'opalestate_agent' ) { + $receiver_id = get_post_meta( $member->ID, OPALESTATE_AGENT_PREFIX . 'user_id', true ); + $email = get_post_meta( $member->ID, OPALESTATE_AGENT_PREFIX . 'email', true ); + } else { + $receiver_id = get_post_meta( $member->ID, OPALESTATE_AGENCY_PREFIX . 'user_id', true ); + $email = get_post_meta( $member->ID, OPALESTATE_AGENCY_PREFIX . 'email', true ); + } + + $member = [ + 'receiver_email' => $email, + 'receiver_name' => $member->post_title, + 'receiver_id' => $receiver_id, + ]; + + $default = [ + 'send_equiry_name' => '', + 'action' => '', + 'post_id' => '', + 'sender_id' => '', + 'email' => '', + 'phone' => '', + 'message' => '', + 'message_action' => '', + ]; + $post = array_merge( $default, $post ); + + $post['link'] = (int) $post['post_id'] ? get_permalink( $post['post_id'] ) : get_home_url(); + $post['receive_name'] = $member['name']; + + $subject = html_entity_decode( esc_html__( 'You got a message contact', 'opalestate-pro' ) ); + + $post['receiver_name'] = $member['receiver_name']; + + + $output = [ + 'subject' => $subject, + 'name' => $member['name'], + 'receiver_email' => $member['receiver_email'], + 'receiver_id' => $member['receiver_id'], + 'sender_id' => get_current_user_id(), + 'sender_email' => $post['email'], + 'phone' => $post['phone'], + 'message' => $post['message'], + 'post_id' => $post['post_id'], + 'type' => 'send_contact', + ]; + + if ( $output['sender_id'] == $output['receiver_id'] ) { + // return false; + } + + return $output; + + } + + /** + * Set values when user logined in system + */ + public function get_member_email_data( $post_id ) { + + return opalestate_get_member_email_data( $post_id ); + } + + /** + * Set values when user logined in system + */ + public function process_send_reply_email() { + + if ( isset( $_POST ) && $this->is_log ) { + $id = 2; + $message = $this->get_message( intval( $_POST['message_id'] ) ); + + + if ( $message ) { + + $data = [ + 'message_id' => $message->id, + 'sender_id' => $this->user_id, + 'receiver_id' => $message->sender_id, + 'message' => sanitize_text_field( $_POST['message'] ), + 'created' => current_time( 'mysql', 1 ), + ]; + + $id = $this->insert_reply( $data ); + + $reply = $this->get_reply( $id ); + + $data['data'] = [ + 'created' => $reply->created, + 'message' => $reply->message, + 'avatar' => OpalEstate_User::get_author_picture( $message->sender_id ), + ]; + // send email for user to inbox email. + do_action( 'opalestate_send_email_notifycation', $data ); + $return = [ + 'status' => true, + 'msg' => esc_html__( 'Email Sent successful', 'opalestate-pro' ), + 'heading' => esc_html__( 'Sending Message', 'opalestate-pro' ), + ]; + } + } else { + $return = [ 'status' => false, 'msg' => esc_html__( 'Unable to send a message.', 'opalestate-pro' ), 'heading' => esc_html__( 'Sending Message', 'opalestate-pro' ) ]; + } + + + echo json_encode( $return ); + die(); + + } + + /** + * + */ + public function process_send_email() { + + do_action( 'opalestate_process_send_email_before' ); + + if ( isset( $_POST['type'] ) && $_POST['type'] ) { + + $content = []; + + switch ( trim( $_POST['type'] ) ) { + case 'send_equiry': + if ( wp_verify_nonce( $_POST['message_action'], 'send-enquiry-form' ) ) { + + $member = $this->get_member_email_data( (int) $_POST['post_id'] ); + $content = $this->send_equiry( $_POST, $member ); + } + break; + case 'send_contact': + if ( wp_verify_nonce( $_POST['message_action'], 'send-contact-form' ) ) { + $content = $this->send_contact( $_POST ); + } + break; + default: + break; + } + + if ( $content ) { + + + // only save in db for user only + if ( $content['receiver_id'] > 0 && $this->is_log ) { + $this->insert( $content ); + } + + // send email for user to inbox email. + do_action( 'opalestate_send_email_notifycation', $content ); + } + } + + $return = [ 'status' => false, 'msg' => esc_html__( 'Unable to send a message.', 'opalestate-pro' ) ]; + + echo json_encode( $return ); + die(); + } + + /** + * + */ + public function insert( $data ) { + + global $wpdb; + + $args = [ + 'subject' => '', + 'message' => '', + 'sender_email' => '', + 'phone' => '', + 'sender_id' => '', + 'created' => current_time( 'mysql', 1 ), + 'receiver_id' => '', + 'post_id' => '', + 'type' => '', + ]; + + foreach ( $args as $key => $value ) { + if ( isset( $data[ $key ] ) ) { + $args[ $key ] = $data[ $key ]; + } + } + + $id = $wpdb->insert( $wpdb->prefix . 'opalestate_message', $args ); + + return $wpdb->insert_id; + } + + public function insert_reply( $data ) { + + global $wpdb; + + $args = [ + 'message_id' => '', + 'message' => '', + 'sender_id' => '', + 'created' => current_time( 'mysql', 1 ), + 'receiver_id' => '', + ]; + + foreach ( $args as $key => $value ) { + if ( isset( $data[ $key ] ) ) { + $args[ $key ] = $data[ $key ]; + } + } + + $id = $wpdb->insert( $wpdb->prefix . 'opalestate_message_reply', $args ); + + return $wpdb->insert_id; + } + + public function get_reply( $id ) { + global $wpdb; + + $query = " SELECT * FROM " . $wpdb->prefix . "opalestate_message_reply where id=" . (int) $id; + $reply = $wpdb->get_row( $query ); + + return $reply; + } + + /** + * + */ + public static function install() { + try { + if ( ! function_exists( 'dbDelta' ) ) { + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); + } + + global $wpdb; + + $charset_collate = $wpdb->get_charset_collate(); + + $sql = 'CREATE TABLE IF NOT EXISTS ' . $wpdb->prefix . 'opalestate_message' . ' ( + `id` int(11) UNSIGNED NOT NULL, + `subject` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `message` text COLLATE utf8mb4_unicode_ci NOT NULL, + `phone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `sender_email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `sender_id` int(11) DEFAULT NULL, + `created` datetime NOT NULL, + `receiver_id` int(11) NOT NULL, + `post_id` int(11) NOT NULL, + `type` varchar(250) COLLATE utf8mb4_unicode_ci NOT NULL, + `isread` tinyint(1) NOT NULL + ) ' . $charset_collate; + dbDelta( $sql ); + + /// + + $sql = 'CREATE TABLE IF NOT EXISTS ' . $wpdb->prefix . 'opalestate_message_reply' . ' ( + `id` int(11) NOT NULL, + `message_id` int(11) NOT NULL, + `sender_id` int(11) NOT NULL, + `message` text NOT NULL, + `created` datetime NOT NULL, + `receiver_id` int(11) NOT NULL + ) ' . $charset_collate; + dbDelta( $sql ); + + + } catch ( Exception $e ) { + + } + } + + + /** + * + */ + public function do_delete( $id ) { + + global $wpdb; + if ( $this->user_id ) { + $wpdb->delete( $wpdb->prefix . "opalestate_message", [ "id" => $id, 'user_id' => $this->user_id ], [ '%d' ] ); + } + } + + /** + * + */ + public function get_list( $args = [] ) { + + global $wpdb; + + $default = [ + 'cpage' => 1, + 'items_per_page' => 3, + ]; + + $args = array_merge( $default, $args ); + $items_per_page = $args['items_per_page']; + $offset = ( $args['cpage'] * $items_per_page ) - $items_per_page; + + $query = " SELECT * FROM " . $wpdb->prefix . "opalestate_message where receiver_id=" . $this->user_id . ' OR sender_id=' . $this->user_id; + $query .= ' ORDER BY id DESC LIMIT ' . $offset . ', ' . $items_per_page; + + return $wpdb->get_results( $query ); + } + + public function get_total() { + + global $wpdb; + $query = " SELECT count(1) as total FROM " . $wpdb->prefix . "opalestate_message where receiver_id=" . $this->user_id . ' OR sender_id=' . $this->user_id; + + return $wpdb->get_var( $query ); + } + + /** + * + */ + public function get_message( $id ) { + + global $wpdb; + + $query = " SELECT * FROM " . $wpdb->prefix . "opalestate_message where ( sender_id=" . $this->user_id . " OR receiver_id=" . $this->user_id . ') and id=' . (int) $id; + $message = $wpdb->get_results( $query ); + + if ( isset( $message[0] ) ) { + return $message[0]; + } + + return []; + } + + public function get_replies( $id ) { + + global $wpdb; + + $query = " SELECT * FROM " . $wpdb->prefix . "opalestate_message_reply where message_id=" . (int) $id . ' ORDER BY created '; + $messages = $wpdb->get_results( $query ); + + return $messages; + } + + /** + * + */ + public function is_saved() { + + } + + /** + * + */ + public function get_equiry_form_fields( $msg = '' ) { + + $prefix = ''; + + $id = ''; + $sender_id = ''; + $post_id = get_the_ID(); + $email = ''; + $current_user = wp_get_current_user(); + $name = ''; + + if ( 0 != $current_user->ID ) { + $email = $current_user->user_email; + $name = $current_user->user_firstname . ' ' . $current_user->user_lastname; + $sender_id = $current_user->ID; + } + + $fields = [ + + [ + 'id' => "type", + 'name' => esc_html__( 'Type', 'opalestate-pro' ), + 'type' => 'hidden', + 'default' => 'send_equiry', + 'description' => "", + ], + [ + 'id' => "post_id", + 'name' => esc_html__( 'Property ID', 'opalestate-pro' ), + 'type' => 'hidden', + 'default' => $post_id, + 'description' => "", + ], + + [ + 'id' => "sender_id", + 'name' => esc_html__( 'Sender ID', 'opalestate-pro' ), + 'type' => 'hidden', + 'default' => $sender_id, + 'description' => "", + ], + + [ + 'id' => "{$prefix}name", + 'name' => esc_html__( 'Name', 'opalestate-pro' ), + 'type' => 'text', + 'before_row' => '', + 'required' => 'required', + 'default' => $name, + 'description' => "", + ], + [ + 'id' => "{$prefix}email", + 'name' => esc_html__( 'Email', 'opalestate-pro' ), + 'type' => 'text', + 'default' => $email, + 'description' => "", + 'required' => 'required', + ], + + [ + 'id' => "{$prefix}phone", + 'name' => esc_html__( 'Phone', 'opalestate-pro' ), + 'type' => 'text', + 'description' => "", + 'required' => 'required', + ], + + [ + 'id' => "{$prefix}message", + 'name' => esc_html__( 'Message', 'opalestate-pro' ), + 'type' => 'textarea', + 'description' => "", + 'default' => $msg, + 'required' => 'required', + ], + + ]; + + return $fields; + } + + public function get_reply_form_fields() { + $prefix = ''; + $fields = [ + [ + 'id' => "type", + 'name' => esc_html__( 'Type', 'opalestate-pro' ), + 'type' => 'hidden', + 'default' => 'send_contact', + 'description' => "", + ], + [ + 'id' => "{$prefix}message", + 'name' => esc_html__( 'Message', 'opalestate-pro' ), + 'type' => 'textarea', + 'description' => "", + 'required' => 'required', + ], + ]; + + return $fields; + } + + /** + * + */ + public function get_contact_form_fields( $msg = '' ) { + + $prefix = ''; + $id = ''; + $sender_id = ''; + $post_id = get_the_ID(); + $email = ''; + $current_user = wp_get_current_user(); + $name = ''; + + if ( 0 != $current_user->ID ) { + $email = $current_user->user_email; + $name = $current_user->user_firstname . ' ' . $current_user->user_lastname; + $sender_id = $current_user->ID; + } + + $fields = [ + [ + 'id' => "type", + 'name' => esc_html__( 'Type', 'opalestate-pro' ), + 'type' => 'hidden', + 'default' => 'send_contact', + 'description' => "", + ], + [ + 'id' => "post_id", + 'name' => esc_html__( 'Property ID', 'opalestate-pro' ), + 'type' => 'hidden', + 'default' => $post_id, + 'description' => "", + ], + [ + 'id' => "sender_id", + 'name' => esc_html__( 'Sender ID', 'opalestate-pro' ), + 'type' => 'hidden', + 'default' => $sender_id, + 'description' => "", + ], + [ + 'id' => "{$prefix}name", + 'name' => esc_html__( 'Name', 'opalestate-pro' ), + 'type' => 'text', + 'default' => $name, + 'required' => 'required', + 'description' => "", + ], + [ + 'id' => "{$prefix}email", + 'name' => esc_html__( 'Email', 'opalestate-pro' ), + 'type' => 'text', + 'default' => $email, + 'description' => "", + 'required' => 'required', + ], + + [ + 'id' => "{$prefix}phone", + 'name' => esc_html__( 'Phone', 'opalestate-pro' ), + 'type' => 'text', + 'description' => "", + 'required' => 'required', + ], + + [ + 'id' => "{$prefix}message", + 'name' => esc_html__( 'Message', 'opalestate-pro' ), + 'type' => 'textarea', + 'description' => "", + 'default' => $msg, + 'required' => 'required', + ], + + ]; + + return $fields; + } + + public function get_request_review_form_fields( $msg = '' ) { + + $prefix = ''; + $id = ''; + $sender_id = ''; + $post_id = get_the_ID(); + $email = ''; + $current_user = wp_get_current_user(); + $name = ''; + + if ( 0 != $current_user->ID ) { + $email = $current_user->user_email; + $name = $current_user->user_firstname . ' ' . $current_user->user_lastname; + $sender_id = $current_user->ID; + } + + $fields = [ + [ + 'id' => "type", + 'name' => esc_html__( 'Type', 'opalestate-pro' ), + 'type' => 'hidden', + 'default' => 'send_request_review', + 'description' => "", + ], + [ + 'id' => "post_id", + 'name' => esc_html__( 'Property ID', 'opalestate-pro' ), + 'type' => 'hidden', + 'default' => $post_id, + 'description' => "", + ], + [ + 'id' => "sender_id", + 'name' => esc_html__( 'Sender ID', 'opalestate-pro' ), + 'type' => 'hidden', + 'default' => $sender_id, + 'description' => "", + ], + [ + 'id' => "{$prefix}date", + 'name' => esc_html__( 'Schedule', 'opalestate-pro' ), + 'type' => 'date', + 'before_row' => '', + 'required' => 'required', + 'description' => "", + ], + [ + 'id' => "{$prefix}time", + 'name' => esc_html__( 'Time', 'opalestate-pro' ), + 'type' => 'select', + 'options' => opalestate_get_time_lapses(), + 'description' => "", + ], + [ + 'id' => "{$prefix}phone", + 'name' => esc_html__( 'Phone', 'opalestate-pro' ), + 'type' => 'text', + 'description' => "", + 'required' => 'required', + ], + + [ + 'id' => "{$prefix}message", + 'name' => esc_html__( 'Message', 'opalestate-pro' ), + 'type' => 'textarea', + 'description' => "", + 'default' => $msg, + 'required' => 'required', + ], + + ]; + + return $fields; + } + + + public function render_user_content_page() { + + if ( isset( $_GET['message_id'] ) ) { + + $message = $this->get_message( absint( $_GET['message_id'] ) ); + + return opalestate_load_template_path( 'user/read-messages', + [ + 'message' => $message, + 'fields' => $this->get_reply_form_fields(), + 'replies' => $this->get_replies( absint( $_GET['message_id'] ) ), + ] + ); + + } else { + return opalestate_load_template_path( 'user/messages' ); + } + } +} + +OpalEstate_User_Message::get_instance(); diff --git a/inc/message/class-opalestate-request-reviewing.php b/inc/message/class-opalestate-request-reviewing.php new file mode 100755 index 00000000..f1120e02 --- /dev/null +++ b/inc/message/class-opalestate-request-reviewing.php @@ -0,0 +1,141 @@ + + * + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * OpalEstate_User_Message Class + * + * @since 1.0.0 + */ +class OpalEstate_User_Request_Viewing { + + /** + * @var int + */ + protected $user_id = 0; + + /** + * Gets types. + * + * @return array + */ + public function get_types() { + return [ + 'request_view' => '', + 'contact' => '', + 'send_equiry' => '', + ]; + } + + /** + * OpalEstate_User_Request_Viewing constructor. + */ + public function __construct() { + add_action( 'init', [ $this, 'init' ] ); + + /// process ajax send message + add_action( 'wp_ajax_send_email_request_reviewing', [ $this, 'process_send_email' ] ); + add_action( 'wp_ajax_nopriv_send_email_request_reviewing', [ $this, 'process_send_email' ] ); + } + + /** + * Set values when user logined in system + */ + public function init() { + global $current_user; + + wp_get_current_user(); + $this->user_id = $current_user->ID; + } + + /** + * get_member_email_data + * + * @param $post_id + * @return array + */ + public function get_member_email_data( $post_id ) { + return opalestate_get_member_email_data( $post_id ); + } + + /** + * Process send email. + */ + public function process_send_email() { + if ( wp_verify_nonce( $_POST['message_action'], 'property-request-view' ) ) { + $post = $_POST; + $member = $this->get_member_email_data( absint( $post['post_id'] ) ); + + $output = [ + 'subject' => isset( $subject ) && $subject ? esc_html( $subject ) : '', + 'name' => esc_html( $member['receiver_name'] ), + 'receiver_email' => sanitize_email( $member['receiver_email'] ), + 'receiver_id' => sanitize_text_field( $member['receiver_id'] ), + 'sender_id' => get_current_user_id(), + 'sender_email' => sanitize_email( $post['email'] ), + 'phone' => sanitize_text_field( $post['phone'] ), + 'message' => esc_html( $post['message'] ), + 'schedule_time' => sanitize_text_field( $post['time'] ), + 'schedule_date' => sanitize_text_field( $post['date'] ), + 'post_id' => absint( $post['post_id'] ), + ]; + + $this->insert( $output ); + + // insert data into request_reviewing form + do_action( 'opalestate_send_email_request_reviewing', $output ); + } + + $return = [ 'status' => false, 'msg' => esc_html__( 'Unable to send a message.', 'opalestate-pro' ) ]; + echo json_encode( $return ); + die(); + } + + public function insert( $data ) { + + } + + /** + * Install. + */ + public static function install() { + try { + if ( ! function_exists( 'dbDelta' ) ) { + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); + } + + global $wpdb; + + $charset_collate = $wpdb->get_charset_collate(); + + $sql = 'CREATE TABLE IF NOT EXISTS ' . $wpdb->prefix . 'opalestate_message' . ' ( + `id` int(11) UNSIGNED NOT NULL, + `subject` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `message` text COLLATE utf8mb4_unicode_ci NOT NULL, + `phone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `sender_email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `sender_id` int(11) DEFAULT NULL, + `created` datetime NOT NULL, + `receiver_id` int(11) NOT NULL, + `post_id` int(11) NOT NULL, + `type` varchar(250) COLLATE utf8mb4_unicode_ci NOT NULL, + `isread` tinyint(1) NOT NULL + ) ' . $charset_collate; + dbDelta( $sql ); + + } catch ( Exception $e ) { + + } + } +} + +new OpalEstate_User_Request_Viewing(); diff --git a/inc/message/functions.php b/inc/message/functions.php new file mode 100755 index 00000000..e69d125f --- /dev/null +++ b/inc/message/functions.php @@ -0,0 +1,46 @@ + OpalEstate_User_Message::get_instance()->get_list( $args ), + 'total' => OpalEstate_User_Message::get_instance()->get_total( $args ) + ); + } + + function opalestate_get_member_email_data( $post_id ){ + + $output = array(); + $type = get_post_meta( $post_id, OPALESTATE_PROPERTY_PREFIX . 'author_type', true ); + + $receiver_id = 0; + switch ( $type ) { + + case 'agent': + $related_id = get_post_meta( $post_id, OPALESTATE_PROPERTY_PREFIX . 'related_id', true ); + $post = get_post( $related_id ); + $name = $post->post_title; + $email = get_post_meta( $related_id, OPALESTATE_AGENT_PREFIX . 'email', true ); + break; + + case 'agency': + $related_id = get_post_meta( $post_id, OPALESTATE_PROPERTY_PREFIX . 'related_id', true ); + $agent = get_post( $related_id ); + $name = $agent->post_title; + $email = get_post_meta( $related_id, OPALESTATE_AGENCY_PREFIX . 'email', true ); + break; + default: + $post = get_post( $post_id ); + $user = get_user_by( 'id', $post->post_author ); + $email = $user->data->user_email; + $name = $user->data->display_name; + $receiver_id = $post->post_author; + + break; + } + + return $output = array( + 'receiver_email' => $email, + 'receiver_name' => $name, + 'receiver_id' => $receiver_id + ); + } +?> \ No newline at end of file diff --git a/inc/mixes-functions.php b/inc/mixes-functions.php new file mode 100755 index 00000000..1bd5e9e7 --- /dev/null +++ b/inc/mixes-functions.php @@ -0,0 +1,1134 @@ + + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * Output message json. + * + * @param bool $result + * @param string $message + * @param array $args + * @param bool $return + * @return false|mixed|string|void + */ +function opalestate_output_msg_json( $result = false, $message = '', $args = [], $return = false ) { + $out = new stdClass(); + $out->status = $result; + $out->message = $message; + if ( $args ) { + foreach ( $args as $key => $arg ) { + $out->$key = $arg; + } + } + if ( $return ) { + return json_encode( $out ); + } else { + echo json_encode( $out ); + die; + } +} + +/** + * Process upload images for properties + */ +function opalesate_upload_image( $submitted_file, $parent_id = 0 ) { + + // do_action( 'opalestate_before_process_ajax_upload_file' ); + + require_once ABSPATH . 'wp-admin/includes/image.php'; + require_once ABSPATH . 'wp-admin/includes/file.php'; + require_once ABSPATH . 'wp-admin/includes/media.php'; + + $uploaded_image = wp_handle_upload( $submitted_file, + [ 'test_form' => false ] ); //Handle PHP uploads in WordPress, sanitizing file names, checking extensions for mime type, and moving the file to the appropriate directory within the uploads directory. + + if ( isset( $uploaded_image['file'] ) ) { + $file_name = basename( $submitted_file['name'] ); + $file_type = wp_check_filetype( $uploaded_image['file'] ); //Retrieve the file type from the file name. + + // Prepare an array of post data for the attachment. + $attachment_details = [ + 'guid' => $uploaded_image['url'], + 'post_mime_type' => $file_type['type'], + 'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $file_name ) ), + 'post_content' => '', + 'post_status' => 'inherit', + ]; + + $attach_id = wp_insert_attachment( $attachment_details, $uploaded_image['file'], $parent_id ); // This function inserts an attachment into the media library + $attach_data = wp_generate_attachment_metadata( $attach_id, + $uploaded_image['file'] ); // This function generates metadata for an image attachment. It also creates a thumbnail and other intermediate sizes of the image attachment based on the sizes defined + wp_update_attachment_metadata( $attach_id, $attach_data ); // Update metadata for an attachment. + + $thumbnail_url = opalestate_get_upload_image_url( $attach_data ); + + $ajax_response = [ + 'success' => true, + 'url' => $thumbnail_url, + 'attachment_id' => $attach_id, + ]; + + update_post_meta( $attach_id, '_pending_to_use_', 1 ); + + return $ajax_response; + + } + + return []; +} + +/** + * + */ +function opalestate_get_time_lapses( $lapse = 15 ) { + + $output = []; + $start = '12:00AM'; + $end = '11:59PM'; + $interval = '+' . $lapse . ' minutes'; + + $start_str = strtotime( $start ); + $end_str = strtotime( $end ); + $now_str = $start_str; + + while ( $now_str <= $end_str ) { + $output[ date( 'h:i a', $now_str ) ] = date( 'h:i A', $now_str ); + $now_str = strtotime( $interval, $now_str ); + } + + return $output; +} + + +function is_single_property() { + global $post; + + $post_type = get_post_type(); + + return $post_type == 'opalestate_property' && is_single(); +} + +function is_single_agent() { + global $post; + + $post_type = get_post_type(); + + return $post_type == 'opalestate_agent' && is_single(); +} + +function is_single_agency() { + global $post; + + $post_type = get_post_type(); + + return $post_type == 'opalestate_agency' && is_single(); +} + +/** + * Gets search form styles. + * + * @return array + */ +function opalestate_search_properties_form_styles() { + return apply_filters( 'opalestate_search_properties_form_styles', [ + 'search-form-h' => esc_html__( 'Advanced V1 Form', 'opalestate-pro' ), + 'advanced-v2' => esc_html__( 'Advanced V2 Form', 'opalestate-pro' ), + 'advanced-v3' => esc_html__( 'Advanced V3 Form', 'opalestate-pro' ), + 'advanced-v4' => esc_html__( 'Advanced V4 Form', 'opalestate-pro' ), + 'advanced-v5' => esc_html__( 'Advanced V5 Form', 'opalestate-pro' ), + 'advanced-v6' => esc_html__( 'Advanced V6 Form', 'opalestate-pro' ), + 'search-form-v' => esc_html__( 'Vertical Advanced Form', 'opalestate-pro' ), + 'search-form-v2' => esc_html__( 'Vertical Advanced V2 Form', 'opalestate-pro' ), + 'search-form-v3' => esc_html__( 'Vertical Advanced V3 Form', 'opalestate-pro' ), + 'simple-city' => esc_html__( 'Simple City Form', 'opalestate-pro' ), + 'simple-keyword' => esc_html__( 'Simple Keyword Form', 'opalestate-pro' ), + 'collapse-city' => esc_html__( 'Collapse City Form', 'opalestate-pro' ), + 'collapse-keyword' => esc_html__( 'Collapse Keyword Form', 'opalestate-pro' ), + ] ); +} + +/** + * Gets loop property layouts. + * + * @return array + */ +function opalestate_get_loop_property_layouts() { + return apply_filters( 'opalestate_get_loop_property_layouts', [ + 'grid' => esc_html__( 'Grid', 'opalestate-pro' ), + 'grid-v2' => esc_html__( 'Grid v2', 'opalestate-pro' ), + 'grid-v3' => esc_html__( 'Grid v3', 'opalestate-pro' ), + 'list' => esc_html__( 'List', 'opalestate-pro' ), + 'list-v2' => esc_html__( 'List v2', 'opalestate-pro' ), + 'mark-hover' => esc_html__( 'Mark hover', 'opalestate-pro' ), + ] ); +} + +/** + * Gets loop property grid layouts. + * + * @return array + */ +function opalestate_get_loop_property_grid_layouts() { + return apply_filters( 'opalestate_get_loop_property_grid_layouts', [ + 'grid' => esc_html__( 'Grid', 'opalestate-pro' ), + 'grid-v2' => esc_html__( 'Grid v2', 'opalestate-pro' ), + 'grid-v3' => esc_html__( 'Grid v3', 'opalestate-pro' ), + 'mark-hover' => esc_html__( 'Mark hover', 'opalestate-pro' ), + ] ); +} + +/** + * Gets loop property list layouts. + * + * @return array + */ +function opalestate_get_loop_property_list_layouts() { + return apply_filters( 'opalestate_get_loop_property_list_layouts', [ + 'list' => esc_html__( 'List', 'opalestate-pro' ), + 'list-v2' => esc_html__( 'List v2', 'opalestate-pro' ), + ] ); +} + +function opalestate_get_map_api_uri() { + + $key = opalestate_options( 'google_map_api_keys' ) ? + opalestate_options( 'google_map_api_keys' ) : 'AIzaSyAvJkbm23fhVAYcbdeVB0nkHjZmDeZ62bc'; + + $api = 'https://maps.googleapis.com/maps/api/js?key=' . $key . '&libraries=geometry,places,drawing&ver=5.2.2'; + $api = apply_filters( 'opalestate_google_map_api_uri', $api ); + + return $api; +} + +function opalestate_get_map_search_api_uri( $address ) { + + $key = opalestate_options( 'google_map_api_keys' ) ? + opalestate_options( 'google_map_api_keys' ) : 'AIzaSyAvJkbm23fhVAYcbdeVB0nkHjZmDeZ62bc'; + + $api = "https://maps.googleapis.com/maps/api/geocode/json?address={$address}&key={$key}"; + + return $api; +} + +function opalestate_is_setting_enabled( $value, $compare_with = null ) { + if ( ! is_null( $compare_with ) ) { + + if ( is_array( $compare_with ) ) { + // Output. + return in_array( $value, $compare_with ); + } + + // Output. + return ( $value === $compare_with ); + } + + return ( in_array( $value, [ 'enabled', 'on', 'yes' ] ) ? true : false ); +} + + +function opalestate_get_dashdoard_page_uri() { + return home_url(); +} + + +if ( ! function_exists( 'opalestate_is_ajax_request' ) ) { + function opalestate_is_ajax_request() { + return defined( 'DOING_AJAX' ) && DOING_AJAX; + } +} + +if ( ! function_exists( 'opalmembership_add_notice' ) ) { + function opalestate_add_notice( $type = 'error', $message = '' ) { + if ( ! $type || ! $message ) { + return; + } + $notices = OpalEstate()->session->get( 'notices', [] ); + if ( ! isset( $notices[ $type ] ) ) { + $notices[ $type ] = []; + } + $notices[ $type ][] = $message; + OpalEstate()->session->set( 'notices', $notices ); + } +} + + +if ( ! function_exists( 'opalestate_print_notices' ) ) { + + /** + * print all notices + */ + function opalestate_print_notices() { + + $notices = OpalEstate()->session->get( 'notices', [] ); + if ( empty( $notices ) ) { + return; + } + ob_start(); + foreach ( $notices as $type => $messages ) { + echo opalestate_load_template_path( 'notices/' . $type, [ 'messages' => $messages ] ); + } + OpalEstate()->session->set( 'notices', [] ); + echo ob_get_clean(); + } +} + + +function opalestate_user_roles_by_user_id( $user_id ) { + $user = get_userdata( $user_id ); + + return empty( $user ) ? [] : $user->roles; +} + +/** + * Featured Image Sizes + */ +function opalestate_get_featured_image_sizes() { + global $_wp_additional_image_sizes; + $sizes = [ 'full' => esc_html__( 'Orginal Size', 'opalestate-pro' ) ]; + + foreach ( get_intermediate_image_sizes() as $_size ) { + + if ( in_array( $_size, [ 'thumbnail', 'medium', 'medium_large', 'large' ] ) ) { + $sizes[ $_size ] = $_size . ' - ' . get_option( "{$_size}_size_w" ) . 'x' . get_option( "{$_size}_size_h" ); + } elseif ( isset( $_wp_additional_image_sizes[ $_size ] ) ) { + $sizes[ $_size ] = $_size . ' - ' . $_wp_additional_image_sizes[ $_size ]['width'] . 'x' . $_wp_additional_image_sizes[ $_size ]['height']; + } + + } + + return apply_filters( 'opalestate_get_featured_image_sizes', $sizes ); +} + +/** + * Gets register page uri. + * + * @return string + */ +function opalestate_get_register_page_uri() { + global $opalmembership_options; + $register_page = isset( $opalmembership_options['register_page'] ) ? get_permalink( absint( $opalmembership_options['register_page'] ) ) : get_bloginfo( 'url' ); + + return apply_filters( 'opalestate_get_register_page_uri', $register_page ); +} + +/** + * Gets search agency uri. + * + * @return false|string + */ +function opalestate_search_agency_uri() { + return get_post_type_archive_link( 'opalestate_agency' ); +} + +/** + * Gets current uri. + * + * @return string + */ +function opalestate_get_current_uri() { + global $wp; + + $current_url = home_url( add_query_arg( [], $wp->request ) ); + + return $current_url; +} + +/** + * Gets URL sort mode. + * + * @param string $mode + * @return string + */ +function opalestate_get_url_sort_mode( $mode = "" ) { + global $wp; + + $get = []; + + if ( isset( $_GET ) ) { + $get = $_GET; + } + $get['display'] = $mode; + $current_url = home_url( add_query_arg( [ $get ], $wp->request ) ); + + return $current_url; +} + +/** + * + */ +function opalestate_search_agent_uri() { + global $opalestate_options; + + $search_agents = isset( $opalestate_options['search_agents'] ) ? get_permalink( absint( $opalestate_options['search_agents'] ) ) : opalestate_get_current_uri(); + + return apply_filters( 'opalestate_get_search_agents_page_uri', $search_agents ); +} + +/** + * + */ +function opalestate_get_session_location_val() { + return isset( $_SESSION['set_location'] ) ? $_SESSION['set_location'] : 0; +} + +function opalestate_get_location_active() { + $location = opalestate_get_session_location_val(); + if ( ! is_numeric( $location ) ) { + $term = get_term_by( 'slug', $location, 'opalestate_location' ); + $name = is_object( $term ) ? $term->name : esc_html__( 'Your Location', 'opalestate-pro' ); + + return $name; + } else { + return esc_html__( 'Your Location', 'opalestate-pro' ); + } +} + +function opalestate_get_upload_image_url( $attach_data ) { + $upload_dir = wp_upload_dir(); + $image_path_array = explode( '/', $attach_data['file'] ); + $image_path_array = array_slice( $image_path_array, 0, count( $image_path_array ) - 1 ); + $image_path = implode( '/', $image_path_array ); + $thumbnail_name = null; + if ( isset( $attach_data['sizes']['user-image'] ) ) { + $thumbnail_name = $attach_data['sizes']['user-image']['file']; + } elseif ( isset( $attach_data['sizes']['thumbnail']['file'] ) ) { + $thumbnail_name = $attach_data['sizes']['thumbnail']['file']; + } else { + return $upload_dir['baseurl'] . '/' . $attach_data['file']; + } + + return $upload_dir['baseurl'] . '/' . $image_path . '/' . $thumbnail_name; +} + +function opalestate_update_attachement_used( $attachment_id ) { + +} + +/** + * batch including all files in a path. + * + * @param String $path : PATH_DIR/*.php or PATH_DIR with $ifiles not empty + */ +function opalestate_includes( $path, $ifiles = [] ) { + if ( ! empty( $ifiles ) ) { + foreach ( $ifiles as $key => $file ) { + $file = $path . '/' . $file; + if ( is_file( $file ) ) { + require( $file ); + } + } + } else { + $files = glob( $path ); + foreach ( $files as $key => $file ) { + if ( is_file( $file ) ) { + require( $file ); + } + } + } +} + +/** + * Gets property. + * + * @param $id + * @return \Opalestate_Property + */ +function opalesetate_property( $id ) { + global $property; + + $property = new Opalestate_Property( $id ); + + return $property; +} + +/** + * Gets agency + * + * @param $id + * @return \Opalestate_Agency + */ +function opalesetate_agency( $id ) { + global $agency; + + $agency = new Opalestate_Agency( $id ); + + return $agency; +} + +/** + * Gets agent. + * + * @param $id + * @return \Opalestate_Agent + */ +function opalesetate_agent( $id ) { + global $agent; + + $agent = new Opalestate_Agent( $id ); + + return $agent; +} + +/** + * Gets opalestate options. + * + * @param string $key + * @param string $default + * @return mixed|void + */ +function opalestate_options( $key, $default = '' ) { + global $opalestate_options; + + $value = isset( $opalestate_options[ $key ] ) ? $opalestate_options[ $key ] : $default; + $value = apply_filters( 'opalestate_option_', $value, $key, $default ); + + return apply_filters( 'opalestate_option_' . $key, $value, $key, $default ); +} + +/** + * Gets image placeholder. + * + * @param string $size + * @param bool $url + * @return string + */ +function opalestate_get_image_placeholder( $size = '', $url = false ) { + $src = opalestate_get_image_placeholder_src(); + + $size = is_string( $size ) ? $size : ''; + + if ( $url ) { + return esc_url( $src ); + } + + return '' . sprintf( esc_html__( 'Placeholder %s', 'opalestate-pro' ), $size ) . ''; +} + +function opalestate_get_image_placeholder_src() { + return OPALESTATE_PLUGIN_URL . 'assets/images/placeholder.png'; +} + +/** + * Get User IP + * + * Returns the IP address of the current visitor + * + * @return string $ip User's IP address + */ +function opalestate_get_ip() { + $ip = '127.0.0.1'; + + if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) { + //check ip from share internet + $ip = $_SERVER['HTTP_CLIENT_IP']; + } elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) { + //to check ip is pass from proxy + $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; + } elseif ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) { + $ip = $_SERVER['REMOTE_ADDR']; + } + + return apply_filters( 'opalestate_get_ip', $ip ); +} + +/** + * Gets currencies. + * + * @return array + */ +function opalestate_get_currencies() { + $currencies = [ + 'AED' => esc_html__( 'United Arab Emirates dirham', 'opalestate-pro' ), + 'AFN' => esc_html__( 'Afghan afghani', 'opalestate-pro' ), + 'ALL' => esc_html__( 'Albanian lek', 'opalestate-pro' ), + 'AMD' => esc_html__( 'Armenian dram', 'opalestate-pro' ), + 'ANG' => esc_html__( 'Netherlands Antillean guilder', 'opalestate-pro' ), + 'AOA' => esc_html__( 'Angolan kwanza', 'opalestate-pro' ), + 'ARS' => esc_html__( 'Argentine peso', 'opalestate-pro' ), + 'AUD' => esc_html__( 'Australian dollar', 'opalestate-pro' ), + 'AWG' => esc_html__( 'Aruban florin', 'opalestate-pro' ), + 'AZN' => esc_html__( 'Azerbaijani manat', 'opalestate-pro' ), + 'BAM' => esc_html__( 'Bosnia and Herzegovina convertible mark', 'opalestate-pro' ), + 'BBD' => esc_html__( 'Barbadian dollar', 'opalestate-pro' ), + 'BDT' => esc_html__( 'Bangladeshi taka', 'opalestate-pro' ), + 'BGN' => esc_html__( 'Bulgarian lev', 'opalestate-pro' ), + 'BHD' => esc_html__( 'Bahraini dinar', 'opalestate-pro' ), + 'BIF' => esc_html__( 'Burundian franc', 'opalestate-pro' ), + 'BMD' => esc_html__( 'Bermudian dollar', 'opalestate-pro' ), + 'BND' => esc_html__( 'Brunei dollar', 'opalestate-pro' ), + 'BOB' => esc_html__( 'Bolivian boliviano', 'opalestate-pro' ), + 'BRL' => esc_html__( 'Brazilian real', 'opalestate-pro' ), + 'BSD' => esc_html__( 'Bahamian dollar', 'opalestate-pro' ), + 'BTC' => esc_html__( 'Bitcoin', 'opalestate-pro' ), + 'BTN' => esc_html__( 'Bhutanese ngultrum', 'opalestate-pro' ), + 'BWP' => esc_html__( 'Botswana pula', 'opalestate-pro' ), + 'BYR' => esc_html__( 'Belarusian ruble', 'opalestate-pro' ), + 'BZD' => esc_html__( 'Belize dollar', 'opalestate-pro' ), + 'CAD' => esc_html__( 'Canadian dollar', 'opalestate-pro' ), + 'CDF' => esc_html__( 'Congolese franc', 'opalestate-pro' ), + 'CHF' => esc_html__( 'Swiss franc', 'opalestate-pro' ), + 'CLP' => esc_html__( 'Chilean peso', 'opalestate-pro' ), + 'CNY' => esc_html__( 'Chinese yuan', 'opalestate-pro' ), + 'COP' => esc_html__( 'Colombian peso', 'opalestate-pro' ), + 'CRC' => esc_html__( 'Costa Rican colón', 'opalestate-pro' ), + 'CUC' => esc_html__( 'Cuban convertible peso', 'opalestate-pro' ), + 'CUP' => esc_html__( 'Cuban peso', 'opalestate-pro' ), + 'CVE' => esc_html__( 'Cape Verdean escudo', 'opalestate-pro' ), + 'CZK' => esc_html__( 'Czech koruna', 'opalestate-pro' ), + 'DJF' => esc_html__( 'Djiboutian franc', 'opalestate-pro' ), + 'DKK' => esc_html__( 'Danish krone', 'opalestate-pro' ), + 'DOP' => esc_html__( 'Dominican peso', 'opalestate-pro' ), + 'DZD' => esc_html__( 'Algerian dinar', 'opalestate-pro' ), + 'EGP' => esc_html__( 'Egyptian pound', 'opalestate-pro' ), + 'ERN' => esc_html__( 'Eritrean nakfa', 'opalestate-pro' ), + 'ETB' => esc_html__( 'Ethiopian birr', 'opalestate-pro' ), + 'EUR' => esc_html__( 'Euro', 'opalestate-pro' ), + 'FJD' => esc_html__( 'Fijian dollar', 'opalestate-pro' ), + 'FKP' => esc_html__( 'Falkland Islands pound', 'opalestate-pro' ), + 'GBP' => esc_html__( 'Pound sterling', 'opalestate-pro' ), + 'GEL' => esc_html__( 'Georgian lari', 'opalestate-pro' ), + 'GGP' => esc_html__( 'Guernsey pound', 'opalestate-pro' ), + 'GHS' => esc_html__( 'Ghana cedi', 'opalestate-pro' ), + 'GIP' => esc_html__( 'Gibraltar pound', 'opalestate-pro' ), + 'GMD' => esc_html__( 'Gambian dalasi', 'opalestate-pro' ), + 'GNF' => esc_html__( 'Guinean franc', 'opalestate-pro' ), + 'GTQ' => esc_html__( 'Guatemalan quetzal', 'opalestate-pro' ), + 'GYD' => esc_html__( 'Guyanese dollar', 'opalestate-pro' ), + 'HKD' => esc_html__( 'Hong Kong dollar', 'opalestate-pro' ), + 'HNL' => esc_html__( 'Honduran lempira', 'opalestate-pro' ), + 'HRK' => esc_html__( 'Croatian kuna', 'opalestate-pro' ), + 'HTG' => esc_html__( 'Haitian gourde', 'opalestate-pro' ), + 'HUF' => esc_html__( 'Hungarian forint', 'opalestate-pro' ), + 'IDR' => esc_html__( 'Indonesian rupiah', 'opalestate-pro' ), + 'ILS' => esc_html__( 'Israeli new shekel', 'opalestate-pro' ), + 'IMP' => esc_html__( 'Manx pound', 'opalestate-pro' ), + 'INR' => esc_html__( 'Indian rupee', 'opalestate-pro' ), + 'IQD' => esc_html__( 'Iraqi dinar', 'opalestate-pro' ), + 'IRR' => esc_html__( 'Iranian rial', 'opalestate-pro' ), + 'ISK' => esc_html__( 'Icelandic króna', 'opalestate-pro' ), + 'JEP' => esc_html__( 'Jersey pound', 'opalestate-pro' ), + 'JMD' => esc_html__( 'Jamaican dollar', 'opalestate-pro' ), + 'JOD' => esc_html__( 'Jordanian dinar', 'opalestate-pro' ), + 'JPY' => esc_html__( 'Japanese yen', 'opalestate-pro' ), + 'KES' => esc_html__( 'Kenyan shilling', 'opalestate-pro' ), + 'KGS' => esc_html__( 'Kyrgyzstani som', 'opalestate-pro' ), + 'KHR' => esc_html__( 'Cambodian riel', 'opalestate-pro' ), + 'KMF' => esc_html__( 'Comorian franc', 'opalestate-pro' ), + 'KPW' => esc_html__( 'North Korean won', 'opalestate-pro' ), + 'KRW' => esc_html__( 'South Korean won', 'opalestate-pro' ), + 'KWD' => esc_html__( 'Kuwaiti dinar', 'opalestate-pro' ), + 'KYD' => esc_html__( 'Cayman Islands dollar', 'opalestate-pro' ), + 'KZT' => esc_html__( 'Kazakhstani tenge', 'opalestate-pro' ), + 'LAK' => esc_html__( 'Lao kip', 'opalestate-pro' ), + 'LBP' => esc_html__( 'Lebanese pound', 'opalestate-pro' ), + 'LKR' => esc_html__( 'Sri Lankan rupee', 'opalestate-pro' ), + 'LRD' => esc_html__( 'Liberian dollar', 'opalestate-pro' ), + 'LSL' => esc_html__( 'Lesotho loti', 'opalestate-pro' ), + 'LYD' => esc_html__( 'Libyan dinar', 'opalestate-pro' ), + 'MAD' => esc_html__( 'Moroccan dirham', 'opalestate-pro' ), + 'MDL' => esc_html__( 'Moldovan leu', 'opalestate-pro' ), + 'MGA' => esc_html__( 'Malagasy ariary', 'opalestate-pro' ), + 'MKD' => esc_html__( 'Macedonian denar', 'opalestate-pro' ), + 'MMK' => esc_html__( 'Burmese kyat', 'opalestate-pro' ), + 'MNT' => esc_html__( 'Mongolian tögrög', 'opalestate-pro' ), + 'MOP' => esc_html__( 'Macanese pataca', 'opalestate-pro' ), + 'MRO' => esc_html__( 'Mauritanian ouguiya', 'opalestate-pro' ), + 'MUR' => esc_html__( 'Mauritian rupee', 'opalestate-pro' ), + 'MVR' => esc_html__( 'Maldivian rufiyaa', 'opalestate-pro' ), + 'MWK' => esc_html__( 'Malawian kwacha', 'opalestate-pro' ), + 'MXN' => esc_html__( 'Mexican peso', 'opalestate-pro' ), + 'MYR' => esc_html__( 'Malaysian ringgit', 'opalestate-pro' ), + 'MZN' => esc_html__( 'Mozambican metical', 'opalestate-pro' ), + 'NAD' => esc_html__( 'Namibian dollar', 'opalestate-pro' ), + 'NGN' => esc_html__( 'Nigerian naira', 'opalestate-pro' ), + 'NIO' => esc_html__( 'Nicaraguan córdoba', 'opalestate-pro' ), + 'NOK' => esc_html__( 'Norwegian krone', 'opalestate-pro' ), + 'NPR' => esc_html__( 'Nepalese rupee', 'opalestate-pro' ), + 'NZD' => esc_html__( 'New Zealand dollar', 'opalestate-pro' ), + 'OMR' => esc_html__( 'Omani rial', 'opalestate-pro' ), + 'PAB' => esc_html__( 'Panamanian balboa', 'opalestate-pro' ), + 'PEN' => esc_html__( 'Peruvian nuevo sol', 'opalestate-pro' ), + 'PGK' => esc_html__( 'Papua New Guinean kina', 'opalestate-pro' ), + 'PHP' => esc_html__( 'Philippine peso', 'opalestate-pro' ), + 'PKR' => esc_html__( 'Pakistani rupee', 'opalestate-pro' ), + 'PLN' => esc_html__( 'Polish złoty', 'opalestate-pro' ), + 'PRB' => esc_html__( 'Transnistrian ruble', 'opalestate-pro' ), + 'PYG' => esc_html__( 'Paraguayan guaraní', 'opalestate-pro' ), + 'QAR' => esc_html__( 'Qatari riyal', 'opalestate-pro' ), + 'RON' => esc_html__( 'Romanian leu', 'opalestate-pro' ), + 'RSD' => esc_html__( 'Serbian dinar', 'opalestate-pro' ), + 'RUB' => esc_html__( 'Russian ruble', 'opalestate-pro' ), + 'RWF' => esc_html__( 'Rwandan franc', 'opalestate-pro' ), + 'SAR' => esc_html__( 'Saudi riyal', 'opalestate-pro' ), + 'SBD' => esc_html__( 'Solomon Islands dollar', 'opalestate-pro' ), + 'SCR' => esc_html__( 'Seychellois rupee', 'opalestate-pro' ), + 'SDG' => esc_html__( 'Sudanese pound', 'opalestate-pro' ), + 'SEK' => esc_html__( 'Swedish krona', 'opalestate-pro' ), + 'SGD' => esc_html__( 'Singapore dollar', 'opalestate-pro' ), + 'SHP' => esc_html__( 'Saint Helena pound', 'opalestate-pro' ), + 'SLL' => esc_html__( 'Sierra Leonean leone', 'opalestate-pro' ), + 'SOS' => esc_html__( 'Somali shilling', 'opalestate-pro' ), + 'SRD' => esc_html__( 'Surinamese dollar', 'opalestate-pro' ), + 'SSP' => esc_html__( 'South Sudanese pound', 'opalestate-pro' ), + 'STD' => esc_html__( 'São Tomé and Príncipe dobra', 'opalestate-pro' ), + 'SYP' => esc_html__( 'Syrian pound', 'opalestate-pro' ), + 'SZL' => esc_html__( 'Swazi lilangeni', 'opalestate-pro' ), + 'THB' => esc_html__( 'Thai baht', 'opalestate-pro' ), + 'TJS' => esc_html__( 'Tajikistani somoni', 'opalestate-pro' ), + 'TMT' => esc_html__( 'Turkmenistan manat', 'opalestate-pro' ), + 'TND' => esc_html__( 'Tunisian dinar', 'opalestate-pro' ), + 'TOP' => esc_html__( 'Tongan paʻanga', 'opalestate-pro' ), + 'TRY' => esc_html__( 'Turkish lira', 'opalestate-pro' ), + 'TTD' => esc_html__( 'Trinidad and Tobago dollar', 'opalestate-pro' ), + 'TWD' => esc_html__( 'New Taiwan dollar', 'opalestate-pro' ), + 'TZS' => esc_html__( 'Tanzanian shilling', 'opalestate-pro' ), + 'UAH' => esc_html__( 'Ukrainian hryvnia', 'opalestate-pro' ), + 'UGX' => esc_html__( 'Ugandan shilling', 'opalestate-pro' ), + 'USD' => esc_html__( 'United States dollar', 'opalestate-pro' ), + 'UYU' => esc_html__( 'Uruguayan peso', 'opalestate-pro' ), + 'UZS' => esc_html__( 'Uzbekistani som', 'opalestate-pro' ), + 'VEF' => esc_html__( 'Venezuelan bolívar', 'opalestate-pro' ), + 'VND' => esc_html__( 'Vietnamese đồng', 'opalestate-pro' ), + 'VUV' => esc_html__( 'Vanuatu vatu', 'opalestate-pro' ), + 'WST' => esc_html__( 'Samoan tālā', 'opalestate-pro' ), + 'XAF' => esc_html__( 'Central African CFA franc', 'opalestate-pro' ), + 'XCD' => esc_html__( 'East Caribbean dollar', 'opalestate-pro' ), + 'XOF' => esc_html__( 'West African CFA franc', 'opalestate-pro' ), + 'XPF' => esc_html__( 'CFP franc', 'opalestate-pro' ), + 'YER' => esc_html__( 'Yemeni rial', 'opalestate-pro' ), + 'ZAR' => esc_html__( 'South African rand', 'opalestate-pro' ), + 'ZMW' => esc_html__( 'Zambian kwacha', 'opalestate-pro' ), + ]; + + return apply_filters( 'opalestate_currencies', $currencies ); +} + +/** + * Get the price format depending on the currency position + * + * @return string + */ +function opalestate_price_format_position() { + global $opalestate_options; + $currency_pos = opalestate_options( 'currency_position', 'before' ); + + $format = '%1$s%2$s'; + switch ( $currency_pos ) { + case 'before' : + $format = '%1$s%2$s'; + break; + case 'after' : + $format = '%2$s%1$s'; + break; + case 'left_space' : + $format = '%1$s %2$s'; + break; + case 'right_space' : + $format = '%2$s %1$s'; + break; + } + + return apply_filters( 'opalestate_price_format_position', $format, $currency_pos ); +} + +/** + * Price format. + * + * @param string $price + * @param array $args + * @return mixed|void + */ +function opalestate_price_format( $price, $args = [] ) { + + $price = opalestate_price( $price, $args ); + $price = sprintf( opalestate_price_format_position(), opalestate_currency_symbol(), $price ); + + return apply_filters( 'opalestate_price_format', $price ); +} + +function opalestate_get_currency() { + return opalestate_options( 'currency', 'USD' ); +} + +/** + * Gets currency symbol + * + * @param string $currency + * @return string + */ +function opalestate_currency_symbol( $currency = '' ) { + if ( ! $currency ) { + $currency = opalestate_get_currency(); + } + + $symbols = apply_filters( 'opalestate_currency_symbols', [ + 'AED' => 'د.إ', + 'AFN' => '؋', + 'ALL' => 'L', + 'AMD' => 'AMD', + 'ANG' => 'ƒ', + 'AOA' => 'Kz', + 'ARS' => '$', + 'AUD' => '$', + 'AWG' => 'ƒ', + 'AZN' => 'AZN', + 'BAM' => 'KM', + 'BBD' => '$', + 'BDT' => '৳ ', + 'BGN' => 'лв.', + 'BHD' => '.د.ب', + 'BIF' => 'Fr', + 'BMD' => '$', + 'BND' => '$', + 'BOB' => 'Bs.', + 'BRL' => 'R$', + 'BSD' => '$', + 'BTC' => '฿', + 'BTN' => 'Nu.', + 'BWP' => 'P', + 'BYR' => 'Br', + 'BZD' => '$', + 'CAD' => '$', + 'CDF' => 'Fr', + 'CHF' => 'CHF', + 'CLP' => '$', + 'CNY' => '¥', + 'COP' => '$', + 'CRC' => '₡', + 'CUC' => '$', + 'CUP' => '$', + 'CVE' => '$', + 'CZK' => 'Kč', + 'DJF' => 'Fr', + 'DKK' => 'DKK', + 'DOP' => 'RD$', + 'DZD' => 'د.ج', + 'EGP' => 'EGP', + 'ERN' => 'Nfk', + 'ETB' => 'Br', + 'EUR' => '€', + 'FJD' => '$', + 'FKP' => '£', + 'GBP' => '£', + 'GEL' => 'ლ', + 'GGP' => '£', + 'GHS' => '₵', + 'GIP' => '£', + 'GMD' => 'D', + 'GNF' => 'Fr', + 'GTQ' => 'Q', + 'GYD' => '$', + 'HKD' => '$', + 'HNL' => 'L', + 'HRK' => 'Kn', + 'HTG' => 'G', + 'HUF' => 'Ft', + 'IDR' => 'Rp', + 'ILS' => '₪', + 'IMP' => '£', + 'INR' => '₹', + 'IQD' => 'ع.د', + 'IRR' => '﷼', + 'ISK' => 'Kr.', + 'JEP' => '£', + 'JMD' => '$', + 'JOD' => 'د.ا', + 'JPY' => '¥', + 'KES' => 'KSh', + 'KGS' => 'лв', + 'KHR' => '៛', + 'KMF' => 'Fr', + 'KPW' => '₩', + 'KRW' => '₩', + 'KWD' => 'د.ك', + 'KYD' => '$', + 'KZT' => 'KZT', + 'LAK' => '₭', + 'LBP' => 'ل.ل', + 'LKR' => 'රු', + 'LRD' => '$', + 'LSL' => 'L', + 'LYD' => 'ل.د', + 'MAD' => 'د. م.', + 'MAD' => 'د.م.', + 'MDL' => 'L', + 'MGA' => 'Ar', + 'MKD' => 'ден', + 'MMK' => 'Ks', + 'MNT' => '₮', + 'MOP' => 'P', + 'MRO' => 'UM', + 'MUR' => '₨', + 'MVR' => '.ރ', + 'MWK' => 'MK', + 'MXN' => '$', + 'MYR' => 'RM', + 'MZN' => 'MT', + 'NAD' => '$', + 'NGN' => '₦', + 'NIO' => 'C$', + 'NOK' => 'kr', + 'NPR' => '₨', + 'NZD' => '$', + 'OMR' => 'ر.ع.', + 'PAB' => 'B/.', + 'PEN' => 'S/.', + 'PGK' => 'K', + 'PHP' => '₱', + 'PKR' => '₨', + 'PLN' => 'zł', + 'PRB' => 'р.', + 'PYG' => '₲', + 'QAR' => 'ر.ق', + 'RMB' => '¥', + 'RON' => 'lei', + 'RSD' => 'дин.', + 'RUB' => '₽', + 'RWF' => 'Fr', + 'SAR' => 'ر.س', + 'SBD' => '$', + 'SCR' => '₨', + 'SDG' => 'ج.س.', + 'SEK' => 'kr', + 'SGD' => '$', + 'SHP' => '£', + 'SLL' => 'Le', + 'SOS' => 'Sh', + 'SRD' => '$', + 'SSP' => '£', + 'STD' => 'Db', + 'SYP' => 'ل.س', + 'SZL' => 'L', + 'THB' => '฿', + 'TJS' => 'ЅМ', + 'TMT' => 'm', + 'TND' => 'د.ت', + 'TOP' => 'T$', + 'TRY' => '₺', + 'TTD' => '$', + 'TWD' => 'NT$', + 'TZS' => 'Sh', + 'UAH' => '₴', + 'UGX' => 'UGX', + 'USD' => '$', + 'UYU' => '$', + 'UZS' => 'UZS', + 'VEF' => 'Bs F', + 'VND' => '₫', + 'VUV' => 'Vt', + 'WST' => 'T', + 'XAF' => 'Fr', + 'XCD' => '$', + 'XOF' => 'Fr', + 'XPF' => 'Fr', + 'YER' => '﷼', + 'ZAR' => 'R', + 'ZMW' => 'ZK', + ] ); + + $currency_symbol = isset( $symbols[ $currency ] ) ? $symbols[ $currency ] : ''; + + return apply_filters( 'opalestate_currency_symbol', $currency_symbol, $currency ); +} + +/** + * Return the thousand separator for prices + * + * @return string + */ +function opalestate_get_price_thousand_separator() { + $separator = stripslashes( opalestate_options( 'thousands_separator' ) ); + + return $separator; +} + +/** + * Return the decimal separator for prices + * + * @return string + */ +function opalestate_get_price_decimal_separator() { + $separator = stripslashes( opalestate_options( 'decimal_separator', '.' ) ); + + return $separator ? $separator : '.'; +} + +/** + * Return the number of decimals after the decimal point. + * + * @return int + */ +function opalestate_get_price_decimals() { + return absint( opalestate_options( 'number_decimals', 2 ) ); +} + + +/** + * Returns Price. + * + * @param int $price + * @param array $args + * @return bool|mixed|string|void + */ +function opalestate_price( $price, $args = [] ) { + + $negative = $price < 0; + + if ( $negative ) { + $price = substr( $price, 1 ); + } + + + extract( apply_filters( 'opalestate_price_args', wp_parse_args( $args, [ + 'ex_tax_label' => false, + 'decimal_separator' => opalestate_get_price_decimal_separator(), + 'thousand_separator' => opalestate_get_price_thousand_separator(), + 'decimals' => opalestate_get_price_decimals(), + + ] ) ) ); + + $negative = $price < 0; + $price = apply_filters( 'opalestate_raw_price', floatval( $negative ? $price * -1 : $price ) ); + $price = apply_filters( 'opalestate_formatted_price', number_format( $price, $decimals, $decimal_separator, $thousand_separator ), $price, $decimals, $decimal_separator, $thousand_separator ); + + return $price; +} + +/** + * + * Applyer function to show unit for property + */ + +function opalestate_areasize_unit_format( $value = '' ) { + return $value . ' ' . '' . opalestate_options( 'measurement_unit', 'sq ft' ) . ''; +} + +add_filter( 'opalestate_areasize_unit_format', 'opalestate_areasize_unit_format' ); + +/** + * + * Applyer function to show unit for property + */ +if ( ! function_exists( 'opalestate_fnc_excerpt' ) ) { + //Custom Excerpt Function + function opalestate_fnc_excerpt( $limit, $afterlimit = '[...]' ) { + $excerpt = get_the_excerpt(); + + return opalestate_fnc_get_words( $excerpt, $limit, $afterlimit ); + } +} + +function opalestate_fnc_get_words( $excerpt, $limit, $afterlimit = '...' ) { + if ( $excerpt != '' ) { + $excerpt = explode( ' ', strip_tags( $excerpt ), $limit ); + } else { + $excerpt = explode( ' ', strip_tags( get_the_content() ), $limit ); + } + if ( count( $excerpt ) >= $limit ) { + array_pop( $excerpt ); + $excerpt = implode( " ", $excerpt ) . ' ' . $afterlimit; + } else { + $excerpt = implode( " ", $excerpt ); + } + $excerpt = preg_replace( '`[[^]]*]`', '', $excerpt ); + + return strip_shortcodes( $excerpt ); +} + +/** + * + */ +function opalestate_is_own_property( $post_id, $user_id ) { + $post = get_post( $post_id ); + wp_reset_postdata(); + if ( ! is_object( $post ) || ! $post->ID ) { + return false; + } + + return $user_id == $post->post_author; +} + + +if ( ! function_exists( 'opalesate_insert_user_agent' ) ) { + + function opalesate_insert_user_agent( $args = [] ) { + $userdata = wp_parse_args( $args, [ + 'first_name' => '', + 'last_name' => '', + 'avatar' => '', + 'job' => '', + 'email' => '', + 'phone' => '', + 'mobile' => '', + 'fax' => '', + 'web' => '', + 'address' => '', + 'twitter' => '', + 'facebook' => '', + 'google' => '', + 'linkedin' => '', + 'instagram' => '', + ] ); + + $agent_id = wp_insert_post( [ + 'post_title' => $args['first_name'] && $args['last_name'] ? $args['first_name'] . ' ' . $args['last_name'] : $userdata['email'], + 'post_content' => 'empty description', + 'post_excerpt' => 'empty excerpt', + 'post_type' => 'opalestate_agent', + 'post_status' => 'publish', + 'post_author' => 1, + ], true ); + + foreach ( $userdata as $key => $value ) { + if ( in_array( $key, [ 'first_name', 'last_name' ] ) ) { + continue; + } + update_post_meta( $agent_id, OPALESTATE_AGENT_PREFIX . $key, $value ); + } + do_action( 'opalesate_insert_user_agent', $agent_id ); + + return $agent_id; + } +} + +/** + * Returns the multilingual instance. + * + * @return Opalestate_Multilingual + */ +function opalestate_multilingual() { + $multilingual = new Opalestate_Multilingual(); + + return $multilingual; +} + +/** + * Is current WordPress is running on multi-languages. + * + * @return bool + */ +function opalestate_running_on_multilanguage() { + return apply_filters( 'opalestate_is_running_multilanguage', Opalestate_Multilingual::is_polylang() || Opalestate_Multilingual::is_wpml() ); +} + +/** + * Add hidden multilingual. + */ +function opalestate_add_hidden_multilingual() { + if ( ! opalestate_running_on_multilanguage() ) { + return; + } + ?> + + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Property_MetaBox { + + /** + * + */ + public function register_admin_fields() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + $box_options = [ + 'id' => 'property_metabox', + 'title' => esc_html__( 'Property Metabox', 'opalestate-pro' ), + 'object_types' => [ 'opalestate_property' ], + 'show_names' => true, + ]; + + // Setup meta box + $cmb = new_cmb2_box( $box_options ); + + // Setting tabs + $tabs_setting = [ + 'config' => $box_options, + 'layout' => 'vertical', // Default : horizontal + 'tabs' => [], + ]; + + + $tabs_setting['tabs'][] = [ + 'id' => 'p-general', + 'icon' => 'dashicons-admin-home', + 'title' => esc_html__( 'General', 'opalestate-pro' ), + 'fields' => $this->metaboxes_management_fields(), + ]; + + $tabs_setting['tabs'][] = [ + 'id' => 'p-prices', + 'icon' => 'dashicons-admin-tools', + 'title' => esc_html__( 'Prices', 'opalestate-pro' ), + 'fields' => $this->metaboxes_price_fields(), + ]; + + $tabs_setting['tabs'][] = [ + 'id' => 'p-information', + 'icon' => 'dashicons-admin-post', + 'title' => esc_html__( 'Information', 'opalestate-pro' ), + 'fields' => $this->metaboxes_info_fields(), + ]; + + $tabs_setting['tabs'][] = [ + 'id' => 'p-facilities', + 'icon' => 'dashicons-grid-view', + 'title' => esc_html__( 'Facility', 'opalestate-pro' ), + 'fields' => $this->metaboxes_public_facilities_fields(), + ]; + + + $tabs_setting['tabs'][] = [ + 'id' => 'p-floor-plans', + 'icon' => 'dashicons-grid-view', + 'title' => esc_html__( 'Floor Plan', 'opalestate-pro' ), + 'fields' => $this->metaboxes_floor_plans(), + ]; + + $tabs_setting['tabs'][] = [ + 'id' => 'p-apartments', + 'icon' => 'dashicons-admin-multisite', + 'title' => esc_html__( 'Apartments', 'opalestate-pro' ), + 'fields' => $this->metaboxes_apartments(), + ]; + + //// + $tabs_setting['tabs'][] = [ + 'id' => 'p-gallery', + 'icon' => 'dashicons-format-gallery', + 'title' => esc_html__( 'Gallery', 'opalestate-pro' ), + 'fields' => [ + [ + 'id' => "{$prefix}gallery", + 'name' => esc_html__( 'Images Gallery', 'opalestate-pro' ), + 'type' => 'file_list', + 'description' => esc_html__( 'Select one or more images to show as gallery', 'opalestate-pro' ), + ], + ], + ]; + /// + $tabs_setting['tabs'][] = [ + 'id' => 'p-vt_gallery', + 'title' => esc_html__( 'Virtual Tour 360', 'opalestate-pro' ), + 'icon' => 'dashicons-format-image', + 'fields' => [ + [ + 'id' => "{$prefix}vt_gallery", + 'name' => esc_html__( 'Manual Images 360 ', 'opalestate-pro' ), + 'type' => 'opal_upload', + 'description' => esc_html__( 'Select one or more images to show as gallery', 'opalestate-pro' ), + ], + [ + 'id' => "{$prefix}virtual", + 'name' => esc_html__( 'Or 360° Virtual Tour', 'opalestate-pro' ), + 'type' => 'textarea_code', + 'description' => esc_html__( 'Input iframe to show 360° Virtual Tour.', 'opalestate-pro' ), + ], + ], + ]; + + /// + $tabs_setting['tabs'][] = [ + 'id' => 'p-attachments', + 'icon' => 'dashicons-media-default', + 'title' => esc_html__( 'Attachments', 'opalestate-pro' ), + 'fields' => [ + [ + 'id' => "{$prefix}attachments", + 'name' => esc_html__( 'Attachments', 'opalestate-pro' ), + 'type' => 'file_list', + 'options' => [ + 'url' => false, // Hide the text input for the url + ], + 'description' => esc_html__( 'Select one or more files to allow download', 'opalestate-pro' ), + ], + ], + ]; + + $tabs_setting['tabs'][] = [ + 'id' => 'p-agents', + 'icon' => 'dashicons-admin-users', + 'title' => esc_html__( 'Contact Member', 'opalestate-pro' ), + 'fields' => $this->metaboxes_members_fields(), + ]; + + $tabs_setting['tabs'][] = [ + 'id' => 'p-assignment', + 'icon' => 'dashicons-admin-users', + 'title' => esc_html__( 'User Assignment', 'opalestate-pro' ), + 'fields' => $this->metaboxes_assignment_fields(), + ]; + + $tabs_setting['tabs'][] = [ + 'id' => 'p-layout', + 'title' => esc_html__( 'Layout', 'opalestate-pro' ), + 'fields' => $this->metaboxes_layout_fields(), + ]; + + // Set tabs + $cmb->add_field( [ + 'id' => '__tabs', + 'type' => 'tabs', + 'tabs' => $tabs_setting, + ] ); + + return true; + } + + /** + * + */ + public function metaboxes_management_fields() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + $fields = [ + [ + 'name' => esc_html__( 'Featured', 'opalestate-pro' ), + 'id' => $prefix . 'featured', + 'type' => 'switch', + 'options' => [ + 0 => esc_html__( 'No', 'opalestate-pro' ), + 1 => esc_html__( 'Yes', 'opalestate-pro' ), + ], + 'default' => 0, + ], + [ + 'name' => esc_html__( 'Property SKU', 'opalestate-pro' ), + 'id' => $prefix . 'sku', + 'type' => 'text', + 'description' => esc_html__( 'Please Enter Your Property SKU', 'opalestate-pro' ), + ], + [ + 'id' => $prefix . 'map', + 'name' => esc_html__( 'Location', 'opalestate-pro' ), + 'type' => 'opal_map', + 'sanitization_cb' => 'opal_map_sanitise', + 'split_values' => true, + ], + + [ + 'name' => esc_html__( 'Postal Code / Zip', 'opalestate-pro' ), + 'id' => $prefix . 'zipcode', + 'type' => 'text', + + ], + [ + 'name' => esc_html__( 'Google Map View', 'opalestate-pro' ), + 'id' => $prefix . 'enablemapview', + 'type' => 'switch', + 'options' => [ + 1 => esc_html__( 'Yes', 'opalestate-pro' ), + 0 => esc_html__( 'No', 'opalestate-pro' ), + ], + ], + + [ + 'name' => esc_html__( 'Address', 'opalestate-pro' ), + 'id' => $prefix . 'address', + 'type' => 'textarea_small', + 'attributes' => [ + 'required' => 'required', + ], + ], + + + [ + 'id' => "{$prefix}video", + 'name' => esc_html__( 'Video', 'opalestate-pro' ), + 'type' => 'text_url', + 'description' => esc_html__( 'Input for videos, audios from Youtube, Vimeo and all supported sites by WordPress. It has preview feature.', 'opalestate-pro' ), + ], + ]; + + return apply_filters( 'opalestate_postype_property_metaboxes_fields_management', $fields ); + } + + /** + * + */ + public function metaboxes_price_fields() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + + $currency = opalestate_currency_symbol() ? ' (' . opalestate_currency_symbol() . ')' : ' ($)'; + + $fields = [ + [ + 'id' => $prefix . 'price', + 'name' => esc_html__( 'Regular Price', 'opalestate-pro' ) . $currency, + 'type' => 'text', + 'description' => esc_html__( 'Enter amount without currency', 'opalestate-pro' ), + 'attributes' => opalestate_get_option( 'require_input_price' ) ? [ 'required' => 'required' ] : '', + 'before_row' => '

            ' . ( is_admin() ? "" : esc_html__( 'Price', 'opalestate-pro' ) ) . '

            ', // callback + ], + [ + 'id' => $prefix . 'saleprice', + 'name' => esc_html__( 'Sale Price', 'opalestate-pro' ) . $currency, + 'type' => 'text', + 'description' => esc_html__( 'Enter amount without currency', 'opalestate-pro' ), + ], + [ + 'id' => $prefix . 'before_pricelabel', + 'name' => esc_html__( 'Before Price Label (optional)', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'Before Price Label (e.g. "from")', 'opalestate-pro' ), + ], + [ + 'id' => $prefix . 'pricelabel', + 'name' => esc_html__( 'After Price Label (optional)', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'After Price Label (e.g. "per month")', 'opalestate-pro' ), + 'after_row' => '
            ', // callback + ], + [ + 'name' => esc_html__( 'Is Price On Call', 'opalestate-pro' ), + 'id' => $prefix . 'price_oncall', + 'type' => 'switch', + 'options' => [ + 0 => esc_html__( 'No', 'opalestate-pro' ), + 1 => esc_html__( 'Yes', 'opalestate-pro' ), + ], + 'default' => 0, + ], + + ]; + + return apply_filters( 'opalestate_postype_property_metaboxes_fields_price', $fields ); + } + + /** + * + */ + public static function metaboxes_info_fields() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + + $fields = [ + + [ + 'name' => esc_html__( 'Built year', 'opalestate-pro' ), + 'id' => $prefix . 'builtyear', + 'type' => 'text_date', + 'description' => esc_html__( 'Enter built year', 'opalestate-pro' ), + + 'before_row' => '

            ' . ( is_admin() ? "" : esc_html__( 'Property Information', 'opalestate-pro' ) ) . '

            ', + // callback + + ], + + [ + 'name' => esc_html__( 'Parking', 'opalestate-pro' ), + 'id' => $prefix . 'parking', + 'type' => 'text', + 'attributes' => [ + 'type' => 'number', + 'min' => 0, + ], + 'description' => esc_html__( 'Enter number of Parking', 'opalestate-pro' ), + ], + + [ + 'name' => esc_html__( 'Bedrooms', 'opalestate-pro' ), + 'id' => $prefix . 'bedrooms', + 'type' => 'text', + 'attributes' => [ + 'type' => 'number', + 'min' => 0, + ], + 'description' => esc_html__( 'Enter number of bedrooms', 'opalestate-pro' ), + ], + [ + 'name' => esc_html__( 'Bathrooms', 'opalestate-pro' ), + 'id' => $prefix . 'bathrooms', + 'type' => 'text', + 'attributes' => [ + 'type' => 'number', + 'min' => 0, + ], + 'description' => esc_html__( 'Enter number of bathrooms', 'opalestate-pro' ), + ], + [ + 'name' => esc_html__( 'Plot Size', 'opalestate-pro' ), + 'id' => $prefix . 'plotsize', + 'type' => 'text', + 'description' => esc_html__( 'Enter size of Plot as 20x30, 20x30x40, 20x30x40x50', 'opalestate-pro' ), + ], + [ + 'name' => esc_html__( 'Area Size', 'opalestate-pro' ), + 'id' => $prefix . 'areasize', + 'type' => 'text', + 'description' => esc_html__( 'Enter size of area in sqft', 'opalestate-pro' ), + ], + [ + 'name' => esc_html__( 'Orientation', 'opalestate-pro' ), + 'id' => "{$prefix}orientation", + 'type' => 'text', + 'description' => esc_html__( 'Enter Orientation of property', 'opalestate-pro' ), + ], + + [ + 'name' => esc_html__( 'Living Rooms', 'opalestate-pro' ), + 'id' => "{$prefix}livingrooms", + 'type' => 'text', + 'attributes' => [ + 'type' => 'number', + 'min' => 0, + ], + 'description' => esc_html__( 'Enter Number of Living Rooms', 'opalestate-pro' ), + ], + + [ + 'name' => esc_html__( 'Kitchens', 'opalestate-pro' ), + 'id' => "{$prefix}kitchens", + 'type' => 'text', + 'attributes' => [ + 'type' => 'number', + 'min' => 0, + ], + 'description' => esc_html__( 'Enter Number of Kitchens', 'opalestate-pro' ), + ], + + [ + 'name' => esc_html__( 'Rooms', 'opalestate-pro' ), + 'id' => "{$prefix}amountrooms", + 'type' => 'text', + 'attributes' => [ + 'type' => 'number', + 'min' => 0, + ], + 'description' => esc_html__( 'Enter Number of Amount Rooms', 'opalestate-pro' ), + + 'after_row' => '
            ', + + ], + ]; + + return apply_filters( 'opalestate_postype_property_metaboxes_fields_info', $fields ); + } + + /** + * + */ + public function metaboxes_public_facilities_fields() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + $fields = [ + [ + 'id' => $prefix . 'public_facilities_group', + 'type' => 'group', + 'fields' => [ + [ + 'id' => $prefix . 'public_facilities_key', + 'name' => esc_html__( 'Label', 'opalestate-pro' ), + 'type' => 'text', + ], + [ + 'id' => $prefix . 'public_facilities_value', + 'name' => esc_html__( 'Content', 'opalestate-pro' ), + 'type' => 'text', + ], + ], + 'options' => [ + 'group_title' => esc_html__( 'Facility {#}', 'opalestate-pro' ), + 'add_button' => esc_html__( 'Add more', 'opalestate-pro' ), + 'remove_button' => esc_html__( 'Remove', 'opalestate-pro' ), + 'sortable' => true, + 'closed' => false, + ], + ], + ]; + + return apply_filters( 'opalestate_postype_property_metaboxes_fields_public_facilities', $fields ); + } + + /** + * + */ + public function metaboxes_members_fields() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + global $post; + + $types = [ + 'hide' => esc_html__( 'Hide Author Information', 'opalestate-pro' ), + 'user' => esc_html__( 'User Author Information', 'opalestate-pro' ), + 'agent' => esc_html__( 'Agent Information', 'opalestate-pro' ), + 'agency' => esc_html__( 'Agency Information', 'opalestate-pro' ), + ]; + + // agent + $agents = [ + 0 => esc_html__( 'No', 'opalestate-pro' ), + ]; + if ( isset( $_GET['post'] ) && $_GET['post'] ) { + $id = get_post_meta( (int) $_GET['post'], OPALESTATE_PROPERTY_PREFIX . 'agent', true ); + if ( $id ) { + $agents[ $id ] = get_the_title( $id ); + } + } + // agency + $agency = [ + 0 => esc_html__( 'No', 'opalestate-pro' ), + ]; + if ( isset( $_GET['post'] ) && $_GET['post'] ) { + $id = get_post_meta( (int) $_GET['post'], OPALESTATE_PROPERTY_PREFIX . 'agency', true ); + if ( $id ) { + $agency[ $id ] = get_the_title( $id ); + } + } + + $fields = [ + [ + 'name' => esc_html__( 'Author Information', 'opalestate-pro' ), + 'id' => "{$prefix}author_type", + 'type' => 'select', + 'options' => $types, + 'default' => 'user', + ], + [ + 'name' => esc_html__( 'Agent', 'opalestate-pro' ), + 'id' => "{$prefix}agent", + 'type' => 'select', + 'options' => $agents, + ], + [ + 'name' => esc_html__( 'Agency', 'opalestate-pro' ), + 'id' => "{$prefix}agency", + 'type' => 'select', + 'options' => $agency, + ], + ]; + + return apply_filters( 'opalestate_postype_property_metaboxes_fields_agent', $fields ); + } + + /** + * + */ + public function metaboxes_assignment_fields() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + global $post; + + // users + $users = [ + 0 => esc_html__( 'Default User', 'opalestate-pro' ), + ]; + + $all_users = get_users(); + + foreach ( $all_users as $user ) { + $users[ $user->ID ] = $user->display_name; + } + + $fields = [ + [ + 'name' => esc_html__( 'User', 'opalestate-pro' ), + 'id' => "post_author_override", + 'type' => 'select', + "description" => esc_html__( 'Change to new owner of this property, which be listed in That user dashboard', 'opalestate-pro' ), + 'options' => $users, + ], + ]; + + return apply_filters( 'opalestate_postype_property_metaboxes_fields_assignment', $fields ); + } + + /** + * + */ + public function metaboxes_layout_fields() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + + $templates = opalestate_single_layout_prieview(); + + $fields = [ + [ + 'name' => esc_html__( 'Layout Display', 'opalestate-pro' ), + 'id' => "{$prefix}layout", + 'type' => 'select', + 'options' => apply_filters( 'opalestate_single_layout_templates', [ '' => esc_html__( 'Inherit', 'opalestate-pro' ) ] ), + 'description' => esc_html__( 'Select a layout to display full information of this property', 'opalestate-pro' ), + ], + + [ + 'name' => esc_html__( 'Preview Display', 'opalestate-pro' ), + 'id' => "{$prefix}preview", + 'type' => 'select', + 'options' => $templates, + 'description' => esc_html__( 'Select a layout to display full information of this property', 'opalestate-pro' ), + ], + ]; + + return apply_filters( 'opalestate_postype_property_metaboxes_fields_layout', $fields ); + } + + /** + * + */ + public function metaboxes_floor_plans() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + $fields = [ + [ + 'id' => $prefix . 'public_floor_group', + 'type' => 'group', + 'fields' => [ + [ + 'id' => $prefix . 'floor_name', + 'name' => esc_html__( 'Name', 'opalestate-pro' ), + 'type' => 'text', + + ], + [ + 'id' => $prefix . 'floor_price', + 'name' => esc_html__( 'Price', 'opalestate-pro' ), + 'before_row' => '
            ', + 'type' => 'text', + ], + [ + 'id' => $prefix . 'floor_size', + 'name' => esc_html__( 'Size', 'opalestate-pro' ), + 'type' => 'text', + ], + [ + 'id' => $prefix . 'floor_room', + 'name' => esc_html__( 'Rooms', 'opalestate-pro' ), + 'type' => 'text', + ], + [ + 'id' => $prefix . 'floor_bath', + 'name' => esc_html__( 'Baths', 'opalestate-pro' ), + 'type' => 'text', + 'after_row' => '
            ', + ], + [ + 'id' => $prefix . 'floor_content', + 'name' => esc_html__( 'Content', 'opalestate-pro' ), + 'type' => 'textarea_small', + ], + [ + 'id' => "{$prefix}floor_image", + 'name' => esc_html__( 'Image Preview', 'opalestate-pro' ), + 'type' => 'file', + 'query_args' => [ + 'type' => [ + 'image/gif', + 'image/jpeg', + 'image/png', + ], + ], + 'description' => esc_html__( 'Input iframe to show 360° Virtual Tour.', 'opalestate-pro' ), + ], + ], + 'options' => [ + 'group_title' => esc_html__( 'Floor {#}', 'opalestate-pro' ), + 'add_button' => esc_html__( 'Add more', 'opalestate-pro' ), + 'remove_button' => esc_html__( 'Remove', 'opalestate-pro' ), + 'sortable' => true, + 'closed' => false, + ], + ], + ]; + + return apply_filters( 'opalestate_postype_property_metaboxes_fields_floor_plans', $fields ); + } + + /** + * + */ + public function metaboxes_apartments() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + $fields = [ + [ + 'id' => $prefix . 'apartments', + 'type' => 'group', + 'fields' => [ + [ + 'id' => $prefix . 'apartment_plot', + 'name' => esc_html__( 'Plot', 'opalestate-pro' ), + 'before_row' => '
            ', + 'type' => 'text', + + ], + [ + 'id' => $prefix . 'apartment_beds', + 'name' => esc_html__( 'Beds', 'opalestate-pro' ), + 'type' => 'text', + ], + [ + 'id' => $prefix . 'apartment_price_from', + 'name' => esc_html__( 'Price from', 'opalestate-pro' ), + 'type' => 'text', + ], + [ + 'id' => $prefix . 'apartment_floor', + 'name' => esc_html__( 'Floor', 'opalestate-pro' ), + 'type' => 'text', + 'after_row' => '
            ', + ], + [ + 'id' => $prefix . 'apartment_building_address', + 'name' => esc_html__( 'Building / Address', 'opalestate-pro' ), + 'type' => 'textarea_small', + ], + [ + 'id' => $prefix . 'apartment_status', + 'name' => esc_html__( 'Status', 'opalestate-pro' ), + 'type' => 'select', + 'options' => apply_filters( 'opalestate_property_apartment_statuses', [ + '' => esc_html__( 'None', 'opalestate-pro' ), + 'available' => esc_html__( 'Available', 'opalestate-pro' ), + 'unavailable' => esc_html__( 'Unavailable', 'opalestate-pro' ), + ] ), + 'before_row' => '
            ', + ], + [ + 'id' => $prefix . 'apartment_link', + 'name' => esc_html__( 'Link', 'opalestate-pro' ), + 'type' => 'text', + 'after_row' => '
            ', + ], + ], + 'options' => [ + 'group_title' => esc_html__( 'Apartment {#}', 'opalestate-pro' ), + 'add_button' => esc_html__( 'Add more', 'opalestate-pro' ), + 'remove_button' => esc_html__( 'Remove', 'opalestate-pro' ), + 'sortable' => true, + 'closed' => false, + ], + ], + ]; + + return apply_filters( 'opalestate_postype_property_metaboxes_fields_apartments', $fields ); + } +} diff --git a/inc/property/class-opalestate-favorite.php b/inc/property/class-opalestate-favorite.php new file mode 100755 index 00000000..482f7213 --- /dev/null +++ b/inc/property/class-opalestate-favorite.php @@ -0,0 +1,150 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * @class Opalestate_Favorite_Property: work as wishlist function + * + * @version 1.0 + */ +class Opalestate_Favorite_Property{ + + /** + * @var integer $userId + */ + protected $userId ; + + /** + * Get instance of this object + */ + public static function get_instance(){ + static $_instance; + if( !$_instance ){ + $_instance = new Opalestate_Favorite_Property(); + } + return $_instance; + } + + /** + * Constructor + */ + public function __construct(){ + + add_shortcode( 'opalestate_favorite_button' , array( $this, 'favorite_button' ) ); + add_shortcode( 'opalestate_user_favious_properties' , array( $this, 'favorite_properties' ) ); + + /** + * Ajax action + */ + add_action( 'wp_ajax_opalestate_toggle_status', array($this,'toggle_status') ); + add_action( 'wp_ajax_nopriv_opalestate_toggle_status', array($this,'toggle_status') ); + add_action( 'init', array($this,'init') ); + + + // show content page in user dashboard + add_filter( 'opalestate_user_content_favorite_page' , array( $this, 'favorite_properties' ) ); + } + + /** + * Set values when user logined in system + */ + public function init(){ + + global $current_user; + wp_get_current_user(); + $this->userId = $current_user->ID; + } + + /** + * Allow set or remove favorite + */ + public function toggle_status(){ + + if( isset($_POST['property_id']) ){ + + $property_id = absint( $_POST['property_id'] ); + + $items = (array)get_user_meta( $this->userId, 'opalestate_user_favorite', true ); + + $key = array_search( $property_id, $items); + if( $key != false || $key != '' ){ + unset($items[$key]); + }else { + $items[] = $property_id; + } + // remove items emty + foreach( $items as $key => $value ) { + if( empty($value) ) { + unset( $items[$key] ); + } + } + update_user_meta( $this->userId, 'opalestate_user_favorite', $items ); + } + + echo $this->favorite_button( array('property_id' => $property_id ) ); + + exit; + } + + + /** + * render favorite button in loop + */ + public function favorite_button( $atts ){ + $atts['userId'] = $this->userId; + if( !isset($atts['property_id']) ){ + $atts['property_id'] = get_the_ID(); + } + + $items = (array)get_user_meta( $this->userId, 'opalestate_user_favorite', true ); + + $key = array_search( $atts['property_id'], $items); + $atts['existed'] = $key; + + ob_start(); + echo opalestate_load_template_path( 'user/favorite-button' , $atts ); + $ouput = ob_get_contents(); + ob_end_clean(); + + return $ouput; + } + + /** + * show all favorited properties with pagination. + */ + public function favorite_properties(){ + + $paged = ( get_query_var('paged') == 0 ) ? 1 : get_query_var('paged'); + $per_page = 9; + $items = (array)get_user_meta( $this->userId, 'opalestate_user_favorite', true ); + + $args = array( + 'post_type' => 'opalestate_property', + 'paged' => $paged, + 'posts_per_page' => $per_page, + 'post__in' => !empty($items) ? $items : array( 9999999 ) + ); + + $loop = new WP_Query( $args ); + + + return opalestate_load_template_path( 'user/favorite-properties' , array('loop' => $loop) ); + } + +} + +Opalestate_Favorite_Property::get_instance(); diff --git a/inc/property/class-opalestate-posttype.php b/inc/property/class-opalestate-posttype.php new file mode 100755 index 00000000..9d1f81b0 --- /dev/null +++ b/inc/property/class-opalestate-posttype.php @@ -0,0 +1,79 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * Class Opalestate_PostType_Agency + * + * @version 1.0 + */ +class Opalestate_PostType_Property { + + /** + * Opalestate_PostType_Property constructor. + */ + public function __construct() { + add_action( 'init', [ __CLASS__, 'definition' ] ); + } + + /** + * Register Post type and taxonomies + */ + public static function definition() { + if ( ! is_blog_installed() || post_type_exists( 'opalestate_property' ) ) { + return; + } + + $labels = [ + 'name' => esc_html__( 'Properties', 'opalestate-pro' ), + 'singular_name' => esc_html__( 'Property', 'opalestate-pro' ), + 'add_new' => esc_html__( 'Add New Property', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New Property', 'opalestate-pro' ), + 'edit_item' => esc_html__( 'Edit Property', 'opalestate-pro' ), + 'new_item' => esc_html__( 'New Property', 'opalestate-pro' ), + 'all_items' => esc_html__( 'All Properties', 'opalestate-pro' ), + 'view_item' => esc_html__( 'View Property', 'opalestate-pro' ), + 'search_items' => esc_html__( 'Search Property', 'opalestate-pro' ), + 'not_found' => esc_html__( 'No Properties found', 'opalestate-pro' ), + 'not_found_in_trash' => esc_html__( 'No Properties found in Trash', 'opalestate-pro' ), + 'parent_item_colon' => '', + 'menu_name' => esc_html__( 'Properties', 'opalestate-pro' ), + ]; + + $labels = apply_filters( 'opalestate_postype_property_labels', $labels ); + + register_post_type( 'opalestate_property', + apply_filters( 'opalestate_property_post_type_parameters', [ + 'labels' => $labels, + 'supports' => [ 'title', 'editor', 'thumbnail', 'comments', 'author' ], + 'public' => true, + 'has_archive' => true, + 'menu_position' => 51, + 'categories' => [], + 'menu_icon' => 'dashicons-admin-home', + 'map_meta_cap' => true, + 'publicly_queryable' => true, + 'exclude_from_search' => false, + 'query_var' => true, + 'hierarchical' => false, // Hierarchical causes memory issues - WP loads all records! + 'show_in_nav_menus' => true, + 'rewrite' => [ 'slug' => esc_html_x( 'property', 'property slug', 'opalestate-pro' ) ], + ] ) + ); + } +} + +new Opalestate_PostType_Property(); diff --git a/inc/property/class-opalestate-property-query.php b/inc/property/class-opalestate-property-query.php new file mode 100755 index 00000000..a5ec11f0 --- /dev/null +++ b/inc/property/class-opalestate-property-query.php @@ -0,0 +1,71 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Property_Query { + /** + * The args to pass to the give_get_donors() query + * + * @since 1.8.14 + * @access public + * + * @var array + */ + public $args = array(); + + /** + * The collection found based on the criteria set + * + * @since 1.8.14 + * @access public + * + * @var array + */ + + public $count = 0; + + public $collection = array(); + + + public function insert( ) { + + } + + public function update() { + + } + + public function mapping_query(){ + + } + + public function query( $args ){ + $this->count = ''; + $this->collection = ''; + $data = ''; + } + + public function get_list ( $args ){ + return $collection; + } + + public function count() { + + } + + +} \ No newline at end of file diff --git a/inc/property/class-opalestate-property.php b/inc/property/class-opalestate-property.php new file mode 100755 index 00000000..4701d47c --- /dev/null +++ b/inc/property/class-opalestate-property.php @@ -0,0 +1,727 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * @class Opalestate_Property + * + * @version 1.0 + */ +class Opalestate_Property { + + /** + * @var Integer $post_id + * + * @access protected + */ + public $post_id; + + /** + * @var array $metabox_info + * + * @access protected + */ + protected $metabox_info; + + /** + * @var float $price + * + * @access protected + */ + protected $price; + + /** + * @var float $saleprice + * + * @access protected + */ + protected $saleprice; + + /** + * @var String $map + * + * @access protected + */ + protected $map; + + /** + * @var Integer $address + * + * @access protected + */ + public $address; + + /** + * @var String $sku + * + * @access protected + */ + public $sku; + + /** + * @var String $latitude + * + * @access protected + */ + public $latitude; + + /** + * @var String $longitude + * + * @access protected + */ + public $longitude; + + /** + * @var Integer $featured 1 or 0 + * + * @access protected + */ + public $featured; + + /** + * @var array Property page settings $property_settings + * + * @access public + */ + public $property_settings; + + /** + * Constructor + */ + public function __construct( $post_id ) { + $this->post_id = $post_id; + + $this->map = $this->get_metabox_value( 'map' ); + $this->address = $this->get_metabox_value( 'address' ); + $this->price = $this->get_metabox_value( 'price' ); + $this->saleprice = $this->get_metabox_value( 'saleprice' ); + $this->before_pricelabel = $this->get_metabox_value( 'before_pricelabel' ); + $this->pricelabel = $this->get_metabox_value( 'pricelabel' ); + $this->featured = $this->get_metabox_value( 'featured' ); + $this->sku = $this->get_metabox_value( 'sku' ); + + $this->latitude = isset( $this->map['latitude'] ) ? $this->map['latitude'] : ''; + $this->longitude = isset( $this->map['longitude'] ) ? $this->map['longitude'] : ''; + } + + /** + * Get A Instance Of Opalestate_Property + */ + public static function get_instance( $post_id ) { + + static $_instance; + + if ( ! $_instance ) { + $_instance = new Opalestate_Property( $post_id ); + } + + return $_instance; + } + + public function get_block_setting( $key ) { + if ( ! $this->property_settings ) { + $keys = [ + 'amenities', + 'attachments', + 'facilities', + 'video', + 'map', + 'nearby', + 'walkscores', + 'apartments', + 'floor_plans', + 'views_statistics', + ]; + + foreach ( $keys as $key ) { + $this->property_settings[ $key ] = opalestate_get_option( 'enable_single_' . $key, 'on' ); + } + } + + return $this->property_settings[ $key ]; + } + + /** + * Gets Amenities + * + * @access public + * @param string $all + * @return array + */ + public function get_meta_fullinfo() { + if ( empty( $this->metabox_info ) ) { + $fields = Opalestate_Property_MetaBox::metaboxes_info_fields(); + + foreach ( $fields as $a => $field ) { + + $id = str_replace( OPALESTATE_PROPERTY_PREFIX, "", $field['id'] ); + + if ( $field['type'] == 'multicheck' || $field['type'] == 'select' ) { + + $opt_values = (array) get_post_meta( $this->post_id, $field['id'] ); + if ( ! empty( $opt_values ) && isset( $field['options'] ) ) { + $tmp = []; + foreach ( $opt_values as $key => $val ) { + if ( isset( $field['options'][ $val ] ) ) { + $tmp[ $val ] = $field['options'][ $val ]; + } + } + $opt_values = $tmp; + } + $value = implode( ", ", $opt_values ); + } else { + $value = get_post_meta( $this->post_id, $field['id'], true ); + } + + $value = isset( $field['unit'] ) ? $value . ' ' . $field['unit'] : $value; + + $this->metabox_info[ $id ] = [ 'label' => $field['name'], 'value' => $value ]; + } + } + + return $this->metabox_info; + } + + public function get_id() { + return $this->post_id; + } + + /** + * + */ + public function is_featured() { + return $this->featured; + } + + /** + * + */ + public function get_meta_search_objects() { + $prop = new stdClass(); + $map = $this->get_metabox_value( 'map' ); + $image_id = get_post_thumbnail_id( $this->post_id ); + if ( $image_id ) { + $url = wp_get_attachment_url( $image_id, opalestate_options( 'loop_image_size', 'large' ), true ); + } else { + $url = opalestate_get_image_placeholder( apply_filters( 'opalestate_loop_property_thumbnail', 'large' ), true ); + } + + + $prop->id = $this->post_id; + $prop->title = get_the_title(); + $prop->url = get_permalink( $this->post_id ); + + $prop->lat = $map['latitude']; + $prop->lng = $map['longitude']; + $prop->address = $this->address; + + $prop->pricehtml = opalestate_price_format( $this->get_price() ); + $prop->pricelabel = $this->get_price_label(); + $prop->thumb = $url; + + if ( file_exists( get_template_directory() . '/images/map/market_icon.png' ) ) { + $prop->icon = get_template_directory_uri() . '/images/map/market_icon.png'; + } else { + $prop->icon = OPALESTATE_PLUGIN_URL . '/assets/map/market_icon.png'; + } + + + $prop->featured = $this->featured; + + $metas = Opalestate_Property_MetaBox::metaboxes_info_fields(); + + foreach ( $metas as $key => $field ) { + $id = str_replace( OPALESTATE_PROPERTY_PREFIX, "", $field['id'] ); + $prop->$id = get_post_meta( $this->post_id, $field['id'], true ); + } + $metas = $this->get_meta_shortinfo(); + + $prop->metas = $metas; + $prop->status = $this->render_statuses(); + $terms = wp_get_post_terms( $this->post_id, 'opalestate_types' ); + if ( $terms ) { + $term = reset( $terms ); + $icon = get_term_meta( $term->term_id, 'opalestate_type_iconmarker', true ); + if ( $icon ) { + $prop->icon = $icon; + } + } + + return $prop; + } + + /** + * Gets Amenities + * + * @access public + * @param string $all + * @return array + */ + public function get_meta_shortinfo() { + $output = []; + + $meta = opalestate_options( 'show_property_meta' ); + $meta = apply_filters( 'opalestate_property_meta_shortinfo_fields', $meta ); + + if ( ! empty( $meta ) ) { + $fields = $this->get_meta_fullinfo(); + foreach ( $meta as $key => $value ) { + + if ( isset( $fields[ $value ] ) ) { + $output[ $value ] = $fields[ $value ]; + } + } + } + + return $output; + } + + /** + * Gets Amenities + * + * @access public + * @param string $all + * @return array + */ + public function get_amenities( $all = true ) { + + if ( $all ) { + $terms = Opalestate_Query::get_amenities(); + } else { + $terms = wp_get_post_terms( $this->post_id, 'opalestate_amenities' ); + } + + return $terms; + } + + /** + * + */ + public function get_locations() { + $terms = wp_get_post_terms( $this->post_id, 'opalestate_location' ); + + if ( $terms ) { + return $terms; + } + + return []; + } + + /** + * Gets locations + * + * @access public + * @return array + */ + public function render_locations() { + $terms = wp_get_post_terms( $this->post_id, 'opalestate_location' ); + if ( $terms ) { + $output = ''; + foreach ( $terms as $key => $term ) { + $output .= '' . $term->name . ''; + if ( $key < ( count( $terms ) - 1 ) ) { + $output .= ", "; + } + } + $output .= ''; + echo $output; + } + } + + /** + * Gets labels + * + * @access public + * @return array + */ + public function get_labels() { + return wp_get_post_terms( $this->post_id, 'opalestate_label' ); + } + + /** + * Render labels. + * + * @access public + * @return string + */ + public function render_labels() { + $labels = $this->get_labels(); + + if ( empty( $labels ) ) { + return; + } + + $output = '
              '; + foreach ( $labels as $key => $value ) { + $output .= '
            • ' . esc_html( $value->name ) . '
            • '; + } + $output .= '
            '; + + return $output; + } + + /** + * Gets statuses + * + * @access public + * @return array + */ + public function get_status() { + $terms = wp_get_post_terms( $this->post_id, 'opalestate_status' ); + + return $terms; + } + + /** + * Render statuses. + * + * @access public + * @return string + */ + public function render_statuses() { + $statuses = $this->get_status(); + + if ( empty( $statuses ) ) { + return; + } + + $output = '
              '; + foreach ( $statuses as $key => $value ) { + $output .= '
            • ' . esc_html( $value->name ) . '
            • '; + } + $output .= '
            '; + + return $output; + } + + /** + * + */ + public function getAuthor() { + + } + + + public function get_author_type() { + return $this->get_metabox_value( 'author_type' ); + } + + /** + * + */ + public function render_author_link() { + switch ( $this->get_author_type() ) { + + case 'hide': + + return; + break; + + case 'agent': + $agent_id = $this->get_metabox_value( 'agent' ); + $data = OpalEstate_Agent::get_link( $agent_id ); + break; + + case 'agency': + $agency_id = $this->get_metabox_value( 'agency' ); + $data = OpalEstate_Agency::get_link( $agency_id ); + break; + default: + $data = $this->get_author_link(); + break; + } + + $avatar = $data['avatar'] ? $data['avatar'] : opalestate_get_image_avatar_placehold(); + $avatar = '' . $data['name'] . ''; + + return '' . $avatar . '' . $data['name'] . ''; + } + + private function get_author_link() { + + $image_id = get_user_meta( get_the_author_meta( 'ID' ), OPALESTATE_USER_PROFILE_PREFIX . 'avatar_id', true ); + $related_id = get_user_meta( get_the_author_meta( 'ID' ), OPALESTATE_USER_PROFILE_PREFIX . 'related_id', true ); + + if ( $image_id ) { + $url = wp_get_attachment_url( $image_id ); + } else { + $url = get_avatar_url( get_the_author_meta( 'email' ) ); + } + + if ( $related_id ) { + $authorlink = get_permalink( $related_id ); + $author = get_the_title( $related_id ); + } else { + $authorlink = get_author_posts_url( get_the_author_meta( 'ID' ) ); + $author = get_the_author(); + } + + return [ + 'name' => $author, + 'avatar' => $url, + 'link' => $authorlink, + ]; + } + + /** + * Gets status + * + * @access public + * @return array + */ + public function get_category_tax() { + $terms = wp_get_post_terms( $this->post_id, 'property_category' ); + + return $terms; + } + + public function get_types_tax() { + $terms = wp_get_post_terms( $this->post_id, 'opalestate_types' ); + + return $terms; + } + + /** + * Gets meta box value + * + * @access public + * @param $key + * @param $single + * @return string + */ + public function get_metabox_value( $key, $single = true ) { + return get_post_meta( $this->post_id, OPALESTATE_PROPERTY_PREFIX . $key, $single ); + } + + /** + * Gets map value + * + * @access public + * @return string + */ + public function get_map() { + return $this->map; + } + + /** + * Gets address value + * + * @access public + * @return string + */ + public function get_address() { + return $this->address; + } + + /** + * Gets sku value + * + * @access public + * @return string + */ + public function get_sku() { + return $this->sku; + } + + /** + * Gets video url value + * + * @access public + * @return string + */ + + public function get_video_url() { + return $this->get_metabox_value( 'video' ); + } + + /** + * Gets 360 virtual tour value + * + * @access public + * @return string + */ + public function get_virtual_tour() { + return $this->get_metabox_value( 'virtual' ); + } + + /** + * Gets gallery ids value + * + * @access public + * @return array + */ + public function get_gallery() { + return $this->get_metabox_value( 'gallery', true ); + } + + + public function get_gallery_count() { + $count = $this->get_gallery(); + + return count( $count ); + } + + /** + * Gets price value + * + * @access public + * @return string + */ + public function get_price() { + return $this->price; + } + + /** + * Gets sale price value + * + * @access public + * @return string + */ + public function get_sale_price() { + return $this->saleprice; + } + + /** + * Gets price value + * + * @access public + * @return string + */ + public function get_before_price_label() { + return $this->before_pricelabel; + } + + /** + * Gets price value + * + * @access public + * @return string + */ + public function get_price_label() { + return $this->pricelabel; + } + + /** + * Gets price format value + * + * @access public + * @return string + */ + public function get_format_price() { + return $this->get_metabox_value( 'formatprice' ); + } + + public function enable_google_mapview() { + return $this->get_metabox_value( 'enablemapview' ); + } + + public function get_google_map_link() { + $url = 'https://maps.google.com/maps?q=' . $this->address . '&ll=' . $this->latitude . ',' . $this->longitude . '&z=17'; + + return $url; + } + + public static function is_allowed_remove( $user_id, $item_id ) { + $item = get_post( $item_id ); + + if ( ! empty( $item->post_author ) ) { + if ( $item->post_author == $user_id ) { + return true; + } + } + + return false; + } + + public function get_price_oncall() { + return $this->get_metabox_value( 'price_oncall' ); + } + + public function get_facilities() { + return $this->get_metabox_value( 'public_facilities_group' ); + } + + public function get_attachments() { + return $this->get_metabox_value( 'attachments' ); + } + + + public function get_content_single_layout() { + return $this->get_metabox_value( 'layout' ); + } + + public function get_preview_template() { + return $this->get_metabox_value( 'preview' ); + } + + /** + * Get rating count. + * + * @param string $context What the value is for. Valid values are view and edit. + * @return int + */ + public function get_rating_counts() { + return $this->get_metabox_value( 'rating_count' ) ? $this->get_metabox_value( 'rating_count' ) : 0; + } + + /** + * Get average rating. + * + * @param string $context What the value is for. Valid values are view and edit. + * @return float + */ + public function get_average_rating() { + return $this->get_metabox_value( 'average_rating' ) ? $this->get_metabox_value( 'average_rating' ) : 0; + } + + /** + * Get review count. + * + * @param string $context What the value is for. Valid values are view and edit. + * @return int + */ + public function get_review_count() { + return $this->get_metabox_value( 'review_count' ) ? $this->get_metabox_value( 'review_count' ) : 0; + } + + public function get_rating_count_stats() { + return $this->get_metabox_value( 'rating_count_stats' ) ? $this->get_metabox_value( 'rating_count_stats' ) : [ + 5 => 0, + 4 => 0, + 3 => 0, + 2 => 0, + 1 => 0, + ]; + } + + public function get_rating_average_stats() { + return $this->get_metabox_value( 'rating_average_stats' ); + } + + public function get_apartments() { + return $this->get_metabox_value( 'apartments' ); + } + + public function get_floor_plans() { + return $this->get_metabox_value( 'public_floor_group' ); + } + + public function get_posted() { + return human_time_diff( get_the_time( 'U' ), current_time( 'timestamp' ) ) . ' ' . esc_html__( 'ago' ); + } +} diff --git a/inc/property/class-opalestate-query.php b/inc/property/class-opalestate-query.php new file mode 100755 index 00000000..464f4849 --- /dev/null +++ b/inc/property/class-opalestate-query.php @@ -0,0 +1,402 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Query { + + /** + * Set active location + */ + public static $LOCATION; + + /** + * Get Query Object to display list of agents + */ + public static function get_agents( $args = [], $featured = false ) { + $default = [ + 'post_type' => 'opalestate_agent', + 'posts_per_page' => 10, + ]; + + $args = array_merge( $default, $args ); + if ( $featured ) { + $args['meta_key'] = OPALESTATE_AGENT_PREFIX . 'featured'; + $args['meta_value'] = 1; + $args['meta_compare'] = '='; + } + + return new WP_Query( $args ); + } + + /** + * Get Query Object to display list of agents + */ + public static function get_agencies( $args = [], $featured = false ) { + $default = [ + 'post_type' => 'opalestate_agency', + 'posts_per_page' => 10, + ]; + $args = array_merge( $default, $args ); + if ( $featured ) { + $args['meta_key'] = OPALESTATE_AGENCY_PREFIX . 'featured'; + $args['meta_value'] = 1; + $args['meta_compare'] = '='; + } + + return new WP_Query( $args ); + } + + /** + * Get Query Object By post and agent with setting items per page. + */ + public static function get_agency_property( $agency_id = null, $user_id = null, $per_page = 10, $page = null ) { + if ( null == $agency_id ) { + $agency_id = get_the_ID(); + } + + $paged = $page ? $page : ( ( get_query_var( 'paged' ) == 0 ) ? 1 : get_query_var( 'paged' ) ); + + // if this has not any relationship with any user + if ( $user_id ) { + + $author = [ $user_id ]; //echo '
            '.print_r( $post_id, 1 );die;
            +			$team   = get_post_meta( $agency_id, OPALESTATE_AGENCY_PREFIX . 'team', true );
            +
            +			if ( is_array( $team ) ) {
            +				$author = array_merge( $author, $team );
            +			}
            +
            +			$args = [
            +				'post_type'      => 'opalestate_property',
            +				'author__in'     => $author,
            +				'posts_per_page' => $per_page,
            +				'paged'          => $paged,
            +			];
            +		} else {
            +			$agents             = get_post_meta( $agency_id, OPALESTATE_AGENCY_PREFIX . 'team', true );
            +			$args               = [
            +				'post_type'      => 'opalestate_property',
            +				'posts_per_page' => $per_page,
            +				'paged'          => $paged,
            +			];
            +			$args['meta_query'] = [ 'relation' => 'OR' ];
            +			array_push( $args['meta_query'], [
            +				'key'     => OPALESTATE_PROPERTY_PREFIX . 'agency',
            +				'value'   => $agency_id,
            +				'compare' => '=',
            +			] );
            +
            +			if ( $agents ) {
            +				array_push( $args['meta_query'], [
            +					'key'   => OPALESTATE_PROPERTY_PREFIX . 'agent',
            +					'value' => $agents,
            +				] );
            +			}
            +
            +		}
            +
            +		$query = new WP_Query( $args );
            +
            +		return $query;
            +	}
            +
            +	/**
            +	 * Get Query Object By post and agent with setting items per page.
            +	 */
            +	public static function get_agent_property( $post_id = null, $agent_id = null, $per_page = 10, $isfeatured = false ) {
            +		if ( null == $post_id ) {
            +			$post_id = get_the_ID();
            +		}
            +
            +		$user_id = get_post_meta( $post_id, OPALESTATE_AGENT_PREFIX . 'user_id', true );
            +
            +		$paged = ( get_query_var( 'paged' ) == 0 ) ? 1 : get_query_var( 'paged' );
            +
            +		$args = [
            +			'post_type'      => 'opalestate_property',
            +			'posts_per_page' => $per_page,
            +			'post__not_in'   => [ $post_id ],
            +			'paged'          => $paged,
            +		];
            +
            +		$args['meta_query'] = [ 'relation' => 'AND' ];
            +
            +		if ( $user_id ) {
            +			$args['author'] = $user_id;
            +		} else {
            +			array_push( $args['meta_query'], [
            +				'key'     => OPALESTATE_PROPERTY_PREFIX . 'agent',
            +				'value'   => $agent_id,
            +				'compare' => '=',
            +			] );
            +		}
            +
            +		if ( $isfeatured ) {
            +			array_push( $args['meta_query'], [
            +				'key'     => OPALESTATE_PROPERTY_PREFIX . 'featured',
            +				'value'   => 'on',
            +				'compare' => '=',
            +			] );
            +		}
            +		$query = new WP_Query( $args );
            +
            +		return $query;
            +	}
            +
            +	/**
            +	 * Get Query Object to show featured properties with custom setting via Arguments passing.
            +	 */
            +	public static function get_featured_properties_query( $args = [] ) {
            +		$default = [
            +			'post_type'      => 'opalestate_property',
            +			'posts_per_page' => 10,
            +			'meta_key'       => OPALESTATE_PROPERTY_PREFIX . 'featured',
            +			'meta_value'     => 1,
            +			'meta_compare'   => '=',
            +
            +		];
            +
            +		$args = array_merge( $default, $args );
            +
            +		return new WP_Query( $args );
            +	}
            +
            +	/**
            +	 * Set filter location to query when user set his location as global filterable.
            +	 */
            +	public static function set_location( $args ) {
            +		if ( $args && self::$LOCATION ) {
            +			$tax_query         = [
            +				[
            +					'taxonomy' => 'opalestate_location',
            +					'field'    => 'slug',
            +					'terms'    => self::$LOCATION,
            +				],
            +			];
            +			$args['tax_query'] = [ 'relation' => 'AND' ];
            +			$args['tax_query'] = array_merge( $args['tax_query'], $tax_query );
            +		}
            +
            +		return $args;
            +	}
            +
            +	/**
            +	 * Get WP Query Object with custom passing arguments and User request as get data.
            +	 */
            +	public static function get_property_query( $args = [] ) {
            +		$condition = [
            +			'post_type'      => 'opalestate_property',
            +			'posts_per_page' => isset( $args['posts_per_page'] ) ? $args['posts_per_page'] : 5,
            +			'paged'          => isset( $args['paged'] ) ? $args['paged'] : 1,
            +		];
            +
            +		$condition = array_merge( $condition, $args );
            +		$relation  = "AND";
            +
            +		$condition['meta_query'] = [];
            +
            +		$condition['tax_query'] = [
            +			'relation' => $relation,
            +		];
            +
            +		if ( ! empty( $args['categories'] ) ) {
            +			array_push( $condition['tax_query'], [
            +				'taxonomy' => 'property_category',
            +				'terms'    => implode( ',', $args['categories'] ),
            +				'field'    => 'slug',
            +				'operator' => 'IN',
            +			] );
            +		}
            +
            +		if ( ! empty( $args['types'] ) ) {
            +			array_push( $condition['tax_query'], [
            +				'taxonomy' => 'opalestate_types',
            +				'terms'    => $args['types'],
            +				'field'    => 'slug',
            +				'operator' => 'IN',
            +			] );
            +		}
            +
            +
            +		if ( ! empty( $args['statuses'] ) ) {
            +			array_push( $condition['tax_query'], [
            +				'taxonomy' => 'opalestate_status',
            +				'terms'    => $args['statuses'],
            +				'field'    => 'slug',
            +				'operator' => 'IN',
            +			] );
            +		}
            +
            +
            +		if ( ! empty( $args['labels'] ) ) {
            +			array_push( $condition['tax_query'], [
            +				'taxonomy' => 'opalestate_label',
            +				'terms'    => $args['labels'],
            +				'field'    => 'slug',
            +			] );
            +		}
            +
            +		if ( ! empty( $args['cities'] ) ) {
            +			array_push( $condition['tax_query'], [
            +				'taxonomy' => 'opalestate_city',
            +				'terms'    => $args['cities'],
            +				'field'    => 'slug',
            +				'operator' => 'IN',
            +			] );
            +		}
            +
            +		if ( ! empty( $args['showmode'] ) ) {
            +			if ( $args['showmode'] == 'featured' ) {
            +				array_push( $condition['meta_query'], [
            +					'key'     => OPALESTATE_PROPERTY_PREFIX . 'featured',
            +					'value'   => 'on',
            +					'compare' => '=',
            +				] );
            +			} elseif ( $args['showmode'] == 'normal' ) {
            +				array_push( $condition['meta_query'], [
            +					'relation' => 'OR',
            +					[
            +						'key'     => OPALESTATE_PROPERTY_PREFIX . 'featured',
            +						'compare' => 'NOT EXISTS',
            +						'value'   => '' // This is ignored, but is necessary...
            +					],
            +					[
            +						'key'     => OPALESTATE_PROPERTY_PREFIX . 'featured',
            +						'value'   => 'on',
            +						'compare' => '!=',
            +					],
            +				] );
            +			}
            +		}
            +
            +		$query = new WP_Query( $condition );
            +
            +		wp_reset_postdata();
            +
            +		return $query;
            +	}
            +
            +	/**
            +	 * Get Agent id by property id
            +	 */
            +	public static function get_agent_by_property( $post_id = null ) {
            +		if ( null == $post_id ) {
            +			$post_id = get_the_ID();
            +		}
            +		$agent_id = get_post_meta( $post_id, OPALESTATE_PROPERTY_PREFIX . 'agent', true );
            +
            +		return $agent_id;
            +	}
            +
            +	/**
            +	 * Get List of properties by user
            +	 */
            +	public static function get_properties_by_user( $oargs = [], $user_id = null ) {
            +
            +		$paged    = ( get_query_var( 'paged' ) == 0 ) ? 1 : get_query_var( 'paged' );
            +		$per_page = 9;
            +
            +		$args = [
            +			'post_type'      => 'opalestate_property',
            +			'paged'          => $paged,
            +			'post_status'    => 'any',
            +			'author'         => $user_id,
            +			'posts_per_page' => $per_page,
            +
            +		];
            +		if ( ! empty( $oargs ) || is_array( $oargs ) ) {
            +			$args = array_merge( $args, $oargs );
            +		}
            +
            +		if ( isset( $args['featured'] ) && $args['featured'] ) {
            +			$args = array_merge( $args,
            +				[
            +					'meta_key'     => OPALESTATE_PROPERTY_PREFIX . 'featured',
            +					'meta_value'   => 'on',
            +					'meta_compare' => '=',
            +				] );
            +			unset( $args['featured'] );
            +
            +		}
            +		$query = new WP_Query( $args );
            +		wp_reset_postdata();
            +
            +		return $query;
            +	}
            +
            +	/**
            +	 *
            +	 */
            +	public static function get_amenities() {
            +		return get_terms( 'opalestate_amenities', [ 'hide_empty' => false ] );
            +	}
            +
            +	/**
            +	 *
            +	 */
            +	public static function filter_by_location( $geo_lat, $geo_long, $radius, $prefix = OPALESTATE_PROPERTY_PREFIX ) {
            +
            +		global $wpdb;
            +
            +		$radius_measure = '';
            +		$earth          = 3959;
            +
            +		if ( $radius_measure == 'km' ) {
            +			$earth = 6371;
            +		}
            +
            +		$latitude  = $prefix . 'map_latitude';
            +		$longitude = $prefix . 'map_longitude';
            +
            +		$sql = "SELECT $wpdb->posts.ID,
            +            ( %s * acos(
            +                    cos( radians(%s) ) *
            +                    cos( radians( latitude.meta_value ) ) *
            +                    cos( radians( longitude.meta_value ) - radians(%s) ) +
            +                    sin( radians(%s) ) *
            +                    sin( radians( latitude.meta_value ) )
            +            ) )
            +            AS distance, latitude.meta_value AS latitude, longitude.meta_value AS longitude
            +            FROM $wpdb->posts
            +            INNER JOIN $wpdb->postmeta
            +                    AS latitude
            +                    ON $wpdb->posts.ID = latitude.post_id
            +            INNER JOIN $wpdb->postmeta
            +                    AS longitude
            +                    ON $wpdb->posts.ID = longitude.post_id
            +            WHERE 1=1
            +
            +                    AND latitude.meta_key = '" . $latitude . "'
            +                    AND longitude.meta_key= '" . $longitude . "'
            +            HAVING distance < %s
            +            ORDER BY $wpdb->posts.menu_order ASC, distance ASC";
            +
            +		$query = $wpdb->prepare( $sql,
            +
            +			$earth,
            +			$geo_lat,
            +			$geo_long,
            +			$geo_lat,
            +			$radius
            +		);
            +
            +		$post_ids = $wpdb->get_results( $query, OBJECT_K );
            +		if ( $post_ids ) {
            +			$post_ids = array_keys( $post_ids );
            +
            +			return $post_ids;
            +		}
            +
            +		return [ 0 ];
            +	}
            +}
            diff --git a/inc/property/class-opalestate-search.php b/inc/property/class-opalestate-search.php
            new file mode 100755
            index 00000000..f4e1ae24
            --- /dev/null
            +++ b/inc/property/class-opalestate-search.php
            @@ -0,0 +1,484 @@
            +
            + * @copyright  Copyright (C) 2019 wpopal.com. All Rights Reserved.
            + * @license    GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
            + *
            + * @website  http://www.wpopal.com
            + * @support  http://www.wpopal.com/support/forum.html
            + */
            +
            +if ( ! defined( 'ABSPATH' ) ) {
            +	exit; // Exit if accessed directly
            +}
            +
            +class OpalEstate_Search {
            +	/**
            +	 * Add action to ajax search to display query data results with json format.
            +	 */
            +	public static function init() {
            +		add_action( 'wp_ajax_opalestate_ajx_get_properties', [ __CLASS__, 'get_search_json' ] );
            +		add_action( 'wp_ajax_nopriv_opalestate_ajx_get_properties', [ __CLASS__, 'get_search_json' ] );
            +
            +		add_action( 'wp_ajax_opalestate_render_get_properties', [ __CLASS__, 'render_get_properties' ] );
            +		add_action( 'wp_ajax_nopriv_opalestate_render_get_properties', [ __CLASS__, 'render_get_properties' ] );
            +		//	add_filter( "pre_get_posts",   array( __CLASS__, 'change_archive_query' )   );
            +	}
            +
            +	/**
            +	 * Get Query Object to display collection of property with user request which submited via search form
            +	 */
            +	public static function get_search_results_query( $limit = 9 ) {
            +		// global $paged;
            +		global $wp_query;
            +
            +		$show_featured_first = opalestate_options( 'show_featured_first', 1 );
            +		$search_min_price    = isset( $_GET['min_price'] ) ? sanitize_text_field( $_GET['min_price'] ) : '';
            +		$search_max_price    = isset( $_GET['max_price'] ) ? sanitize_text_field( $_GET['max_price'] ) : '';
            +
            +		$search_min_area = isset( $_GET['min_area'] ) ? sanitize_text_field( $_GET['min_area'] ) : '';
            +		$search_max_area = isset( $_GET['max_area'] ) ? sanitize_text_field( $_GET['max_area'] ) : '';
            +		$s               = isset( $_GET['search_text'] ) ? sanitize_text_field( $_GET['search_text'] ) : null;
            +		$location_text   = isset( $_GET['location_text'] ) ? sanitize_text_field( $_GET['location_text'] ) : null;
            +
            +		$posts_per_page = apply_filters( 'opalestate_search_property_per_page', opalestate_options( 'search_property_per_page', $limit ) );
            +
            +		$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
            +		$paged = isset( $wp_query->query['paged'] ) ? $wp_query->query['paged'] : $paged;
            +		$paged = ! empty( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : $paged;
            +
            +		if ( isset( $_GET['paged'] ) && intval( $_GET['paged'] ) > 0 ) {
            +			$paged = intval( $_GET['paged'] );
            +		}
            +
            +		$infos = [];
            +
            +		$args = [
            +			'posts_per_page' => $posts_per_page,
            +			'paged'          => $paged,
            +			'post_type'      => 'opalestate_property',
            +			'post_status'    => 'publish',
            +			's'              => $s,
            +		];
            +
            +
            +		$tax_query = [];
            +
            +		if ( isset( $_GET['location'] ) && $_GET['location'] != -1 ) {
            +			$tax_query[] =
            +				[
            +					'taxonomy' => 'opalestate_location',
            +					'field'    => 'slug',
            +					'terms'    => sanitize_text_field( $_GET['location'] ),
            +				];
            +		}
            +
            +		if ( isset( $_GET['state'] ) && $_GET['state'] != -1 ) {
            +			$tax_query[] =
            +				[
            +					'taxonomy' => 'opalestate_state',
            +					'field'    => 'slug',
            +					'terms'    => sanitize_text_field( $_GET['state'] ),
            +				];
            +		}
            +
            +		if ( isset( $_GET['city'] ) && $_GET['city'] != -1 ) {
            +			$tax_query[] =
            +				[
            +					'taxonomy' => 'opalestate_city',
            +					'field'    => 'slug',
            +					'terms'    => sanitize_text_field( $_GET['city'] ),
            +				];
            +		}
            +
            +		if ( isset( $_GET['types'] ) && $_GET['types'] != -1 ) {
            +			$tax_query[] =
            +				[
            +					'taxonomy' => 'opalestate_types',
            +					'field'    => 'slug',
            +					'terms'    => sanitize_text_field( $_GET['types'] ),
            +				];
            +		}
            +
            +		if ( isset( $_GET['status'] ) && $_GET['status'] != -1 ) {
            +			$tax_query[] =
            +				[
            +					'taxonomy' => 'opalestate_status',
            +					'field'    => 'slug',
            +					'terms'    => sanitize_text_field( $_GET['status'] ),
            +				];
            +		}
            +
            +		if ( isset( $_GET['amenities'] ) && is_array( $_GET['amenities'] ) ) {
            +			$tax_query[] =
            +				[
            +					'taxonomy' => 'opalestate_amenities',
            +					'field'    => 'slug',
            +					'terms'    => sanitize_text_field( $_GET['amenities'] ),
            +				];
            +		}
            +
            +		if ( $tax_query ) {
            +			$args['tax_query'] = [ 'relation' => 'AND' ];
            +			$args['tax_query'] = array_merge( $args['tax_query'], $tax_query );
            +		}
            +
            +		$args['meta_query'] = [ 'relation' => 'AND' ];
            +		if ( isset( $_GET['info'] ) && is_array( $_GET['info'] ) ) {
            +			$metaquery = [];
            +			foreach ( $_GET['info'] as $key => $value ) {
            +				if ( trim( $value ) ) {
            +					if ( is_numeric( trim( $value ) ) ) {
            +						$fieldquery = [
            +							'key'     => OPALESTATE_PROPERTY_PREFIX . $key,
            +							'value'   => sanitize_text_field( trim( $value ) ),
            +							'compare' => '>=',
            +							'type'    => 'NUMERIC',
            +						];
            +					} else {
            +						$fieldquery = [
            +							'key'     => OPALESTATE_PROPERTY_PREFIX . $key,
            +							'value'   => sanitize_text_field( trim( $value ) ),
            +							'compare' => 'LIKE',
            +						];
            +					}
            +					$sarg        = apply_filters( 'opalestate_search_field_query_' . $key, $fieldquery );
            +					$metaquery[] = $sarg;
            +
            +				}
            +			}
            +			$args['meta_query'] = array_merge( $args['meta_query'], $metaquery );
            +		}
            +
            +		if ( $search_min_price != '' && $search_min_price != '' && is_numeric( $search_min_price ) && is_numeric( $search_max_price ) ) {
            +			if ( $search_min_price ) {
            +
            +				array_push( $args['meta_query'], [
            +					'key'     => OPALESTATE_PROPERTY_PREFIX . 'price',
            +					'value'   => [ $search_min_price, $search_max_price ],
            +					'compare' => 'BETWEEN',
            +					'type'    => 'NUMERIC',
            +				] );
            +			} else {
            +				array_push( $args['meta_query'], [
            +					[
            +						[
            +							'key'     => OPALESTATE_PROPERTY_PREFIX . 'price',
            +							'compare' => 'NOT EXISTS',
            +						],
            +						'relation' => 'OR',
            +						[
            +							'key'     => OPALESTATE_PROPERTY_PREFIX . 'price',
            +							'value'   => $search_max_price,
            +							'compare' => '<=',
            +							'type'    => 'NUMERIC',
            +						],
            +					],
            +				] );
            +			}
            +
            +		} elseif ( $search_min_price != '' && is_numeric( $search_min_price ) ) {
            +			array_push( $args['meta_query'], [
            +				'key'     => OPALESTATE_PROPERTY_PREFIX . 'price',
            +				'value'   => $search_min_price,
            +				'compare' => '>=',
            +				'type'    => 'NUMERIC',
            +			] );
            +		} elseif ( $search_max_price != '' && is_numeric( $search_max_price ) ) {
            +			array_push( $args['meta_query'], [
            +				'key'     => OPALESTATE_PROPERTY_PREFIX . 'price',
            +				'value'   => $search_max_price,
            +				'compare' => '<=',
            +				'type'    => 'NUMERIC',
            +			] );
            +		}
            +
            +		if ( $search_min_area != '' && $search_min_area != '' && is_numeric( $search_min_area ) && is_numeric( $search_max_area ) ) {
            +			array_push( $args['meta_query'], [
            +				'key'     => OPALESTATE_PROPERTY_PREFIX . 'areasize',
            +				'value'   => [ $search_min_area, $search_max_area ],
            +				'compare' => 'BETWEEN',
            +				'type'    => 'NUMERIC',
            +			] );
            +		} elseif ( $search_min_area != '' && is_numeric( $search_min_area ) ) {
            +			array_push( $args['meta_query'], [
            +				'key'     => OPALESTATE_PROPERTY_PREFIX . 'areasize',
            +				'value'   => $search_min_area,
            +				'compare' => '>=',
            +				'type'    => 'NUMERIC',
            +			] );
            +		} elseif ( $search_max_area != '' && is_numeric( $search_max_area ) ) {
            +			array_push( $args['meta_query'], [
            +				'key'     => OPALESTATE_PROPERTY_PREFIX . 'areasize',
            +				'value'   => $search_max_area,
            +				'compare' => '<=',
            +				'type'    => 'NUMERIC',
            +			] );
            +		}
            +
            +		///// search by address and geo location ///
            +		if ( isset( $_GET['geo_long'] ) && isset( $_GET['geo_lat'] ) ) {
            +
            +			if ( $_GET['location_text'] && ( empty( $_GET['geo_long'] ) || empty( $_GET['geo_lat'] ) ) ) {
            +				array_push( $args['meta_query'], [
            +					'key'      => OPALESTATE_PROPERTY_PREFIX . 'map_address',
            +					'value'    => sanitize_text_field( trim( $_GET['location_text'] ) ),
            +					'compare'  => 'LIKE',
            +					'operator' => 'OR',
            +				] );
            +
            +			} elseif ( $_GET['geo_lat'] && $_GET['geo_long'] ) {
            +				$radius           = isset( $_GET['geo_radius'] ) ? $_GET['geo_radius'] : 5;
            +				$post_ids         = Opalestate_Query::filter_by_location( $_GET['geo_lat'], $_GET['geo_long'], $radius );
            +				$args['post__in'] = $post_ids;
            +			}
            +		}
            +
            +		/// ///
            +		$ksearchs = [];
            +
            +		if ( isset( $_REQUEST['opalsortable'] ) && ! empty( $_REQUEST['opalsortable'] ) ) {
            +			$ksearchs = explode( "_", $_REQUEST['opalsortable'] );
            +		} elseif ( isset( $_SESSION['opalsortable'] ) && ! empty( $_SESSION['opalsortable'] ) ) {
            +			$ksearchs = explode( "_", $_SESSION['opalsortable'] );
            +		}
            +
            +		if ( ! empty( $ksearchs ) && count( $ksearchs ) == 2 ) {
            +			$args['meta_key'] = OPALESTATE_PROPERTY_PREFIX . $ksearchs[0];
            +			$args['orderby']  = 'meta_value_num';
            +			$args['order']    = $ksearchs[1];
            +		}
            +
            +		$args = apply_filters( 'opalestate_get_search_results_query_args', $args );
            +
            +		$query = new WP_Query( $args );
            +
            +		wp_reset_postdata();
            +
            +		return $query;
            +	}
            +
            +	/**
            +	 * Get search query base on user request to filter collection of Agents
            +	 */
            +	public static function get_search_agents_query( $args = [] ) {
            +		$min = opalestate_options( 'search_agent_min_price', 0 );
            +		$max = opalestate_options( 'search_agent_max_price', 10000000 );
            +
            +		$search_min_price = isset( $_GET['min_price'] ) ? sanitize_text_field( $_GET['min_price'] ) : '';
            +		$search_max_price = isset( $_GET['max_price'] ) ? sanitize_text_field( $_GET['max_price'] ) : '';
            +
            +		$search_min_area = isset( $_GET['min_area'] ) ? sanitize_text_field( $_GET['min_area'] ) : '';
            +		$search_max_area = isset( $_GET['max_area'] ) ? sanitize_text_field( $_GET['max_area'] ) : '';
            +		$s               = isset( $_GET['search_text'] ) ? sanitize_text_field( $_GET['search_text'] ) : null;
            +
            +		$paged   = ( get_query_var( 'paged' ) == 0 ) ? 1 : get_query_var( 'paged' );
            +		$default = [
            +			'post_type'      => 'opalestate_agent',
            +			'posts_per_page' => apply_filters( 'opalestate_agent_per_page', 12 ),
            +			'paged'          => $paged,
            +		];
            +		$args    = array_merge( $default, $args );
            +
            +		$tax_query = [];
            +
            +
            +		if ( isset( $_GET['location'] ) && $_GET['location'] != -1 ) {
            +			$tax_query[] =
            +				[
            +					'taxonomy' => 'opalestate_location',
            +					'field'    => 'slug',
            +					'terms'    => sanitize_text_field( $_GET['location'] ),
            +				];
            +		}
            +
            +		if ( isset( $_GET['types'] ) && $_GET['types'] != -1 ) {
            +			$tax_query[] =
            +				[
            +					'taxonomy' => 'opalestate_types',
            +					'field'    => 'slug',
            +					'terms'    => sanitize_text_field( $_GET['types'] ),
            +				];
            +		}
            +
            +		if ( $tax_query ) {
            +			$args['tax_query'] = [ 'relation' => 'AND' ];
            +			$args['tax_query'] = array_merge( $args['tax_query'], $tax_query );
            +		}
            +
            +		$args['meta_query'] = [ 'relation' => 'AND' ];
            +
            +		if ( $search_min_price != $min && is_numeric( $search_min_price ) ) {
            +			array_push( $args['meta_query'], [
            +				'key'     => OPALESTATE_AGENT_PREFIX . 'target_min_price',
            +				'value'   => $search_min_price,
            +				'compare' => '>=',
            +				// 'type' => 'NUMERIC'
            +			] );
            +		}
            +		if ( is_numeric( $search_max_price ) && $search_max_price != $max ) {
            +			array_push( $args['meta_query'], [
            +				'key'     => OPALESTATE_AGENT_PREFIX . 'target_max_price',
            +				'value'   => $search_max_price,
            +				'compare' => '<=',
            +				// 'type' => 'NUMERIC'
            +			] );
            +		}
            +
            +		return new WP_Query( $args );
            +	}
            +
            +
            +	/**
            +	 * Get search query base on user request to filter collection of Agents
            +	 */
            +	public static function get_search_agencies_query( $args = [] ) {
            +		$s = isset( $_GET['search_text'] ) ? sanitize_text_field( $_GET['search_text'] ) : null;
            +
            +		$paged   = ( get_query_var( 'paged' ) == 0 ) ? 1 : get_query_var( 'paged' );
            +		$default = [
            +			'post_type'      => 'opalestate_agency',
            +			'posts_per_page' => apply_filters( 'opalestate_agency_per_page', 12 ),
            +			'paged'          => $paged,
            +		];
            +		$args    = array_merge( $default, $args );
            +
            +		$tax_query = [];
            +
            +
            +		if ( isset( $_GET['location'] ) && $_GET['location'] != -1 ) {
            +			$tax_query[] =
            +				[
            +					'taxonomy' => 'opalestate_location',
            +					'field'    => 'slug',
            +					'terms'    => sanitize_text_field( $_GET['location'] ),
            +				];
            +		}
            +
            +		if ( isset( $_GET['types'] ) && $_GET['types'] != -1 ) {
            +			$tax_query[] =
            +				[
            +					'taxonomy' => 'opalestate_types',
            +					'field'    => 'slug',
            +					'terms'    => sanitize_text_field( $_GET['types'] ),
            +				];
            +		}
            +
            +		if ( $tax_query ) {
            +			$args['tax_query'] = [ 'relation' => 'AND' ];
            +			$args['tax_query'] = array_merge( $args['tax_query'], $tax_query );
            +		}
            +
            +		$args['meta_query'] = [ 'relation' => 'AND' ];
            +
            +
            +		return new WP_Query( $args );
            +	}
            +
            +
            +	public function filter_by_geolocations() {
            +
            +	}
            +
            +	/**
            +	 *
            +	 */
            +	public static function get_setting_search_fields( $option = '' ) {
            +		$options = [
            +			OPALESTATE_PROPERTY_PREFIX . 'bedrooms'  => esc_html__( 'Bed Rooms', 'opalestate-pro' ),
            +			OPALESTATE_PROPERTY_PREFIX . 'parking'   => esc_html__( 'Parking', 'opalestate-pro' ),
            +			OPALESTATE_PROPERTY_PREFIX . 'bathrooms' => esc_html__( 'Bath Rooms', 'opalestate-pro' ),
            +		];
            +
            +		$default = apply_filters( 'opalestate_default_fields_setting', $options );
            +
            +		$metas     = Opalestate_Property_MetaBox::metaboxes_info_fields();
            +		$esettings = [];
            +		$found     = false;
            +		foreach ( $metas as $key => $meta ) {
            +			$value = opalestate_options( $meta['id'] . '_opt' . $option );
            +
            +			if ( preg_match( "#areasize#", $meta['id'] ) ) {
            +				continue;
            +			}
            +
            +			if ( $value ) {
            +				$id               = str_replace( OPALESTATE_PROPERTY_PREFIX, "", $meta['id'] );
            +				$esettings[ $id ] = $meta['name'];
            +			}
            +			if ( $value == 0 ) {
            +				$found = true;
            +			}
            +		}
            +
            +		if ( ! empty( $esettings ) ) {
            +			return $esettings;
            +		} elseif ( $found ) {
            +			return [];
            +		}
            +
            +		return $default;
            +	}
            +
            +	/**
            +	 * Get Json data by action ajax filter
            +	 */
            +	public static function get_search_json() {
            +
            +		$query = self::get_search_results_query();
            +
            +		$output = [];
            +
            +		while ( $query->have_posts() ) {
            +
            +			$query->the_post();
            +			$property = opalesetate_property( get_the_ID() );
            +			$output[] = $property->get_meta_search_objects();
            +		}
            +
            +		wp_reset_query();
            +
            +		echo json_encode( $output );
            +		exit;
            +	}
            +
            +	public static function render_get_properties() {
            +		// $_GET = $_POST;
            +		echo opalestate_load_template_path( 'shortcodes/ajax-map-search-result' );
            +		die;
            +	}
            +
            +	/**
            +	 * Render search property form in horizontal
            +	 */
            +	public static function render_horizontal_form( $atts = [] ) {
            +		echo opalestate_load_template_path( 'search-box/search-form-h', $atts );
            +	}
            +
            +	/**
            +	 * Render search property form in vertical
            +	 */
            +	public static function render_vertical_form( $atts = [] ) {
            +		echo opalestate_load_template_path( 'search-box/search-form-v', $atts );
            +	}
            +
            +	/**
            +	 *
            +	 */
            +	public static function render_field_price() {
            +
            +	}
            +
            +	/**
            +	 *
            +	 */
            +	public static function render_field_area() {
            +
            +	}
            +}
            +
            +OpalEstate_Search::init();
            diff --git a/inc/property/class-opalestate-shortcodes.php b/inc/property/class-opalestate-shortcodes.php
            new file mode 100755
            index 00000000..352b5cfe
            --- /dev/null
            +++ b/inc/property/class-opalestate-shortcodes.php
            @@ -0,0 +1,125 @@
            +
            + * @copyright  Copyright (C) 2019 wpopal.com. All Rights Reserved.
            + * @license    GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
            + *
            + * @website  http://www.wpopal.com
            + * @support  http://www.wpopal.com/support/forum.html
            + */
            + 
            +if ( ! defined( 'ABSPATH' ) ) {
            +	exit; // Exit if accessed directly
            +}
            +
            +/**
            + * @class OpalEstate_Shortcodes
            + *
            + * @version 1.0
            + */
            +class OpalEstate_Shortcodes{
            +
            +	/**
            +	 * Static $shortcodes
            +	 */
            +	public $shortcodes;
            +
            +	/**
            +	 * defined list of shortcode and functions of this for each.
            +	 */
            +	public function __construct(){
            +
            +	 	$this->shortcodes = array(
            +
            +	 		'search_properties_result'	=> array( 'code' => 'search_properties_result', 'label' => esc_html__( 'Search Properties Result', 'opalestate-pro' ) ),
            +	 		'search_properties'    		=> array( 'code' => 'search_properties', 'label'    	=> esc_html__( 'Search Properties', 'opalestate-pro' ) ),
            +	 		'search_properties_v'  		=> array( 'code' => 'search_properties_v', 'label'   	=> esc_html__( 'Search Properties Vertical', 'opalestate-pro' ) ),
            +	 	
            +	 		'search_map_properties'		=> array( 'code' => 'search_map_properties', 'label' 	=> esc_html__( 'Search Map Properties', 'opalestate-pro' ) ),
            +	 		'ajax_map_search'			=> array( 'code' => 'ajax_map_search', 'label' 			=> esc_html__( 'Ajax Search Map Properties', 'opalestate-pro' ) ),
            +	 		'ajax_map_quick_search'	    => array( 'code' => 'ajax_map_quick_search', 'label' 	=> esc_html__( 'Ajax Search Map Properties', 'opalestate-pro' ) ),
            +	 		'register_form'	    		=> array( 'code' => 'register_form', 'label' 			=> esc_html__( 'Register User Form', 'opalestate-pro' ) ),
            +	 		'login_form'	    	    => array( 'code' => 'login_form', 'label' 				=> esc_html__( 'Login Form', 'opalestate-pro' ) ),
            +	 	);
            +
            +	 	foreach( $this->shortcodes as $shortcode ){ 
            +	 		add_shortcode( 'opalestate_'.$shortcode['code'] , array( $this, $shortcode['code'] ) );
            +	 	}
            +
            +	 	if( is_admin() ){
            +	 		add_action( 'media_buttons', array( $this, 'shortcode_button' ) );
            +	 	}
            +
            +	}
            +
            +	public function shortcode_button(){
            +		
            +	}
            +
            +	public function search_properties_result(){
            +		return opalestate_load_template_path( 'shortcodes/search-properties-result' );
            +	}
            +
            +
            +
            +	/**
            +	 * Display all properties follow user when logined
            +	 */
            +	public function agent_property(){
            +		return opalestate_load_template_path( 'shortcodes/agent-property-listing' );
            +	}
            +
            +	/**
            +	 * Render search property page with horizontal form and map
            +	 */
            +	public function search_properties(){
            +		return opalestate_load_template_path( 'shortcodes/search-properties', array( 'loop' => '') );
            +	}
            +
            +	/**
            +	 * Render search property page with vertical form and map
            +	 */
            +	public function search_properties_v(){
            +		return opalestate_load_template_path( 'shortcodes/search-properties-v', array( 'loop' => '') );
            +	}
            +
            +	public function search_map_properties(){
            +		return opalestate_load_template_path( 'shortcodes/search-map-properties', array( 'loop' => '') );	
            +	}
            +
            +	public function ajax_map_search(){ 
            +		wp_enqueue_script( 'sticky-kit', OPALESTATE_PLUGIN_URL . 'assets/js/jquery.sticky-kit.min.js'  );
            +		return opalestate_load_template_path( 'shortcodes/ajax-map-search', array( 'loop' => '') );	
            +	}
            +
            +	public function ajax_map_quick_search(){ 
            +		return  opalestate_load_template_path( 'shortcodes/ajax-map-quick-search', array( 'loop' => '') );	
            +	}
            +
            +	/* register form show up */
            +	public function register_form( $atts = array() ) {
            +		$atts = shortcode_atts( array(
            + 				'message' 	=> '',
            + 				'redirect'	=> '',
            + 				'hide_title'	=> false
            +			), $atts );
            +		return opalestate_load_template_path( 'user/register-form', $atts );
            +	}
            +
            +	/* sign in show up */
            +	public function login_form( $atts = array() ) {
            +		$atts = shortcode_atts( array(
            + 				'message' 	=> '',
            + 				'redirect'	=> '',
            + 				'hide_title'	=> false
            +			), $atts );
            +		return opalestate_load_template_path( 'user/login-form', $atts );
            +	}
            +
            +}
            +
            +new OpalEstate_Shortcodes();
            diff --git a/inc/property/class-opalestate-view-stats.php b/inc/property/class-opalestate-view-stats.php
            new file mode 100755
            index 00000000..d5008d1a
            --- /dev/null
            +++ b/inc/property/class-opalestate-view-stats.php
            @@ -0,0 +1,155 @@
            +
            + * @copyright  Copyright (C) 2019 wpopal.com. All Rights Reserved.
            + * @license    GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
            + *
            + * @website  http://www.wpopal.com
            + * @support  http://www.wpopal.com/support/forum.html
            + */
            +
            +if ( ! defined( 'ABSPATH' ) ) {
            +	exit; // Exit if accessed directly
            +}
            +
            +class Opalestate_View_Stats {
            +	protected $id;
            +
            +	protected $record;
            +
            +	public function __construct( $id, $record = 8 ) {
            +
            +		$this->id = $id;
            +
            +		$this->record = $record;
            +
            +		$this->count_page_stats();
            +	}
            +
            +	/**
            +	 * @return mixed
            +	 */
            +	public static function get_real_ip_addr() {
            +		if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) { //check ip from share internet
            +			$ip = $_SERVER['HTTP_CLIENT_IP'];
            +		} elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) { //to check ip is pass from proxy
            +			$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
            +		} elseif ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) {
            +			$ip = $_SERVER['REMOTE_ADDR'];
            +		} else {
            +			$ip = '';
            +		}
            +
            +		return $ip;
            +	}
            +
            +	/**
            +	 * Count page views.
            +	 */
            +	public function count_page_stats() {
            +		// Get IPs.
            +		$ips = $this->get_ips_viewed();
            +
            +		$current_ip = static::get_real_ip_addr();
            +
            +		if ( ! in_array( $current_ip, $ips ) ) {
            +			// Update IPS.
            +			array_push( $ips, $current_ip );
            +			update_post_meta( $this->id, 'opalestate_ips_viewed', $ips );
            +
            +			// Count and update total views.
            +			$total_views = intval( get_post_meta( $this->id, 'opalestate_total_views', true ) );
            +			if ( $total_views == '' ) {
            +				$total_views = 1;
            +			} else {
            +				$total_views++;
            +			}
            +
            +			update_post_meta( $this->id, 'opalestate_total_views', $total_views );
            +
            +			// Update detailed views.
            +			$today          = date( 'm-d-Y', time() );
            +			$detailed_views = get_post_meta( $this->id, 'opalestate_detailed_views', true );
            +
            +			if ( $detailed_views == '' || ! is_array( $detailed_views ) ) {
            +				$detailed_views           = [];
            +				$detailed_views[ $today ] = 1;
            +			} else {
            +				if ( ! isset( $detailed_views[ $today ] ) ) {
            +					if ( count( $detailed_views ) > 15 ) {
            +						array_shift( $detailed_views );
            +					}
            +
            +					$detailed_views[ $today ] = 1;
            +				} else {
            +					$detailed_views[ $today ] = intval( $detailed_views[ $today ] ) + 1;
            +				}
            +			}
            +
            +			$detailed_views = update_post_meta( $this->id, 'opalestate_detailed_views', $detailed_views );
            +		}
            +	}
            +
            +
            +	public function get_traffic_labels() {
            +		$detailed_views = get_post_meta( $this->id, 'opalestate_detailed_views', true );
            +
            +		if ( ! is_array( $detailed_views ) ) {
            +			$detailed_views = [];
            +		}
            +
            +		$array_label = array_keys( $detailed_views );
            +		$array_label = array_slice( $array_label, -1 * $this->record, $this->record, false );
            +
            +		return $array_label;
            +	}
            +
            +
            +	public function get_traffic_data() {
            +		$detailed_views = get_post_meta( $this->id, 'opalestate_detailed_views', true );
            +		if ( ! is_array( $detailed_views ) ) {
            +			$detailed_views = [];
            +		}
            +		$array_values = array_values( $detailed_views );
            +		$array_values = array_slice( $array_values, -1 * $this->record, $this->record, false );
            +
            +		return $array_values;
            +	}
            +
            +
            +	public function get_traffic_data_accordion() {
            +		$detailed_views = get_post_meta( $this->id, 'opalestate_detailed_views', true );
            +		if ( ! is_array( $detailed_views ) ) {
            +			$detailed_views = [];
            +		}
            +
            +		// since this runs before we increment the visits - on acc page style
            +		$today = date( 'm-d-Y', time() );
            +
            +		if ( isset( $detailed_views[ $today ] ) ) {
            +			$detailed_views[ $today ] = intval( $detailed_views[ $today ] ) + 1;
            +		}
            +
            +		$array_values = array_values( $detailed_views );
            +		$array_values = array_slice( $array_values, -1 * $this->record, $this->record, false );
            +
            +		return $array_values;
            +	}
            +
            +	/**
            +	 * Get IPs viewed.
            +	 *
            +	 * @return array
            +	 */
            +	public function get_ips_viewed() {
            +		$ips = get_post_meta( $this->id, 'opalestate_ips_viewed', true );
            +		if ( ! $ips ) {
            +			$ips = [];
            +		}
            +
            +		return $ips;
            +	}
            +}
            diff --git a/inc/property/functions.php b/inc/property/functions.php
            new file mode 100755
            index 00000000..e69de29b
            diff --git a/inc/query-functions.php b/inc/query-functions.php
            new file mode 100755
            index 00000000..aa724889
            --- /dev/null
            +++ b/inc/query-functions.php
            @@ -0,0 +1,84 @@
            +
            + * @copyright  Copyright (C) 2019 wpopal.com. All Rights Reserved.
            + * @license    GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
            + *
            + * @website  http://www.wpopal.com
            + * @support  http://www.wpopal.com/support/forum.html
            + */
            +
            +if ( ! defined( 'ABSPATH' ) ) {
            +    exit; // Exit if accessed directly
            +}
            +
            +function opalestate_clean_attachments( $user_id ){
            +    
            +  
            +    $query = new WP_Query( 
            +        array( 
            +            'post_type'   => 'attachment', 
            +            'post_status' => 'inherit', 
            +            'author'      => $user_id , 
            +            'meta_query' => array(
            +                array(
            +                    'key' => '_pending_to_use_',
            +                     'value' => 1,
            +                     'compare' => '>=',
            +                )
            +            )    
            +        ) 
            +    );
            +  
            +    if( $query->have_posts() ){   
            +        while( $query->have_posts() ){ $query->the_post();
            +            wp_delete_attachment( get_the_ID() );
            +        }
            +    }
            +    wp_reset_postdata(); 
            +}
            + 
            +
            +/****/
            +add_filter( 'pre_get_posts', 'opalestate_archives_property_query', 1 );
            +function opalestate_archives_property_query( $query ){
            +
            +    if( $query->is_main_query() && ( is_post_type_archive( 'opalestate_property' ) || is_tax('property_category') || is_tax('opalestate_amenities') || is_tax('opalestate_location') || is_tax('opalestate_types') ) ){
            +
            +        $args = array();
            +        $ksearchs = array();
            +       
            +        if( isset($_REQUEST['opalsortable']) && !empty($_REQUEST['opalsortable']) ){
            +            $ksearchs = explode( "_", $_REQUEST['opalsortable'] );  
            +        } 
            +    
            +        if( !empty($ksearchs) && count($ksearchs) == 2 ){
            +            $args['meta_key'] = OPALESTATE_PROPERTY_PREFIX.$ksearchs[0];
            +            $args['orderby']  = 'meta_value_num';
            +            $args['order']    = $ksearchs[1];   
            +        }
            +
            +        if( isset( $_GET['status']) &&  !empty($_GET['status']) && $_GET['status'] != 'all' ){
            +            $tax_query = array(
            +                array(
            +                    'taxonomy' => 'opalestate_status',
            +                    'field'    => 'slug',
            +                    'terms'    =>  sanitize_text_field( $_GET['status'] ),
            +                ),
            +            );
            +            $args['tax_query'] = array('relation' => 'AND');
            +            $args['tax_query'] = array_merge( $args['tax_query'], $tax_query );
            +        }
            +
            +        if( $args ){
            +            foreach( $args as $key => $value ){
            +                $query->set( $key, $value );
            +            }
            +        }
            +
            +    }
            +}
            diff --git a/inc/rating/class-opalestate-rating-features-posttype.php b/inc/rating/class-opalestate-rating-features-posttype.php
            new file mode 100755
            index 00000000..89025971
            --- /dev/null
            +++ b/inc/rating/class-opalestate-rating-features-posttype.php
            @@ -0,0 +1,87 @@
            +
            + * @copyright  Copyright (C) 2019 wpopal.com. All Rights Reserved.
            + * @license    GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
            + *
            + * @website  http://www.wpopal.com
            + * @support  http://www.wpopal.com/support/forum.html
            + */
            +
            +if ( ! defined( 'ABSPATH' ) ) {
            +	exit; // Exit if accessed directly
            +}
            +
            +/**
            + * Class Opalestate_PostType_Rating_Features
            + */
            +class Opalestate_PostType_Rating_Features {
            +	/**
            +	 * Init action and filter data to define property post type
            +	 */
            +	public function __construct() {
            +		add_action( 'init', [ $this, 'definition' ] );
            +	}
            +
            +	/**
            +	 * Definition
            +	 */
            +	public function definition() {
            +		if ( ! is_blog_installed() ) {
            +			return;
            +		}
            +
            +		$rating_supports = Opalestate_Rating::get_rating_supports();
            +
            +		foreach ( $rating_supports as $key => $support ) {
            +			$this->register_post_type( $support['features_cpt'], $support['post_type'] );
            +		}
            +	}
            +
            +	public function register_post_type( $cpt_feature, $cpt_support ) {
            +		if ( post_type_exists( $cpt_feature ) ) {
            +			return;
            +		}
            +
            +		register_post_type( $cpt_feature, apply_filters( $cpt_feature . '_cpt_args', [
            +			'labels'              => [
            +				'name'                  => esc_html_x( 'Rating Features', 'Feature plural name', 'opalestate-pro' ),
            +				'singular_name'         => esc_html_x( 'Rating Feature', 'Feature singular name', 'opalestate-pro' ),
            +				'menu_name'             => esc_html_x( 'Rating Features', 'Admin menu name', 'opalestate-pro' ),
            +				'add_new'               => esc_html__( 'Add rating feature', 'opalestate-pro' ),
            +				'add_new_item'          => esc_html__( 'Add new rating feature', 'opalestate-pro' ),
            +				'edit'                  => esc_html__( 'Edit', 'opalestate-pro' ),
            +				'edit_item'             => esc_html__( 'Edit rating feature', 'opalestate-pro' ),
            +				'new_item'              => esc_html__( 'New rating feature', 'opalestate-pro' ),
            +				'view_item'             => esc_html__( 'View rating feature', 'opalestate-pro' ),
            +				'search_items'          => esc_html__( 'Query rating features', 'opalestate-pro' ),
            +				'not_found'             => esc_html__( 'No rating features found', 'opalestate-pro' ),
            +				'not_found_in_trash'    => esc_html__( 'No rating features found in trash', 'opalestate-pro' ),
            +				'parent'                => esc_html__( 'Parent rating features', 'opalestate-pro' ),
            +				'filter_items_list'     => esc_html__( 'Filter rating features', 'opalestate-pro' ),
            +				'items_list_navigation' => esc_html__( 'Rating Features navigation', 'opalestate-pro' ),
            +				'items_list'            => esc_html__( 'Rating Features List', 'opalestate-pro' ),
            +			],
            +			'description'         => esc_html__( 'This is where store rating features are stored.', 'opalestate-pro' ),
            +			'public'              => false,
            +			'hierarchical'        => false,
            +			'exclude_from_search' => true,
            +			'publicly_queryable'  => false,
            +			'show_ui'             => true,
            +			'show_in_menu'        => 'edit.php?post_type=' . $cpt_support,
            +			'show_in_nav_menus'   => false,
            +			'show_in_admin_bar'   => false,
            +			'show_in_rest'        => true,
            +			'map_meta_cap'        => true,
            +			'supports'            => [ 'title' ],
            +			'rewrite'             => false,
            +			'has_archive'         => false,
            +		] ) );
            +	}
            +}
            +
            +new Opalestate_PostType_Rating_Features();
            diff --git a/inc/rating/class-opalestate-rating-helper.php b/inc/rating/class-opalestate-rating-helper.php
            new file mode 100755
            index 00000000..3f24dcad
            --- /dev/null
            +++ b/inc/rating/class-opalestate-rating-helper.php
            @@ -0,0 +1,169 @@
            + $feature_title ) {
            +				$sum += absint( get_comment_meta( $comment->comment_ID, $cpt_feature . '_' . $feature_slug, true ) );
            +			}
            +
            +			$average = number_format( $sum / count( $features ), 1 );
            +		} else {
            +			$average = absint( get_comment_meta( $comment->comment_ID, 'opalestate_rating', true ) );
            +		}
            +
            +		return $average;
            +	}
            +
            +	/**
            +	 * Get property rating for a property. Please note this is not cached.
            +	 *
            +	 * @return float
            +	 */
            +	public static function get_average_rating_for_post( $post_id, $cpt_feature ) {
            +		$comments = get_comments( [ 'post_id' => $post_id, 'status' => 'approve' ] );
            +		if ( ! $comments ) {
            +			return 0;
            +		}
            +
            +		$sum = 0;
            +		foreach ( $comments as $comment ) {
            +			$sum += static::get_average_rating( $comment, $cpt_feature );
            +		}
            +
            +		return number_format( $sum / static::get_review_count_for_post( $post_id ), 2 );
            +	}
            +
            +	/**
            +	 * Get property review count for a property (not replies). Please note this is not cached.
            +	 */
            +	public static function get_review_count_for_post( $post_id ) {
            +		global $wpdb;
            +
            +		$count = $wpdb->get_var(
            +			$wpdb->prepare(
            +				"
            +			SELECT COUNT(*) FROM $wpdb->comments
            +			WHERE comment_parent = 0
            +			AND comment_post_ID = %d
            +			AND comment_approved = '1'
            +				",
            +				$post_id
            +			)
            +		);
            +
            +		return $count;
            +	}
            +
            +	/**
            +	 * Get property rating count for a property. Please note this is not cached.
            +	 */
            +	public static function get_rating_counts_for_post( $post_id, $cpt_feature ) {
            +		$features = static::get_features( $cpt_feature );
            +		if ( $features ) {
            +			return static::get_review_count_for_post( $post_id ) * count( $features );
            +		}
            +
            +		return static::get_review_count_for_post( $post_id );
            +	}
            +
            +	public static function get_rating_count_stats_for_post( $post_id, $cpt_feature ) {
            +		$output = [
            +			5 => 0,
            +			4 => 0,
            +			3 => 0,
            +			2 => 0,
            +			1 => 0,
            +		];
            +
            +		$features = static::get_features( $cpt_feature );
            +
            +		for ( $i = 5; $i >= 1; $i-- ) {
            +			$args = [
            +				'post_id' => $post_id,
            +				'count'   => true,
            +				'status' => 'approve',
            +			];
            +
            +			if ( $features ) {
            +				$features_query = [];
            +				foreach ( $features as $feature_slug => $feature_title ) {
            +					$features_query[] = [
            +						'key'   => $cpt_feature . '_' . $feature_slug,
            +						'value' => $i,
            +					];
            +				}
            +				$args['meta_query']             = $features_query;
            +				$args['meta_query']['relation'] = 'OR';
            +			} else {
            +				$args['meta_query'] = [
            +					[
            +						'key'   => 'opalestate_rating',
            +						'value' => $i,
            +					],
            +				];
            +			}
            +
            +			$output[ $i ] = get_comments( $args );
            +		}
            +
            +		return $output;
            +	}
            +
            +	public static function get_rating_average_stats_by_features_for_post( $post_id, $cpt_feature, $meta_prefix ) {
            +		global $wpdb;
            +
            +		$output   = [];
            +		$count    = get_post_meta( $post_id, $meta_prefix . 'review_count', true );
            +		$features = static::get_features( $cpt_feature );
            +
            +		if ( ! $features || ! $count ) {
            +			return $output;
            +		}
            +
            +		foreach ( $features as $feature_slug => $feature_title ) {
            +			$meta_key = $cpt_feature . '_' . $feature_slug;
            +
            +			$ratings                 = $wpdb->get_var(
            +				$wpdb->prepare(
            +					"
            +				SELECT SUM(meta_value) FROM $wpdb->commentmeta
            +				LEFT JOIN $wpdb->comments ON $wpdb->commentmeta.comment_id = $wpdb->comments.comment_ID
            +				WHERE meta_key = %s
            +				AND comment_post_ID = %d
            +				AND comment_approved = '1'
            +				AND meta_value > 0
            +					",
            +					$meta_key,
            +					$post_id
            +				)
            +			);
            +			$average                 = number_format( $ratings / $count, 2, '.', '' );
            +			$output[ $feature_slug ] = $average;
            +		}
            +
            +		return $output;
            +	}
            +
            +	public static function get_features( $cpt_feature, $posts_per_page = -1 ) {
            +		$args = [
            +			'post_type'      => $cpt_feature,
            +			'post_status'    => 'publish',
            +			'posts_per_page' => $posts_per_page,
            +			'order'          => 'ASC',
            +			'orderby'        => 'meta_value_num',
            +			'meta_key'       => 'opalestate_feature_order',
            +		];
            +
            +		$features = get_posts( $args );
            +
            +		return wp_list_pluck( $features, 'post_title', 'post_name' );
            +	}
            +}
            +
            +new Opalestate_Rating_Helper();
            diff --git a/inc/rating/class-opalestate-rating-init.php b/inc/rating/class-opalestate-rating-init.php
            new file mode 100755
            index 00000000..c5a8db6a
            --- /dev/null
            +++ b/inc/rating/class-opalestate-rating-init.php
            @@ -0,0 +1,245 @@
            +cpt_support = $cpt_support;
            +		$this->cpt_feature = $cpt_feature;
            +		$this->meta_prefix = $meta_prefix;
            +
            +		// Check comment fields.
            +		add_filter( 'comments_open', [ $this, 'comments_open' ], 10, 2 );
            +		add_filter( 'preprocess_comment', [ $this, 'check_comment_rating' ], 0 );
            +
            +		// Add comment rating.
            +		add_action( 'comment_post', [ $this, 'add_comment_rating' ], 1 );
            +
            +		// Clear transients.
            +		add_action( 'wp_update_comment_count', [ $this, 'clear_transients' ] );
            +
            +		// Support avatars for `review` comment type.
            +		add_filter( 'get_avatar_comment_types', [ $this, 'add_avatar_for_review_comment_type' ] );
            +
            +		// Set comment type.
            +		add_filter( 'preprocess_comment', [ $this, 'update_comment_type' ], 1 );
            +
            +		// Remove comment meta boxes.
            +		add_action( 'admin_menu', [ $this, 'remove_meta_boxes' ] );
            +
            +		// Clean
            +		add_action( 'trashed_post', [ $this, 'trash_feature' ] );
            +		add_action( 'untrashed_post', [ $this, 'trash_feature' ] );
            +		add_action( 'delete_post', [ $this, 'clear_meta' ] );
            +	}
            +
            +	/**
            +	 * Gets comment type.
            +	 *
            +	 * @return string
            +	 */
            +	public function get_comment_type() {
            +		return str_replace( 'opalestate_', '', $this->cpt_support ) . '_review';
            +	}
            +
            +	/**
            +	 * See if comments are open.
            +	 *
            +	 * @param bool $open    Whether the current post is open for comments.
            +	 * @param int  $post_id Post ID.
            +	 * @return bool
            +	 */
            +	public function comments_open( $open, $post_id ) {
            +		if ( $this->cpt_support === get_post_type( $post_id ) && ! post_type_supports( $this->cpt_support, 'comments' ) ) {
            +			$open = false;
            +		}
            +
            +		return $open;
            +	}
            +
            +	/**
            +	 * Validate the comment ratings.
            +	 *
            +	 * @param array $comment_data Comment data.
            +	 * @return array
            +	 */
            +	public function check_comment_rating( $comment_data ) {
            +		// If posting a comment (not trackback etc) and not logged in.
            +		$features = Opalestate_Rating_Helper::get_features( $this->cpt_feature );
            +		if ( $features ) {
            +			foreach ( $features as $feature_slug => $feature_title ) {
            +				$post = $this->cpt_feature . '_' . $feature_slug;
            +				if ( ! is_admin() && isset( $_POST['comment_post_ID'], $_POST[ $post ], $comment_data['comment_type'] ) && $this->cpt_support === get_post_type( absint( $_POST['comment_post_ID'] ) ) && empty( $_POST[ $post ] ) && '' === $comment_data['comment_type'] ) { // WPCS: input var ok, CSRF ok.
            +					wp_die( esc_html__( 'Please rate all features.', 'opalestate-pro' ) );
            +					exit;
            +				}
            +			}
            +		} else {
            +			if ( ! is_admin() && isset( $_POST['comment_post_ID'], $_POST['opalestate_rating'], $comment_data['comment_type'] ) && $this->cpt_support === get_post_type( absint( $_POST['comment_post_ID'] ) ) && empty( $_POST['opalestate_rating'] ) && '' === $comment_data['comment_type'] ) { // WPCS: input var ok, CSRF ok.
            +				wp_die( esc_html__( 'Please rate.', 'opalestate-pro' ) );
            +				exit;
            +			}
            +		}
            +
            +		return $comment_data;
            +	}
            +
            +	/**
            +	 * Rating field for comments.
            +	 *
            +	 * @param int $comment_id Comment ID.
            +	 */
            +	public function add_comment_rating( $comment_id ) {
            +		if ( ! isset( $_POST['comment_post_ID'] ) || ( $this->cpt_support !== get_post_type( absint( $_POST['comment_post_ID'] ) ) ) ) {
            +			return;
            +		}
            +
            +		$features = Opalestate_Rating_Helper::get_features( $this->cpt_feature );
            +		if ( $features ) {
            +			foreach ( $features as $feature_slug => $feature_title ) {
            +				$post = $this->cpt_feature . '_' . $feature_slug;
            +				if ( isset( $_POST[ $post ] ) ) {
            +					if ( ! $_POST[ $post ] || $_POST[ $post ] > 5 || $_POST[ $post ] < 0 ) { // WPCS: input var ok, CSRF ok, sanitization ok.
            +						continue;
            +					}
            +					add_comment_meta( $comment_id, $post, intval( $_POST[ $post ] ), true ); // WPCS: input var ok, CSRF ok.
            +				}
            +			}
            +		} else {
            +			if ( isset( $_POST['opalestate_rating'] ) ) { // WPCS: input var ok, CSRF ok.
            +				if ( ! $_POST['opalestate_rating'] || $_POST['opalestate_rating'] > 5 || $_POST['opalestate_rating'] < 0 ) { // WPCS: input var ok, CSRF ok, sanitization ok.
            +					return;
            +				}
            +				add_comment_meta( $comment_id, 'opalestate_rating', intval( $_POST['opalestate_rating'] ), true ); // WPCS: input var ok, CSRF ok.
            +			}
            +		}
            +
            +		$post_id = isset( $_POST['comment_post_ID'] ) ? absint( $_POST['comment_post_ID'] ) : 0; // WPCS: input var ok, CSRF ok.
            +		if ( $post_id ) {
            +			$this->clear_transients( $post_id );
            +		}
            +	}
            +
            +	/**
            +	 * Make sure WP displays avatars for comments with the `$this->cpt_support` type.
            +	 *
            +	 * @param array $comment_types Comment types.
            +	 * @return array
            +	 */
            +	public function add_avatar_for_review_comment_type( $comment_types ) {
            +		return array_merge( $comment_types, [ $this->get_comment_type() ] );
            +	}
            +
            +	/**
            +	 * Ensure property average rating and review count is kept up to date.
            +	 *
            +	 * @param int $post_id Post ID.
            +	 */
            +	public function clear_transients( $post_id ) {
            +		if ( $this->cpt_support === get_post_type( $post_id ) ) {
            +			do_action( 'opalestate_rating_before_clear_transients', $post_id, $this->cpt_support, $this->cpt_feature );
            +
            +			update_post_meta( $post_id, $this->meta_prefix . 'rating_count', Opalestate_Rating_Helper::get_rating_counts_for_post( $post_id, $this->cpt_feature ) );
            +			update_post_meta( $post_id, $this->meta_prefix . 'average_rating', Opalestate_Rating_Helper::get_average_rating_for_post( $post_id, $this->cpt_feature ) );
            +			update_post_meta( $post_id, $this->meta_prefix . 'review_count', Opalestate_Rating_Helper::get_review_count_for_post( $post_id ) );
            +			update_post_meta( $post_id, $this->meta_prefix . 'rating_count_stats', Opalestate_Rating_Helper::get_rating_count_stats_for_post( $post_id, $this->cpt_feature ) );
            +			update_post_meta( $post_id, $this->meta_prefix . 'rating_average_stats', Opalestate_Rating_Helper::get_rating_average_stats_by_features_for_post( $post_id, $this->cpt_feature,
            +				$this->meta_prefix ) );
            +
            +			do_action( 'opalestate_rating_after_clear_transients', $post_id, $this->cpt_support, $this->cpt_feature );
            +		}
            +	}
            +
            +	/**
            +	 * Update comment type of property reviews.
            +	 *
            +	 * @param array $comment_data Comment data.
            +	 * @return array
            +	 */
            +	public function update_comment_type( $comment_data ) {
            +		if ( ! is_admin() && isset( $_POST['comment_post_ID'], $comment_data['comment_type'] ) && '' === $comment_data['comment_type'] && $this->cpt_support === get_post_type( absint( $_POST['comment_post_ID'] ) ) ) { // WPCS: input var ok, CSRF ok.
            +			$comment_data['comment_type'] = $this->get_comment_type();
            +		}
            +
            +		return $comment_data;
            +	}
            +
            +	public function remove_meta_boxes() {
            +		// remove_meta_box( 'commentstatusdiv', $this->cpt_support, 'normal' );
            +		remove_meta_box( 'commentsdiv', $this->cpt_support, 'normal' );
            +	}
            +
            +	public function trash_feature( $id ) {
            +		if ( ! $id ) {
            +			return;
            +		}
            +
            +		$post_type = get_post_type( $id );
            +
            +		if ( $post_type !== $this->cpt_feature ) {
            +			return;
            +		}
            +
            +		$this->clean_and_recal();
            +	}
            +
            +	public function clear_meta( $id ) {
            +		if ( ! current_user_can( 'delete_posts' ) || ! $id ) {
            +			return;
            +		}
            +
            +		$post_type = get_post_type( $id );
            +
            +		if ( $post_type !== $this->cpt_feature ) {
            +			return;
            +		}
            +
            +		global $wpdb;
            +		$feature = get_post( $id );
            +		if ( ! $feature ) {
            +			return;
            +		}
            +
            +		$meta_key = $this->cpt_feature . '_' . str_replace( '__trashed', '', $feature->post_name );
            +		if ( $meta_key && ( 0 !== $meta_key ) ) {
            +			$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->commentmeta} WHERE meta_key = %s;", $meta_key ) );
            +		}
            +
            +		$this->clean_and_recal();
            +	}
            +
            +	protected function clean_and_recal() {
            +		$posts = get_posts( [
            +			'post_type'      => $this->cpt_support,
            +			'posts_per_page' => -1,
            +			'post_status'    => 'any',
            +		] );
            +
            +		foreach ( $posts as $post ) {
            +			$this->clear_transients( $post->ID );
            +		}
            +	}
            +}
            diff --git a/inc/rating/class-opalestate-rating-metabox.php b/inc/rating/class-opalestate-rating-metabox.php
            new file mode 100755
            index 00000000..d751528e
            --- /dev/null
            +++ b/inc/rating/class-opalestate-rating-metabox.php
            @@ -0,0 +1,175 @@
            +
            + * @copyright  Copyright (C) 2019 wpopal.com. All Rights Reserved.
            + * @license    GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
            + *
            + * @website  http://www.wpopal.com
            + * @support  http://www.wpopal.com/support/forum.html
            + */
            +
            +if ( ! defined( 'ABSPATH' ) ) {
            +	exit; // Exit if accessed directly
            +}
            +
            +/**
            + * Class Opalestate_Rating_MetaBox
            + */
            +class Opalestate_Rating_MetaBox {
            +
            +	public function register_admin_comment_fields() {
            +		$rating_supports = Opalestate_Rating::get_rating_supports();
            +
            +		foreach ( $rating_supports as $key => $support ) {
            +			$this->register_comment_metabox( $support['post_type'], $support['features_cpt'] );
            +		}
            +	}
            +
            +	public function register_admin_feature_fields() {
            +		$rating_supports = Opalestate_Rating::get_rating_supports();
            +
            +		foreach ( $rating_supports as $key => $support ) {
            +			$this->register_feature_metabox( $support['features_cpt'] );
            +		}
            +	}
            +
            +	/**
            +	 * Hook in and register a metabox for the admin comment edit page.
            +	 */
            +	public function register_comment_metabox( $cpt_support, $cpt_feature ) {
            +		if ( ! isset( $_GET['c'] ) ) {
            +			return;
            +		}
            +
            +		$comment_type = get_comment_type( sanitize_text_field( $_GET['c'] ) );
            +
            +		if ( $comment_type !== $this->get_comment_type( $cpt_support ) ) {
            +			return;
            +		}
            +
            +		$features = Opalestate_Rating_Helper::get_features( $cpt_feature );
            +
            +		$cmb = new_cmb2_box( [
            +			'id'           => $cpt_support . '_comment_meta',
            +			'title'        => $features ? esc_html__( 'Rating features', 'opalestate-pro' ) : esc_html__( 'Rating', 'opalestate-pro' ),
            +			'object_types' => [ 'comment' ],
            +		] );
            +
            +		if ( $features ) {
            +			foreach ( $features as $feature_slug => $feature_title ) {
            +				$id = $cpt_feature . '_' . $feature_slug;
            +
            +				$cmb->add_field( [
            +					'id'      => $id,
            +					'type'    => 'select',
            +					'name'    => $feature_title,
            +					'options' => [
            +						'1' => '1 ★',
            +						'2' => '2 ★★',
            +						'3' => '3 ★★★',
            +						'4' => '4 ★★★★',
            +						'5' => '5 ★★★★★',
            +					],
            +					// 'show_on_cb' => function ( $cmb ) {
            +					// 	return isset( $_GET['c'] );
            +					// },
            +				] );
            +			}
            +		} else {
            +			$cmb->add_field( [
            +				'id'      => 'opalestate_rating',
            +				'type'    => 'select',
            +				'options' => [
            +					'1' => '1 ★',
            +					'2' => '2 ★★',
            +					'3' => '3 ★★★',
            +					'4' => '4 ★★★★',
            +					'5' => '5 ★★★★★',
            +				],
            +				// 'show_on_cb' => function ( $cmb ) {
            +				// 	return isset( $_GET['c'] );
            +				// },
            +			] );
            +		}
            +	}
            +
            +	/**
            +	 * Hook in and register a metabox for the admin comment edit page.
            +	 */
            +	public function register_feature_metabox( $cpt_feature ) {
            +		$cmb = new_cmb2_box( [
            +			'id'           => $cpt_feature . '_meta',
            +			'title'        => esc_html__( 'Data', 'opalestate-pro' ),
            +			'object_types' => [ $cpt_feature ],
            +		] );
            +
            +		$cmb->add_field( [
            +			'name' => esc_html__( 'Description', 'opalestate-pro' ),
            +			'id'   => 'opalestate_feature_desc',
            +			'type' => 'textarea_small',
            +		] );
            +
            +		$cmb->add_field( [
            +			'name'       => esc_html__( 'Order', 'opalestate-pro' ),
            +			'desc'       => esc_html__( 'Set a priority to display', 'opalestate-pro' ),
            +			'id'         => 'opalestate_feature_order',
            +			'type'       => 'text_small',
            +			'attributes' => [
            +				'type' => 'number',
            +			],
            +			'default'    => 0,
            +		] );
            +	}
            +
            +	/**
            +	 * Save meta box data
            +	 *
            +	 * @param mixed $data Data to save.
            +	 * @return mixed
            +	 */
            +	public static function save( $data ) {
            +		if ( ! isset( $data['comment_post_ID'] ) || ! $data['comment_post_ID'] ) {
            +			return $data;
            +		}
            +
            +		$comment_post_ID = $data['comment_post_ID'];
            +		$cpt_support     = get_post_type( $comment_post_ID );
            +		$rating_supports = Opalestate_Rating::get_rating_supports();
            +
            +		if ( ! isset( $rating_supports[ $cpt_support ] ) || ! isset( $rating_supports[ $cpt_support ]['features_cpt'] ) ) {
            +			return $data;
            +		}
            +
            +		$cpt_feature = $rating_supports[ $cpt_support ]['features_cpt'];
            +		$comment_id  = $data['comment_ID'];
            +		$features    = Opalestate_Rating_Helper::get_features( $cpt_feature );
            +
            +		if ( $features ) {
            +			foreach ( $features as $feature_slug => $feature_title ) {
            +				$id = $cpt_feature . '_' . $feature_slug;
            +				if ( isset( $_POST[ $id ] ) && ( $_POST[ $id ] > 0 ) && ( $_POST[ $id ] <= 5 ) ) {
            +					update_comment_meta( $comment_id, $id, intval( wp_unslash( $_POST[ $id ] ) ) ); // WPCS: input var ok.
            +				}
            +			}
            +		} else {
            +			if ( isset( $_POST['opalestate_rating'] ) && ( $_POST['opalestate_rating'] > 0 ) && ( $_POST['opalestate_rating'] <= 5 ) ) {
            +				update_comment_meta( $comment_id, 'opalestate_rating', intval( wp_unslash( $_POST['opalestate_rating'] ) ) ); // WPCS: input var ok.
            +			}
            +		}
            +
            +		// Return regular value after updating.
            +		return $data;
            +	}
            +
            +	/**
            +	 * Gets comment type.
            +	 *
            +	 * @return string
            +	 */
            +	public function get_comment_type( $cpt_support ) {
            +		return str_replace( 'opalestate_', '', $cpt_support ) . '_review';
            +	}
            +}
            diff --git a/inc/rating/class-opalestate-rating.php b/inc/rating/class-opalestate-rating.php
            new file mode 100755
            index 00000000..4080d97b
            --- /dev/null
            +++ b/inc/rating/class-opalestate-rating.php
            @@ -0,0 +1,102 @@
            +includes();
            +		$this->process();
            +
            +		// Template loader.
            +		add_filter( 'comments_template', [ $this, 'comments_template_loader' ] );
            +
            +		// Add shortcode User property reviews.
            +		add_shortcode( 'opalestate_user_property_reviews', [ $this, 'property_reviews_template' ] );
            +		add_filter( 'opalestate_user_content_reviews_page', [ $this, 'property_reviews_template' ] );
            +	}
            +
            +	public function includes() {
            +		require_once 'class-opalestate-rating-features-posttype.php';
            +		require_once 'class-opalestate-rating-metabox.php';
            +		require_once 'class-opalestate-rating-helper.php';
            +		require_once 'class-opalestate-rating-init.php';
            +		require_once 'rating-functions.php';
            +		require_once 'rating-hook-functions.php';
            +	}
            +
            +	public static function get_rating_supports() {
            +		return [
            +			// Support property rating.
            +			'opalestate_property' => [
            +				'post_type'    => 'opalestate_property',
            +				'features_cpt' => 'opalestate_rating_ft',
            +				'prefix'       => OPALESTATE_PROPERTY_PREFIX,
            +			],
            +			// Support agency rating.
            +			'opalestate_agency'   => [
            +				'post_type'    => 'opalestate_agency',
            +				'features_cpt' => 'opalestate_agency_ft',
            +				'prefix'       => OPALESTATE_AGENCY_PREFIX,
            +			],
            +			// Support agent rating.
            +			'opalestate_agent'    => [
            +				'post_type'    => 'opalestate_agent',
            +				'features_cpt' => 'opalestate_agent_ft',
            +				'prefix'       => OPALESTATE_AGENT_PREFIX,
            +			],
            +		];
            +	}
            +
            +	public function process() {
            +		$rating_supports = static::get_rating_supports();
            +		foreach ( $rating_supports as $key => $support ) {
            +			new Opalestate_Rating_Init( $support['post_type'], $support['features_cpt'], $support['prefix'] );
            +		}
            +	}
            +
            +	/**
            +	 * Load comments template.
            +	 *
            +	 * @param string $template template to load.
            +	 * @return string
            +	 */
            +	public function comments_template_loader( $template ) {
            +		$supports           = static::get_rating_supports();
            +		$post_type_supports = array_keys( $supports );
            +
            +		if ( ! in_array( get_post_type(), $post_type_supports ) ) {
            +			return $template;
            +		}
            +
            +		$check_dirs = [
            +			trailingslashit( get_stylesheet_directory() ) . 'opalestate/rating/',
            +			trailingslashit( get_template_directory() ) . 'opalestate/rating/',
            +			trailingslashit( get_stylesheet_directory() ),
            +			trailingslashit( get_template_directory() ),
            +			trailingslashit( OPALESTATE_PLUGIN_DIR ) . 'templates/rating/',
            +		];
            +
            +		foreach ( $check_dirs as $dir ) {
            +			$file = 'opalestate-ratings.php';
            +			if ( file_exists( trailingslashit( $dir ) . $file ) ) {
            +				return trailingslashit( $dir ) . $file;
            +			}
            +		}
            +	}
            +
            +	public function property_reviews_template() {
            +		if ( ! is_user_logged_in() || ! $current_user_id = get_current_user_id() ) {
            +			return '';
            +		}
            +
            +		$args = [
            +			'post_author__in' => [ $current_user_id ],
            +			'status'          => 'approve',
            +			'type'            => 'property_review',
            +		];
            +
            +		$comments = get_comments( $args );
            +
            +		return opalestate_load_template_path( 'user/property-ratings', [ 'comments' => $comments ] );
            +	}
            +}
            +
            +new Opalestate_Rating();
            diff --git a/inc/rating/rating-functions.php b/inc/rating/rating-functions.php
            new file mode 100755
            index 00000000..65210173
            --- /dev/null
            +++ b/inc/rating/rating-functions.php
            @@ -0,0 +1,107 @@
            + $comment,
            +				'args'    => $args,
            +				'depth'   => $depth,
            +			]
            +		);
            +	}
            +}
            +
            +if ( ! function_exists( 'opalestate_review_display_gravatar' ) ) {
            +	/**
            +	 * Display the review authors gravatar
            +	 *
            +	 * @param array $comment WP_Comment.
            +	 * @return void
            +	 */
            +	function opalestate_review_display_gravatar( $comment ) {
            +		echo get_avatar( $comment, apply_filters( 'opalestate_review_gravatar_size', '60' ), '' );
            +	}
            +}
            +
            +if ( ! function_exists( 'opalestate_review_display_rating' ) ) {
            +	/**
            +	 * Display the reviewers star rating
            +	 *
            +	 * @return void
            +	 */
            +	function opalestate_review_display_rating() {
            +		echo opalestate_load_template_path( 'rating/review-rating' );
            +	}
            +}
            +
            +if ( ! function_exists( 'opalestate_review_display_meta' ) ) {
            +	/**
            +	 * Display the review authors meta (name, verified owner, review date)
            +	 *
            +	 * @return void
            +	 */
            +	function opalestate_review_display_meta() {
            +		echo opalestate_load_template_path( 'rating/review-meta' );
            +	}
            +}
            +
            +if ( ! function_exists( 'opalestate_review_display_comment_text' ) ) {
            +
            +	/**
            +	 * Display the review content.
            +	 */
            +	function opalestate_review_display_comment_text() {
            +		echo '
            '; + comment_text(); + echo '
            '; + } +} + +function opalestate_get_property_rating_features() { + return Opalestate_Rating_Helper::get_features( 'opalestate_rating_ft' ); +} + +function opalestate_get_agency_rating_features() { + return Opalestate_Rating_Helper::get_features( 'opalestate_agency_ft' ); +} + +function opalestate_get_agent_rating_features() { + return Opalestate_Rating_Helper::get_features( 'opalestate_agent_ft' ); +} diff --git a/inc/rating/rating-hook-functions.php b/inc/rating/rating-hook-functions.php new file mode 100755 index 00000000..8c396ca3 --- /dev/null +++ b/inc/rating/rating-hook-functions.php @@ -0,0 +1,13 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Property_MetaBox_Submission { + + /** + * Defines custom front end fields + * + * @access public + * @param array $metaboxes + * @return array + */ + public function register_form( array $metaboxes ) { + + $prefix = OPALESTATE_PROPERTY_PREFIX; + + $fields = array_merge( + $this->metaboxes_general_fields_front(), + + $this->is_enabled_tab( 'media' ) ? $this->metaboxes_media_fields() : [], + $this->is_enabled_tab( 'location' ) ? $this->metaboxes_location_fields() : [], + $this->is_enabled_tab( 'information' ) ? $this->metaboxes_info_fields() : [], + $this->is_enabled_tab( 'amenities' ) ? $this->metaboxes_amenities_fields() : [], + $this->is_enabled_tab( 'facilities' ) ? $this->metaboxes_public_facilities_fields() : [], + $this->is_enabled_tab( 'apartments' ) ? $this->metaboxes_public_apartments_fields() : [], + $this->is_enabled_tab( 'floor_plans' ) ? $this->metaboxes_public_floor_plans_fields() : [] + ); + + $metaboxes[ $prefix . 'front' ] = [ + 'id' => $prefix . 'front', + 'title' => esc_html__( 'Name and Description', 'opalestate-pro' ), + 'object_types' => [ 'opalestate_property' ], + 'context' => 'normal', + 'priority' => 'high', + 'save_fields' => false, + 'show_names' => true, + 'fields' => $fields, + 'cmb_styles' => false, + + ]; + + return $metaboxes; + } + + public function get_fields_groups() { + return [ + 'general' => [ 'status' => true, 'title' => esc_html__( 'General', 'opalestate-pro' ) ], + + 'media' => [ 'status' => $this->is_enabled_tab( 'media' ), 'title' => esc_html__( 'Media', 'opalestate-pro' ) ], + 'location' => [ 'status' => $this->is_enabled_tab( 'location' ), 'title' => esc_html__( 'Location', 'opalestate-pro' ) ], + 'information' => [ 'status' => $this->is_enabled_tab( 'information' ), 'title' => esc_html__( 'Information', 'opalestate-pro' ) ], + 'amenities' => [ 'status' => $this->is_enabled_tab( 'amenities' ), 'title' => esc_html__( 'Amenities', 'opalestate-pro' ) ], + 'facilities' => [ 'status' => $this->is_enabled_tab( 'facilities' ), 'title' => esc_html__( 'Facilities', 'opalestate-pro' ) ], + 'apartments' => [ 'status' => $this->is_enabled_tab( 'apartments' ), 'title' => esc_html__( 'Apartments', 'opalestate-pro' ) ], + 'floor_plans' => [ 'status' => $this->is_enabled_tab( 'floor_plans' ), 'title' => esc_html__( 'Floor plans', 'opalestate-pro' ) ] + ]; + } + + public function metaboxes_general_fields_front() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + + $post_id = ''; + if ( ! empty( $_GET['id'] ) ) { + $post = get_post( intval( $_GET['id'] ) ); + $featured_image = wp_get_attachment_image_src( get_post_thumbnail_id( absint( $_GET['id'] ) ) ); + $post_id = $post->ID; + } + + $currency = opalestate_currency_symbol() ? ' (' . opalestate_currency_symbol() . ')' : ' ($)'; + + $fields = [ + [ + 'id' => 'post_type', + 'type' => 'hidden', + 'default' => 'opalestate_property', + + ], + [ + 'id' => 'post_id', + 'type' => 'hidden', + 'default' => $post_id, + + ], + + [ + 'name' => esc_html__( 'Title', 'opalestate-pro' ) . ' *', + 'id' => $prefix . 'title', + 'type' => 'text', + 'default' => ! empty( $post ) ? $post->post_title : '', + 'before_row' => '
            ', + 'attributes' => [ + 'required' => 'required', + ], + ], + [ + 'name' => esc_html__( 'Description', 'opalestate-pro' ), + 'id' => $prefix . 'text', + 'type' => 'wysiwyg', + 'default' => ! empty( $post ) ? $post->post_content : '', + 'before_row' => '
            ', + ], + + [ + 'id' => $prefix . 'price', + 'name' => esc_html__( 'Regular Price', 'opalestate-pro' ) . $currency . ' *', + 'type' => 'text', + 'description' => esc_html__( 'Enter amount without currency', 'opalestate-pro' ), + 'attributes' => opalestate_get_option( 'require_input_price' ) ? [ 'required' => 'required' ] : '', + 'before_row' => '
            ', // callback + ], + [ + 'id' => $prefix . 'saleprice', + 'name' => esc_html__( 'Sale Price', 'opalestate-pro' ) . $currency, + 'type' => 'text', + 'description' => esc_html__( 'Enter amount without currency', 'opalestate-pro' ), + ], + [ + 'id' => $prefix . 'before_pricelabel', + 'name' => esc_html__( 'Before Price Label (optional)', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'Before Price Label (e.g. "from")', 'opalestate-pro' ), + ], + [ + 'id' => $prefix . 'pricelabel', + 'name' => esc_html__( 'After Price Label (optional)', 'opalestate-pro' ), + 'type' => 'text', + 'description' => esc_html__( 'After Price Label (e.g. "per month")', 'opalestate-pro' ), + ], + [ + 'name' => esc_html__( 'Statuses', 'opalestate-pro' ), + 'id' => $prefix . 'status', + 'type' => 'taxonomy_select', + 'taxonomy' => 'opalestate_status', + 'class' => 'form-control', + 'attributes' => [ + 'required' => 'required', + ], + 'before_row' => '

            ', // callback + ], + [ + 'name' => esc_html__( 'Types', 'opalestate-pro' ), + 'id' => $prefix . 'type', + 'type' => 'taxonomy_select', + 'taxonomy' => 'opalestate_types', + 'class' => 'form-control', + 'attributes' => [ + 'required' => 'required', + ], + 'after_row' => '

            ', // callback + ], + ]; + + return apply_filters( 'opalestate_postype_property_metaboxes_fields_general', $fields ); + } + + public function metaboxes_media_fields() { + + $id = 0; + + if( isset($_GET['id']) ){ + $post_id = intval( $_GET['id'] ); + $id = get_post_thumbnail_id( $post_id ); + } + + $prefix = OPALESTATE_PROPERTY_PREFIX; + $fields = [ + + [ + 'id' => "{$prefix}featured_image", + 'name' => esc_html__( 'Featured Image', 'opalestate-pro' ), + 'type' => 'uploader', + 'single' => true, + 'value' => $id, + 'description' => esc_html__( 'Select one or more images to show as gallery', 'opalestate-pro' ), + 'before_row' => '
            ', + + ], + + [ + 'id' => "{$prefix}gallery", + 'name' => esc_html__( 'Images Gallery', 'opalestate-pro' ), + 'type' => 'uploader', + 'description' => esc_html__( 'Select one or more images to show as gallery', 'opalestate-pro' ), + + ], + + [ + 'id' => "{$prefix}video", + 'name' => esc_html__( 'Video', 'opalestate-pro' ), + 'type' => 'text_url', + 'before_row' => '
            ', + 'description' => esc_html__( 'Input for videos, audios from Youtube, Vimeo and all supported sites by WordPress. It has preview feature.', 'opalestate-pro' ), + ], + [ + 'id' => "{$prefix}virtual", + 'name' => esc_html__( '360° Virtual Tour', 'opalestate-pro' ), + 'type' => 'textarea_small', + 'description' => esc_html__( 'Input iframe to show 360° Virtual Tour.', 'opalestate-pro' ), + 'before_row' => '
            ' + ], + [ + 'id' => "{$prefix}attachments", + 'name' => esc_html__( 'Attachments', 'opalestate-pro' ), + 'type' => 'uploader', + 'before_row' => '
            ', + 'show_icon' => true, + 'accept' => 'application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'options' => [ + 'url' => true, // Hide the text input for the url + ], + 'description' => esc_html__( 'Select one or more files to allow download', 'opalestate-pro' ), + 'after_row' => '
            ', + ], + ]; + + return apply_filters( 'opalestate_postype_property_metaboxes_fields_price', $fields ); + } + + public function metaboxes_info_fields() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + + $fields = [ + [ + 'name' => esc_html__( 'Built year', 'opalestate-pro' ), + 'id' => $prefix . 'builtyear', + 'type' => 'text_date', + 'description' => esc_html__( 'Enter built year', 'opalestate-pro' ), + + 'before_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Parking', 'opalestate-pro' ), + 'id' => $prefix . 'parking', + 'type' => 'text', + 'attributes' => array( + 'type' => 'number', + 'pattern' => '\d*', + ), + 'sanitization_cb' => 'absint', + 'escape_cb' => 'absint', + 'description' => esc_html__( 'Enter number of Parking', 'opalestate-pro' ), + ], + [ + 'name' => esc_html__( 'Bedrooms', 'opalestate-pro' ), + 'id' => $prefix . 'bedrooms', + 'type' => 'text', + 'attributes' => array( + 'type' => 'number', + 'pattern' => '\d*', + ), + 'sanitization_cb' => 'absint', + 'escape_cb' => 'absint', + 'description' => esc_html__( 'Enter number of bedrooms', 'opalestate-pro' ), + ], + [ + 'name' => esc_html__( 'Bathrooms', 'opalestate-pro' ), + 'id' => $prefix . 'bathrooms', + 'type' => 'text', + 'attributes' => array( + 'type' => 'number', + 'pattern' => '\d*', + ), + 'sanitization_cb' => 'absint', + 'escape_cb' => 'absint', + 'description' => esc_html__( 'Enter number of bathrooms', 'opalestate-pro' ), + ], + [ + 'name' => esc_html__( 'Plot Size', 'opalestate-pro' ), + 'id' => $prefix . 'plotsize', + 'type' => 'text', + 'description' => esc_html__( 'Enter size of Plot as 20x30, 20x30x40, 20x30x40x50', 'opalestate-pro' ), + ], + [ + 'name' => esc_html__( 'Area Size', 'opalestate-pro' ), + 'id' => $prefix . 'areasize', + 'type' => 'text', + 'attributes' => array( + 'type' => 'number', + 'pattern' => '\d*', + ), + 'sanitization_cb' => 'absint', + 'escape_cb' => 'absint', + 'description' => esc_html__( 'Enter size of area in sqft', 'opalestate-pro' ), + ], + [ + 'name' => esc_html__( 'Orientation', 'opalestate-pro' ), + 'id' => "{$prefix}orientation", + 'type' => 'text', + 'description' => esc_html__( 'Enter Orientation of property', 'opalestate-pro' ), + ], + [ + 'name' => esc_html__( 'Living Rooms', 'opalestate-pro' ), + 'id' => "{$prefix}livingrooms", + 'type' => 'text', + 'attributes' => array( + 'type' => 'number', + 'pattern' => '\d*', + ), + 'sanitization_cb' => 'absint', + 'escape_cb' => 'absint', + 'description' => esc_html__( 'Enter Number of Living Rooms', 'opalestate-pro' ), + ], + + [ + 'name' => esc_html__( 'Kitchens', 'opalestate-pro' ), + 'id' => "{$prefix}kitchens", + 'type' => 'text', + 'attributes' => array( + 'type' => 'number', + 'pattern' => '\d*', + ), + 'sanitization_cb' => 'absint', + 'escape_cb' => 'absint', + 'description' => esc_html__( 'Enter Number of Kitchens', 'opalestate-pro' ), + ], + + [ + 'name' => esc_html__( 'Rooms', 'opalestate-pro' ), + 'id' => "{$prefix}amountrooms", + 'type' => 'text', + 'attributes' => array( + 'type' => 'number', + 'pattern' => '\d*', + ), + 'sanitization_cb' => 'absint', + 'escape_cb' => 'absint', + 'description' => esc_html__( 'Enter Number of Amount Rooms', 'opalestate-pro' ), + 'after_row' => '

            ', + + ], + ]; + + return apply_filters( 'opalestate_metaboxes_public_info_fields', $fields ); + } + + public function metaboxes_location_fields() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + $management = [ + [ + 'name' => esc_html__( 'Country', 'opalestate-pro' ), + 'id' => $prefix . 'location', + 'type' => 'taxonomy_select', + 'taxonomy' => 'opalestate_location', + 'before_row' => '
            ', + ], + [ + 'name' => esc_html__( 'States / Province', 'opalestate-pro' ), + 'id' => $prefix . 'state', + 'type' => 'taxonomy_select', + 'taxonomy' => 'opalestate_state', + ], + [ + 'name' => esc_html__( 'City / Town', 'opalestate-pro' ), + 'id' => $prefix . 'city', + 'type' => 'taxonomy_select', + 'taxonomy' => 'opalestate_city', + ], + [ + 'name' => esc_html__( 'Postal Code / Zip', 'opalestate-pro' ), + 'id' => $prefix . 'zipcode', + 'type' => 'text', + 'after_row'=> '

            ' + + ], + [ + 'name' => esc_html__( 'Address', 'opalestate-pro' ) . ' *', + 'id' => $prefix . 'address', + 'type' => 'text', + 'attributes' => [ + 'required' => 'required', + ], + ], + [ + 'name' => esc_html__( 'Google Map View', 'opalestate-pro' ), + 'id' => $prefix . 'enablemapview', + 'type' => 'switch', + 'options' => [ + 0 => esc_html__( 'No', 'opalestate-pro' ), + 1 => esc_html__( 'Yes', 'opalestate-pro' ), + ], + 'description' => esc_html__( 'Enable Google Map', 'opalestate-pro' ), + ], + [ + 'id' => $prefix . 'map', + 'name' => esc_html__( 'Google Map', 'opalestate-pro' ), + 'type' => 'opal_map', + 'sanitization_cb' => 'opal_map_sanitise', + 'split_values' => true, + 'after_row' => '
            ', + ], + ]; + + return $management; + } + + public function metaboxes_amenities_fields() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + $fields = [ + [ + 'name' => esc_html__( 'Amenities', 'opalestate-pro' ), + 'id' => $prefix . 'amenity', + 'type' => 'taxonomy_multicheck', + 'before_row' => '
            ', + 'after_row' => '
            ', + 'taxonomy' => 'opalestate_amenities', + 'render_row_cb' => [ $this, 'amenities_html_callback' ], + ], + ]; + + return apply_filters( 'opalestate_metaboxes_amenities_fields', $fields ); + } + + public function metaboxes_public_facilities_fields() { + + $prefix = OPALESTATE_PROPERTY_PREFIX; + $fields = [ + [ + 'id' => $prefix . 'public_facilities_group', + 'type' => 'group', + 'before_group' => '
            ', + 'after_group' => '
            ', + 'fields' => [ + [ + 'id' => $prefix . 'public_facilities_key', + 'name' => esc_html__( 'Label', 'opalestate-pro' ), + 'type' => 'text', + ], + [ + 'id' => $prefix . 'public_facilities_value', + 'name' => esc_html__( 'Content', 'opalestate-pro' ), + 'type' => 'text', + ], + ], + 'options' => [ + 'group_title' => esc_html__( 'Facility {#}', 'opalestate-pro' ), + 'add_button' => esc_html__( 'Add more', 'opalestate-pro' ), + 'remove_button' => esc_html__( 'Remove', 'opalestate-pro' ), + 'sortable' => true, + 'closed' => true, + ], + ], + ]; + + return apply_filters( 'opalestate_metaboxes_public_facilities_fields', $fields ); + } + + public function metaboxes_public_apartments_fields() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + $fields = [ + [ + 'name' => esc_html__( 'Apartments', 'opalestate-pro' ), + 'id' => $prefix . 'enable_apartments', + 'type' => 'heading', + 'options' => [ + 0 => esc_html__( 'No', 'opalestate-pro' ), + 1 => esc_html__( 'Yes', 'opalestate-pro' ), + ], + 'before_row' => '
            ', + ], + [ + 'id' => $prefix . 'apartments', + 'type' => 'group', + 'after_group' => '
            ', + 'fields' => [ + [ + 'id' => $prefix . 'apartment_plot', + 'name' => esc_html__( 'Plot', 'opalestate-pro' ), + 'before_row' => '
            ', + 'type' => 'text', + + ], + + [ + 'id' => $prefix . 'apartment_beds', + 'name' => esc_html__( 'Beds', 'opalestate-pro' ), + 'type' => 'text', + ], + [ + 'id' => $prefix . 'apartment_price_from', + 'name' => esc_html__( 'Price from', 'opalestate-pro' ), + 'type' => 'text', + ], + [ + 'id' => $prefix . 'apartment_floor', + 'name' => esc_html__( 'Floor', 'opalestate-pro' ), + 'type' => 'text', + 'after_row' => '
            ', + ], + [ + 'id' => $prefix . 'apartment_building_address', + 'name' => esc_html__( 'Building / Address', 'opalestate-pro' ), + 'type' => 'textarea_small', + ], + [ + 'id' => $prefix . 'apartment_status', + 'name' => esc_html__( 'Status', 'opalestate-pro' ), + 'type' => 'select', + 'options' => apply_filters( 'opalestate_property_apartment_statuses', [ + 'available' => esc_html__( 'Available', 'opalestate-pro' ), + 'unavailable' => esc_html__( 'Unavailable', 'opalestate-pro' ), + ] ), + 'before_row' => '
            ', + ], + [ + 'id' => $prefix . 'apartment_link', + 'name' => esc_html__( 'Link', 'opalestate-pro' ), + 'type' => 'text', + 'default' => '#', + 'after_row' => '
            ', + ], + ], + 'options' => [ + 'group_title' => esc_html__( 'Apartment {#}', 'opalestate-pro' ), + 'add_button' => esc_html__( 'Add more', 'opalestate-pro' ), + 'remove_button' => esc_html__( 'Remove', 'opalestate-pro' ), + 'sortable' => true, + 'closed' => true, + ], + ], + ]; + + return apply_filters( 'opalestate_metaboxes_public_apartments_fields', $fields ); + } + + public function metaboxes_public_floor_plans_fields() { + $prefix = OPALESTATE_PROPERTY_PREFIX; + $fields = [ + [ + 'name' => esc_html__( 'Floor Plans', 'opalestate-pro' ), + 'id' => $prefix . 'enable_floor', + 'type' => 'heading', + 'before_row' => '
            ', + ], + [ + 'id' => $prefix . 'public_floor_group', + 'type' => 'group', + 'after_group' => '
            ', + 'fields' => [ + [ + 'id' => $prefix . 'floor_name', + 'name' => esc_html__( 'Name', 'opalestate-pro' ), + 'type' => 'text', + + ], + [ + 'id' => $prefix . 'floor_price', + 'name' => esc_html__( 'Price', 'opalestate-pro' ), + 'before_row' => '
            ', + 'type' => 'text', + ], + [ + 'id' => $prefix . 'floor_size', + 'name' => esc_html__( 'Size', 'opalestate-pro' ), + 'type' => 'text', + ], + [ + 'id' => $prefix . 'floor_room', + 'name' => esc_html__( 'Rooms', 'opalestate-pro' ), + 'type' => 'text', + ], + [ + 'id' => $prefix . 'floor_bath', + 'name' => esc_html__( 'Baths', 'opalestate-pro' ), + 'type' => 'text', + 'after_row' => '
            ', + ], + [ + 'id' => $prefix . 'floor_content', + 'name' => esc_html__( 'Content', 'opalestate-pro' ), + 'type' => 'textarea_small', + ], + [ + 'id' => "{$prefix}floor_image_id", + 'name' => esc_html__( 'Image Preview', 'opalestate-pro' ), + 'type' => 'uploader', + 'single' => 1, + + 'query_args' => [ + 'type' => [ + 'image/gif', + 'image/jpeg', + 'image/png', + ], + ], + 'description' => esc_html__( 'Input iframe to show 360° Virtual Tour.', 'opalestate-pro' ), + ], + ], + 'options' => [ + 'group_title' => esc_html__( 'Floor {#}', 'opalestate-pro' ), + 'add_button' => esc_html__( 'Add more', 'opalestate-pro' ), + 'remove_button' => esc_html__( 'Remove', 'opalestate-pro' ), + 'sortable' => true, + 'closed' => false, + ], + ], + ]; + + return apply_filters( 'opalestate_metaboxes_public_floor_plans_fields', $fields ); + } + + protected function is_enabled_tab( $tab ) { + return ( 'on' === opalestate_get_option( 'enable_submission_tab_' . $tab, true ) ); + } + + /** + * Manually render a field column display. + * + * @param array $field_args Array of field arguments. + * @param CMB2_Field $field The field object + */ + public function amenities_html_callback( $field_args, $field ) { + $id = $field->args( 'id' ); + $label = $field->args( 'name' ); + $name = $field->args( '_name' ); + $value = $field->escaped_value(); + $description = $field->args( 'description' ); + + $amenites = get_terms( [ + 'taxonomy' => 'opalestate_amenities', + 'orderby' => 'name', + 'order' => 'ASC', + 'hide_empty' => false, + ] ); + + if ( ! $amenites ) { + return; + } + ?> +
            +
            +
            + +
            + +
            +
              + $amenity ) : ?> +
            • + + +
            • + +
            +
            +
            + + +
            + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} +if ( ! session_id() ) { + @session_start(); +} + +/** + * @class OpalEstate_Submission + * + * @version 1.0 + */ +class OpalEstate_Submission { + + /** + * + * + */ + public $metabox; + + /** + * + * + */ + public $new_attachmenet_ids = array(); + + /** + * Constructor + */ + public function __construct() { + + /** + * Can not use $this->is_submission_page() || use 'wp_enqueue_scripts' here + * because inside this hook global $post == null + */ + add_action( 'wp_head', [ $this, 'head_check_page' ] ); + + add_action( 'cmb2_after_init', [ $this, 'process_submission' ], 10000 ); + + add_action( 'opalestate_single_property_before', [ $this, 'render_button_edit' ] ); + + if ( is_admin() ) { + add_filter( 'opalestate_settings_tabs', [ $this, 'setting_content_tab' ] ); + add_filter( 'opalestate_registered_submission_page_settings', [ $this, 'setting_content_fields' ] ); + } + + add_action( 'opalestate_user_content_submission_list_page', [ $this, 'submission_list' ] ); + add_action( 'opalestate_user_content_submission_page', [ $this, 'submission' ] ); + add_action( 'wp_enqueue_scripts', [ $this, 'scripts_styles' ], 99 ); + + $this->register_shortcodes(); + } + + /** + * Save post. + */ + public function scripts_styles() { + + wp_register_style( 'opalesate-submission', OPALESTATE_PLUGIN_URL . 'assets/submission.css' ); + wp_register_style( 'opalesate-cmb2-front', OPALESTATE_PLUGIN_URL . 'assets/cmb2-front.css' ); + wp_register_script( + 'opalestate-submission', + OPALESTATE_PLUGIN_URL . 'assets/js/frontend/submission.js', + [ + 'jquery', + ], + '1.0', + true + ); + } + + /* + * Is submission page. 'submission_page' option in General Setting + */ + public function register_shortcodes() { + $shortcodes = [ + 'submission' => [ + 'code' => 'submission', + 'label' => esc_html__( 'Submission Form', 'opalestate-pro' ), + ], + 'submission_list' => [ + 'code' => 'submission_list', + 'label' => esc_html__( 'My Properties', 'opalestate-pro' ), + ] + ]; + + foreach ( $shortcodes as $shortcode ) { + add_shortcode( 'opalestate_' . $shortcode['code'], [ $this, $shortcode['code'] ] ); + } + } + + /* + * Is submission page. 'submission_page' option in General Setting + */ + public function setting_content_tab( $tabs ) { + $tabs['submission_page'] = esc_html__( 'Submission Page', 'opalestate-pro' ); + + return $tabs; + } + + /* + * Is submission page. 'submission_page' option in General Setting + */ + public function setting_content_fields( $fields = [] ) { + $fields = [ + 'id' => 'submission_page', + 'title' => esc_html__( 'Email Settings', 'opalestate-pro' ), + 'show_on' => [ 'key' => 'options-page', 'value' => [ 'opalestate_settings' ], ], + 'fields' => apply_filters( 'opalestate_settings_submission', [ + [ + 'name' => esc_html__( 'Submission Page Settings', 'opalestate-pro' ), + 'id' => 'opalestate_title_submission_page_settings', + 'type' => 'title', + 'after_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Property Submission Page', 'opalestate-pro' ), + 'desc' => esc_html__( 'This is the submission page. The [opalestate_submission] shortcode should be on this page.', 'opalestate-pro' ), + 'id' => 'submission_page', + 'type' => 'select', + 'options' => opalestate_cmb2_get_post_options( [ + 'post_type' => 'page', + 'numberposts' => -1, + ] ), + ], + + [ + 'name' => esc_html__( 'Show Content Use Not Login', 'opalestate-pro' ), + 'desc' => esc_html__( 'Show Login/Register form and submission form if user not logined', 'opalestate-pro' ), + 'id' => 'submission_show_content', + 'type' => 'select', + 'default' => '', + 'options' => [ + '' => esc_html__( 'Show Login Form', 'opalestate-pro' ), + 'login_submission' => esc_html__( 'Show Login Form and Submission Form', 'opalestate-pro' ), + ], + ], + + [ + 'name' => esc_html__( 'Enable Admin Approve', 'opalestate-pro' ), + 'desc' => esc_html__( 'the Property will be auto approve when user submit, if you do not enable it.', 'opalestate-pro' ), + 'id' => 'admin_approve', + 'type' => 'checkbox', + ], + [ + 'name' => esc_html__( 'Enable Require Price', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable or Disable require user enter price and price label.', 'opalestate-pro' ), + 'id' => 'require_input_price', + 'type' => 'checkbox', + + ], + [ + 'name' => esc_html__( 'Submission Tab Settings', 'opalestate-pro' ), + 'id' => 'opalestate_title_submission_tab_settings', + 'type' => 'title', + 'before_row' => '
            ', + 'after_row' => '
            ', + ], + [ + 'name' => esc_html__( 'Enable Media tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable Media tab', 'opalestate-pro' ), + 'id' => 'enable_submission_tab_media', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ], + [ + 'name' => esc_html__( 'Enable Location tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable Location tab', 'opalestate-pro' ), + 'id' => 'enable_submission_tab_location', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ], + [ + 'name' => esc_html__( 'Enable Information tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable Information tab', 'opalestate-pro' ), + 'id' => 'enable_submission_tab_information', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ], + [ + 'name' => esc_html__( 'Enable Amenities tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable Amenities tab', 'opalestate-pro' ), + 'id' => 'enable_submission_tab_amenities', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ], + [ + 'name' => esc_html__( 'Enable Facilities tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable Facilities tab', 'opalestate-pro' ), + 'id' => 'enable_submission_tab_facilities', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ], + [ + 'name' => esc_html__( 'Enable Apartments tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable Apartments tab', 'opalestate-pro' ), + 'id' => 'enable_submission_tab_apartments', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ], + [ + 'name' => esc_html__( 'Enable Floor plans tab', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable Floor plans tab', 'opalestate-pro' ), + 'id' => 'enable_submission_tab_floor_plans', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + ], + ] + ), + ]; + + return $fields; + } + + /* + * Is submission page. 'submission_page' option in General Setting + */ + public function head_check_page() { + + } + + /* + * Is submission page. 'submission_page' option in General Setting + */ + public function render_button_edit() { + + global $post, $current_user; + wp_get_current_user(); + + if ( $current_user->ID == $post->post_author ) { + echo ''; + } + } + + /* + * Is submission page. 'submission_page' option in General Setting + */ + public function is_submission_page() { + global $post; + if ( ! $post || ! isset( $post->ID ) || ! $post->ID ) { + return false; + } + + return opalestate_get_option( 'submission_page' ) == $post->ID; + } + + + /** + * + * + */ + public function register_metabox() { + + $metabox = new Opalestate_Property_MetaBox_Submission(); + + add_filter( 'cmb2_meta_boxes', [ $metabox, 'register_form' ], 9999 ); + + return $metabox; + } + + /** + * FrontEnd Submission + */ + public function submission() { + + global $current_user; + + if ( ! is_user_logged_in() ) { + echo opalestate_load_template_path( 'submission/require-login' ); + if( empty(opalestate_get_option("submission_show_content")) ){ + return ""; + } + } + + if( isset($_GET['do']) && $_GET['do'] == 'completed' ){ + + OpalEstate()->session->set( 'submission', 'addnew' ); + + echo opalestate_load_template_path( 'submission/completed' ); + return ; + } + + // remove all dirty images before edit/create new a property + $this->cleanup(); + + wp_enqueue_script( 'opalestate-submission' ); + wp_enqueue_style( 'opalesate-submission' ); + wp_enqueue_style( 'opalesate-cmb2-front' ); + + + $metabox = $this->register_metabox(); + $metaboxes = apply_filters( 'cmb2_meta_boxes', [] ); + + + if ( ! isset( $metaboxes[ OPALESTATE_PROPERTY_PREFIX . 'front' ] ) ) { + return esc_html__( 'A metabox with the specified \'metabox_id\' doesn\'t exist.', 'opalestate-pro' ); + } + $post_id = 0; + + if( is_user_logged_in() ) { + // CMB2 is getting fields values from current post what means it will fetch data from submission page + // We need to remove all data before. + $post_id = ! empty( $_GET['id'] ) ? absint( $_GET['id'] ) : false; + if ( ! $post_id ) { + unset( $_POST ); + foreach ( $metaboxes[ OPALESTATE_PROPERTY_PREFIX . 'front' ]['fields'] as $field_name => $field_value ) { + delete_post_meta( get_the_ID(), $field_value['id'] ); + } + } + + if ( ! empty( $post_id ) && ! empty( $_POST['object_id'] ) ) { + $post_id = absint( $_POST['object_id'] ); + + } + + if ( $post_id && ! opalestate_is_own_property( $post_id, $current_user->ID ) ) { + echo opalestate_load_template_path( 'parts/has-warning' ); + return ; + } + } + return opalestate_load_template_path( 'submission/submission-form', + [ + 'post_id' => $post_id, + 'metaboxes' => $metaboxes, + 'navigation' => $metabox->get_fields_groups(), + ] ); + } + + /** + * + * + */ + public function cmb2_get_metabox() { + $object_id = 'fake-oject-id'; + return cmb2_get_metabox( OPALESTATE_PROPERTY_PREFIX . 'front', $object_id ); + } + + /** + * FrontEnd Submission + */ + public function process_submission() { + + if ( isset( $_POST['submission_action'] ) && ! empty( $_POST['submission_action'] ) ) { + + if ( wp_verify_nonce( $_POST['submission_action'], 'submitted-property' ) ) { + + $user_id = get_current_user_id(); + $edit = false; + $prefix = OPALESTATE_PROPERTY_PREFIX; + $blocked = OpalEstate_User::is_blocked(); + + // Setup and sanitize data + if ( isset( $_POST[ $prefix . 'title' ] ) && ! $blocked && $user_id ) { + + $metabox = $this->register_metabox(); + $metaboxes = apply_filters( 'cmb2_meta_boxes', [] ); + + + + + $post_id = ! empty( $_POST['post_id'] ) ? absint( $_POST['post_id'] ) : false; + + if( $post_id ){ + do_action( 'opalestate_process_edit_submission_before' ); + } else { + do_action( 'opalestate_process_submission_before' ); + } + + + $review_before = opalestate_get_option( 'admin_approve' ); + + $post_status = 'pending'; + + if ( ! $review_before ) { + $post_status = 'publish'; + } + + // If we are updating the post get old one. We need old post to set proper + // post_date value because just modified post will at the top in archive pages. + if ( ! empty( $post_id ) ) { + $old_post = get_post( $post_id ); + $post_date = $old_post->post_date; + } else { + $post_date = ''; + } + + $post_content = isset( $_POST[ $prefix . 'text' ] ) ? wp_kses( $_POST[ $prefix . 'text' ], + '

            ' ) : ''; + + + $data = [ + 'post_title' => sanitize_text_field( $_POST[ $prefix . 'title' ] ), + 'post_author' => $user_id, + 'post_status' => $post_status, + 'post_type' => 'opalestate_property', + 'post_date' => $post_date, + 'post_content' => $post_content, + ]; + + $unset_fields = [ + 'text', + 'title', + 'post_type', + ]; + + unset( $_POST['post_type'] ); + + foreach ( $unset_fields as $field ) { + unset( $_POST[ $prefix . $field ] ); + } + + if ( ! empty( $post_id ) ) { + $edit = true; + $data['ID'] = $post_id; + + do_action( 'opalestate_process_edit_submission_before' ); + } else { + do_action( 'opalestate_process_add_submission_before' ); + } + + if ( empty( $data['post_title'] ) || empty( $data['post_author'] ) ) { + return opalestate_output_msg_json( false, + __( 'Please enter data for all require fields before submitting', 'opalestate-pro' ), + array( + 'heading' => esc_html__('Submission Information' ,'opalestate-pro') + )) ; + } + + $post_id = wp_insert_post( $data, true ); + + if ( ! empty( $post_id ) && ! empty( $_POST['object_id'] ) ) { + $_POST['object_id'] = (int) $post_id; + + $metaboxes = apply_filters( 'cmb2_meta_boxes', [] ); + + /* + * Processing upload files + */ + $this->process_upload_files( $post_id, $_POST ); + + /** + * Fetch sanitized values + */ + cmb2_get_metabox_form( $metaboxes[ $prefix. 'front' ], $post_id ); + $cmb = $this->cmb2_get_metabox(); + $sanitized_values = $cmb->get_sanitized_values( $_POST ); + $cmb->save_fields( $post_id, 'post', $sanitized_values ); + + // Create featured image + $featured_image = get_post_meta( $post_id, $prefix . 'featured_image', true ); + + if ( ! empty( $_POST[ $prefix . 'featured_image' ] ) && isset( $_POST[ $prefix . 'featured_image' ] ) ) { + foreach( $_POST[ $prefix . 'featured_image' ] as $key => $value ) { + set_post_thumbnail( $post_id, $key ); + } + unset( $_POST[ $prefix . 'featured_image' ] ); + } else { + delete_post_thumbnail( $post_id ); + } + + // remove meta field; + update_post_meta( $post_id, $prefix . 'featured_image', null ); + //redirect + $_SESSION['messages'][] = [ 'success', esc_html__( 'Property has been successfully updated.', 'opalestate-pro' ) ]; + + do_action( "opalestate_process_submission_after", $user_id, $post_id, $edit ); + + if ( $edit ) { + $type = OpalEstate()->session->set( 'submission' , 'edit' ); + $message = esc_html__('The property has updated completed with new information', 'opalestate-pro' ); + do_action( "opalestate_processed_edit_submission", $user_id, $post_id ); + } else { + $type = OpalEstate()->session->get( 'submission' , 'addnew' ); + $message = esc_html__('You have submitted the property successful', 'opalestate-pro' ); + do_action( "opalestate_processed_new_submission", $user_id, $post_id ); + } + + // set ready of attachment for use. + if( $this->new_attachmenet_ids ){ + foreach ( $this->new_attachmenet_ids as $_id ) { + delete_post_meta( $_id, '_pending_to_use_', 1 ); + } + } + + // + + return opalestate_output_msg_json( true, + $message, + array( + 'heading' => esc_html__('Submission Information' ,'opalestate-pro'), + 'redirect' => opalestate_submssion_page( $post_id, array('do' => 'completed') ) + )) ; + } + } else { + return opalestate_output_msg_json( fales, + __('Currently, your account was blocked, please keep contact admin to resolve this!.', 'opalestate-pro' ), + array('heading' => esc_html__('Submission Information' ,'opalestate-pro') ) + ) ; + } + } + + return opalestate_output_msg_json( fales, + __('Sorry! Your submitted datcould not save a at this time', 'opalestate-pro' ), + array('heading' => esc_html__('Submission Information', 'opalestate-pro') ) + ) ; + } + } + + /** + * + * + */ + private function get_field_name( $field ){ + return OPALESTATE_PROPERTY_PREFIX.$field; + } + + /** + * + * + */ + private function process_upload_files ( $post_id ) { + + //upload images for featured and gallery images + if( isset($_FILES) && !empty($_FILES) ){ + + /// + $fields = array( + $this->get_field_name('gallery'), + $this->get_field_name('featured_image'), + ); + + foreach( $_FILES as $key => $value ) { + // allow processing in fixed collection + if( in_array($key, $fields) ){ + $ufile = $_FILES[$key]; + + /// ///// + if( isset( $ufile['name'] ) && is_array( $ufile['name'] ) ){ + $output = array(); + + foreach ( $ufile['name'] as $f_key => $f_value ) { + $loop_file = array( + 'name' => $ufile['name'][$f_key], + 'type' => $ufile['type'][$f_key], + 'tmp_name' => $ufile['tmp_name'][$f_key], + 'error' => $ufile['error'][$f_key], + 'size' => $ufile['size'][$f_key] + ); + $new_atm = $this->upload_image( $loop_file, $post_id ); + if( $new_atm ){ + $_POST[$key] = isset($_POST[$key]) ? $_POST[$key] : array(); + $_POST[$key][$new_atm['attachment_id']] = $new_atm['url']; + $this->new_attachmenet_ids[$new_atm['attachment_id']] = $new_atm['attachment_id']; + } + } + + } + /// + elseif( isset($ufile['name']) ) { + $new_atm = $this->upload_image( $ufile, $post_id ); + if( $new_atm ){ + $_POST[$key][$new_atm['attachment_id']] = $new_atm['url']; + $this->new_attachmenet_ids[$new_atm['attachment_id']] = $new_atm['attachment_id']; + } + } + //// / // + } + } + + // for group files + $fields = array( + $this->get_field_name('public_floor_group') + ); + + + foreach( $_FILES as $key => $value ) { + + if( in_array($key, $fields) ){ + $ufile = $_FILES[$key]; + + if( isset( $ufile['name'] ) && is_array( $ufile['name'] ) ){ + $output = array(); + foreach ( $ufile['name'] as $f_key => $f_value ) { + + foreach( $f_value as $u_key => $u_v ) { + $loop_file = array( + 'name' => $ufile['name'][$f_key][$u_key], + 'type' => $ufile['type'][$f_key][$u_key], + 'tmp_name' => $ufile['tmp_name'][$f_key][$u_key], + 'error' => $ufile['error'][$f_key][$u_key], + 'size' => $ufile['size'][$f_key][$u_key] + ); + + $new_atm = $this->upload_image( $loop_file, $post_id ); + if( $new_atm ){ + + $_POST[$key][$f_key][$u_key] = $new_atm['attachment_id']; + $this->new_attachmenet_ids[$new_atm['attachment_id']] = $new_atm['attachment_id']; + } + } + } + } + } + } + } + } + + + /** + * Process upload images for properties + */ + public function upload_image( $submitted_file, $parent_id=0 ){ + return opalesate_upload_image( $submitted_file, $parent_id ); + } + + /** + * FrontEnd Submission + */ + private function cleanup() { + $user_id = get_current_user_id(); + opalestate_clean_attachments( $user_id ); + } + + /** + * FrontEnd Submission + */ + public function submission_list() { + if ( ! is_user_logged_in() ) { + echo opalestate_load_template_path( 'parts/not-allowed' ); + + return; + } + + if ( isset( $_GET['id'] ) && isset( $_GET['remove'] ) ) { + $is_allowed = Opalestate_Property::is_allowed_remove( get_current_user_id(), intval( $_GET['id'] ) ); + if ( ! $is_allowed ) { + echo opalestate_load_template_path( 'parts/not-allowed' ); + + return; + } + + if ( wp_delete_post( intval( $_GET['id'] ) ) ) { + $_SESSION['messages'][] = [ 'success', esc_html__( 'Property has been successfully removed.', 'opalestate-pro' ) ]; + } else { + $_SESSION['messages'][] = [ 'danger', esc_html__( 'An error occured when removing an item.', 'opalestate-pro' ) ]; + } + + wp_redirect( opalestate_submssion_list_page() ); + } + + + $args = []; + + if ( isset( $_GET['status'] ) && ! empty( $_GET['status'] ) ) { + $args['post_status'] = sanitize_text_field( $_GET['status'] ); + } + + $loop = Opalestate_Query::get_properties_by_user( $args, get_current_user_id() ); + + return opalestate_load_template_path( 'user/my-properties', [ 'loop' => $loop ] ); + } +} + +new OpalEstate_Submission(); diff --git a/inc/submission/function.php b/inc/submission/function.php new file mode 100755 index 00000000..e89f248d --- /dev/null +++ b/inc/submission/function.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/inc/taxonomies/class-taxomony-amenities.php b/inc/taxonomies/class-taxomony-amenities.php new file mode 100755 index 00000000..4ad2c70f --- /dev/null +++ b/inc/taxonomies/class-taxomony-amenities.php @@ -0,0 +1,93 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Taxonomy_Amenities { + + /** + * Opalestate_Taxonomy_Amenities constructor. + */ + public function __construct() { + add_action( 'init', [ $this, 'definition' ] ); + add_action( 'cmb2_admin_init', [ $this, 'taxonomy_metaboxes' ], 999 ); + } + + /** + * + */ + public function definition() { + + $labels = [ + 'name' => esc_html__( 'Amenities', 'opalestate-pro' ), + 'singular_name' => esc_html__( 'Properties By Amenity', 'opalestate-pro' ), + 'search_items' => esc_html__( 'Search Amenities', 'opalestate-pro' ), + 'all_items' => esc_html__( 'All Amenities', 'opalestate-pro' ), + 'parent_item' => esc_html__( 'Parent Amenity', 'opalestate-pro' ), + 'parent_item_colon' => esc_html__( 'Parent Amenity:', 'opalestate-pro' ), + 'edit_item' => esc_html__( 'Edit Amenity', 'opalestate-pro' ), + 'update_item' => esc_html__( 'Update Amenity', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New Amenity', 'opalestate-pro' ), + 'new_item_name' => esc_html__( 'New Amenity', 'opalestate-pro' ), + 'menu_name' => esc_html__( 'Amenities', 'opalestate-pro' ), + ]; + + register_taxonomy( 'opalestate_amenities', 'opalestate_property', [ + 'labels' => apply_filters( 'opalestate_taxomony_amenities_labels', $labels ), + 'hierarchical' => true, + 'query_var' => 'amenity', + 'rewrite' => [ 'slug' => _x( 'amenity', 'slug', 'opalestate-pro' ), 'with_front' => false, 'hierarchical' => true ], + 'public' => true, + 'show_ui' => true, + ] ); + } + + public static function get_list() { + return get_terms( 'opalestate_amenities', [ 'hide_empty' => false ] ); + } + + public function taxonomy_metaboxes() { + $prefix = 'opalestate_amt_'; + /** + * Metabox to add fields to categories and tags + */ + $cmb_term = new_cmb2_box( [ + 'id' => $prefix . 'edit', + 'title' => esc_html__( 'Type Metabox', 'opalestate-pro' ), // Doesn't output for term boxes + 'object_types' => [ 'term' ], // Tells CMB2 to use term_meta vs post_meta + 'taxonomies' => [ 'opalestate_amenities' ], // Tells CMB2 which taxonomies should have these fields + ] ); + + $cmb_term->add_field( [ + 'name' => esc_html__( 'Image Icon', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select an image icon (SVG, PNG or JPEG).', 'opalestate-pro' ), + 'id' => $prefix . 'image', + 'type' => 'file', + 'preview_size' => [ 50, 50 ], + 'options' => [ + 'url' => false, // Hide the text input for the url + ], + 'query_args' => [ + 'type' => [ + 'image/gif', + 'image/jpeg', + 'image/png', + ], + ], + ] ); + } +} + +new Opalestate_Taxonomy_Amenities(); diff --git a/inc/taxonomies/class-taxonomy-categories.php b/inc/taxonomies/class-taxonomy-categories.php new file mode 100755 index 00000000..8669975a --- /dev/null +++ b/inc/taxonomies/class-taxonomy-categories.php @@ -0,0 +1,116 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Taxonomy_Categories { + + /** + * + */ + public static function init() { + + add_action( 'init', [ __CLASS__, 'definition' ] ); + add_filter( 'opalestate_taxomony_category_metaboxes', [ __CLASS__, 'metaboxes' ] ); + + add_action( 'cmb2_admin_init', [ __CLASS__, 'taxonomy_metaboxes' ], 999 ); + + } + + public static function metaboxes() { + + } + + + /** + * + */ + public static function definition() { + + register_taxonomy( 'property_category', 'opalestate_property', apply_filters( 'opalestate_taxonomy_args_property_category', [ + 'labels' => [ + 'name' => esc_html__( 'Categories', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New Category', 'opalestate-pro' ), + 'new_item_name' => esc_html__( 'New Category', 'opalestate-pro' ), + ], + 'public' => true, + 'hierarchical' => true, + 'show_ui' => true, + 'query_var' => true, + 'rewrite' => [ 'slug' => _x( 'property-category', 'slug', 'opalestate-pro' ), 'with_front' => false, 'hierarchical' => true ], + ] ) ); + } + + + /** + * Hook in and add a metabox to add fields to taxonomy terms + */ + public static function taxonomy_metaboxes() { + + $prefix = 'opalestate_category_'; + /** + * Metabox to add fields to categories and tags + */ + $cmb_term = new_cmb2_box( [ + 'id' => $prefix . 'edit', + 'title' => esc_html__( 'Category Metabox', 'opalestate-pro' ), // Doesn't output for term boxes + 'object_types' => [ 'term' ], // Tells CMB2 to use term_meta vs post_meta + 'taxonomies' => [ 'property_category' ], // Tells CMB2 which taxonomies should have these fields + // 'new_term_section' => true, // Will display in the "Add New Category" section + ] ); + + $cmb_term->add_field( [ + 'name' => esc_html__( 'Image', 'opalestate-pro' ), + 'desc' => esc_html__( 'Category image', 'opalestate-pro' ), + 'id' => $prefix . 'image', + 'type' => 'file', + ] ); + } + + public static function get_list( $args = [] ) { + $default = [ + 'taxonomy' => 'property_category', + 'hide_empty' => true, + ]; + + if ( $args ) { + $default = array_merge( $default, $args ); + } + + return get_terms( $default ); + } + + public static function dropdown_list( $selected = 0 ) { + $id = "opalestate_category" . rand(); + + $args = [ + 'show_option_none' => esc_html__( 'Select category', 'opalestate-pro' ), + 'id' => $id, + 'class' => 'form-control', + 'show_count' => 0, + 'hierarchical' => '', + 'name' => 'label', + 'value_field' => 'slug', + 'selected' => $selected, + 'taxonomy' => 'opalestate_category', + ]; + + return wp_dropdown_categories( $args ); + } + +} + +Opalestate_Taxonomy_Categories::init(); diff --git a/inc/taxonomies/class-taxonomy-city.php b/inc/taxonomies/class-taxonomy-city.php new file mode 100755 index 00000000..4c9cc8d6 --- /dev/null +++ b/inc/taxonomies/class-taxonomy-city.php @@ -0,0 +1,152 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Taxonomy_City { + + /** + * + */ + public static function init() { + add_action( 'init', [ __CLASS__, 'definition' ] ); + add_action( 'cmb2_admin_init', [ __CLASS__, 'taxonomy_metaboxes' ] ); + } + + /** + * + */ + public static function definition() { + + $labels = [ + 'name' => esc_html__( 'Cities / Towns', 'opalestate-pro' ), + 'singular_name' => esc_html__( 'Properties By City', 'opalestate-pro' ), + 'search_items' => esc_html__( 'Search Cities / Towns', 'opalestate-pro' ), + 'all_items' => esc_html__( 'All Cities / Town', 'opalestate-pro' ), + 'parent_item' => esc_html__( 'Parent City', 'opalestate-pro' ), + 'parent_item_colon' => esc_html__( 'Parent City:', 'opalestate-pro' ), + 'edit_item' => esc_html__( 'Edit City', 'opalestate-pro' ), + 'update_item' => esc_html__( 'Update City', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New City', 'opalestate-pro' ), + 'new_item_name' => esc_html__( 'New City', 'opalestate-pro' ), + 'menu_name' => esc_html__( 'Cities / Towns', 'opalestate-pro' ), + ]; + + register_taxonomy( 'opalestate_city', 'opalestate_property', [ + 'labels' => apply_filters( 'opalestate_taxomony_city_labels', $labels ), + 'hierarchical' => true, + 'query_var' => 'city', + 'rewrite' => [ 'slug' => esc_html__( 'city', 'opalestate-pro' ) ], + 'public' => true, + 'show_ui' => true, + ] ); + } + + /** + * Hook in and add a metabox to add fields to taxonomy terms + */ + public static function taxonomy_metaboxes() { + + $prefix = 'opalestate_city_'; + /** + * Metabox to add fields to categories and tags + */ + $cmb_term = new_cmb2_box( [ + 'id' => $prefix . 'edit', + 'title' => esc_html__( 'City Metabox', 'opalestate-pro' ), // Doesn't output for term boxes + 'object_types' => [ 'term' ], // Tells CMB2 to use term_meta vs post_meta + 'taxonomies' => [ 'opalestate_city' ], // Tells CMB2 which taxonomies should have these fields + ] ); + + $cmb_term->add_field( [ + 'name' => esc_html__( 'Image', 'opalestate-pro' ), + 'desc' => esc_html__( 'City image', 'opalestate-pro' ), + 'id' => $prefix . 'image', + 'type' => 'file', + 'preview_size' => 'small', + 'options' => [ + 'url' => false, // Hide the text input for the url + ], + ] ); + + //// + $cmb_term->add_field( [ + 'name' => esc_html__( 'Country', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select one, to add new you create in countries of estate panel', 'opalestate-pro' ), + 'id' => $prefix . 'location', + 'taxonomy' => 'opalestate_location', //Enter Taxonomy Slug + 'type' => 'taxonomy_select', + ] ); + + /// + $cmb_term->add_field( [ + 'name' => esc_html__( 'State / Province', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select one, to add new you create in City/Town of estate panel', 'opalestate-pro' ), + 'id' => $prefix . 'state', + 'taxonomy' => 'opalestate_state', //Enter Taxonomy Slug + 'type' => 'taxonomy_select', + ] ); + } + + /** + * Gets list. + * + * @param array $args + * @return array|int|\WP_Error + */ + public static function get_list( $args = [] ) { + $default = [ + 'taxonomy' => 'opalestate_city', + 'hide_empty' => true, + ]; + + if ( $args ) { + $default = array_merge( $default, $args ); + } + + return get_terms( $default ); + } + + /** + * Render dopdown list. + * + * @param int $selected + * @return string + */ + public static function dropdown_list( $selected = 0 ) { + $id = 'opalestate_city' . rand(); + $args = [ + 'show_option_none' => esc_html__( 'Select City', 'opalestate-pro' ), + 'id' => $id, + 'class' => 'form-control', + 'name' => 'city', + 'show_count' => 0, + 'hierarchical' => '', + 'selected' => $selected, + 'value_field' => 'slug', + 'taxonomy' => 'opalestate_city', + 'orderby' => 'name', + 'order' => 'ASC', + 'echo' => 0, + ]; + + $label = ''; + + echo $label . wp_dropdown_categories( $args ); + } +} + +Opalestate_Taxonomy_City::init(); diff --git a/inc/taxonomies/class-taxonomy-labels.php b/inc/taxonomies/class-taxonomy-labels.php new file mode 100755 index 00000000..735ece67 --- /dev/null +++ b/inc/taxonomies/class-taxonomy-labels.php @@ -0,0 +1,150 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Taxonomy_Label { + + /** + * + */ + public function __construct() { + + add_action( 'init', [ $this, 'definition' ] ); + + add_filter( 'opalestate_taxomony_label_metaboxes', [ $this, 'metaboxes' ] ); + add_action( 'cmb2_admin_init', [ $this, 'taxonomy_metaboxes' ], 999 ); + } + + /** + * + */ + public function definition() { + + $labels = [ + 'name' => esc_html__( 'Label', 'opalestate-pro' ), + 'singular_name' => esc_html__( 'Properties By Label', 'opalestate-pro' ), + 'search_items' => esc_html__( 'Search Label', 'opalestate-pro' ), + 'all_items' => esc_html__( 'All Label', 'opalestate-pro' ), + 'parent_item' => esc_html__( 'Parent Label', 'opalestate-pro' ), + 'parent_item_colon' => esc_html__( 'Parent Label:', 'opalestate-pro' ), + 'edit_item' => esc_html__( 'Edit Label', 'opalestate-pro' ), + 'update_item' => esc_html__( 'Update Label', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New Label', 'opalestate-pro' ), + 'new_item_name' => esc_html__( 'New Label', 'opalestate-pro' ), + 'menu_name' => esc_html__( 'Label', 'opalestate-pro' ), + ]; + + register_taxonomy( 'opalestate_label', 'opalestate_property', [ + 'labels' => apply_filters( 'opalestate_label_labels', $labels ), + 'hierarchical' => true, + 'query_var' => 'property-label', + 'rewrite' => [ 'slug' => esc_html__( 'property-label', 'opalestate-pro' ) ], + 'public' => true, + 'show_ui' => true, + ] ); + } + + public function metaboxes() { + + } + + /** + * Hook in and add a metabox to add fields to taxonomy terms + */ + public function taxonomy_metaboxes() { + + $prefix = 'opalestate_label_'; + /** + * Metabox to add fields to categories and tags + */ + $cmb_term = new_cmb2_box( [ + 'id' => $prefix . 'edit', + 'title' => esc_html__( 'Category Metabox', 'opalestate-pro' ), // Doesn't output for term boxes + 'object_types' => [ 'term' ], // Tells CMB2 to use term_meta vs post_meta + 'taxonomies' => [ 'opalestate_label' ], // Tells CMB2 which taxonomies should have these fields + // 'new_term_section' => true, // Will display in the "Add New Category" section + ] ); + $cmb_term->add_field( [ + 'name' => esc_html__( 'Background', 'opalestate-pro' ), + 'desc' => esc_html__( 'Set background of label', 'opalestate-pro' ), + 'id' => $prefix . 'lb_bg', + 'type' => 'colorpicker', + ] ); + $cmb_term->add_field( [ + 'name' => esc_html__( 'Color', 'opalestate-pro' ), + 'desc' => esc_html__( 'Set color of text', 'opalestate-pro' ), + 'id' => $prefix . 'lb_color', + 'type' => 'colorpicker', + ] ); + + $cmb_term->add_field( [ + 'name' => esc_html__( 'Image Logo', 'opalestate-pro' ), + 'desc' => esc_html__( 'Or Using Image Logo without using text', 'opalestate-pro' ), + 'id' => $prefix . 'lb_img', + 'type' => 'file', + 'preview_size' => 'small', + 'options' => [ + 'url' => false, // Hide the text input for the url + ], + ] ); + } + + /** + * Gets list. + * + * @param array $args + * @return array|int|\WP_Error + */ + public static function get_list( $args = [] ) { + $default = [ + 'taxonomy' => 'opalestate_label', + 'hide_empty' => false, + ]; + + if ( $args ) { + $default = array_merge( $default, $args ); + } + + return get_terms( $default ); + } + + /** + * Render dopdown list. + * + * @param int $selected + * @return string + */ + public static function dropdown_list( $selected = 0 ) { + $id = 'opalestate_label' . rand(); + + $args = [ + 'show_option_none' => esc_html__( 'Select Label', 'opalestate-pro' ), + 'id' => $id, + 'class' => 'form-control', + 'show_count' => 0, + 'hierarchical' => '', + 'name' => 'label', + 'value_field' => 'slug', + 'selected' => $selected, + 'taxonomy' => 'opalestate_label', + ]; + + return wp_dropdown_categories( $args ); + } +} + +new Opalestate_Taxonomy_Label(); diff --git a/inc/taxonomies/class-taxonomy-locations.php b/inc/taxonomies/class-taxonomy-locations.php new file mode 100755 index 00000000..4837273a --- /dev/null +++ b/inc/taxonomies/class-taxonomy-locations.php @@ -0,0 +1,152 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Taxonomy_Location { + + /** + * + */ + public function __construct() { + add_action( 'init', [ $this, 'definition' ] ); + add_filter( 'opalestate_taxomony_location_metaboxes', [ $this, 'metaboxes' ] ); + add_action( 'cmb2_admin_init', [ $this, 'taxonomy_metaboxes' ] ); + } + + /** + * + */ + public function definition() { + + $labels = [ + 'name' => esc_html__( 'Countries', 'opalestate-pro' ), + 'singular_name' => esc_html__( 'Properties By Country', 'opalestate-pro' ), + 'search_items' => esc_html__( 'Search Countries', 'opalestate-pro' ), + 'all_items' => esc_html__( 'All Countries', 'opalestate-pro' ), + 'parent_item' => esc_html__( 'Parent Country', 'opalestate-pro' ), + 'parent_item_colon' => esc_html__( 'Parent Country:', 'opalestate-pro' ), + 'edit_item' => esc_html__( 'Edit Country', 'opalestate-pro' ), + 'update_item' => esc_html__( 'Update Country', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New Country', 'opalestate-pro' ), + 'new_item_name' => esc_html__( 'New Country', 'opalestate-pro' ), + 'menu_name' => esc_html__( 'Countries', 'opalestate-pro' ), + ]; + + register_taxonomy( 'opalestate_location', 'opalestate_property', [ + 'labels' => apply_filters( 'opalestate_taxomony_location_labels', $labels ), + 'hierarchical' => true, + 'query_var' => 'location', + 'rewrite' => [ 'slug' => esc_html__( 'location', 'opalestate-pro' ) ], + 'public' => true, + 'show_ui' => true, + ] ); + } + + /** + * + */ + public function metaboxes() { + + } + + /** + * Hook in and add a metabox to add fields to taxonomy terms + */ + public function taxonomy_metaboxes() { + + $prefix = 'opalestate_location_'; + /** + * Metabox to add fields to categories and tags + */ + $cmb_term = new_cmb2_box( [ + 'id' => $prefix . 'edit', + 'title' => esc_html__( 'Country Metabox', 'opalestate-pro' ), // Doesn't output for term boxes + 'object_types' => [ 'term' ], // Tells CMB2 to use term_meta vs post_meta + 'taxonomies' => [ 'opalestate_location' ], // Tells CMB2 which taxonomies should have these fields + // 'new_term_section' => true, // Will display in the "Add New Category" section + ] ); + + $cmb_term->add_field( [ + 'name' => esc_html__( 'Image', 'opalestate-pro' ), + 'desc' => esc_html__( 'Country image', 'opalestate-pro' ), + 'id' => $prefix . 'image', + 'type' => 'file', + 'preview_size' => 'small', + 'options' => [ + 'url' => false, // Hide the text input for the url + ], + ] ); + } + + /** + * + */ + public static function get_list() { + return get_terms( 'opalestate_location', [ 'hide_empty' => false ] ); + } + + /** + * + */ + public static function dropdown_agents_list( $selected = 0 ) { + $id = "opalestate_location" . rand(); + $args = [ + 'show_option_none' => esc_html__( 'Select Country', 'opalestate-pro' ), + 'id' => $id, + 'class' => 'form-control', + 'name' => 'location', + 'show_count' => 0, + 'hierarchical' => '', + 'selected' => $selected, + 'value_field' => 'slug', + 'taxonomy' => 'opalestate_agent_location', + ]; + + return wp_dropdown_categories( $args ); + } + + /** + * + */ + public static function dropdown_list( $selected = 0 ) { + $id = 'opalestate_location' . rand(); + $args = [ + 'show_option_none' => esc_html__( 'Select Country', 'opalestate-pro' ), + 'id' => $id, + 'class' => 'form-control', + 'name' => 'location', + 'show_count' => 0, + 'hierarchical' => '', + 'selected' => $selected, + 'value_field' => 'slug', + 'taxonomy' => 'opalestate_location', + 'orderby' => 'name', + 'order' => 'ASC', + 'echo' => 0, + ]; + + $label = ''; + + echo $label . wp_dropdown_categories( $args ); + } + + public static function get_multi_check_list() { + + } +} + +new Opalestate_Taxonomy_Location(); diff --git a/inc/taxonomies/class-taxonomy-neighborhood.php b/inc/taxonomies/class-taxonomy-neighborhood.php new file mode 100755 index 00000000..3913e26b --- /dev/null +++ b/inc/taxonomies/class-taxonomy-neighborhood.php @@ -0,0 +1,114 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} +class Opalestate_Taxonomy_Neighborhood{ + + /** + * + */ + public static function init(){ + add_action( 'init', array( $this, 'definition' ), 99 ); + + add_action( 'cmb2_admin_init', array( $this, 'taxonomy_metaboxes' ), 9 ); + + + } + + /** + * Hook in and add a metabox to add fields to taxonomy terms + */ + public function taxonomy_metaboxes() { + + $prefix = 'opalestate_nb_'; + /** + * Metabox to add fields to categories and tags + */ + $cmb_term = new_cmb2_box( array( + 'id' => $prefix . 'edit', + 'title' => esc_html__( 'Type Metabox', 'opalestate-pro' ), // Doesn't output for term boxes + 'object_types' => array( 'term' ), // Tells CMB2 to use term_meta vs post_meta + 'taxonomies' => array( 'opalestate_neighborhoods' ), // Tells CMB2 which taxonomies should have these fields + // 'new_term_section' => true, // Will display in the "Add New Category" section + ) ); + + $cmb_term->add_field( array( + 'name' => esc_html__( 'Icon', 'opalestate-pro' ), + 'desc' => esc_html__( 'This image will display in google map', 'opalestate-pro' ), + 'id' => $prefix . 'icon', + 'type' => 'file', + 'preview_size' => 'small', + 'options' => array( + 'url' => false, // Hide the text input for the url + ) + ) ); + } + + /** + * + */ + public function definition(){ + + $labels = array( + 'name' => esc_html__( 'Neighborhoods', 'opalestate-pro' ), + 'singular_name' => esc_html__( 'Properties By Neighborhood', 'opalestate-pro' ), + 'search_items' => esc_html__( 'Search Neighborhoods', 'opalestate-pro' ), + 'all_items' => esc_html__( 'All Neighborhoods', 'opalestate-pro' ), + 'parent_item' => esc_html__( 'Parent Neighborhood', 'opalestate-pro' ), + 'parent_item_colon' => esc_html__( 'Parent Neighborhood:', 'opalestate-pro' ), + 'edit_item' => esc_html__( 'Edit Neighborhood', 'opalestate-pro' ), + 'update_item' => esc_html__( 'Update Neighborhood', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New Neighborhood', 'opalestate-pro' ), + 'new_item_name' => esc_html__( 'New Neighborhood', 'opalestate-pro' ), + 'menu_name' => esc_html__( 'Neighborhoods', 'opalestate-pro' ), + ); + + register_taxonomy( 'opalestate_neighborhoods', array( 'opalestate_property' ) , array( + 'labels' => apply_filters( 'opalestate_taxomony_neighborhoods_labels', $labels ), + 'hierarchical' => true, + 'query_var' => 'property-neighborhood', + 'rewrite' => array( 'slug' => esc_html__( 'property-neighborhood', 'opalestate-pro' ) ), + 'public' => true, + 'show_ui' => true, + ) ); + } + + public static function metaboxes(){ + + } + + public static function dropdown_list( $selected=0 ){ + + $id = "opalestate_neighborhoods".rand(); + + $args = array( + 'show_option_none' => esc_html__( 'Select Neighborhoods', 'opalestate-pro' ), + 'id' => $id, + 'class' => 'form-control', + 'show_count' => 0, + 'hierarchical' => '', + 'name' => 'neighborhoods', + 'selected' => $selected, + 'value_field' => 'slug', + 'taxonomy' => 'opalestate_neighborhoods' + ); + + return wp_dropdown_categories( $args ); + } + +} + +new Opalestate_Taxonomy_Neighborhood(); \ No newline at end of file diff --git a/inc/taxonomies/class-taxonomy-state.php b/inc/taxonomies/class-taxonomy-state.php new file mode 100755 index 00000000..86b7a6e1 --- /dev/null +++ b/inc/taxonomies/class-taxonomy-state.php @@ -0,0 +1,145 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Taxonomy_State { + /** + * Opalestate_Taxonomy_State constructor. + */ + public function __construct() { + add_action( 'init', [ $this, 'definition' ] ); + add_filter( 'opalestate_taxomony_state_metaboxes', [ $this, 'metaboxes' ] ); + add_action( 'cmb2_admin_init', [ $this, 'taxonomy_metaboxes' ] ); + } + + /** + * + */ + public function definition() { + $labels = [ + 'name' => esc_html__( 'States / Provinces', 'opalestate-pro' ), + 'singular_name' => esc_html__( 'Properties By State', 'opalestate-pro' ), + 'search_items' => esc_html__( 'Search States', 'opalestate-pro' ), + 'all_items' => esc_html__( 'All States / Province', 'opalestate-pro' ), + 'parent_item' => esc_html__( 'Parent State', 'opalestate-pro' ), + 'parent_item_colon' => esc_html__( 'Parent State:', 'opalestate-pro' ), + 'edit_item' => esc_html__( 'Edit State', 'opalestate-pro' ), + 'update_item' => esc_html__( 'Update State', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New State', 'opalestate-pro' ), + 'new_item_name' => esc_html__( 'New State', 'opalestate-pro' ), + 'menu_name' => esc_html__( 'States / Provinces', 'opalestate-pro' ), + ]; + + register_taxonomy( 'opalestate_state', 'opalestate_property', [ + 'labels' => apply_filters( 'opalestate_taxomony_state_labels', $labels ), + 'hierarchical' => true, + 'query_var' => 'state', + 'rewrite' => [ 'slug' => esc_html__( 'state', 'opalestate-pro' ) ], + 'public' => true, + 'show_ui' => true, + ] ); + } + + + public function metaboxes() { + + } + + /** + * Hook in and add a metabox to add fields to taxonomy terms + */ + public function taxonomy_metaboxes() { + $prefix = 'opalestate_state_'; + /** + * Metabox to add fields to categories and tags + */ + $cmb_term = new_cmb2_box( [ + 'id' => $prefix . 'edit', + 'title' => esc_html__( 'State Metabox', 'opalestate-pro' ), // Doesn't output for term boxes + 'object_types' => [ 'term' ], // Tells CMB2 to use term_meta vs post_meta + 'taxonomies' => [ 'opalestate_state' ], // Tells CMB2 which taxonomies should have these fields + // 'new_term_section' => true, // Will display in the "Add New Category" section + ] ); + + $cmb_term->add_field( [ + 'name' => esc_html__( 'Image', 'opalestate-pro' ), + 'desc' => esc_html__( 'State image', 'opalestate-pro' ), + 'id' => $prefix . 'image', + 'type' => 'file', + 'preview_size' => 'small', + 'options' => [ + 'url' => false, // Hide the text input for the url + ], + ] ); + + //// + $cmb_term->add_field( [ + 'name' => esc_html__( 'Country', 'opalestate-pro' ), + 'desc' => esc_html__( 'Select one, to add new you create in countries of estate panel', 'opalestate-pro' ), + 'id' => $prefix . "location", + 'taxonomy' => 'opalestate_location', //Enter Taxonomy Slug + 'type' => 'taxonomy_select', + ] ); + + /// + } + + public static function get_list() { + return get_terms( 'opalestate_state', [ 'hide_empty' => false ] ); + } + + public static function dropdown_agents_list( $selected = 0 ) { + $id = "opalestate_state" . rand(); + $args = [ + 'show_option_none' => esc_html__( 'Select State', 'opalestate-pro' ), + 'id' => $id, + 'class' => 'form-control', + 'name' => 'state', + 'show_count' => 0, + 'hierarchical' => '', + 'selected' => $selected, + 'value_field' => 'slug', + 'taxonomy' => 'opalestate_agent_state', + ]; + + return wp_dropdown_categories( $args ); + } + + public static function dropdown_list( $selected = 0 ) { + $id = "opalestate_state" . rand(); + $args = [ + 'show_option_none' => esc_html__( 'Select State', 'opalestate-pro' ), + 'id' => $id, + 'class' => 'form-control', + 'name' => 'state', + 'show_count' => 0, + 'hierarchical' => '', + 'selected' => $selected, + 'value_field' => 'slug', + 'taxonomy' => 'opalestate_state', + 'orderby' => 'name', + 'order' => 'ASC', + 'echo' => 0, + ]; + + $label = ''; + + echo $label . wp_dropdown_categories( $args ); + } +} + +new Opalestate_Taxonomy_State(); diff --git a/inc/taxonomies/class-taxonomy-status.php b/inc/taxonomies/class-taxonomy-status.php new file mode 100755 index 00000000..78feedc7 --- /dev/null +++ b/inc/taxonomies/class-taxonomy-status.php @@ -0,0 +1,159 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Taxonomy_Status { + + /** + * Opalestate_Taxonomy_Status constructor. + */ + public function __construct() { + add_action( 'init', [ $this, 'definition' ] ); + add_filter( 'opalestate_taxomony_status_metaboxes', [ $this, 'metaboxes' ] ); + add_action( 'cmb2_admin_init', [ $this, 'taxonomy_metaboxes' ] ); + } + + /** + * + */ + public function definition() { + $labels = [ + 'name' => esc_html__( 'Status', 'opalestate-pro' ), + 'singular_name' => esc_html__( 'Properties By Status', 'opalestate-pro' ), + 'search_items' => esc_html__( 'Search Status', 'opalestate-pro' ), + 'all_items' => esc_html__( 'All Status', 'opalestate-pro' ), + 'parent_item' => esc_html__( 'Parent Status', 'opalestate-pro' ), + 'parent_item_colon' => esc_html__( 'Parent Status:', 'opalestate-pro' ), + 'edit_item' => esc_html__( 'Edit Status', 'opalestate-pro' ), + 'update_item' => esc_html__( 'Update Status', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New Status', 'opalestate-pro' ), + 'new_item_name' => esc_html__( 'New Status', 'opalestate-pro' ), + 'menu_name' => esc_html__( 'Status', 'opalestate-pro' ), + ]; + register_taxonomy( 'opalestate_status', 'opalestate_property', [ + 'labels' => apply_filters( 'opalestate_status_labels', $labels ), + 'hierarchical' => true, + 'query_var' => 'status', + 'rewrite' => [ 'slug' => esc_html__( 'status', 'opalestate-pro' ) ], + 'public' => true, + 'show_ui' => true, + ] ); + } + + + /** + * Hook in and add a metabox to add fields to taxonomy terms + */ + public function taxonomy_metaboxes() { + + $prefix = 'opalestate_status_'; + /** + * Metabox to add fields to categories and tags + */ + $cmb_term = new_cmb2_box( [ + 'id' => $prefix . 'edit', + 'title' => esc_html__( 'Category Metabox', 'opalestate-pro' ), // Doesn't output for term boxes + 'object_types' => [ 'term' ], // Tells CMB2 to use term_meta vs post_meta + 'taxonomies' => [ 'opalestate_status' ], // Tells CMB2 which taxonomies should have these fields + // 'new_term_section' => true, // Will display in the "Add New Category" section + ] ); + $cmb_term->add_field( [ + 'name' => esc_html__( 'Background', 'opalestate-pro' ), + 'desc' => esc_html__( 'Set background of label', 'opalestate-pro' ), + 'id' => $prefix . 'lb_bg', + 'type' => 'colorpicker', + ] ); + $cmb_term->add_field( [ + 'name' => esc_html__( 'Color', 'opalestate-pro' ), + 'desc' => esc_html__( 'Set background of text', 'opalestate-pro' ), + 'id' => $prefix . 'lb_color', + 'type' => 'colorpicker', + ] ); + $cmb_term->add_field( [ + 'name' => esc_html__( 'Order', 'opalestate-pro' ), + 'desc' => esc_html__( 'Set a priority to display', 'opalestate-pro' ), + 'id' => $prefix . 'order', + 'type' => 'text_small', + 'attributes' => [ + 'type' => 'number', + ], + 'default' => 0, + ] ); + } + + public function metaboxes() { + + } + + /** + * Gets list. + * + * @param array $args + * @return array|int|\WP_Error + */ + public static function get_list( $args = [] ) { + $default = apply_filters( 'opalestate_status_args', [ + 'taxonomy' => 'opalestate_status', + 'hide_empty' => false, + 'hierarchical' => false, + 'parent' => 0, + 'order' => 'ASC', + 'orderby' => 'meta_value_num', + 'meta_query' => [ + [ + 'key' => 'opalestate_status_order', + 'type' => 'NUMERIC', + ], + ], + ] ); + + if ( $args ) { + $default = array_merge( $default, $args ); + } + + return get_terms( $default ); + } + + /** + * Render dopdown list. + * + * @param int $selected + * @return string + */ + public static function dropdown_list( $selected = 0 ) { + $id = 'palestate_status' . rand(); + + $args = [ + 'show_option_none' => esc_html__( 'Select Status', 'opalestate-pro' ), + 'id' => $id, + 'class' => 'form-control', + 'show_count' => 0, + 'hierarchical' => '', + 'name' => 'status', + 'value_field' => 'slug', + 'selected' => $selected, + 'taxonomy' => 'opalestate_status', + 'echo' => 0, + ]; + + $label = ''; + + echo $label . wp_dropdown_categories( $args ); + } +} + +new Opalestate_Taxonomy_Status(); diff --git a/inc/taxonomies/class-taxonomy-types.php b/inc/taxonomies/class-taxonomy-types.php new file mode 100755 index 00000000..0983da5c --- /dev/null +++ b/inc/taxonomies/class-taxonomy-types.php @@ -0,0 +1,136 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Taxonomy_Type { + + /** + * + */ + public function __construct() { + add_action( 'init', [ $this, 'definition' ] ); + add_action( 'cmb2_admin_init', [ $this, 'taxonomy_metaboxes' ] ); + } + + /** + * Hook in and add a metabox to add fields to taxonomy terms + */ + public function taxonomy_metaboxes() { + + $prefix = 'opalestate_type_'; + /** + * Metabox to add fields to categories and tags + */ + $cmb_term = new_cmb2_box( [ + 'id' => $prefix . 'edit', + 'title' => esc_html__( 'Type Metabox', 'opalestate-pro' ), // Doesn't output for term boxes + 'object_types' => [ 'term' ], // Tells CMB2 to use term_meta vs post_meta + 'taxonomies' => [ 'opalestate_types' ], // Tells CMB2 which taxonomies should have these fields + // 'new_term_section' => true, // Will display in the "Add New Category" section + ] ); + + $cmb_term->add_field( [ + 'name' => esc_html__( 'Custom Icon Marker', 'opalestate-pro' ), + 'desc' => esc_html__( 'This image will display in google map', 'opalestate-pro' ), + 'id' => $prefix . 'iconmarker', + 'type' => 'file', + 'preview_size' => 'small', + 'options' => [ + 'url' => false, // Hide the text input for the url + ], + ] ); + + $cmb_term->add_field( [ + 'name' => esc_html__( 'Image', 'opalestate-pro' ), + 'desc' => esc_html__( 'Type image', 'opalestate-pro' ), + 'id' => $prefix . 'image', + 'type' => 'file', + 'preview_size' => 'small', + 'options' => [ + 'url' => false, // Hide the text input for the url + ], + ] ); + } + + /** + * + */ + public function definition() { + + $labels = [ + 'name' => esc_html__( 'Types', 'opalestate-pro' ), + 'singular_name' => esc_html__( 'Properties By Type', 'opalestate-pro' ), + 'search_items' => esc_html__( 'Search Types', 'opalestate-pro' ), + 'all_items' => esc_html__( 'All Types', 'opalestate-pro' ), + 'parent_item' => esc_html__( 'Parent Type', 'opalestate-pro' ), + 'parent_item_colon' => esc_html__( 'Parent Type:', 'opalestate-pro' ), + 'edit_item' => esc_html__( 'Edit Type', 'opalestate-pro' ), + 'update_item' => esc_html__( 'Update Type', 'opalestate-pro' ), + 'add_new_item' => esc_html__( 'Add New Type', 'opalestate-pro' ), + 'new_item_name' => esc_html__( 'New Type', 'opalestate-pro' ), + 'menu_name' => esc_html__( 'Types', 'opalestate-pro' ), + ]; + + register_taxonomy( 'opalestate_types', [ 'opalestate_property' ], [ + 'labels' => apply_filters( 'opalestate_taxomony_types_labels', $labels ), + 'hierarchical' => true, + 'query_var' => 'type', + 'rewrite' => [ 'slug' => esc_html__( 'type', 'opalestate-pro' ) ], + 'public' => true, + 'show_ui' => true, + ] ); + } + + public function metaboxes() { + + } + + public static function get_list() { + return get_terms( 'opalestate_types', [ 'hide_empty' => false ] ); + } + + public static function dropdown_list( $selected = 0 ) { + + $id = "opalestate_types" . rand(); + + $args = [ + 'show_option_none' => esc_html__( 'Select Type', 'opalestate-pro' ), + 'id' => $id, + 'class' => 'form-control', + 'show_count' => 0, + 'hierarchical' => '', + 'name' => 'types', + 'selected' => $selected, + 'value_field' => 'slug', + 'taxonomy' => 'opalestate_types', + 'echo' => 0, + ]; + + $label = ''; + + echo $label . wp_dropdown_categories( $args ); + } + + public static function get_multi_check_list( $stypes ) { + $list = self::get_list(); + + echo opalestate_terms_multi_check( $list, $stypes ); + + } +} + +new Opalestate_Taxonomy_Type(); diff --git a/inc/template-functions.php b/inc/template-functions.php new file mode 100755 index 00000000..7bc077d7 --- /dev/null +++ b/inc/template-functions.php @@ -0,0 +1,1050 @@ + + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +function opalestate_archive_search_block() { + echo opalestate_load_template_path( 'parts/archive-search-block' ); +} + +function opalestate_property_mortgage() { + echo opalestate_load_template_path( 'parts/mortgage-calculator' ); +} + +function opalestate_load_template_path( $tpl, $args = [], $layout = '' ) { + return Opalestate_Template_Loader::get_template_part( $tpl, $args, $layout ); + +} + +function opalestate_get_image_avatar_placehold() { + return OPALESTATE_PLUGIN_URL . 'assets/images/avatar-placeholder.jpg'; +} + +function opalestate_get_admin_view( $file ) { + return OPALESTATE_PLUGIN_DIR . 'inc/admin/views/' . $file; +} + +function opalestate_user_fullname( $user_id = null ) { + $user_info = $user_id ? new WP_User( $user_id ) : wp_get_current_user(); + if ( $user_info->first_name ) { + if ( $user_info->last_name ) { + return $user_info->first_name . ' ' . $user_info->last_name; + } + + return $user_info->first_name; + } + + return $user_info->display_name; +} + +/** + * Hooks Give actions, when present in the $_GET superglobal. Every opalestate_action + * present in $_GET is called using WordPress's do_action function. These + * functions are called on init. + * + * @return void + * + */ +function opalestate_get_actions() { + if ( isset( $_GET['opalestate_action'] ) ) { + do_action( 'opalestate_' . sanitize_text_field( $_GET['opalestate_action'] ), $_GET ); + } +} + +add_action( 'init', 'opalestate_get_actions' ); + +/** + * Hooks Give actions, when present in the $_POST superglobal. Every opalestate_action + * present in $_POST is called using WordPress's do_action function. These + * functions are called on init. + * + * @return void + * + */ +function opalestate_post_actions() { + if ( isset( $_POST['opalestate_action'] ) ) { + do_action( 'opalestate_' . sanitize_text_field( $_POST['opalestate_action'] ), $_POST ); + } +} + +add_action( 'init', 'opalestate_post_actions' ); + +/** + * + */ +function opalestate_template_init() { + if ( isset( $_GET['display'] ) && ( $_GET['display'] == 'list' || $_GET['display'] == 'grid' || $_GET['display'] == 'map' ) ) { + setcookie( 'opalestate_displaymode', trim( $_GET['display'] ), time() + 3600 * 24 * 100, '/' ); + $_COOKIE['opalestate_displaymode'] = trim( $_GET['display'] ); + } +} + +add_action( 'init', 'opalestate_template_init' ); + + +function opalestate_get_read_message_uri( $message_id ) { + $args['message_id'] = $message_id; + + return opalestate_get_current_url( $args ); +} + + +function opalestate_terms_multi_check( $terms ) { + $html = '

            '; + + foreach ( $terms as $term ) { + + $id = time() . '-' . $term->slug; + $html .= '
            '; + $html .= ''; + $html .= ' '; + $html .= '
            '; + + } + + $html .= '
            '; + + return $html; +} + +function opalestate_get_image_by_id( $id ) { + if ( $id ) { + $url = wp_get_attachment_url( $id ); + + return ''; + } + + return ''; +} + + +/** + * + */ +function opalestate_get_loop_thumbnail( $size = 'property-thumbnail' ) { ?> + + + + + + esc_html__( 'Featured Desending', 'opalestate-pro' ), + 'price_asc' => esc_html__( 'Price Ascending', 'opalestate-pro' ), + 'price_desc' => esc_html__( 'Price Desending', 'opalestate-pro' ), + 'areasize_asc' => esc_html__( 'Area Ascending', 'opalestate-pro' ), + 'areasize_desc' => esc_html__( 'Area Desending', 'opalestate-pro' ), + ]; + $modes = apply_filters( 'opalestate_sortable_modes', $modes ); + + $modes = array_merge( [ '' => esc_html__( 'Sort By', 'opalestate-pro' ) ], $modes ); + $output = '
            '; + + return $output; +} + + +/** + * + */ +function opalestate_show_display_modes( $default = 'list' ) { + $op_display = opalestate_get_display_mode( $default ); + + $modes = apply_filters( 'opalestate_listing_display_mode', [ + 'grid' => [ + 'icon' => 'fa fa-th', + 'title' => esc_html__( 'Grid', 'opalestate-pro' ), + ], + 'list' => [ + 'icon' => 'fa fa-th-list', + 'title' => esc_html__( 'List', 'opalestate-pro' ), + ], + /* 'map' => array( + 'icon' => 'fa fa-map-marker', + 'title' => esc_html__('Map','opalestate-pro') + ), */ + ] ); + + + echo '
            '; + foreach ( $modes as $key => $mode ) { + echo ''; + } + + echo '
            '; + +} + +if ( ! function_exists( 'opalestate_pagination' ) ) { + /** + * Opalestate pagination. + * + * @param string $pages + * @param int $range + */ + function opalestate_pagination( $pages = '', $range = 2 ) { + global $wp_query; + + $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; + $paged = isset( $wp_query->query['paged'] ) ? $wp_query->query['paged'] : $paged; + $paged = isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : $paged; + + // if(empty($paged))$paged = 1; + + $prev = $paged - 1; + $next = $paged + 1; + $showitems = ( $range * 2 ) + 1; + $range = 2; // change it to show more links + + if ( $pages == '' ) { + global $wp_query; + + $pages = $wp_query->max_num_pages; + if ( ! $pages ) { + $pages = 1; + } + } + + if ( 1 != $pages ) { + + echo '
            '; + echo '
              '; + echo ( $paged > 2 && $paged > $range + 1 && $showitems < $pages ) ? '
            • ' : ''; + echo ( $paged > 1 ) ? '
            • ' : '
            • '; + for ( $i = 1; $i <= $pages; $i++ ) { + if ( 1 != $pages && ( ! ( $i >= $paged + $range + 1 || $i <= $paged - $range - 1 ) || $pages <= $showitems ) ) { + if ( $paged == $i ) { + echo '
            • ' . $i . '
            • '; + } else { + echo '
            • ' . $i . '
            • '; + } + } + } + echo ( $paged < $pages ) ? '
            • ' : ''; + echo ( $paged < $pages - 1 && $paged + $range - 1 < $pages && $showitems < $pages ) ? '
            • ' : ''; + echo '
            '; + echo '
            '; + } + } +} + +function opalestate_show_display_status() { + global $wp; + $current_url = add_query_arg( $wp->query_string, '', preg_replace( '#page\/\d+#', '', home_url( $wp->request ) ) ); + $current_url = remove_query_arg( [ 'paged', 'page' ], $current_url ); + $gstatus = isset( $_GET['status'] ) ? sanitize_text_field( $_GET['status'] ) : ''; + + // echo $current_url;die; + ?> +
            + + '; + + echo ''; + echo ''; + ?> +
              +
            • active" data-id="all"> + +
            • + + +
            • + name; ?> +
            • + +
            + +
            + '_wp_page_template', + 'meta_value' => 'page-templates/page-property-search-results.php', + ] ); + + if ( $pages ) { + $pages = reset( $pages ); + $search_submit = get_permalink( $pages->ID ); + } else { + $search_submit = isset( $opalestate_options['search_map_properties_page'] ) ? get_permalink( absint( $opalestate_options['search_map_properties_page'] ) ) : get_bloginfo( 'url' ); + } + + return apply_filters( 'opalestate_get_search_link', $search_submit ); +} + +function opalestate_get_user_properties_uri( $args = [] ) { + + global $opalestate_options; + + $uri = isset( $opalestate_options['submission_list_page'] ) ? get_permalink( absint( $opalestate_options['submission_list_page'] ) ) : get_bloginfo( 'url' ); + + if ( ! empty( $args ) ) { + // Check for backward compatibility + if ( is_string( $args ) ) { + $args = str_replace( '?', '', $args ); + } + $args = wp_parse_args( $args ); + $uri = add_query_arg( $args, $uri ); + } + + $scheme = defined( 'FORCE_SSL_ADMIN' ) && FORCE_SSL_ADMIN ? 'https' : 'admin'; + + $ajax_url = admin_url( 'admin-ajax.php', $scheme ); + + if ( ( ! preg_match( '/^https/', $uri ) && preg_match( '/^https/', $ajax_url ) ) ) { + $uri = preg_replace( '/^http:/', 'https:', $uri ); + } + + return apply_filters( 'opalestate_get_user_properties_uri', $uri ); +} + +function opalestate_get_favorite_page_uri() { + + global $opalestate_options; + + $favorite_page = isset( $opalestate_options['favorite_page'] ) ? get_permalink( absint( $opalestate_options['favorite_page'] ) ) : get_bloginfo( 'url' ); + + return apply_filters( 'opalestate_get_favorite_page_uri', $favorite_page ); +} + +function opalestate_single_layout_templates( $layout ) { + + $layout['v2'] = esc_html__( 'Vesion 2', 'opalestate-pro' ); + $layout['v3'] = esc_html__( 'Vesion 3', 'opalestate-pro' ); + $layout['v4'] = esc_html__( 'Vesion 4', 'opalestate-pro' ); + $layout['v5'] = esc_html__( 'Vesion 5', 'opalestate-pro' ); + + return $layout; +} + +add_filter( 'opalestate_single_layout_templates', 'opalestate_single_layout_templates' ); + +function opalestate_single_the_property_layout() { + + global $opalestate_options; + + $layout = get_post_meta( get_the_ID(), OPALESTATE_PROPERTY_PREFIX . 'layout', true ); + if ( ! $layout ) { + $layout = isset( $opalestate_options['layout'] ) ? $opalestate_options['layout'] : ''; + } + + return $layout; +} + + +function opalestate_single_layout_prieview() { + $layout = [ + '' => esc_html__( 'Inherit', 'opalestate-pro' ), + 'gallery-thumbnail' => esc_html__( 'Gallery Thumb Nav', 'opalestate-pro' ), + 'gallery-slider' => esc_html__( 'Gallery Slider', 'opalestate-pro' ), + 'map' => esc_html__( 'Maps', 'opalestate-pro' ), + 'tabs-gallery' => esc_html__( 'Tabs - Gallery Active', 'opalestate-pro' ), + 'tabs-map' => esc_html__( 'Tabs - Map Active', 'opalestate-pro' ), + 'tabs-street' => esc_html__( 'Tabs - Street Map Active', 'opalestate-pro' ), + 'tour360' => esc_html__( 'Tour 360', 'opalestate-pro' ), + 'gallery-metro' => esc_html__( 'Gallery Metro', 'opalestate-pro' ), + 'mark-picture' => esc_html__( 'Mark Picture', 'opalestate-pro' ), + ]; + + return $layout; +} + + +function opalestate_property_loop_price() { + echo opalestate_load_template_path( 'parts/property-loop-price' ); +} + +function opalestate_property_featured_label() { + echo opalestate_load_template_path( 'parts/featured-label' ); +} + +function opalestate_property_label() { + echo opalestate_load_template_path( 'parts/property-label' ); +} + +function opalestate_property_status() { + echo opalestate_load_template_path( 'parts/property-status' ); +} + +/** + * Single property logic functions + */ + +/** + * Single property logic functions + */ +function opalestate_property_meta() { + echo opalestate_load_template_path( 'single-property/meta' ); +} + +function opalestate_single_show_map() { + return false; +} + +/** + * Single property logic functions + */ +function opalestate_property_preview() { + global $property; + $preview = $property->get_preview_template(); + if ( isset( $_GET['preview'] ) && $_GET['preview'] ) { + $preview = sanitize_text_field( $_GET['preview'] ); + } + switch ( $preview ) { + case 'tour360': + echo opalestate_load_template_path( 'single-property/preview/virtualtour' ); + break; + case 'gallery-slider': + echo opalestate_load_template_path( 'single-property/preview/gallery-slider' ); + break; + + case 'tabs-gallery': + echo opalestate_load_template_path( 'single-property/preview/tabs', [ 'tab_active' => 'gallery-slider' ] ); + remove_action( 'opalestate_after_single_property_summary', 'opalestate_property_map', 30 ); + add_filter( 'opalestate_single_show_map', 'opalestate_single_show_map' ); + break; + case 'tabs-map': + echo opalestate_load_template_path( 'single-property/preview/tabs', [ 'tab_active' => 'google-map' ] ); + remove_action( 'opalestate_after_single_property_summary', 'opalestate_property_map', 30 ); + add_filter( 'opalestate_single_show_map', 'opalestate_single_show_map' ); + break; + case 'tabs-street': + echo opalestate_load_template_path( 'single-property/preview/tabs', [ 'tab_active' => 'street-view-map' ] ); + remove_action( 'opalestate_after_single_property_summary', 'opalestate_property_map', 30 ); + add_filter( 'opalestate_single_show_map', 'opalestate_single_show_map' ); + break; + case 'map': + echo opalestate_load_template_path( 'single-property/preview/map', [ 'tab_active' => 'street-view-map' ] ); + remove_action( 'opalestate_after_single_property_summary', 'opalestate_property_map', 30 ); + break; + case 'mark-picture': + echo opalestate_load_template_path( 'single-property/preview/mark-picture' ); + break; + case 'gallery-metro': + echo opalestate_load_template_path( 'single-property/preview/gallery-metro' ); + break; + default: + echo opalestate_load_template_path( 'single-property/preview' ); + break; + } +} + +/** + * + */ +function opalestate_property_content() { + echo opalestate_load_template_path( 'single-property/content' ); +} + +/** + * + */ +function opalestate_property_information() { + echo opalestate_load_template_path( 'single-property/information' ); +} + +/** + * + */ +function opalestate_property_amenities() { + echo opalestate_load_template_path( 'single-property/amenities' ); +} + +function opalestate_property_facilities() { + echo opalestate_load_template_path( 'single-property/facilities' ); +} + + +function opalestate_property_attachments() { + echo opalestate_load_template_path( 'single-property/attachments' ); +} + +function opalestate_property_tags() { + return the_tags( '
            ', '', '
            ' ); +} + +function opalestate_property_map() { + echo opalestate_load_template_path( 'single-property/map' ); +} + +function opalestate_property_map_v2() { + echo opalestate_load_template_path( 'single-property/map-v2' ); +} + +function opalestate_property_nearby() { + echo opalestate_load_template_path( 'single-property/nearby' ); +} + +function opalestate_property_walkscore() { + echo opalestate_load_template_path( 'single-property/walkscore' ); +} + +function opalestate_property_apartments() { + echo opalestate_load_template_path( 'single-property/apartments' ); +} + +function opalestate_property_floor_plans() { + echo opalestate_load_template_path( 'single-property/floor-plans' ); +} + +function opalestate_property_views_statistics() { + echo opalestate_load_template_path( 'single-property/views-statistics' ); +} + +function opalestate_property_author() { + echo opalestate_load_template_path( 'single-property/author' ); +} + + +function opalestate_property_author_v2() { + echo opalestate_load_template_path( 'single-property/author-v2' ); +} + +function opalestate_property_author_v3() { + echo opalestate_load_template_path( 'single-property/author-v3' ); +} + + +function opalestate_property_video() { + echo opalestate_load_template_path( 'single-property/video' ); +} + +function opalestate_property_virtual_tour() { + echo opalestate_load_template_path( 'single-property/virtualtour' ); +} + +function opalestate_properties_same_agent() { + echo opalestate_load_template_path( 'single-property/sameagent' ); +} + +function opalestate_property_location() { + echo opalestate_load_template_path( 'single-property/location' ); +} + +/** + * + */ +add_action( 'opalestate_single_property_sameagent', 'opalestate_properties_same_agent', 5 ); + +function opalestate_agent_summary() { + echo opalestate_load_template_path( 'single-agent/summary' ); +} + +function opalestate_agent_properties() { + echo opalestate_load_template_path( 'single-agent/properties' ); +} + +function opalestate_agent_featured_properties() { + echo opalestate_load_template_path( 'single-agent/featured-properties' ); +} + +function opalestate_agent_contactform() { + global $post; + $args = [ 'post_id' => $post->ID ]; + echo opalestate_load_template_path( 'single-agent/form', $args ); +} + +add_action( 'opalestate_single_agent_summary', 'opalestate_agent_summary', 5 ); +add_action( 'opalestate_single_content_agent_after', 'opalestate_agent_properties', 15 ); +add_action( 'opalestate_single_content_agent_sidebar', 'opalestate_agent_featured_properties', 16 ); + +/** + * + */ +function opalestate_agent_navbar() { + +} + +add_action( 'opalestate_single_agent_summary', 'opalestate_agent_navbar', 5 ); + +/** + * Search page: + */ + +function opalestate_show_contact_share_search_link() { + $args = []; + echo opalestate_load_template_path( 'user/share-search-form', $args ); +} + +add_action( 'opalestate_before_render_search_properties_result', 'opalestate_show_contact_share_search_link' ); + +function opalestate_calculate_distance_geo( $lat, $long, $start_lat, $start_long, $dist_measure ) { + $angle = $start_long - $long; + $distance = sin( deg2rad( $start_lat ) ) * sin( deg2rad( $lat ) ) + cos( deg2rad( $start_lat ) ) * cos( deg2rad( $lat ) ) * cos( deg2rad( $angle ) ); + $distance = acos( $distance ); + $distance = rad2deg( $distance ); + + if ( $dist_measure == 'miles' ) { + $distance_miles = $distance * 60 * 1.1515; + + return '(' . round( $distance_miles, 2 ) . ' ' . esc_html__( 'miles', 'opalestate-pro' ) . ')'; + } else { + $distance_miles = $distance * 60 * 1.1515 * 1.6; + + return '(' . round( $distance_miles, 2 ) . ' ' . esc_html__( 'km', 'opalestate-pro' ) . ')'; + } +} + + +function opalestate_get_walkscore_results( $latitude, $longitude, $address ) { + $walkscore_api = esc_html( opalestate_get_option( 'walkscore_api_key', '' ) ); + if ( ! $walkscore_api ) { + return null; + } + + if ( ! $latitude || ! $longitude ) { + return null; + } + + $w = new Opalestate_WalkScore( $walkscore_api ); + + $walkscore = $w->WalkScore( [ + 'lat' => $latitude, + 'lon' => $longitude, + 'address' => $address, + 'transit' => 1, + 'bike' => 1, + ] ); + + if ( ! isset( $walkscore->walkscore ) || ! $walkscore->walkscore ) { + return null; + } + + return $walkscore; +} + +function opalestate_get_property_walkscore_results( $property ) { + if ( ! $property instanceof Opalestate_Property ) { + return false; + } + + $map = $property->get_map(); + + $latitude = $map['latitude']; + $longitude = $map['longitude']; + + $key = md5( $latitude . $longitude ); + + if ( ! $latitude || ! $longitude ) { + return false; + } + + $address = $property->get_address() ? $property->get_address() : ''; + + if ( false === ( $results = get_transient( $key ) ) ) { + $results = opalestate_get_walkscore_results( $latitude, $longitude, $address ); + set_transient( $key, $results, 24 * 7 * HOUR_IN_SECONDS ); + } + + return $results; +} + +function opalestate_get_property_walkscore_score( $property ) { + $walkscore = opalestate_get_property_walkscore_results( $property ); + + return $walkscore->walkscore; +} + +/** + * Gets related properties template. + */ +function opalestate_properties_related() { + + $num = apply_filters( 'opalestate_related_properties_number', 6 ); + $args = [ + 'post_type' => 'opalestate_property', + 'posts_per_page' => $num, + 'post__not_in' => [ get_the_ID() ], + ]; + + $terms = wp_get_post_terms( get_the_ID(), 'opalestate_types' ); + + $tax_query = []; + if ( $terms ) { + $tax_query[] = [ + [ + 'taxonomy' => 'opalestate_types', + 'field' => 'slug', + 'terms' => $terms[0]->slug, + ], + ]; + } + + $status = wp_get_post_terms( get_the_ID(), 'opalestate_status' ); + if ( ! is_wp_error( $status ) && $status ) { + $tax_query[] = + [ + 'taxonomy' => 'opalestate_status', + 'field' => 'slug', + 'terms' => $status[0]->slug, + + ]; + } + + + if ( $tax_query ) { + $args['tax_query'] = [ 'relation' => 'AND' ]; + $args['tax_query'] = array_merge( $args['tax_query'], $tax_query ); + } + $query = Opalestate_Query::get_property_query( $args ); + + $args = [ + 'query' => $query, + 'column' => 3, + 'style' => 'content-property-' . opalestate_get_option( 'single_related_properties_layout', 'grid' ), + 'heading' => esc_html__( 'Similar Properties You May Like', 'opalestate-pro' ), + ]; + + echo opalestate_load_template_path( 'parts/modules/carousel', $args ); +} + +/** + * Gets nearby properties template. + */ +function opalestate_properties_nearby() { + global $property; + $maps = $property->get_map(); + + $num = apply_filters( 'opalestate_nearby_properties_number', 6 ); + $post_id = get_the_ID(); + + $args = [ + 'post_type' => 'opalestate_property', + 'posts_per_page' => $num, + ]; + + $geo_lat = $maps['latitude']; + $geo_long = $maps['longitude']; + + if ( empty( $geo_lat ) || empty( $geo_long ) ) { + return; + } + + $radius = 5; + $post_ids = Opalestate_Query::filter_by_location( $geo_lat, $geo_long, $radius ); + + if ( empty( $post_ids ) ) { + return; + } + + $args['post__in'] = $post_ids; + + $query = Opalestate_Query::get_property_query( $args ); + + $args = [ + 'query' => $query, + 'column' => 3, + 'style' => 'content-property-' . opalestate_get_option( 'single_nearby_properties_layout', 'grid' ), + 'heading' => esc_html__( 'New Listings Nearby', 'opalestate-pro' ), + ]; + + echo opalestate_load_template_path( 'parts/modules/carousel', $args ); +} + +/** + * Opalestate Date Format - Allows to change date format for everything Opalestate. + * + * @return string + */ +function opalestate_date_format() { + return apply_filters( 'opalestate_date_format', get_option( 'date_format' ) ); +} + +/** + * Opalestate Time Format - Allows to change time format for everything Opalestate. + * + * @return string + */ +function opalestate_time_format() { + return apply_filters( 'opalestate_time_format', get_option( 'time_format' ) ); +} + +/** + * Get HTML for ratings. + * + * @param float $rating Rating being shown. + * @param int $count Total number of ratings. + * @return string + */ +function opalestate_get_rating_html( $rating, $count = 0 ) { + $html = ''; + + if ( 0 < $rating ) { + /* translators: %s: rating */ + $label = sprintf( esc_html__( 'Rated %s out of 5', 'opalestate-pro' ), $rating ); + $html = ''; + } + + return apply_filters( 'opalestate_property_get_rating_html', $html, $rating, $count ); +} + +/** + * Get HTML for star rating. + * + * @param float $rating Rating being shown. + * @param int $count Total number of ratings. + * @return string + */ +function opalestate_get_star_rating_html( $rating, $count = 0 ) { + $html = ''; + + if ( 0 < $count ) { + /* translators: 1: rating 2: rating count */ + $html .= sprintf( _n( 'Rated %1$s out of 5 based on %2$s customer rating', 'Rated %1$s out of 5 based on %2$s customer ratings', $count, 'opalestate-pro' ), + '' . esc_html( + $rating + ) . '', '' . esc_html( $count ) . '' ); + } else { + /* translators: %s: rating */ + $html .= sprintf( esc_html__( 'Rated %s out of 5', 'opalestate-pro' ), '' . esc_html( $rating ) . '' ); + } + + $html .= ''; + + return apply_filters( 'opalestate_get_star_rating_html', $html, $rating, $count ); +} + +function opalestate_load_yelp_places() { + if ( ! isset( $_POST['property_id'] ) ) { + return; + } + + $property_id = absint( $_POST['property_id'] ); + $property = opalesetate_property( $property_id ); + + if ( ! Opalestate_Yelp::get_client_id() || ! Opalestate_Yelp::get_app_key() ) { + return; + } + + $categories = Opalestate_Yelp::get_categories(); + if ( ! $categories ) { + return; + } + + $map = $property->get_map(); + + $latitude = $map['latitude']; + $longitude = $map['longitude']; + if ( ! $latitude || ! $longitude ) { + return; + } + + $all_categories = Opalestate_Yelp::get_all_categories(); + $yelp_dist_measure = opalestate_get_option( 'yelp_measurement_unit' ); + + ob_start(); + ?> + + + get_results( $category, $latitude, $longitude ); + + if ( ! $results || ! $results->businesses ) { + continue; + } + + $category_name = $all_categories[ $category ]['category']; + $category_icon = $all_categories[ $category ]['category_sign']; + ?> +
            +
            + +
            +
            + + businesses as $result ) : ?> + location->display_address; + $business_address0 = isset( $location[0] ) ? $location[0] : ''; + $business_address1 = isset( $location[1] ) ? $location[1] : ''; + $business_address2 = isset( $location[2] ) ? $location[2] : ''; + $business_address = $business_address0 . ' ' . $business_address1 . ' ' . $business_address2; + + $business_rating = isset( $result->rating ) ? $result->rating : 0; + ?> +
            + image_url ) && $result->image_url ) : ?> +
            + + <?php echo esc_attr( $result->name ); ?> + +
            + + +
            +
            + name ); ?> +
            + coordinates->latitude ) && isset( $result->coordinates->longitude ) ) : ?> +
            + coordinates->latitude, + $result->coordinates->longitude, + $latitude, + $longitude, + $yelp_dist_measure + ); ?> +
            + +
            +
            + +
            +
            + + + + review_count ), + 'review numbers', + 'opalestate-pro' + ), + number_format_i18n( absint( $result->review_count ) ) + ); + ?> + +
            +
            +
            + +
            + absint( $_POST['id'] ) ] ); + get_footer(); + + $output = ob_get_contents(); + ob_end_clean(); + echo $output; + exit(); +} + +add_action( 'wp_ajax_opalestate_ajax_create_property_print', 'opalestate_ajax_create_property_print' ); +add_action( 'wp_ajax_nopriv_opalestate_ajax_create_property_print', 'opalestate_ajax_create_property_print' ); + +if ( ! function_exists( 'opalestate_property_print_button' ) ) { + function opalestate_property_print_button( $id ) { + ?> + + + + + + + ' . esc_html__( 'Request Viewing', 'opalestate-pro' ) . ' + '; +} + +/// +add_action( 'opalestate_single_property_layout', 'opalestate_single_property_layout' ); +function opalestate_single_property_layout( $layout ) { + switch ( $layout ) { + case 'v2': + opalestate_single_property_layout_v2(); + break; + case 'v3': + opalestate_single_property_layout_v3(); + break; + case 'v4': + opalestate_single_property_layout_v4(); + break; + case 'v5': + opalestate_single_property_layout_v5(); + break; + default: + opalestate_single_property_layout_default(); + break; + } +} + + +/** + * Forms + */ +function opalestate_property_request_view_form() { + if ( ! is_single_property() ) { + return; + } + + $object = OpalEstate_User_Message::get_instance(); + $fields = $object->get_request_review_form_fields(); + + $form = OpalEstate()->html->render_form( $fields ); + + $description = esc_html__( 'Physical Arrange viewings is always been attractive to property clients. Fill out the form to arrange visualizations around our properties.', 'opalestate-pro' ); + + $atts = [ + 'heading' => esc_html__( 'Request Viewing', 'opalestate-pro' ), + 'description' => $description, + 'id' => 'property-request-view', + 'form' => $form, + ]; + + echo opalestate_load_template_path( 'messages/request-reviewing-form', $atts ); +} + +add_action( 'wp_footer', 'opalestate_property_request_view_form', 9 ); + +function opalestate_property_equiry_form() { + echo opalestate_load_template_path( 'messages/enquiry-form' ); +} + +if ( ! function_exists( "opalestate_login_register_form_popup" ) ) { + function opalestate_login_register_form_popup() { + echo opalestate_load_template_path( 'user/my-account-popup' ); + } +} +add_action( 'wp_footer', 'opalestate_login_register_form_popup', 9 ); + + +/** + * Add "Custom" template to page attirbute template section. + */ +function opalestate_add_template_to_select( $post_templates, $wp_theme, $post, $post_type ) { + + // Add custom template named template-custom.php to select dropdown + $post_templates['user-management.php'] = esc_html__( 'User Management', 'opalestate-pro' ); + $post_templates['fullwidth-page.php'] = esc_html__( 'Opalestate Fullwidth', 'opalestate-pro' ); + + return $post_templates; +} + +add_filter( 'theme_page_templates', 'opalestate_add_template_to_select', 10, 4 ); + +function opalestate_load_plugin_template( $template ) { + if ( get_page_template_slug() === 'user-management.php' ) { + + if ( $theme_file = locate_template( [ 'page-templates/user-management.php', 'user-management.php' ] ) ) { + $template = $theme_file; + } else { + $template = OPALESTATE_PLUGIN_DIR . '/templates/user-management.php'; + } + } elseif ( get_page_template_slug() === 'fullwidth-page.php' ) { + + if ( $theme_file = locate_template( [ 'page-templates/fullwidth-page.php', 'fullwidth-page.php' ] ) ) { + $template = $theme_file; + } else { + $template = OPALESTATE_PLUGIN_DIR . '/templates/fullwidth-page.php'; + } + + } + + if ( $template == '' ) { + throw new \Exception( 'No template found' ); + } + + return $template; +} + +add_filter( 'template_include', 'opalestate_load_plugin_template' ); + +add_action( 'opalestate_before_property_loop_item', 'opalestate_property_featured_label' ); +add_action( 'opalestate_before_property_loop_item', 'opalestate_property_label' ); diff --git a/inc/user/class-opalestate-user-form-handler.php b/inc/user/class-opalestate-user-form-handler.php new file mode 100755 index 00000000..03f3c033 --- /dev/null +++ b/inc/user/class-opalestate-user-form-handler.php @@ -0,0 +1,327 @@ +get_error_code() ) { + throw new Exception( '' . esc_html__( 'ERROR', 'opalestate-pro' ) . ': ' . $validation->get_error_message() ); + } + + /* validate username */ + if ( ! $username ) { + throw new Exception( '' . esc_html__( 'ERROR', 'opalestate-pro' ) . ': ' . esc_html__( 'Username is required.', 'opalestate-pro' ) ); + } else { + + if ( is_email( $username ) ) { + /* user object */ + $user = get_user_by( 'email', $username ); + if ( $user->user_login ) { + $credentials['user_login'] = $user->user_login; + } else { + throw new Exception( '' . esc_html__( 'ERROR', 'opalestate-pro' ) . ': ' . esc_html__( 'A user could not be found with this email address.', + 'opalestate-pro' ) ); + } + } else { + $credentials['user_login'] = $username; + } + + } + + /* validate password if it empty */ + if ( ! $password ) { + throw new Exception( '' . esc_html__( 'ERROR', 'opalestate-pro' ) . ': ' . esc_html__( 'Password is required.', 'opalestate-pro' ) ); + } + $credentials['user_password'] = $password; + /* is rembemer me checkbox */ + $credentials['remember'] = isset( $_POST['remember'] ); + + /* signon user */ + $user = wp_signon( $credentials, is_ssl() ); + if ( is_wp_error( $user ) ) { + throw new Exception( $user->get_error_message() ); + } else { + + /* after signon successfully */ + do_action( 'opalestate_after_signon_successfully', $user ); + $redirect = opalestate_get_dashdoard_page_uri(); + + if ( ! empty( $_POST['redirect'] ) ) { + $redirect = sanitize_text_field( $_POST['redirect'] ); + } elseif ( wp_get_referer() ) { + $redirect = wp_get_referer(); + } + + $redirect = apply_filters( 'opalestate_signon_redirect_url', $redirect ); + + if ( opalestate_is_ajax_request() ) { + + opalestate_add_notice( 'success', esc_html__( 'Logged successfully, welcome back!', 'opalestate-pro' ) ); + ob_start(); + opalestate_print_notices(); + $message = ob_get_clean(); + + + wp_send_json( [ + 'status' => true, + 'message' => $message, + 'redirect' => $redirect, + ] ); + + } else { + wp_safe_redirect( $redirect ); + exit(); + } + } + + do_action( 'opalestate_user_proccessing_login_after' ); + + } catch ( Exception $e ) { + opalestate_add_notice( 'error', $e->getMessage() ); + } + + if ( opalestate_is_ajax_request() ) { + ob_start(); + opalestate_print_notices(); + $message = ob_get_clean(); + wp_send_json( [ + 'status' => false, + 'message' => $message, + ] ); + } + } + + /** + * Register processer + */ + public function process_register() { + if ( ! isset( $_POST['opalestate-register-nonce'] ) ) { + return; + } + + $nonce_value = isset( $_POST['_wpnonce'] ) ? sanitize_text_field( $_POST['_wpnonce'] ) : ''; + $nonce_value = isset( $_POST['opalestate-register-nonce'] ) ? sanitize_text_field( $_POST['opalestate-register-nonce'] ) : $nonce_value; + + /* verify wp nonce */ + if ( ! isset( $_POST['confirmed_register'] ) || ! wp_verify_nonce( $nonce_value, 'opalestate-register' ) ) { + return; + } + + try { + + do_action( 'opalestate_user_proccessing_register_before' ); + + $credentials = []; + $username = isset( $_POST['username'] ) ? sanitize_user( $_POST['username'] ) : ''; + $email = isset( $_POST['email'] ) ? sanitize_email( $_POST['email'] ) : ''; + $password = isset( $_POST['password'] ) ? sanitize_text_field( $_POST['password'] ) : ''; + $password1 = isset( $_POST['password1'] ) ? sanitize_text_field( $_POST['password1'] ) : ''; + + /* sanitize, allow hook process like block somebody =)))) */ + $validation = apply_filters( 'opalestate_validation_process_register_error', new WP_Error(), $username, $email ); + + /* sanitize */ + if ( $validation->get_error_code() ) { + throw new Exception( '' . esc_html__( 'ERROR', 'opalestate-pro' ) . ': ' . $validation->get_error_message() ); + } + + /* validate username */ + if ( ! $username ) { + throw new Exception( '' . esc_html__( 'ERROR', 'opalestate-pro' ) . ': ' . esc_html__( 'Username is required.', 'opalestate-pro' ) ); + } else { + $credentials['user_login'] = $username; + } + + /* validate email */ + if ( ! $email ) { + throw new Exception( '' . esc_html__( 'ERROR', 'opalestate-pro' ) . ': ' . esc_html__( 'Email is required.', 'opalestate-pro' ) ); + } else { + $credentials['user_email'] = $email; + } + + /* validate password */ + if ( ! $password ) { + throw new Exception( '' . esc_html__( 'ERROR', 'opalestate-pro' ) . ': ' . esc_html__( 'Password is required.', 'opalestate-pro' ) ); + } + if ( $password !== $password1 ) { + throw new Exception( '' . esc_html__( 'ERROR', 'opalestate-pro' ) . ': ' . esc_html__( 'Re-Password is not match.', 'opalestate-pro' ) ); + } + $credentials['user_pass'] = $password; + + + /* create new user */ + $user_id = opalestate_create_user( $credentials ); + + if ( is_wp_error( $user_id ) ) { + throw new Exception( '' . esc_html__( 'ERROR', 'opalestate-pro' ) . ': ' . $user_id->get_error_message() ); + } else { + + /* after register successfully */ + do_action( 'opalestate_after_register_successfully', $user_id ); + + $redirect = home_url(); + if ( opalestate_get_option( 'login_user' ) ) { + wp_set_auth_cookie( $user_id ); + $redirect = opalestate_get_dashdoard_page_uri(); + } elseif ( ! empty( $_POST['redirect'] ) ) { + $redirect = sanitize_text_field( $_POST['redirect'] ); + } elseif ( wp_get_referer() ) { + $redirect = wp_get_referer(); + } + + do_action( 'opalestate_user_proccessing_register_after' ); + + $redirect = apply_filters( 'opalestate_register_redirect_url', $redirect ); + + /* is ajax request */ + if ( opalestate_is_ajax_request() ) { + wp_send_json( [ 'status' => true, 'redirect' => $redirect ] ); + } else { + wp_safe_redirect( $redirect ); + exit(); + } + } + + } catch ( Exception $e ) { + opalestate_add_notice( 'error', $e->getMessage() ); + } + + /* is ajax request */ + if ( opalestate_is_ajax_request() ) { + ob_start(); + opalestate_print_notices(); + $message = ob_get_clean(); + wp_send_json( [ + 'status' => false, + 'message' => $message, + ] ); + } + } + + /** + * process user doForgotPassword with username/password + * + * return Json Data with messsage and login status + */ + public function process_forgot_password() { + + // First check the nonce, if it fails the function will break + check_ajax_referer( 'ajax-pbr-lostpassword-nonce', 'security' ); + + global $wpdb; + + $account = sanitize_text_field( $_POST['user_login'] ); + + if ( empty( $account ) ) { + $error = esc_html__( 'Enter an username or e-mail address.', 'opalestate-pro' ); + } else { + if ( is_email( $account ) ) { + if ( email_exists( $account ) ) { + $get_by = 'email'; + } else { + $error = esc_html__( 'There is no user registered with that email address.', 'opalestate-pro' ); + } + } elseif ( validate_username( $account ) ) { + if ( username_exists( $account ) ) { + $get_by = 'login'; + } else { + $error = esc_html__( 'There is no user registered with that username.', 'opalestate-pro' ); + } + } else { + $error = esc_html__( 'Invalid username or e-mail address.', 'opalestate-pro' ); + } + } + + if ( empty ( $error ) ) { + $random_password = wp_generate_password(); + + $user = get_user_by( $get_by, $account ); + + $update_user = wp_update_user( [ 'ID' => $user->ID, 'user_pass' => $random_password ] ); + + if ( $update_user ) { + + $from = get_option( 'admin_email' ); // Set whatever you want like mail@yourdomain.com + + if ( ! ( isset( $from ) && is_email( $from ) ) ) { + $sitename = strtolower( $_SERVER['SERVER_NAME'] ); + if ( substr( $sitename, 0, 4 ) == 'www.' ) { + $sitename = substr( $sitename, 4 ); + } + $from = 'do-not-reply@' . $sitename; + } + + $to = $user->user_email; + $subject = esc_html__( 'Your new password', 'opalestate-pro' ); + $sender = 'From: ' . get_option( 'name' ) . ' <' . $from . '>' . "\r\n"; + + $message = esc_html__( 'Your new password is: ', 'opalestate-pro' ) . $random_password; + + $headers[] = 'MIME-Version: 1.0' . "\r\n"; + $headers[] = 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; + $headers[] = "X-Mailer: PHP \r\n"; + $headers[] = $sender; + + $mail = wp_mail( $to, $subject, $message, $headers ); + if ( $mail ) { + $success = esc_html__( 'Check your email address for you new password.', 'opalestate-pro' ); + } else { + $error = esc_html__( 'System is unable to send you mail containg your new password.', 'opalestate-pro' ); + } + } else { + $error = esc_html__( 'Oops! Something went wrong while updating your account.', 'opalestate-pro' ); + } + } + + if ( ! empty( $error ) ) { + echo wp_send_json( [ 'status' => false, 'message' => ( $error ) ] ); + } + + if ( ! empty( $success ) ) { + echo wp_send_json( [ 'status' => false, 'message' => $success ] ); + } + die(); + } +} + +new Opalestate_User_Form_Handler(); diff --git a/inc/user/class-opalestate-user-search.php b/inc/user/class-opalestate-user-search.php new file mode 100755 index 00000000..406dc1be --- /dev/null +++ b/inc/user/class-opalestate-user-search.php @@ -0,0 +1,222 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class OpalEstate_User_Search { + + /** + * + */ + protected $user_id = 0; + + /** + * + */ + public static function get_instance() { + static $_instance; + if ( ! $_instance ) { + $_instance = new self(); + } + + return $_instance; + } + + /** + * + */ + public function __construct() { + add_action( 'init', [ $this, 'init' ] ); + } + + /** + * Set values when user logined in system + */ + public function init() { + + global $current_user; + wp_get_current_user(); + + $this->user_id = $current_user->ID; + + add_filter( 'opalestate_management_user_menu', [ $this, 'dashboard_menu' ] ); + add_action( 'wp_ajax_opalestate_ajx_save_search', [ $this, 'do_save' ] ); + add_action( 'wp_ajax_nopriv_opalestate_ajx_save_search', [ $this, 'do_save' ] ); + + add_shortcode( 'opalestate_user_saved_search', [ $this, 'savedsearch_page' ] ); + + add_filter( 'opalestate_user_content_saved_search_page', [ $this, 'savedsearch_page' ] ); + } + + /** + * + */ + public function get_search_by_code( $code ) { + + global $wpdb; + + $query = " SELECT * FROM " . $wpdb->prefix . "opalestate_usersearch WHERE code like %s "; + + $items = $wpdb->get_results( $wpdb->prepare( $query, $code ) ); + + if ( isset( $items[0] ) ) { + return $items[0]; + } + + return false; + } + + /** + * + */ + public function has_existed( $params ) { + return $this->get_search_by_code( md5( $params ) ); + } + + /** + * + */ + public function insert( $data ) { + global $wpdb; + + $args = [ + 'name' => '', + 'params' => '', + 'code' => '', + 'user_id' => $this->user_id, + ]; + + $args = array_merge( $args, $data ); + $args['code'] = md5( $data['params'] ); + + $id = $wpdb->insert( $wpdb->prefix . 'opalestate_usersearch', $args ); + + return $id; + } + + /** + * + */ + public static function install() { + try { + if ( ! function_exists( 'dbDelta' ) ) { + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); + } + + global $wpdb; + + $charset_collate = $wpdb->get_charset_collate(); + + $sql = 'CREATE TABLE IF NOT EXISTS ' . $wpdb->prefix . 'opalestate_usersearch' . ' ( + id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255), + params VARCHAR(255), + code VARCHAR(255), + user_id INT(11) DEFAULT 0 + ) ' . $charset_collate; + dbDelta( $sql ); + + } catch ( Exception $e ) { + + } + } + + /** + * + */ + public function do_save() { + if ( $this->user_id > 0 && isset( $_POST['params'] ) && isset( $_POST['name'] ) && ! empty( $_POST['name'] ) && ! empty( $_POST['params'] ) ) { + if ( ! $this->has_existed( $_POST['params'] ) ) { + $this->insert( [ 'name' => sanitize_text_field( $_POST['name'] ), 'params' => $_POST['params'] ] ); + $result = [ 'status' => true, 'message' => esc_html__( 'Saved this search successful.', 'opalestate-pro' ) ]; + } else { + $result = [ 'status' => false, 'message' => esc_html__( 'You saved this search', 'opalestate-pro' ) ]; + } + } else { + $result = [ 'status' => false, 'message' => esc_html__( 'Please sign in to save this search.', 'opalestate-pro' ) ]; + } + + echo json_encode( $result ); + + die; + } + + /** + * + */ + public function do_delete( $id ) { + + global $wpdb; + if ( $this->user_id ) { + $wpdb->delete( $wpdb->prefix . "opalestate_usersearch", [ 'id' => $id, 'user_id' => $this->user_id ], [ '%d' ] ); + } + } + + /** + * + */ + public function get_list() { + + global $wpdb; + + $query = " SELECT * FROM " . $wpdb->prefix . "opalestate_usersearch where user_id=" . $this->user_id; + + return $wpdb->get_results( $query ); + } + + /** + * + */ + public function is_saved() { + + } + + /** + * + */ + public function dashboard_menu( $menu ) { + $menu['savedsearch'] = [ + 'icon' => 'fa fa-search', + 'link' => 'saved_search', + 'title' => esc_html__( 'Saved Search', 'opalestate-pro' ), + 'id' => 0, + ]; + + return $menu; + } + + /** + * + */ + public function savedsearch_page() { + if ( isset( $_GET['doaction'] ) && $_GET['doaction'] == 'delete' && isset( $_GET['id'] ) ) { + $this->do_delete( absint( $_GET['id'] ) ); + } + + return opalestate_load_template_path( 'user-search/content-savedsearch' ); + } + + /** + * + */ + public function render_button() { + echo opalestate_load_template_path( 'user-search/render-form' ); + } +} + +if ( opalestate_options( 'enable_saved_usersearch', 'on' ) == 'on' ) { + OpalEstate_User_Search::get_instance(); +} diff --git a/inc/user/class-opalestate-user.php b/inc/user/class-opalestate-user.php new file mode 100755 index 00000000..593120fe --- /dev/null +++ b/inc/user/class-opalestate-user.php @@ -0,0 +1,717 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class OpalEstate_User { + + /** + * @var + */ + public $id; + + /** + * @var + */ + public $current_user_id; + + /** + * @var mixed|void + */ + public $enable_extra_profile; + + /** + * @var + */ + public $roles; + + /** + * @var + */ + public $user_id; + + /** + * @var + */ + public $new_attachmenet_ids; + + /** + * OpalEstate_User constructor. + */ + public function __construct() { + define( "OPALESTATE_USER_PROFILE_PREFIX", 'opalestate_user_' ); + + $shortcodes = [ + 'user_profile' => [ 'code' => 'user_profile', 'label' => esc_html__( 'User Profile', 'opalestate-pro' ) ], + 'myaccount' => [ 'code' => 'myaccount', 'label' => esc_html__( 'My Account', 'opalestate-pro' ) ], + ]; + + foreach ( $shortcodes as $shortcode ) { + add_shortcode( 'opalestate_' . $shortcode['code'], [ $this, $shortcode['code'] ] ); + } + $this->enable_extra_profile = opalestate_options( 'enable_extra_profile', 'on' ); + + + add_action( 'init', [ $this, 'process_frontend_submit' ], 99999 ); + add_action( 'cmb2_render_text_password', [ $this, 'cmb2_render_text_password' ], 10, 5 ); + + /** + * Ajax action + */ + add_action( 'wp_ajax_opalestate_save_changepass', [ $this, 'save_change_password' ] ); + add_action( 'wp_ajax_nopriv_opalestate_save_changepass', [ $this, 'save_change_password' ] ); + + add_action( 'cmb2_after_init', [ $this, 'process_submission' ], 100000 ); + + /** + * Check User Block Submission + */ + add_action( 'opalestate_submission_form_before', [ $this, 'show_message' ], 9 ); + add_action( 'opalestate_before_process_ajax_upload_file', [ $this, 'check_blocked' ] ); + add_action( 'opalestate_before_process_ajax_upload_user_avatar', [ $this, 'check_blocked' ] ); + add_action( 'opalestate_profile_form_process_before', [ $this, 'check_blocked' ] ); + add_action( 'opalestate_toggle_featured_property_before', [ $this, 'check_blocked' ] ); + + add_action( 'user_register', [ $this, 'on_create_user' ], 10, 1 ); + add_action( 'profile_update', [ $this, 'on_create_user' ], 10, 1 ); + add_action( 'opalestate_after_register_successfully', [ $this, 'on_regiser_user' ], 10, 1 ); + + add_action( 'init', [ $this, 'disable' ], 100000 ); + add_action( 'init', [ $this, 'init_user_management' ] ); + + add_action( 'wp_enqueue_scripts', [ $this, 'scripts_styles' ], 99 ); + + add_filter( 'pre_get_posts', [ $this, 'show_current_user_attachments' ] ); + } + + /** + * FrontEnd Submission + */ + public function show_current_user_attachments( $wp_query_obj ) { + + global $current_user, $pagenow; + + if ( ! is_a( $current_user, 'WP_User' ) ) { + return; + } + + if ( ! in_array( $pagenow, [ 'upload.php', 'admin-ajax.php' ] ) ) { + return; + } + + if ( ! empty( $current_user->roles ) ) { + if ( in_array( 'opalestate_agent', $current_user->roles ) || in_array( 'opalestate_agency', $current_user->roles ) ) { + $wp_query_obj->set( 'author', $current_user->ID ); + } + } + + return; + } + + + public function scripts_styles() { + if ( isset( $_GET['tab'] ) ) { + wp_register_style( 'opalesate-cmb2-front', OPALESTATE_PLUGIN_URL . 'assets/cmb2-front.css' ); + wp_enqueue_style( 'opalesate-cmb2-front' ); + wp_register_script( + 'opalestate-dashboard', + OPALESTATE_PLUGIN_URL . 'assets/js/frontend/dashboard.js', + [ + 'jquery', + ], + '1.0', + true + ); + wp_enqueue_script( 'opalestate-dashboard' ); + } + } + + public function disable() { + if ( ! current_user_can( 'manage_options' ) ) { + add_action( 'wp_before_admin_bar_render', [ $this, 'disable_profile_page' ] ); + add_action( 'admin_init', [ $this, 'disable_profile_page' ] ); + add_filter( 'show_admin_bar', '__return_false' ); + } + } + + public function init_user_management() { + add_action( 'opalestate_user_content_profile_page', [ $this, 'user_profile' ] ); + } + + /** + * + */ + public function show_message_user_profile() { + $user_id = isset( $_GET['user_id'] ) ? intval( $_GET['user_id'] ) : 0; + $roles = opalestate_user_roles_by_user_id( $user_id ); + if ( $roles ): + if ( in_array( 'opalestate_agency', $roles ) ): + $agency_id = get_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'related_id', true ); + if ( ! $agency_id ) { + return; + } + $link = get_edit_post_link( $agency_id ); + ?> +
            +

            Opal Estate Agency and click here to update Agency profile', + 'opalestate-pro' ), $link ); ?>

            +
            + +
            +

            Opal Estate Agent and click here to update Agent profile', + 'opalestate-pro' ), $link ); ?>

            +
            + + remove_role( 'subscriber' ); + // Replace the current role with 'editor' role + $u->set_role( sanitize_text_field( $_POST['role'] ) ); + + if ( $roles && in_array( $_POST['role'], $roles ) ) { + $role = str_replace( 'opalestate_', '', sanitize_text_field( $_POST['role'] ) ); + do_action( 'opalestate_on_set_role_' . $role, $user_id ); + } + } + } + + /** + * + */ + public function on_create_user( $user_id ) { + if ( isset( $_POST['role'] ) ) { + $roles = opalestate_user_roles_by_user_id( $user_id ); + + if ( $roles && in_array( $_POST['role'], $roles ) ) { + $role = sanitize_text_field( str_replace( 'opalestate_', '', $_POST['role'] ) ); + do_action( 'opalestate_on_set_role_' . $role, $user_id ); + } + } + } + + /** + * + */ + public function disable_profile_page() { + + // Remove AdminBar Link + if ( + 'wp_before_admin_bar_render' === current_filter() + && ! current_user_can( 'manage_options' ) + ) { + return $GLOBALS['wp_admin_bar']->remove_menu( 'edit-profile', 'user-actions' ); + } + + // Remove (sub)menu items + // remove_menu_page( 'profile.php' ); + if ( function_exists( "remove_submenu_page" ) ) { + remove_submenu_page( 'users.php', 'profile.php' ); + } + // Deny access to the profile page and redirect upon try + if ( + defined( 'IS_PROFILE_PAGE' ) + && IS_PROFILE_PAGE + && ! current_user_can( 'manage_options' ) + ) { + // wp_redirect( admin_url() ); + exit; + } + } + + /** + * + */ + public function show_message() { + if ( $this->is_blocked() ) { + + echo apply_filters( 'opalestate_user_block_submission_message', + '
            ' . __( 'Your account was blocked to use the submission form, so you could not submit any property.', 'opalestate-pro' ) . '
            ' ); + } + } + + /** + * + */ + public function check_blocked() { + $check = $this->is_blocked(); + if ( $check ) { + $std = new stdClass(); + $std->status = false; + $std->message = esc_html__( 'Your account is blocked, you could not complete this action', 'opalestate-pro' ); + $std->msg = $std->message; + echo json_encode( $std ); + wp_die(); + } + } + + /** + * + */ + public static function get_user_types() { + + return apply_filters( 'opalestate_usertypes', [ + 'none' => esc_html__( 'Subscriber', 'opalestate-pro' ), + 'opalestate_agent' => esc_html__( 'Agent', 'opalestate-pro' ), + 'opalestate_agency' => esc_html__( 'Agency', 'opalestate-pro' ), + ] ); + } + + /** + * + */ + public function process_submission() { + + global $current_user; + // Verify Nonce + $user_id = get_current_user_id(); + $check = $this->is_blocked(); + + $key = 'nonce_CMB2phpopalestate_user_front'; + + if ( ! isset( $_POST[ $key ] ) || empty( $_POST[ $key ] ) || ! is_user_logged_in() || $check ) { + return; + } + + $this->process_upload_files( 0 ); + + $prefix = OPALESTATE_USER_PROFILE_PREFIX; + $post_id = $user_id; + + $metaboxes = apply_filters( 'cmb2_meta_boxes', $this->front_edit_fields( [] ) ); + cmb2_get_metabox_form( $metaboxes[ $prefix . 'front' ], $post_id ); + $cmb = cmb2_get_metabox( $prefix . 'front', $post_id ); + + $sanitized_values = $cmb->get_sanitized_values( $_POST ); + $cmb->save_fields( $user_id, 'user', $sanitized_values ); + + $posts = [ + 'first_name', + 'last_name', + 'description', + ]; + + foreach ( $posts as $post ) { + if ( isset( $_POST[ $post ] ) ) { + update_user_meta( $current_user->ID, $post, esc_attr( $_POST[ $post ] ) ); + } + } + + if ( $this->new_attachmenet_ids ) { + foreach ( $this->new_attachmenet_ids as $_id ) { + delete_post_meta( $_id, '_pending_to_use_', 1 ); + } + } + + $this->remove_dirty_images( $user_id ); + + return opalestate_output_msg_json( true, + __( 'The data updated successful, please wait for redirecting', 'opalestate-pro' ), + [ + 'heading' => esc_html__( 'Update Information', 'opalestate-pro' ), + 'redirect' => opalestate_get_user_management_page_uri( [ 'tab' => 'profile' ] ), + ] + ); + } + + /** + * Remove dirty images of current user + */ + public function remove_dirty_images( $user_id ) { + + if ( isset( $_POST['remove_image_id'] ) && is_array( $_POST['remove_image_id'] ) && $_POST['remove_image_id'] ) { + foreach ( $_POST['remove_image_id'] as $key => $value ) { + $post = get_post( $value ); + if ( $post->post_author == $user_id ) { + wp_delete_attachment( $value ); + } + } + } + } + + + /** + * + * + */ + private function get_field_name( $field ) { + return OPALESTATE_USER_PROFILE_PREFIX . $field; + } + + /** + * Process upload images for properties + */ + public function upload_image( $submitted_file, $parent_id = 0 ) { + return opalesate_upload_image( $submitted_file, $parent_id ); + } + + + private function process_upload_files( $post_id ) { + + //upload images for featured and gallery images + if ( isset( $_FILES ) && ! empty( $_FILES ) ) { + + /// + $fields = [ + $this->get_field_name( 'avatar_id' ), + ]; + + foreach ( $_FILES as $key => $value ) { + // allow processing in fixed collection + if ( in_array( $key, $fields ) ) { + $ufile = $_FILES[ $key ]; + + /// ///// + if ( isset( $ufile['name'] ) && is_array( $ufile['name'] ) ) { + $output = []; + + foreach ( $ufile['name'] as $f_key => $f_value ) { + $loop_file = [ + 'name' => $ufile['name'][ $f_key ], + 'type' => $ufile['type'][ $f_key ], + 'tmp_name' => $ufile['tmp_name'][ $f_key ], + 'error' => $ufile['error'][ $f_key ], + 'size' => $ufile['size'][ $f_key ], + ]; + $new_atm = $this->upload_image( $loop_file, $post_id ); + if ( $new_atm ) { + $_POST[ $key ] = isset( $_POST[ $key ] ) ? $_POST[ $key ] : []; + $_POST[ $key ][ $new_atm['attachment_id'] ] = $new_atm['url']; + $this->new_attachmenet_ids[ $new_atm['attachment_id'] ] = $new_atm['attachment_id']; + } + } + + } /// + elseif ( isset( $ufile['name'] ) ) { + $new_atm = $this->upload_image( $ufile, $post_id ); + if ( $new_atm ) { + $_POST[ $key ] = $new_atm['attachment_id']; + + if ( preg_match( "#id#", $key ) ) { + $_key = str_replace( "_id", "", $key ); + $_POST[ $_key ] = $new_atm['url']; + } + $this->new_attachmenet_ids[ $new_atm['attachment_id'] ] = $new_atm['attachment_id']; + } + } + //// / // + } + } + } + } + + /** + * + */ + public static function is_blocked() { + + global $current_user; + // Verify Nonce + $user_id = get_current_user_id(); + if ( $user_id <= 0 ) { + return true; + } + $blocked = get_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'block_submission', true ); + + return $blocked; + } + + /** + * + */ + public function get_avatar_url( $user_id ) { + + return get_avatar_url( $user_id ); + } + + /** + * + */ + public static function get_author_picture( $user_id ) { + $avatar = get_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'avatar', true ); + + if ( ! $avatar ) { + $avatar = opalestate_get_image_avatar_placehold(); + } + + return $avatar; + } + + /** + * + */ + public function shortcode_button() { + + } + + /** + * + */ + public function save_change_password() { + global $current_user; + + $nonce = 'nonce_CMB2phpopalestate_user_frontchangepass'; + if ( ! isset( $_POST[ $nonce ], $_POST['oldpassword'], $_POST['new_password'], $_POST['confirm_password'] ) || ! wp_verify_nonce( $_POST[ $nonce ], $nonce ) ) { + return false; + } + + do_action( 'opalestate_profile_form_process_before' ); + $output = new stdClass(); + $output->status = false; + $output->message = esc_html__( 'Found a problem while updating', 'opalestate-pro' ); + + wp_get_current_user(); + + $userID = $current_user->ID; + + $oldpassword = sanitize_text_field( $_POST['oldpassword'] ); + $new_password = sanitize_text_field( $_POST['new_password'] ); + $confirm_password = sanitize_text_field( $_POST['confirm_password'] ); + + if ( empty( $oldpassword ) || empty( $new_password ) || empty( $confirm_password ) ) { + $output->message = esc_html__( 'Passwords fields are not empty', 'opalestate-pro' ); + echo json_encode( $output ); + exit; + } + + if ( $new_password != $confirm_password ) { + $output->message = esc_html__( 'New password is not same confirm password', 'opalestate-pro' ); + echo json_encode( $output ); + exit; + } + + + $user = get_user_by( 'id', $userID ); + if ( $user && wp_check_password( $oldpassword, $user->data->user_pass, $userID ) ) { + wp_set_password( $new_password, $userID ); + $output->status = true; + $output->message = esc_html__( 'Password Updated', 'opalestate-pro' ); + } else { + $output->message = esc_html__( 'Old password is not correct', 'opalestate-pro' ); + } + + echo json_encode( $output ); + die(); + } + + /** + * Defines custom front end fields + * + * @access public + * @param array $metaboxes + * @return array + */ + public function front_edit_fields( array $metaboxes ) { + $post_id = 0; + $prefix = OPALESTATE_USER_PROFILE_PREFIX; + global $current_user; + + $default = []; + + $user_roles = $current_user->roles; + $user_role = array_shift( $user_roles ); + + $metabox = new Opalestate_User_MetaBox(); + + /// + if ( $this->get_member_id() ) { + $fields = array_merge_recursive( $default, + $metabox->get_front_base_field( $prefix ) + ); + } else { + $fields = array_merge_recursive( $default, + $metabox->get_front_base_field( $prefix ), + $metabox->get_job_fields( $prefix ), + $metabox->get_base_front_fields( $prefix ), + $metabox->get_address_fields( $prefix ) + ); + } + + + $metaboxes[ $prefix . 'front' ] = [ + 'id' => $prefix . 'front', + 'title' => esc_html__( 'Name and Description', 'opalestate-pro' ), + 'object_types' => [ 'opalestate_property' ], + 'context' => 'normal', + 'object_types' => [ 'user' ], // Tells CMB2 to use user_meta vs post_meta + 'priority' => 'high', + 'show_names' => true, + 'cmb_styles' => false, + 'fields' => $fields, + ]; + + + $metaboxes[ $prefix . 'frontchangepass' ] = [ + 'id' => $prefix . 'frontchangepass', + 'title' => esc_html__( 'Name and Description', 'opalestate-pro' ), + 'object_types' => [ 'opalestate_property' ], + 'context' => 'normal', + 'object_types' => [ 'user' ], // Tells CMB2 to use user_meta vs post_meta + 'priority' => 'high', + 'show_names' => true, + 'fields' => [ + [ + 'id' => "oldpassword", + 'name' => esc_html__( 'Old Password', 'opalestate-pro' ), + 'type' => 'text_password', + 'attributes' => [ + 'required' => 'required', + ], + 'description' => esc_html__( 'Please enter your old password', 'opalestate-pro' ), + ], + [ + 'id' => "new_password", + 'name' => esc_html__( 'New Password', 'opalestate-pro' ), + 'type' => 'text_password', + 'attributes' => [ + 'required' => 'required', + ], + 'description' => esc_html__( 'Please enter your new password.', 'opalestate-pro' ), + ], + [ + 'id' => "confirm_password", + 'name' => esc_html__( 'Confirm Password', 'opalestate-pro' ), + 'type' => 'text_password', + 'attributes' => [ + 'required' => 'required', + ], + 'description' => esc_html__( 'Please enter your confirm password.', 'opalestate-pro' ), + ], + ], + ]; + + + return $metaboxes; + } + + public function cmb2_render_text_password( $field_args, $escaped_value, $object_id, $object_type, $field_type_object ) { + echo $field_type_object->input( [ 'type' => 'password', 'class' => 'form-control' ] ); + } + + + public function myaccount() { + return opalestate_load_template_path( 'user/my-account' ); + } + + /** + * FrontEnd Submission + */ + public function user_profile() { + + global $current_user; + + if ( ! is_user_logged_in() ) { + echo opalestate_load_template_path( 'parts/not-allowed' ); + + return; + } + + $user_id = get_current_user_id(); + + + $metaboxes = apply_filters( 'cmb2_meta_boxes', $this->front_edit_fields( [] ) ); + + return opalestate_load_template_path( 'user/profile', [ 'metaboxes' => $metaboxes, 'user_id' => $user_id ] ); + + } + + public function process_frontend_submit() { + + if ( opalestate_options( 'enable_extra_profile', 'on' ) != 'on' ) { + return; + } + + global $current_user; + } + + /** + * + */ + private function update_data_agent_or_agency( $prefix ) { + + global $current_user; + + + $post_id = isset( $_POST['object_id'] ) && absint( $_POST['object_id'] ) ? absint( $_POST['object_id'] ) : 0; + $user_id = get_current_user_id(); + $metaboxes = apply_filters( 'opalestate_before_render_profile_' . $_GET['tab'] . '_form', [], $post_id ); + $metaboxes = apply_filters( 'cmb2_meta_boxes', $metaboxes ); + + if ( isset( $metaboxes[ $prefix . 'front' ] ) ) { + if ( ! empty( $post_id ) ) { + $old_post = get_post( $post_id ); + $post_date = $old_post->post_date; + } else { + $post_date = ''; + } + + $data = [ + 'ID' => $post_id, + 'post_title' => $current_user->display_name, + 'post_author' => $user_id, + 'post_status' => 'publish', + 'post_type' => 'opalestate_agent', + 'post_date' => $post_date, + 'post_content' => wp_kses( $_POST[ $prefix . 'text' ], '

            ' ), + ]; + unset( $_POST[ $prefix . 'text' ] ); + + + if ( $post_id > 0 ) { + $post_id = wp_update_post( $data, true ); + } else { + $post_id = wp_insert_post( $data, true ); + } + + $post = get_post( $post_id ); + + if ( empty( $post->post_content ) || empty( $post->post_title ) || ! has_post_thumbnail( $post_id ) ) { + + $data['post_status'] = 'pending'; + $post_id = wp_update_post( $data, true ); + } + update_user_meta( $user_id, $prefix . 'related_id', $post_id ); + cmb2_get_metabox_form( $metaboxes[ $prefix . 'front' ], $post_id ); + + return $post_id; + } + + return false; + } + + public static function get_member_id() { + $user_id = get_current_user_id(); + + return get_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'related_id', true ); + } +} + +new OpalEstate_User(); diff --git a/inc/user/class-user-statistics.php b/inc/user/class-user-statistics.php new file mode 100755 index 00000000..cea527da --- /dev/null +++ b/inc/user/class-user-statistics.php @@ -0,0 +1,29 @@ +user_id = get_current_user_id(); + } + + public function get_count_properties() { + $query = Opalestate_Query::get_properties_by_user( array(), $this->user_id ); + return $query->found_posts; + } + + public function get_count_featured() { + $query = Opalestate_Query::get_properties_by_user( array( + 'featured' => 1 + ), $this->user_id ); + return $query->found_posts; + } + + public function get_count_pending_properties() { + $query = Opalestate_Query::get_properties_by_user( array( + 'post_status' => 'pending' + ), $this->user_id ); + return $query->found_posts; + } + + } +?> \ No newline at end of file diff --git a/inc/user/functions.php b/inc/user/functions.php new file mode 100755 index 00000000..b25eeecc --- /dev/null +++ b/inc/user/functions.php @@ -0,0 +1,261 @@ + 'submission_list') ); +} + +function opalestate_get_user_management_page_uri( $args = [] ) { + + global $opalestate_options; + + $uri = isset( $opalestate_options['user_management_page'] ) ? get_permalink( absint( $opalestate_options['user_management_page'] ) ) : get_bloginfo( 'url' ); + + if ( ! empty( $args ) ) { + // Check for backward compatibility + if ( is_string( $args ) ) { + $args = str_replace( '?', '', $args ); + } + $args = wp_parse_args( $args ); + $uri = add_query_arg( $args, $uri ); + } + + return apply_filters( 'opalestate_user_management_page_uri', $uri ); +} + +function opalestate_get_current_url( $args = [] ) { + global $wp; + if( isset($_GET['tab']) && $_GET['tab'] ) { + $args['tab'] = $_GET['tab']; + } + $current_url = home_url( add_query_arg( $args, $wp->request ) ); + return $current_url; +} + + +function opalestate_get_user_tab_uri( $tab ) { + $args['tab'] = $tab ; + return opalestate_get_current_url( $args ); +} + + + +function opalestate_management_show_content_page_tab() { + + $tab = isset($_GET['tab']) && $_GET['tab'] ? sanitize_text_field( $_GET['tab'] ): 'dashboard'; + + $fnc = 'opalestate_user_content_'.$tab.'_page'; + + $content = apply_filters( $fnc, '' ); + + if( $content ) { + echo $content; + } else { + if( function_exists( $fnc ) ) { + $fnc(); + } else { + opalestate_user_content_dashboard_page(); + } + } +} + +function opalestate_user_savedsearch_page( $args = [] ) { + + $uri = get_permalink( opalestate_get_option( 'saved_link_page', '/' ) ); + + if ( ! empty( $args ) ) { + // Check for backward compatibility + if ( is_string( $args ) ) { + $args = str_replace( '?', '', $args ); + } + $args = wp_parse_args( $args ); + $uri = add_query_arg( $args, $uri ); + } + + return $uri; +} + + +function opalestate_my_account_page( $id = false, $args = array() ) { + + $page = get_permalink( opalestate_get_option( 'user_myaccount_page', '/' ) ); + if ( $id ) { + $edit_page_id = opalestate_get_option( 'user_myaccount_page' ); + $page = $edit_page_id ? get_permalink( $edit_page_id ) : $page; + $page = add_query_arg( 'id', $id, $page ); + } + if( $args ){ + foreach( $args as $key => $value ) { + $page = add_query_arg( $key, $value, $page ); + } + } + return $page; +} + +function opalestate_submssion_page( $id = false, $args = array() ) { + + + $page = get_permalink( opalestate_get_option( 'submission_page', '/' ) ); + if ( $id ) { + $edit_page_id = opalestate_get_option( 'submission_edit_page' ); + $page = $edit_page_id ? get_permalink( $edit_page_id ) : $page; + $page = add_query_arg( 'id', $id, $page ); + } + if( $args ){ + foreach( $args as $key => $value ) { + $page = add_query_arg( $key, $value, $page ); + } + } + return $page; +} + +function opalestate_management_user_menu() { +} + + +function opalestate_management_user_menu_tabs() { + + global $opalestate_options; + $menu = []; + + $menu['dashboard'] = [ + 'icon' => 'fa fa-user', + 'link' => 'dashboard', + 'title' => esc_html__( 'Dashboard', 'opalestate-pro' ), + 'id' => isset( $opalestate_options['profile_page'] ) ? $opalestate_options['profile_page'] : 0, + ]; + + $menu['profile'] = [ + 'icon' => 'fa fa-user', + 'link' => 'profile', + 'title' => esc_html__( 'Personal Information', 'opalestate-pro' ), + 'id' => isset( $opalestate_options['profile_page'] ) ? $opalestate_options['profile_page'] : 0, + ]; + + $menu['favorite'] = [ + 'icon' => 'fa fa-heart', + 'link' => 'favorite', + 'title' => esc_html__( 'Favorite', 'opalestate-pro' ), + 'id' => isset( $opalestate_options['favorite_page'] ) ? $opalestate_options['favorite_page'] : 0, + ]; + + $menu['reviews'] = [ + 'icon' => 'fa fa-star', + 'link' => 'reviews', + 'title' => esc_html__( 'Reviews', 'opalestate-pro' ), + 'id' => isset( $opalestate_options['reviews_page'] ) ? $opalestate_options['reviews_page'] : 0, + ]; + + $menu['reviews'] = [ + 'icon' => 'fa fa-star', + 'link' => 'reviews', + 'title' => esc_html__( 'Reviews', 'opalestate-pro' ), + 'id' => isset( $opalestate_options['reviews_page'] ) ? $opalestate_options['reviews_page'] : 0, + ]; + + if( opalestate_get_option('message_log') ) { + $menu['messages'] = [ + 'icon' => 'fa fa-envelope', + 'link' => 'messages', + 'title' => esc_html__( 'Messages', 'opalestate-pro' ), + 'id' => isset( $opalestate_options['reviews_page'] ) ? $opalestate_options['reviews_page'] : 0, + ]; + } + + $menu['submission'] = [ + 'icon' => 'fa fa-upload', + 'link' => 'submission', + 'title' => esc_html__( 'Submit Property', 'opalestate-pro' ), + 'id' => isset( $opalestate_options['submission_page'] ) ? $opalestate_options['submission_page'] : 0, + ]; + + $menu['myproperties'] = [ + 'icon' => 'fa fa-building', + 'link' => 'submission_list', + 'title' => esc_html__( 'My Properties', 'opalestate-pro' ), + 'id' => isset( $opalestate_options['submission_list_page'] ) ? $opalestate_options['submission_list_page'] : 0, + ]; + + $menu = apply_filters( 'opalestate_management_user_menu', $menu ); + + $output = '

            '; + + echo $output; +} + +function opalestate_user_content_dashboard_page(){ + echo opalestate_load_template_path( 'user/dashboard' ); +} + +if ( ! function_exists( 'opalestate_create_user' ) ) { + /** + * create new wp user + */ + function opalestate_create_user( $credentials = [] ) { + $cred = wp_parse_args( $credentials, [ + 'user_login' => '', + 'user_email' => '', + 'user_pass' => '', + 'first_name' => '', + 'last_name' => '', + ] ); + + /* sanitize user email */ + $user_email = sanitize_email( $cred['user_email'] ); + if ( email_exists( $user_email ) ) { + return new WP_Error( 'email-exists', esc_html__( 'An account is already registered with your email address. Please login.', 'opalestate-pro' ) ); + } + + $username = sanitize_user( $cred['user_login'] ); + if ( ! $username || ! validate_username( $username ) ) { + return new WP_Error( 'username-invalid', esc_html__( 'Please enter a valid account username.', 'opalestate-pro' ) ); + } + /* if username exists */ + if ( username_exists( $username ) ) { + return new WP_Error( 'username-exists', esc_html__( 'Username is already exists.', 'opalestate-pro' ) ); + } + + /* password empty */ + if ( ! $cred['user_pass'] ) { + return new WP_Error( 'password-empty', esc_html__( 'Password is requried.', 'opalestate-pro' ) ); + } else { + $password = $cred['user_pass']; + } + + $user_data = apply_filters( 'opalestate_create_user_data', [ + 'user_login' => $username, + 'user_pass' => $password, + 'user_email' => $user_email, + ] ); + + /* insert new wp user */ + $user_id = wp_insert_user( $user_data ); + if ( is_wp_error( $user_id ) ) { + return new WP_Error( 'user-create-failed', $user_id->get_error_message() ); + } + + /* allow hook like insert user meta. create new post type agent in opalmembership */ + do_action( 'opalmembership_create_new_user_successfully', $user_id, $user_data, $cred ); + + return $user_id; + } +} + +?> \ No newline at end of file diff --git a/inc/vendors/.DS_Store b/inc/vendors/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..077103fc4048244ee4b181dd632018ac3f8df22f GIT binary patch literal 8196 zcmeHMPfQ$D82`Qn+L7qb^RobRo7FviJ2+QAsZfAE!m^eGL?#wPw zMDb5=O{<9)Yt%%0(R$K&G4*VXUW_DG4_=IV@Z!~j(eKThB?U^27q#iU>9Wc&i z&;|$u2y91yJwBC?fh?qO_BC7l5-8)awhe>Loy{- zIkflTjBSnPb!MN+*k&PXIVrh1qneq5sk-_}(@YxYbZ6Stmt596qdFPg z(hO_<3_)kP#?ywL7ppNUj$3M0Uzhh)?X9a$D{lvH^)18N2JrF0Un~WV+iIzr>|1WZ~-pDC3q9Az=!Y=T!YWyI(!LV z!PoFT{0Kk6&+rTU27kbx2#6?Q9oD0Q_u_qcKek{S9>H$x#TXvLK|F;+IE*7WjWall zbEsh!Ewph7U&NR26+Dlx<6HPPzJu@M2lz2w$41F>E%QtgMEZ7#7HbBnYAlNq7hfl0Xtb!|u)iQ|`{jo!JD$ zXcYb9q2iC=TRuem5z8u{KYj>4K73H6Sn7wCTBRTQsa3vich9aNkFqSKu&9};ncIE) zc2D=6bNh7n006Gc8I1rD0MO_blFy{a1eYim_qeOb(};RV^&v6j3?x#S1m)iuXYDI| z5BMJNJ>Yx5_kiz#|APmJv&E&&P||<;9`HTjd!XO}F+W7;7Bc3^5hdl+K@YhFAX!Xm zc~P2+1j&deW1bvQl1k`8Rh6Wwiry9jRdv!wJiC}DN0e060lm!!dT&N=hl29$)P6*o z1ICo}pS}lt4~+MK*t-`)64H=>rqTQN#6Ze&+=hlvuxLv0)M?W-P1p2U`mJ5NGecc& z+|4;FF2YP@l-OGio52DRI1Cm({y@WbB`-hTb)eSZI_1qoaY>K zlSy{gpxHszPOnAH2{VrDB|kO=^OR^hS*v zY;!7}FjGpkSZ~$%I@U9&yrz_;`cjScCNt?Yb=pz7<-r>?enz`Zyn21yaW@Q@w&}H7 z6>QhEK2fs5FsMt_v8ei}a+s_-*5G|(4Ju$EQPUdO4kir1emDS!;4mD62$sR&2xTuoG9|8eEGT zuowGq8*WDf(`aJ`_u##FAKs4-;3N1rK7mi-349)3!dLKB)vuyF7T0?H^aQ>|i9)au z7QMr=qP~f+81CrQS6>_~o|`E!FuU~fvN=~&*UoQfS$ad^^Nsmp=b>sekR);xG$ds5 zkWf%1m{x=;_3&l_leuRsyz{W<(*?M-v%-3ABpl`fGTPaS@?b!(2{T40mYHx(xL(tE zku;1h2NMXX*XXA;2m9l?G6e79<<$(%~2%+m+k?Yl%1AHX@HiO=B+qKO~jSNL7h z1j9L!CL%--wOB_H+(ZN+Vs{zE?v1z}Z^E0gN5*Y}A~%IO9K<0Up@`j2G;stUlQi)h z(ZnfyU4d@Wh<$SsFy^UZ(?nnl5g2PP3K-90in?fH>#|tk3;vf(!NPe?7|RukK{P=W ze7aPq4@=_U<*SHVwuCIsIq3(B33kfs?4$_Y^hlC z@M2ZEoDme)F+NScW<@0t(0N=@K;5L6dm5gHR|#()!6$^Wui$&a+0V2TnTA|qEQFQB z6IT<;>LpLK5Kk;2tO=y41<5TQPxRmpk0*B0l0@-D4)6AO;(k2nvBbl8Yz*R7t9<^6 z$0tHuI@8f%C&`u8x(|iTt_6*#3yK_6XfO=oXi-8&OhLp@%RLdU+gA8F3t6 y=jrmtHKIJ`=|+^4)k!a_la$p-s?+=n_A|iW|4*>x_4ogy4nszr6knSA|33jn4Eo{# literal 0 HcmV?d00001 diff --git a/inc/vendors/cmb2-plugins/CMB2-Switch-Button/README.md b/inc/vendors/cmb2-plugins/CMB2-Switch-Button/README.md new file mode 100755 index 00000000..ebb9756c --- /dev/null +++ b/inc/vendors/cmb2-plugins/CMB2-Switch-Button/README.md @@ -0,0 +1,52 @@ +# CMB2 Switch Button Field Type +Custom Switch Button field type for CMB2 Metabox for WordPress. + +## Installation +You can install it as a plugin, or include the main file into your theme or plugin folder. + +## Usage: + +```php +add_action( 'cmb2_admin_init', 'create_your_metabox' ); +if(!function_exists('create_your_metabox')){ + function create_your_metabox(){ + $prefix = '_slug_'; + + $cmb2_metabox = new_cmb2_box( array( + 'id' => $prefix . 'test_metabox', + 'title' => esc_html__( 'Test Metabox', 'tmv' ), + 'object_types' => array( 'page'), // Post type + 'priority' => 'high', + 'context' => 'normal', + ) ); + + $cmb2_metabox->add_field( array( + 'name' => esc_html__( 'Dynamically Load', 'text-domain' ), + 'id' => $prefix . 'metabox_id', + 'desc' => esc_html__('','text-domain'), + 'type' => 'switch', + 'default' => 'on' //If it's checked by default + ) ); + } +} +``` + +* The usage in the template as same as CMB2 checkbox field type: + +```php +$test_meta = get_post_meta($post->ID, '_slug_metabox_id', true); + +if($test_meta){ + //Do something when it's checked; +} +``` + + +## Screenshot: + + + +## Follow us: +- Website: https://www.themevan.com +- Facebook: https://facebook.com/ThemeVan +- Twitter: https://twitter.com/ThemeVan diff --git a/inc/vendors/cmb2-plugins/CMB2-Switch-Button/cmb2-switch-button.php b/inc/vendors/cmb2-plugins/CMB2-Switch-Button/cmb2-switch-button.php new file mode 100755 index 00000000..d327b7f6 --- /dev/null +++ b/inc/vendors/cmb2-plugins/CMB2-Switch-Button/cmb2-switch-button.php @@ -0,0 +1,105 @@ +_name(); + + $args = array( + 'type' => 'checkbox', + 'id' => $field_name, + 'name' => $field_name, + 'desc' => '', + 'value' => 'on', + ); + if( $escaped_value == 'on' || $escaped_value == 1 ){ + $args['checked'] = 'checked'; + } + + echo ''; + $field_type_object->_desc( true, true ); + } + + public function admin_head() { + ?> + + X zh=_HLYAMJl@No0+{_PEzVd>%F0we+e zT-|)U{#HN?42>X|O8^i6?cX0uYi|!}4Gool#{9pJ|MU3w%YU7J%L3Owef`gM|J!eP zHn!f@000`JT;m*f4;GYQsWZgXiy&UZwd?38s+(HoPzqzx8D7slc|6BLZMfk@90DRN@ zS8~xPrv5wTUIG9J-vI#VDgPa_$_4=5#sC0RYyTaC76Sl;kpMvFptY};-@m&1n-#Qs z0N~#V%KBI6pX>bZ^3U=ALH|38|FQ`J0Oc!xZ{Jq{fXXxgkedepu-N?_$OHh;!2cT; z0ifOgy?g#^`>(FO?f7{ACDHI?{^oTHh5E(<0AQvA0KZdEs9$9$)bH}Y6WRa(`rH7V z|2Y5ou>im*h$h>NO_9T!Mwhb>9-NMQYpbJ8SNjqX~oQBg2g_$W0P zHLceBOh02pOBbj zOhO!!oROK8os;`IHLtL!xTLg9lq9{px~BF`U427iQ*%peTYE?6+pc%r?|XVbeC+EV z7#tcN866v+n4FrP`7}E>zp%Kpyt2Bs{&{0_>&y1e?%w{v;nDHQ>Dl?k<=3n0n{T&w z_un6W{QUL!`wt3$jzb4;F6ocJBIPg{Yc3s(A!1T0fVY$l$5Zh+ZH%>)k0wK8O7+Z=1|N zrZQqZQR!;l8AOskGYjro{8ARiAnqacuJvFthtGLy>fN^kOhO2p_s+oHW;TPi#%#K~ z<7}nbda|f@o!4P5O({PK66oc$-WP%UbZcGOp})d+Gy%HCdwn!p-X=&O?c;U8sVva+ zm>2f_D_%wX(=R1A7iX)QN)Au*`F?!grQcU8F6?zaT_To!!2kHt19Q1l!5n_S8S~kp zihHye6^gf|uo;Y=Muz6pw1c^WQ>oHr5rOxb#Uhd#wo4nDK`&&4$0#~#8Pj2kWu-uq zrEg}tBw~l|p4~8J5di3ZD3ecD_0M+@-L5H1`Wm&;=lS#xl_n?>%W#iiDiH|{R-!p7 zPbX{8r}I@U8_UnszsI!5G2xX{@GLE5KlHP;S}V_YWCYoI$^kWPGdzx zT@;y*KZP<{oSidAxc_{1(m=_scZl+Ue1aj;Lwj zXo-8#lJipw`Dm(PT*QZSxA(}suyqjE_|<@>X5KD`?Vb#lcv}?q*pwh9PSiD0b!T^c(Ivg zH)*QAE=f4viEsU}mj?aiuM5IWNnN_1f`T|GoeEKE(B+o8_RuV!L%N>@$PamVBznY$00`CZnWAk>l z@~*p?o)T>iiK%ZySSo*1%dDZteiE>(p8aKS-T1kIZ%Lv-$iv~L=?Ce;Z_CEtiv&Vl z4kLS;W~sx*)kA;hDlXYeX^Z_%d=r|WSOTOR>+7GLK@cUBfLP)EI7V0DR8u7wLSy{| zL01tFyizO$_y9@XRV15ADUSZw07dsz6n8=?o;`e!W}S$HgMC|=QJVFJ87fjUseWeF zm(TDT$~*UK z9}Owsn6Ls`YzvVfM-)1A90854Aj5+|sjw--cqFyr8?Q*Pk%?eO9NV1z9{zkkAhY$^GPr~N0O?<2MxYN1%r>lhmIj!+bj zq<{s>hHhL~iSk?_?VK*rLPjy18JiGEk(rqcqH5u*P;xX zF5fv!kOP-J-ph(O-Vpf`6db)oZ_`P+zb$81EwfItD~l48O52}OjgF2}ZD71AVb7U$ zH6i<0Z$%cX-CFGzu0Q90+E%LCYeh#{(o+7@Iz5=K(qhywnwO<5gPWd}EK)(6=e4^c z8+Zyy4afdwun6zmrtFiLdg)P`m<0VTY_UX4<{`Ax9}|h73{Ldki#d>%W)H&|Hwv( zom^AH zbxYBBU*YH{3&e-_q0Nhgaf8zPxm5efnG+BjYBO$`_*KYpgGo{yg_N48uk=GKYM`!w zG&4@JBq}k*&HF@&2%l>-0>JbIP#Ep`YaVRS#<1{*oUGVEqR48b#fY6^0(UPH6wJO$ z)0Q-BU&)j50}Jx{f;GEzA&FjWEnG^iCH|EUj|iy{@_8p&Vh^3HA1y#pj>IdyP-T1b?o~gNtU$bJp$C=eMxwSEN&G6l zJxcKt^?27_i=0Bg4M65yF(m>Ge7>E3iIdhZR)ji-NFB9KQb!r67W;R#4-D3k zM6OBm0JBk*h7pDPYAr{7yTsejLRPmZengVavk@zy%>nbP1Kac!uE#-u7)F>6+)_Hn z;JBX_GsSBK#N5X3?2Z-AabSnK;%7lJ$z@i-7jIupMX@Kc7|;vy6llLjGFfy9C<-5I z;$H={@H2GZ$iJpA4WdwZMgi}avk&nFsvt3~N1&Q;dSZEu5A9)WLN<)73K?AnW&wnG zASBByJoeUKW>k?7O%qUX@b_2BtZ?gQ00}d-NtJGR zX38)|I4B#AMe_2RFFru-wS6XFo|%u!K%ja#x~*KXZ85p(z)u*-eul+Dp&LE>5Z_U* zWoKbBxT5T)l_=Mhgt~%aq-0B$@>@QpF+^TzeB||c8^iAqO?U){H!k^n&QfW>2wbZO zb`ex=j?CyEq45g9$U4e+)#36bLKyudNQfy=$}dG_S#3E$D=pKUyD~&l$Ax6v^cBBN z5}HMXuwI&{FpDD+>#ZUjBh88%iHI>^uF_f^4h3{PC1Fz~)R%w3ta5g(R4SlxYLkxR zs5B3@HH?h=4Rf1~W0ZGf8AK$9Q-732)W+wPsBruy?ALO>c#jXRr2clf0 z!p@!@~GGq%2tJS(NwWvf8w# zmeYN~m?rpXaQ1~q!cqMQ!F5}3t6dpAXSgxjxO@U1WrefG`iDmKPiBXuyu!obAf@7s$O;=uQRc#KG&wZt=HCNO6fNfIP z)sSdOhO z$^>j#dsM%>E`PNsBAHQd?Ng9y11R!Sp2`B|WkV>3^M2(;Oek17fP4fD;*b%*U4FG_ z54Bf0T6PAZeAMaP(P=h8WfW8)EvvO2jwW=@8mdum2H08yo(X6)RT2PPBh$Tcg&OscRWMHFrO#oYUv61evSQwichl zqiyVA&cUv$g)?%BG8LJ6PTAxNud+G>0Oat5rBW>8PVHKEzsZoXH%g9jHCb48Jx2iY zno$1?Eh_*xPdRJ;AuT0RK31o&VBrmpMqF@okv+N1(Hm!VHXgp7Uq0?-W@Hob*6*zAeV5G(a|~st_QC#q+c$nre{lT^-^N#^ z6is$Qbvl)>eBUz1cu@sPYM(Ii{*2d$`}8OcQk($DsXG>PweDl~kC7e2%EtD-o5LUHYR!Y*2eKKs@GB%r{A5j@80;JB<0z>~)WxEMN4PumSgu({ ztY|20`@;e)bHKg(?Vh}oA@8DcX5oD|>FEQ)Og)RqJ)>bQY<$`}YJ4Ubs4nMNUu8Mj zm5_0**TMH5bS@KY`ZmcNQM{d?+Dr)OyQgqW-VdF6T|oz`ak}d|fRvoarf%eja!oRx z9m^qL)wh7?Ck&ydWQOVbEUKI@C;yA(iwR-Hh_Mm6@thi6Pf~AIFZOqgRpv4Ha1 z-$xyWgZuJ8HZ5JiPj{obhZ#X89#5*v7Zj2Xh`R&5P`Fh%8m*aAk14u)1KXNEu=wi}MJ;AmBB(f(2j!gn~QW!M_+NW%W4)vf#yHDZ<0^6U%zr9C1gSon|Bwi^yX=n7`A4J-ExN*T2 zL7!Cw0~B0apNyY=G_5k+>dbNQowN5*-lbU98CCkWt@9a%sS8HO35UsPSsa}(=kum^ zO|bSnd|3X~ll#NQZ_xMa5r0M%&4Q4rik)_dKr9iEIpTM1tEuK;KDuO zuL}97Rpzyw(nWYCHnul6Z~A0uI^npwx-dD(@AR4_5|U<_DyUdJAFS{-#&D{1M4)Ys z2JEdmA(?*iH-&&o5mQ*en}c{f(GW(k|G=L1jFY~GFHIMvCT5!IQTh(dUY8faH1N$J z5U!P%zjeo-Xgl^r<*wtryOWDRkl@~;Li)=eS97dNKQWv=C(4}yrF_>+Oc}H2Pa!S8 z$lwLk+qbvcGgfcpp6h6*>}$RT8$9{4Y6B7}+N1xlO~s32d(mWBrjk6lyD*An@q`@E zcHj*G3qBVtMI7p3e9_CaRkJ5{Es|Y>WN3}dmMk3INgb2gh?Vs3$yXi<-OBou949_G zNs~OuFgwY5eUejjlK0`HVC$sl&q+xmLG&fK{K;vJ#wp4Ka0D5k&72hpn9(fASI4^p z>t1fo3t*-E!8{{&`bxuAI3JPN%o@=9>?OKR0s;SV$l+f2A~o3Q?|;IWK{@uzTNoHQuv9I} z2wmQ%#aFtsPFs^1v1S`F*%$gHH@f`PKnIfzGcMHmL~ZcWUf#34T=IZS6CGb$wx1bI zjJyW;(Ja^kPt%FJY5o|L=QOpx)^R#((X`oJ324WSs6^h7JSNE{1zII&glF4R?VvZbE#HKei?f(lH?A z&R=zU(PhR>T;3)8CW$EaGWB$mCZ(iVG)!0n88MEWl7=TDBSj)h3~YTUyBz@2>BvE0 zs)JKR3js5}@>GU|7isxM3+%{DkY8Sdg0&x=pX87-=iYoyrd3RFSaRF;Eot zkr>l$pg_a^(aY64G;l33_4uP_8fREid|Sps37gc45t;!th7Fb&+;4~Z=`9Escj;Z2 z*lqEELWMR&{{9slOvQG*tQQ)qc#-i*Q}OKUx9`7D=y+@%kpA%If|AJ$wYXd=J{^8i zN`;sRYOG+kp#>?pxC;Ms4y0_1TpCL3UYJ}9i^sG;lDtrwQOLF!6toLuMjJ#d4l(pJ z!l+_-tg+p>2P!mH>p=v3#BjPA2H#11=;yAElCId@${7EmRQ7ac$03#bHxNAPQ?x{| z&2FlP#X;?m{s0HZY@74qurW8s2Zji{4281Feevlt)gd4VFIn=ZLwT5~Be90T0R|3k zNj_}7pDLAybd2Zk`VE|@gL7)p%^VWBteKAE8AC(DTk}fj>(+-*^z%se@gC)AwGUT1 z1O2rl0u)_F>FXFGdT$g(I@DxYs9!$ISt%uMP0gxgh0_(cm&afqYI6u(*L2M+l86?b z2z2s=MX+bb)I})j;HB`4Dx*G$TcNX!TUzy@y)1bkp&35ltLRdFwOuD z+CEc(%dpUX=u^^E5b!XezD^jBlC5L&Kt#*ehG)~PxmcE)s|%3EkbWY!w_>5B5sm{I zUU0`b7B;7i#t81Rsj@<)ftWm7<6cV9fg(}B*B-U)2I2w^$5Isdvlivi&+F3$tPOKO zm_gGOyfMsu*K5_qq4$O(K93jDOu*JI9cv4!B)(XO4G@nEKHE=EsDpk=yLGw_%)Z9@ zH~5Yu)b?0$fOhVhkHTQQ(ykBI#OxPgF3{nttSW)WXb>;S%ada*f9+KuG>Tj)4x=^_ z2HWpK(@GOauYhm^R2&h8Qq3f@6}^Z|0n?Z!-YQ$UY>Z$Ul~{$mY&j(S!UvEkt+S}_ z70jg(ZLrYmH>`{`6*n8+w^F&9A@ zwDP65ms@TWkMKEFG!Ri%&^qxfw49#6@*Su!6jT=$Kbd6bpx#(lunG?t-&z_>3NKo% zjjhzM@C3zp5 zH{SXu6F51_RNN!Y`1v^=y)xSkiI>bn9mC8<59=}>e8j4jhZhSN_Mk*K-Pw?1#jCjh zJ4k>2;?s7(0W8q3_$yK5Stz5;M{a+i{qu*kw6%855s-jAbMoCBBa!C{U4CgQY;_xce4UO(3H@1AIl#J{MZm zN8<7vFk=mf&5?9ci(B@kiYF|x+I`T5lAc_%>MIjiKdz>zsPdXFIpaJ}V0b3i8XFdb zn%J{y^&^}!k@L4*u!WRFj91>366Rb}J*U$P@11IKVHL*j_ONW4V~d22W5uB#b&_fg zkpLr4jyO<9U0-i8!Om7JEGiRJuMY=FF|nw58al+hq))I|Q`D`CsHZs)FP=VU(9$o? zou*?02JdEd;rS~3Q?Fr$zcbFhd$I~yGi!PZA53>I!p`s`MwhOMWC=WDpX@m zRV2z5zP!iTUd0!!;af>{tiqMiH8=guZ=pu-cmmH;I%Z-ZOy;;N#e=~zd_4!Fm|6Tl zdHp(r5Jx@;QZT4Z+zdH`^flp_aZ3Ym@$<{hUPqeR+ zPk-B0$zIEbmBV>!pa1FN((m>ifMY!K9YbIw7am1>kjp!g6$zQ@_Fudr^%TT^Oy=oc z4-}Y*0A5a&(le;_Z#p!854DCB690PK-0|HJm!J6Rv9%tfAaE9ubPVI!K+(QH=j*q` zw&SjR)V;(=k$+oKDwie~D90+TB3^Kq8t{&do5Cr`VR)#Vjd5GTv0iiH5_7ViSb%`&rU)Yq&E!=$OA9aSW~%&FHwT_29Ky`TDndBgz5Ybhz5tX7K*J-17=}F_aA6gz4xcTZ zR+@xo;uLAQv($MSPzb&eR=m#G)RL-jYKJjyWAl^BO7S$xp({s-@8@9b#9KsmnC-J; zVp)bg9M5m`bJ;&y+p?qO~4kqELsz*CpyCPH4#&D z6(pmv^K?XIT&{IRkW|v#ENHK5v=018G-m=Xd00NN88d7on_Con5nu2<1Bq1sET2WZw#k~tx+c3ZAl!TSEIB=&z}rBw`UQ) zoqOtI&*}bf+4bTulp1uv$J^^8jIK=ATYKlkrQE@J69LX@H;IXvY~M-NSQnC?j( z(I|vSR$viVRUGyTxfJx+CyxBIuvApLO0))fDqf+TNN-ey+yn(s78FFZc*>By+d`_) zoW8R#m)0v`9*!aka}`JbYB0+anL#(yms*juxrEn#Qb@V2`txF_ZCDD2&YZ<1p}BUT zl^YgnF#K)0AG{oGRZ+rMidCKiFjB+`<=2d?0fP>tBcseE$$R7GK>0JTlQE<4nREe!3$ohTC@23iJ# z#WJ*^TdK}<`K;m=&(c)(Y$Akb3;)2agoKB&==vxIqEU`?W^z%A(iT)Du^}PD>1+jj zTroxXgqzq5_$1*@1uMWMRZbm+NaFYh;sS!^QUUr{}gd+Q8aF(~3oDJMwXIKlJl5-|-E zeNo#69-C8({uz2O&uom&V`YOOux2$QHdE(`&+gh3g{Fxd{na*>0ZEn%lM-(V^+Qse zr8M6=eWU4p=WybTnsGZlvWGkB3nUrC{)P#a=A&60$;Ap-h@7sA_;ay_UJD^XcE<1AdOOye!U&TX^dM2#e zK_xS2X_Ho(O0{2xeQnr%ddz)?wL1ru=5}efiC@hv{E0CDUTVQi!D;VvkLG8`8ZvJm zQWf9JmU_95;bL`soukF<<`9EZ@aoz=MDVCs&cVG;SHmFT$pGe4kenCAkRzm8swDL_ zFgu2Ywett-0K-V&6aw;lB!)%ZQZVPl*t*s)}6XHoElG08*iMN zex5b~ottsann|2nXwF&~om)B1T6vw@M9q>Kemv{EAtPXeAv3uZ6>O5oJ1Y5sdH^0?W>s+ibrCAO^g- zmVDV)nRWtMbS{A|K!>!QPxdlDM0JCA3GfVFYMc)WuJ$SEOkR^`iGpVi&TzFj{p+U~ zg-hKzU3~M7<0bHm+1Sd`j)$Gntki+i#89g_FGAo9-5}BQ(iGuk2YICF;Zm3G6fkOd~Na@IkusIo@n<@^) zbHZV2kw9wM&T}dWt|I=5h(jWU#zW^&<7aYjopBslDhhuilG=qWWkORX7yW+u96)>4B8CDaz_{|sN}Us8o;aOY!IYUU0?b z^kHbYn{j|GjeRdQ^$Ili%ryM^2{WpWdLHlwPIAE%uzEf8POk zm|aEkzTnXriM1k{68=MP^Sy--}%kigO;>Xp-yn#$j#IgWx8R*&Rr4kp4NtjoMB&cW+_*bS-Wvo z#yKzymuu9D&4KQ{g0D<0$~WR;ZIqN;a_k0RP`Y%gBBjC$mv3_p@TEEJcq(kBg?#Z^ z3zojSX}89Js-3A_puVj*;oKsvV%=CeYWEp>;V@5h{*|392I?Ur>v$pU117QKMz<;( z+^PyX!MB-NBZHE_=uK_OT(ZJrMo6G^yfU)Qp1;zhJ_mf}iDR@nO`|t(t+h<;bbT)6 zNiZ$|AzR%KiB-FGtqJZ=;PHVIK*D&mE>H=#(CFRD6bTR4f=4es7bPqC+c6Y8Tsh z$@G;|hqO|jxQ{Ss`lxCXjK0`d`AkpLmGh;cD{NK=n>A!eY%lRo+2ugL>VU=D0mNH6K~?7@n8PDDRO$$4Tqb zL8W>%6+yJa#_e;xh9-eCFdBWpBDo;bv35yOjNTtM!K-v*8a6C}CJ~)akfVZGyF}os z<%A~_Ocy7BME_C?&jy<+n~%S^8b+8XJx|RjYc{HB#w5WSs~}obqf7GGPZi*o-PIZr zM<1x@I~VviIN>{cFg*trjS2QZ%_Kn%|qDcuA5^YTJFT(SXI%|#XFWC|+f5HOZ zW4=c+-8SdcgYhhkF&YA%N7szZZ9yrbFrcJku|kCHa`NT)^2s9c&{b|T{K=B`l}|%6 zoXI7^_Ia$Xg?_Wfs;!I%`wI3UqvweOyaZGSeH!?2Gr1P-Df9{h7A9z%I$UF@XeHLK z*iQghJS#ckcKRl=NoT^+-gk@=m<*F&p7f|^+bYn7-j~hdT;Dd)&W(MZj`F^W*@oaQ z?(n{>U9{}gWDv#x%YL1cN~Rvly|ei=a6HEBr`w50dAx&4&qS8kIy<`IqDyC1n@0R}>0S*q(%V z-U8YkuMF;c;B^Vz7z6Q*C%~bc`{SwPW>{>&Xb^7GuMeM0-@!kzr#YQ1ov3StW9tFLJBQW$!zuG+^r<$Rdh4i?OGoQxU391{Cwd%CfhWnu7N) zaF$@f`uLkB@|7}AXYTowO*fjcOnTx*XPrPW48oN-Eq#Q_;eTjhu z*IHy72ga(V@$ddpyMam^-i#4@E4AUVGgGCQ0{cDWUZ;-%Q#GU<5~Btx40I?>C{i_5 z*>Y7&=M~gGL5b=pB*M8%>}m3=E%qTe4jID(wz}0U*#ey`H{2P69^Z(<644|X13lXHBxLLWei~j&$xfnqxm|O#FoNtX+vXN%vmR)^-Gb?sfXMSwxa2|SvNAD= zP|zQ$7NBCB;EKFf(JzbU?CPzu+iw2~Gn}=5BVL5~45@Q*I#;j85 z3Rwqn^6+|`ZQ%d9vP2n5|sVl|aUrE5TZ!U#Pz?aacF560scXpzGQBboWN z3BR_Ow7f_c$zh+Cs%7P=G9!FqO#(dRYFGy~beB+?QA2ul!$(U>f+o^K5+R(;AiReT zB5Z3sNlOI97$h4*UNIv^3w^0%5Ld2VpgIYNSwKWaYfQ&VMQO|>PmNn^`EBK;a5M$> z(@ag-0c>}hPE}DQL$on_h9nA1ZkB`HIk6TZEQS=Bi~t+6>x>l*?IbizyBw<|Y`a7X zO+Q-37s3@QAm3g@B03>bD2c&Ph1dc&ZBb(Y?QRB9=7mI^1B;t|8Jj=29({ln#6EvF6%(@;37d5d zo_m_?rM6cUgqAYk`7i>?b0chq9+oucmX^~U77?(Qm`(l8m}h<9y^D=)fww!4H9OO@ zo$3T+ftJ;9VxvjFGMisUHUtrP_zgWQa7-ku&TQB))j@hu)WM5|if-SvD|Pl6&MV&3 zjY^kodl!y}FzJE_xz*InwwoII9T6~8gQ}pCKSs3z&p{0H?YDhtA7U!l0gJ&?nKjJK z&CL{=#G_ejGwhKM(Q+bukuB|_StytEdXe5nQ>QXuvRcpy;5Rgy>lRDmc4<+g!^*rp zNTQG#Id*5c!$QZ6FDOGNGcK{rNVI4u)v$NQ07FEBpakNdWb@Mbp=wfDc3vZzfx}YR zcj8=I_~H>fk59c!({9Lu!p3Tg$yKtz$b=YwF{E~=3nU5E-#l8|y?rHzynX-G|Z4}rw~ z=Y9#hKqDOuXdMCrSCI_`?zs0&dU>@Qs3#5t-ZD^;N-+=)HG_B`1n`d~N&^=ran%+r zB9m341u!B=8-~K7z0p*Oq`Wg|RA6}KKRAetV_`Ie%_C3)TulDB;*>s;r@dGs`aQFw z<|gt|;!yCj9qsM4M}{oS0Yxm%`LJqUjFuKWG!8RFYW2C-82C;N!#fCPHaK^jeaAW_ zhcll+F9SsJ@CNX$&BE0N+P;EBhcgpT1IFcJT*;h}7K1py5^{z-;@X6~ng@n&1o&9D zcR7d?k|}=H#FHGd&>*Br30Ho!c8nbd3IyT^@WSFcIPnvYwoOEet?0yIOqQARu^`q6 zN|rhS(^$b&R5*zXA^nKI98@(SS@}jSbNGHjio#` zGH(RR4NhU=OA05ottgGC#U^s%VvhoSg~f6-6G$;7WF3eyWFZ=(bX%Ku4~6$W3240F z7`l?#T)+A_+`m_AE2RVv15iAp8Z5p)T_<&z%nPAS*z}7wUC;s? zcuX|3^-v7>W$1Nlb*@aLnYeE(R51s*U{7d%e5#$3>#W<tXG>FMiyZZ)?gO;v)PM1%3*?Y%4}_hQH$;B*tJv0Dy>N zIl*T^a|v$kJEWG{4c4y!NI}*W9sgIiz<=E%6f8>;l-19{Wq%g zQQ=_MLqm>v`@c}7u18iDk=bwmg({g5*idH+I{%Kx%T75_g$mA-ro z6@k(G2USW~C9^0G|6id>qIUuRpi0=a|3Q_^T&dd~6f0E~Qp82>&cFOcmFzDdKG6Ah zwq9v2fnDE@W*uWF62${24|+q|?D~4eB96BQg=$>hci&~a@2K;WLbg48-=^P|{K6~o zYk8RASOHI3;t|y8RbyTdGr)PG@tb)7@YN&S9(xYD8#KYd9a8? zg~(e((RikrI%QDX$60gdtkNNgSlGTGp=Lg%kw2)zBSJF!v3C4{S_ak%ghclFDS}rI zrOC4)D~LE*KQig?3u(g%w>2K@;`Ct#>Pi?U%{vCd)w>#7r0DD1R1i$*$d7acwri{=fK-xWF3bxj z=NLcQEbgQvPjILC?4}Q7AWf0L|WObn1G&8f^bEL($l^dau{m zzE$<>bNBfZx##VNEbl6MaF*j|+deD3fAO*2@a(G;K!H}i0)(==>POpjaB1>^tX{bg z%04C!^&EVO8G%h4I}t--rfveDAL)3)*Mp3PdWGH! z*3AIuk1qp~2>J`Ag{oEBB|JOrt4E)8jkS+SzBIj!x~vi|A=JaXSg+7=?oBE_PyK#J zpl2T9xon5hu3B86_dl4kA|0SF^HeC<3L2(9^1-z{>a|}BspAux4{K7D-HC1z^w~A$ zWA%;WNb0hR2~bG7-OiBh_1+K(N!f3^E@>hu1*dqe)E z!`kasOn08k4Qbq;m*3@n8^z`AG#XudFul+ya1$fUU#U`lDUnsvyNdANGW@dTigZS) z#kBgnS3Mw(vU`7kU7ujPpT5eX?kMImkbJx?nd$v~N&FX8k`?skLRZ7AA z6%R)n?~m2#b!Qlp-c0ps&QFMi@>cwm|C&IG-v8JP*(gt$`|uXQN==MG^stqnW`%>n zi9jRVE=8v*0id|eu0bw8lP-5xioZ^clEI7+)b(SfrwP~bUA(dEWC#EW^ek+GYUm$S zDfgX)5-xIpI{qJ2Ny@-QOA0vQ0Q<%!oyf^MOhVF!fYQK$cn}*ZU2-&DN#2+yEK+P1 z|8C4H9<;zm%D=0fNKU2JxW5m&A>tA&5~ZSx;UAMZd|Hf@Umqt0 z-&e3o>Tb&gZ>4)k)bA0zyl+_-X?DU~Cw%$Eu!DV53umPr%1)g(6*>Va{warM8HB*# zmqU5S5ESln-}P5{^8yIpbM6W1TTEJ{S@5S~F=K<6-$Ph-|9# zR~iR%g39Pa&)0-`P_1@K2f#U6&g&>1x=>LsWiK`ur(N*enU)+EZDuhbHBC{OuE;&LOc@`O(#`rOd3X5ra>_llfjjD8)?7?W!Dt-A&L(0AIC zoHzb0QY6b!V>zY-dz$=dB0S9F(Zg2wBxqO=bpBLaG{s%2(a3^SKGJc83$L606*>^P z?D?)}qGsA>SNgz+llkieg<*9`S8mUqiGn+Y$`2+@bcS`xy}kFN8T$*&zp>QNUo8yp zgIF0^6_;fyk`ny84uJ&DTULRdlekz;p*AMN&-VJQGz4#yMQn;!iYT&E>QUS_ni~eB zLqea}0FBhldoXwqZjolwcMMwSg1{2Rl5_!pUM&IK1t|IZZn!9xfize z+*YP`leJXmUGnqWBW`6Fqr1pxor+BA;i{8#W6(f#JmP)g#ii$r8}NPbzG`OOrVM6w zLDf|wb?YiZEoT8QKU2z$9p=LLih}>O5)z%TeXwi`XBpJTnA&M@Nd9h@0{e z(dC|FP6Z^?#Iqj4X`d^@BpM9s&J5QFM4NwcH^TcB^~jQsz(}3ibCg!hXGN#u1uS7l zl9~Xer0ifIxjo&;=rOFdmbaCTW8Mw&emlxEJY<8g^SMrJGiw`U=o9K$`D>`2of32<=GE%UR~x4=p!WNRZr(aT4u)}(P zE%9qdv-iO3QQxaV2*Xwbc*d*<#Pnz+Qz7XBzE3qB^`m8>P}$CuFX^Duv0=TRGdsD~ zs5sKhuK+9#vj;;xvUS|hy_mc!xSd&)8r}lH&DKQ?f778Y*mL`AJGZx3zrGqrM_k0H#n@pH}zRH#wT_ffKla!W)4`LY9e z^^J4dVgiNGtog0@!X=L|L-y`rH`OAnWhRjo$Pb6^W6Y@|6d|9ZomTjx&)aE*MonWo z?CoyNB(&(ds^Hp3hJnkPc-wJQ4$7J>~Swrafv+aVNTC>M>jvU zI#u<%Oax_hI>!Lx-{@C360GR(RHX-dV8HVf{VY_ut5l4)db7j5x1Z*ON~|cREj(fT zAbp*UDMQ|E#3*q~9Fb7PFi+)hHNlv?ukHshN5wkNU?J!B&2cbt`vFFe#iE{Hv$Gy1 zG;#e((rEqfbwml_uBlmQS_1*>2CB(c?&2Ia$(;H4J$xO<-o__t+T)=sS!P9|Ubge< z3M-xxd&r>b{1?$C!PusjsEowb0(QH!dT`-ey-=)nOYUFUaia|5wc5j786)iJ3wdrY zyIhJR*xU?V@oS29M_?HF_H{ksLZwds4xKq2yh8RlgtCl1;1EBF^D0R=2oSv_0;nY=q{+#%TLM9J+Gs#G1GIUs% z$79S=sMQ#&W#g&ztT^G?d*_G8LZbr`DDCfSU#s}5`tR4Us$q7DsNAUL7Y;B4FNfKv z)!aB5JklB&1z2PbR>OTW&JW=py#c@L!hE^h{a5OND6pmND;~f4St>tud;N=>LOP-7 zE`)uos*M9Etv?EsrWThVA?&(jB`MUjni~oXC`(4Y9+z;v7*Do%C?JGHLSG=Fa~#!s$yVqUuR#A+&syK_yCi;5L!;THvMNHjAEdb3yAD$9+AK@@) z&n9TA$ApZO*Ygp8rl>NEL z6-(`C%}nn_0_d4iq#WcqjViV!WNtOqLK%ra&xGltk?z-OVTV0<@2`(=v_*qBh{Oy@ z1S7DKrkt9hF@|$pZx5EBiT+W_KdpsuqOIV_SB@g4zx_oeE6w1M>K8FYqg@4`ZJaXQ zk6A&nddS~(+TFJPktU7fyK33L#V1)g zRGXnDW9!eykJK%t)ZACqnI!50U)b^WCE07WJnky_ox$ytAzsTYx**GE1Na4={_2W- zy^6YZ_HrFs2I<(77TLKeGZg3&ozWeYrW?Bj^8w7T(!{7evs|SHAa48^DkP>oN#n4c zw7OfsH&rqYqmsQFtt)l@#94l*x*bb<;}?Tas`sKVM&wv|hn`hgU1;}G=Egxn5LK!F znU_b7EtE>Ha5_D#EBQ8A2KMz+xm?^+mK{D5a8r^tIbIf7TA!?vEIxWo}W$7*S zcBvoVrzCn_XRdEJUP`Bsy>&>eVMW>fv9(P#s=Y25Wn~cOms9iNC4tq3N=N!i?>$&W zoIPA3zinj9_{?^qU4M{#cf#8*rM%JhYlkV?ZKEE;{^3LIw(~~<=h6? z38aidiBI1b8l*SQW-S{X>%uQ@sF&=HwMP(4I;5yzBQ9*T$HQa{ zuz8z1cMOqv!B9%IBp@WI+uz}FuHI`}OiJzJyKknEY*iCCRoZp^2oo_)GtU}Qqey)- z<+YAHzx8fAwGLzG(gMNcr$qYiaMx0*{8zEFqg<5_*~PufIne$WC%*-q8%zX7qZlB* z*Vo3~(-u5`a~4g}HbhMWIBA{6*#E7wyxwbpsjGa66J`)?T;K8WzYSHzp6D4?a~c(F zx`g~h*9!4lgs-{0XkF9Q+0dJ2gySN+YpF_|+Sh;wfnVC_kUq?!`mYF< zgOabgMOW<9)0?BJ3^=Y`qnI@KRZ27!fEI*b2C#UEyID%ab^P+hrY9t-u5(Ap8u@}) zBa9{gkZ5(%)!-kzHK!bVR0X{pWK~x4(da%;pwiEab)d zFuyNZRE5siZ9IUbk2Lhi&BJERR&Og`PK@d^&Z<$nrVnPgzjx4}7Tv|{*yT7^eWAQN z@2W@r&od%&FMxKeDitBWwcfj_fY$6%cMT2m zkjg~`!G_a!nEmqSqNShGiGYVo(=DNV+8Tkvz;E#8l_R2rP`_$`O3XJ#M468nc4^e3 zEV`EQ`X?IiuI^ zd6s;c?pI%Wg?bqcB=WqJ7f2z=DLnVrR@n}G!q(raME7J z`w3-#S+5f|X^HmHFl^J+O~hR^N^x|iiE&B*uK7Y(5iZhGQvqI8+Ekh}9KyeTeExNk zWO_XOD~nmF!`Hy`P(S>~7N<__l!&18*wv8E!{EAz_m?c)?ERL0BNlk@5Hy=V{F#{_*Ao?Z@cykVfHYMIrOLAy_ULZsqWXV}Dz!jw z+>)}JxuX78s&t@|pQe^cCwC3n6__opq0+T}$@1{utx}XA+PnLfG$vjc?=7WR>MDJb zesrCl-=))ACl{?&+M}#KYVa+1m<_aQpweBePHn3op%N>h!Y(oa<)=8?H27~+37eP& zRx3~z`{LW|=o(h!M*>RVI%jUh@E`#|mQjan=n$9iF@<(=l{pPG_ufS5YJii?HMzv} zm!`NJ{{V6Gy>4x*!{iudF^78xuM zb6p(EEMu!+nbu+nLT+f=py#F0+DG?vzseR&wi=BCA84~Qi9dbdWqD|h8j-X{lail5 zUo1*C9KQP7rAada`QmvS=8qZELP|WBrzC|i$7rAy+zKNbQC$rLmqslgQ9;V0pQsWs zU-118w^!-gUKL$Nxp~B%W@g6KJxLI;Cca#!3<#^9Xpl(YY}nYOig9W2JO%%^8gYq9 zz^44w4~E9X@#M#85%-9n1-HJJQThY}_A1JcBM!R@Zqp#kC#qEIw}5*u4x(~C7HEM* z6VaH?<5^Wwu$AyZ_DSIi|sd<9h zZJ1RUwObT99YTBon#SkgS+O7Mh{5*XXliaE{eji9+<8`kZvAxLyDPR&V9XDYHK z)1wmc&%>MOg}{VdTqb&*^(y{H+HF#^IOp(IH@fUa`LU?p07rA8#y1D3y=DPy5 zmPDMCad=eMoSvqb{Aj|sw4rjTtEG?Fog?aaNx+?WTnUkOR?OaPjEeZCZ0!mQbI~dr z3_TdK5@S|L%FuXxfDS;#a1w>8nX6B4h-VwZNezBmXo(A0x|}*EubvP1mXAHOaA4F` zmXY|pvXnL(-{>%tGwsuo$Z(`vNNdd`M@8Y4_{Pq~xnD=})v1`b2o6?tb(UPLUy)kk zw8x*)G>i!_r*m_;j*K<1NxnTDz>KMFi}CXQgpF#JOwh<&my0JzIa$g$oy@E=J|^}Z zs4jeZK?fpGBK@jz_06-5S$tQvPO3#3qt*ANO{~%1jtA<9+B=;Xm;(>yc-nmoV@pJp z0?S6ulvuk-&ioyot^8p}O|d-Yxoj9R_T@<_`op?fu`o8}3b5#@Dy*tzP582O1mY5{ zOH~}-V#Xh3*(zxS30T*)UXHW=cs7!|p#6y~K~8sL>S&2bIz!;%{9q2o&3if+O;Kc} zTrb!_)~9jQD9$}SBFM$Zrlv&N^em52%z?*0y#oDT@h=&689is79VydL2Lyd=p{ph! zlg?r>B7O7Whb6dm69C$wno4p(>OZ6|Isj5p1lCF$5-P%(h&IvEB)S;IFm!9S7nGJ< zKFJY`$L-#^ul%`$b28Q_Ocy&(k+F(g@?`E8R!YJlHk|Tj@ocLZCCLo4ehFy!O~1lQ zD7(XO@Su#;eaE9G`iYN})NLkYP``T1ks;sv1noQTiz=+LQXEeK7HKEUav`B;4GEj6 z%2l>zO{{tHQef_%bPwgG5NkSpfsc{iLft%JL}6}@&{2p-w{ua7e5=Hsj42YwjG)ZT zN7!1dyAva!qsh9QNtg0$yFuU5kskwnN4DMjrP+3~I+N4*(v2-z9X%^n?o}GXMLz+T zErvlDSwiX1CSt==&UGxVi5o08!l1OMS|yE@ov8ByQ^w1=xj9RXActAm2ZIOqo<(XS zPiX3I737dJpD5S5*C_qV{;v`S&iRjcg#;CF6sF5EW zDEGy(D@~G;GGs#>3{J5?Nx-gxs`=+1B?b^92FfoRp*iFE^TAYTSw84K7|xd}8kW&1 z@zPPTw$HE`-NNGewVljgZ!hE%EC^kU?s#UNBl@7bvwgdtH5=2+gWprsNjA4DwM;0J zLMU5bvI5iW61Z8AeBU9i&2VfR zu#&7I*P@Y?7dAU3$IF}U6y3aG&(gGmemg6A{@QIcQ-Q4a-ho`$N{-Z_&0I|pz7^r~ zLNfO>+K=qm>(%zkcADq~aw_AqxVLgs=fGr4T8TY_g-@Isg3To z26~8!1%~qbrDLrTopAt$26uGPdsZ9`ui4{;@aZU644<2}uaYa)tLiY>QdE*{R3%wE zoA+#P5j=$D(!gs&z>(8@5OE{vBg<0ma8^mKH?~TX>C+mQfUe*2_AK&5xy|40Kc#=k zUSRHMXwzrcv();kv9CWullG`|YIY3Z?P z`B*B2;kEJ#uUMpNFQY_MC?KAPw;ilG(qXJR6p{;VppCm# zrG5E)p}XW&_1h&kN@MjY+jV_CE8d9Vp?}CDU7j&Zx2Fs{MW@G`u;&pjgLP(dk6gl=}#VF}_c3w_nf2=w6H1PqzcG@voynBDB4Qf4OqrH+XS2FXA&@`E>siiVR#jFQBOl$c_f zwD20V7l>n-cJCFJQn4leKuPLUAYrjHCpzQ^29=K=e|D5qqABpADfo>fs%YiT0I7bH ze$5ZIN*%QzoFVwT02vt|`0{OV*NCzg0etgOejaF9NxF^dF<`2dv$HCCXqwx~ETe`o z?e^!)Y@+FwPB2-^|^i`Cg33;_avZm~bq}R5xw&+kmoo&xxxKb3bsfP?ixk-_Qu=iZBM*@ok31RYc zvGefQkj&>skw*hNP81kDX0s|)cGumBqLrggzvhbIm?-5`nNV_TIeFqZZSpu$LZJee zebn<;TT(2_x`F3>ak%<=|4}+LSMf zZ0k7DuNA|SZdgY)CfjtfK8t>9p~f|o zB+S>YT6O+erj`Noi0dy@0A9><@#EL*;6T1-F@XwU{rJ)5;5aH3d67AVZZ<_12jscE z6;T!Vd?1+0A!+?MNoXXv6CTe?pL`k@d8M2R4UhYEEZ^vm#1}zLagr`nm&6!J9UJc^ zb}}iVtUB^3lMk#2}$7Hni^Qzv#Cs+EO)Ubo8jSE0&80!cf@?J1c^Xm$-5l zXCC(A&1l0kqN^k1D={2+N7hGioRbZB?A zq=CcvcH~FKsJ&dYUdpJlF^XrkaZ`!#ccFG@RLt*}2{7-+UNp`g_-pcDKXUZ`ON$8O zHfJ}Z4o4k`JpbD7l1nvYX~`3Rhnupis^~p9L^gi@&R9VjCy&ZBBo;p_ISSJH$$oVw zqGO$oQ>hLd_J)#Cgfux6q(lRl{p=Yf8LDk8O*(BCQ5^d1IQ-SrF9THdqFJHqF2p8| z&Y}~2tFsy~dR35d%!8D}bm#r56MdTv*i z;!rYq!O3yIe1>9eFJOw@JDg)F`^##pfV89AZZPtX)fIlga%l>N?3jV;=8} zT^#6;n4E{f@zrOD%-MSqj_2CMkfXx)k*_D5soom>&8P38EH98@211-f1&D*R1P z-U=}$pO_O!L`fH`#exP0PPqBlqa9N5$Lp=6YHgmkDKj-{DmG!J^<#gNr)Dw9V(gY5 z;ff?R9i>wsKjeYvrOw%Rujh+^hMdMKLDP{y6p|1sEK8|h*+%$T9#5Q1+X+)IQ*Hn) zpZQs}mJFU#|Cn<3+)GJ-(w~o%rq4q>%JHiJx|Ey7K#W`1HAZ%nDj?zu>GiGJH9um* zVHk#UWOmpwTV;pWJmRF@Al7Gkog1OO;yxqrwIuf?<|I+>|EXcS_?z{<_C< zbIlth&_SF5=4~Hy07gcMxAlc6O=>8oV*us9%<5f);UX4X&%+_lR|uM!Mjbyr`%|iI zk*c2Jf`YcQP+%d`MA-6Y#|$ukYYmNs!9!X|s1xz-#6YSr2c%AF8GQ(9>w&A(V3 zF#pPxu*i)24$YSD8p5+!q(r3oTZc)r;Hf<^{b{f==^VgPNPw4)?5#{f&+Y`1@iw4+Rf2b+p>yvgW+ z>0wHHP3IFydDzMwZTj8{fjN7Fi81IDVPo67HyW^|1EL)!xla;`pN^wxH?WNDziALh zX*8xWv_oDmfxPcm)J<3T3pdypT3neydfIDBNR~@SutaK%$+?5{HqD=~c#$=Q@8Z0R z6yL|uotOg%+T*-mxkfk>Ud%ib!_5FollG=}uqhPT^EWzjrWR)qKU)pkw$%MB zl7^rRBhm`v-1CL z?DC*B=Rd7vIsqZ;z9B>Csfj`l1Ch0C?PTyH0rW?>yDh=Dyt~BtSsvHOq4XZN*pAK8 zS4IzFVqRHVAEZl$z&#yi8--4Z$z^$Yw&K+}7M^dzrhB!m8{-m?;!d`a7ukVL9{yHJ z1fS#xUZnX59olEat$<`mr>mBAlwQq^PN#%Tl}U>Q558*X$=NMrw0Smi0p+K4=yT_D zrTh34z^Ezl4)A7AD<0dRz%x%weN@mRQHXkd9hDXo^4zA|xnizG%5N=4U26d+0)%jG=YvT`r8OpT3 zETp*mZow8Fgz6{Jo?jLM+c9vPj4_Mc9F9~B*GI%BXViJqEgSJ`qad^X=zne!W)%}> zsg+o6XGT+T`}OO%{*v78Bc9t*TFaTMW163>5d?{9%*igr%qNBcd|zIx!5n2yJEZ77 z4jD)7+y0!H;xL=-_|8Gg!gZ(~n%MBR5RiS*#N@&7EJ!{iTs+}&=l5>N*Ey@cTvu`5 zS!THVw}qbTP+qL%)kN{oeZ@yvVjl-b@CTb_AP`m#6jd9Nn@=xI7Ku-Z0O5(Kek?DX zYBd3xaE|fq#EvMDk_%y&sO6;NxL=Z~vXEdaT!tNj%%1HDhR++<7${6Q%awon&QF_h z{2VN@*G>ZI5^Y1;#WaUi)Z}!AAurI#2M3l9(U`>)sIRr+SPqdxrR}tp^8$`6pggb2 z+@rNUInRB&wQ}IWKURF(C+m%Uq}p8!61$3e@Y{tScH1KL zQ)eZWqD1{ZXA~z}vA_$_R~GKCQ%c@`nEU$U?ej)zI-!(Y$F-rM(x?c`|0ueTicRP8 z5ZAxNuuG`rC!8<+o%zUxQ<%n@BqILMsKV{tZw%a}ZXD0kAn9k@#a4Vp%OkGzuFfh7 zJ<|8;SoDOnHZwcloo>Fql1W)8LWp^ySHiAf?pYAoRhUT4!XT$?_%=@t6KF)=DEE(` z)CqZG)f@rul^BI)idd}>ZO}FMDCpb=}BZ^=chY ztcI*qjX^|F-|&%FfRxp?5^GdjNX8nCB+rFx)lmsFNC;K06sF+)X0;GYH~TTmf`mV{ zC6aX2gM1sYN#89eW2zT{CWJU=+jEm*JCHMDI7usfmKhEL`bpJhW`L)%bjAqPux=t% zYKs)0J%X<7~5y-w$Jg^+E>oG%Nhu=MgpncXIi8=ja;F6D_3%*6j3hYA;f% zO4m82;M5vX5>N>Q*_Aec!fxn`BCZyK<)@IKMxc;;U&nK^NCc=bG=%npQe?yQXoP++Q?*9 z-Tj@3j(0@jR-Jz;9oWVAuvqfIVWdV2U^M}ftsAGu7xc9HTvV_=Ntb5`h$zD263MR6 z4aZj575GfR@mAaXrbUkpnJ$KF;~`DMMAhVi=`k5VziP;VC3tZHD0`!7tntrB52GG_ zo8umF5L|{P z#uOC=Ghtc^U9QVv6PHc%r!ISDRA$oU)4(j{syEE%5zhERx2rDh`{}QW=ej?0iqFcU zKbjXsf^oXLRN}5g2ER)Pz8h>KQ)EY?34NT%iqPKzC4_mKF!K>LYFk~|;Rj2h^$%lw z$jg_BV`n)=(Tfey@UKN(XEW!{@G13OqEwQ!IM}$`$chWbR|~N#qvO85bl6;_jM=Z1 znzL#WwAR#9x|pzc6t^=bg4@4=>)0saNwVLADCq(WY4o-UC1T6iqn;58upE3y*q>60 z5gw5%y~LC-vLcLPPI^`DMOH?_3?17}Wvy?moImDzDP5|K3)&N}posPqX)Gh;Rl&y+ zjFi#O9c8ES3F8Mu<5aFf%=c3>hVuqF8iO$6`@IOZo05GBuC{TVNU}`CCk%h&Kbosq zijpU_4~Of5H3|J&nP~-Cf~l62JX6bazNDqGmmo14Ewk`zGBIL}_Tdbe3oq=^6o4{D zp-Kx zw;W_60zAQ-UEA@Jc1CZ+6Ogqyt_(bCR@BjPzy#6pFr1H@>o`N!4Rv8z^E?Ax&mx_*bl#JygYO~8V%7AWKF z!eQB<2L7M0cx1jIuSO;cv^dSNZQux##z2=kw^|Y~mTS(?5*9WHw`P8fQKsk4BxlJH zppZ;v$r3SYv#%FKC&Nu+P4#$!K2s@L?08yfj$UOM;*_CRsk!VPkpP2mJPB%J>Tnjtn)fX`cZ7U43KK|P7Diu+ z*6qR>SVC|BR_|$6H0F@INI2ke4wyFm-kS4);7}kTUqyWO)XcEK2{&-6YRH;{P>9^6^anUoeu@_wV0={sSZ7QpPaR z1zcrK^Y;A@7-{3zZ3Zcmh~YQ6Uv`%lgHi(_#kRk0&lPoFHogz}^Ee=(RTOX=@`RDz z;)0DHZK}@=Xv0X@#Ti1d{$o6;Nu#SIAn8j^{%cZk(Y9=b95tajNvO@K}~s z6{|Q#Gw3thUoG83;ot}$Yw%ajTGk{|8M#7N;q`$E-)(9=jNV*>eu5DhR z=1p~qMJs1yLikvYeHp1o>sF4kX{=qvtOn4r^7OXum>|)*p1rIS98c?e$5~|1JYUonPX?TM_8DIalbe*QLdF1I3l{GPY@r02GH+UWu zvVR$xwhO`3zqwwK4$Fw%28RQB|K^@}$BA^t?$?bk_Y^_$*>GTqMSKK<8>zVn-AYdzn7Hu71e5YN6bzCe+` z4cwgMel%T4l6W=mSu42qumI3BqhU*1(yLj9 zVe~^sAIbYqq&jR$0^ci^jJ4aN+vS#Tr|zNg30carJ0||;ZW5XRZKRPL2GvD9wVoro zHrQr?o(YOgpiY2Gvq#ZHKBiDRmxKp>8rc(5!Ud+MzSxeUVaOZRON;}g*$fuk<)TSj zt0(45M^RE*V&``-rQ$(p7(rQR8teQtRs9hdexUGgl&#n})&oqRVk6kFy$CJ2t?|6U z*Z>fk4=@~!-sWKhCsrFhTVx*-aH1~kCYbI_$3&31s)#t%Qk8ZYJbP*+TY1pVe^pr{ z?IAw?G6GL8?-_w3U0WGr>!(t6no5dlRaG|L*!1DbLFumn>Vv_&xa5}Av@!517}w)= z&VxU>1nq^AX)}xBsz5#zoB@d3{UVoP$tvJe8?x=Jy-5=zQS_Zdl|YS2IY*Hp zq~23rHFd`IindSU8%i>;;m846GosGIApmKzm$OmHXVNSW^f5ja!P!};E-O>yJ++d? zF{05m1*#HSpUK;hEUi-dlmN0$^e^io>LBfTPzG{(YP1%>FB@DOBe_W?G<9Q^t6ZCC zTTmakbfdpLc{7p>j|H7$nLeYGkcNk)2Ry0?brLl)=Fs~IRW}y8hCOxcGH#D3t4eAk zTa*#hc|W^eZIQOxtegK-_yl83>y%m~J&XSCA4^1wn}+|*>VeJ@^@FLU;BkXH4|mCC z6hJ?aZwA|on^+sw6U3`6bIr#s{RvSL8%W#&xl)fSmaPhUHp?&8%GX6oCtW#8`xNq1 zHtbLBM(Ap$IizszCTz}o;w1l&39ot&SO0csL$dWQ5|^e&M;LmUzjfGRCptcC%xY_<0_6tK$+*pd=YkW<^p$W-TosV> zRcC!7OCmYaW@=e`^uX24!H|CPa(*Q-(WNOqGI45@Z!n=RSl40DafgCHp<9E!&1H~h zEV{U*Q?Iy@jka=8ur;sE$8G-UWnR5q%r1;#{2F3Y*m_%SH^a^Qc#$lvX99VhJ#2mG z!KIC~AgmbZMr0CDKc8G>^%Ea658kD#>0gxU>|xwGx1Efq-Qy$EiH%9T+4X0gF!jZm z2nKjSs?Hg{fz_h_CcPT202RfySnq^_Tx!_pU0H$OGiH8sMV z6;9TjeH$rk+qdT9`*P%E(YP`!E5&CeQ}x^i%t`C4iQO|kejcu3b)+-CAlvN@GI!&D z_vA;2=pusi9fH>_%bj;bgoMrMR3jj7%&cpv94CB*bTrdplamO zIjs)0-BTU_x_aW;tpnbQd|Wg5U~sxcaH~z~jiMQ`MV;;zl^8w?@@5(L3JpJoiyGdj z&b{T~QN%kEI4ZtwP27{>ghEa(wtX~U;UHtkE_djMFY5^|zk73iSXx0sw`cuNHV?LM z<^!|ESFzr`@f}brt1OwkxC`ldXQPv)I_Q^{Ccfr=5M96lT68Ieh4?SyXtpv7`cE)JT`I8JF7@^gqg3wdZns!I^&u? zd#IuDhL0((jWIsbpRLqxE1R3T+?u}&47U|RI4i! zQfvLi2PG@QSDjS|3r-1-ypTSRrl^5}z@CkDD4C zx#2}vMcF-5w{*j-v_Y`@cT-@M4_cg1>G&XApV_&9*6ADh4ZC>kBqeMw(4cp@mO+TxK68~qkXcAC;JObmh|ftp5HS{V5X`s-wr z>J(?|)#sp{-dZ<_>;H`j<2lwY^@gy9=}=<`rI$P6d&cN^M@=au=3rv}_QQT=r=qM6 z(_4;%?3#U|rj?tp3%=Kw8n;+Al=iGek&{@yp~7UKRF{5=w=D&O<-C$#c=e6?SlUM? ztRm%o0={Ee4pqVKVkE$=w)QXBD**5oG5G76fHDrhPf7vl)U*eX(1{lgU&YWFJ;i>j zsME1y2N}i7i^bJMq3PrR%0v;M0~GN^u(MA@S+zH6K8)mrc5{Wd>uL;C`hx6%&l((aO2lt|E6Xd7nKARbgzj zCVEt9>wtTwlJ29#cG7M64O7arepsqCYAAP zW)vkD$_!1n!p@$2;mmNQ@iM29w3ogPYWwb|6Q^at=ePo+T%RC42VpIzbZU#IQ*Yv^ z%KWv?+m7r`e@N4<-^VouuedZp&d{eO9Z*2}f^vHMQI4vzW>0&(5ETa!tF!~tSkO=+ zdymF#BqV6c9pN1#v|^gwEh;$*O53V_D{vCHNi$yyGfS$XAuv zt2Q#!7@@^%+c(e6Doi^rCjnQx-9Z-XB0K;=x#7frUqHwX-CXm%-%*(<`j_;1r{DcF zmB~(d+mO6;YRI3DNu$h*4Ol7H$NsUr#L`v4Kunf9+8g z!1nCH_B_kdb~%v*bfi#VR~7gKMBh6G)&@J)CV@DEjRJHnql+CKeS(fE$kY>SE6P&# z>kmX*<+EOHfSu4C>XUM{xX$t`e8NSj-`sUO0DgHkEJ4G%Wzv@H8X)1o9(z4o?VqWM z_@jtlRPB$Zs&Bsd!&p?Ti%J8QZHt~J6A&lkz!B> zZrU5G*7p2Xv2MT*m7*@HsykmjB@x^hfVo$G+rJncpXT}vy^hlIfSi+r?0PR`H$?SW z)y8lrT*Y|sz8%?11cMY3{AS=ucXl~*NUH46U#)wqY7seYqkg2byoBP@@qeSIiX&;@ zT9fQ8nJh7uh2G#)7u${e{W|1xdq)N1%+DHgd~5ewb!o{McwRqmd4N4rsQ}9FK*Db+ z8u2LqOXtZT^%dmrQU~5~a7K!WuqWt{G+VRM+SO)SwjbMV-3AX|S#Nm0o6olf#kP3F zTL2Bx&VR<`tf5d7%KCS&)sT6=@=ixREYi3S% zo3~}%p!>sb>qMZ%`vSW?C3O?=q6SAKv4a0ECsQ!4SI$~6G)RLHI=ZD^lWc27I&a*x zFF7opZnxwaeQvuiqUsW?gFK3MJI*d!sQe0XUQxqrgGQtp7Y?6F8CBP1Rl{p1vLB25 zklfTA+dt!t?uR|@JkN08QPccRcjF#CNOI2!|DR5iAUjG)bp$M1Rlp%O8#7^8Em*yt$|}!pkAw#YZFRiT}gdU-H-#Q zc`D=sUY+*nFQuF^uH~up?@iIx12X*~GC_C_JlJ~sSfrhBe4m7|)Fg*3mSUP&MP5#Y zjAn}4hm5*tX1+iuq7VWB2@rPoZWJ6G6A{rZ#P6HMVZZ1hsW#y^W_{=K_=Y@A^IP?% zRisa;BPhaZJIelrx-eNBL~qLBD`jcDn9*3y-~slM>ET>=%n<#!6CGh4BFphzU@L}m zQ>}sJdV7RRYiHq#&aTSLOP>J7DmUrQ21-?1Y&q+BsT{S>rtTQF5uaW-xGH-hiuUBQ zUSUZ_S(*o<%52zZH})8>Bvlx%1ztjdzn9>qBH$Z5BZ#Mo{#A+8I^&~i`qtHp5WHAn zPvf^)U9ZI?IUvwvVesu|$;@|7=ILTJo-TD=w0e$4PM zZ%2IlQ)M=$!mG9-p6AK>QEK{k?W}5)yVu`n?!IUmE5jmK+q}znuPFNY&2c||=JXO@ zJRAuk=GxD-(J#3w(A?71)7rPVh7r7xl-2~mZ(s&)kjiEUQw_u2)qVI7(C9mbBO}0B z)397Fr)gQ*YspvtX)ei}%#RV@ZNG@gM-a#-Cv>A%418t8rbsI|D&=+@|Nb~}>p1z} zaq9oPn{<+TWHNBVIC4_V2P?if2ux>$Fw#E8xnbVx^*Rb1z$iV`QcpvWOv~1Wsh(ic zCZJ_o+v{@1=n=5*I#xEzikKUWal!~q1Gh_K?BC^4wP0)ccg$|+c{q~}m=>0G!^PrL zVlm(Nmpj5Xarm2jUyhugYEw!uB3gm8;qVC{mF<5KN^AXx%|eY3#|L~0HNee+S|C^M zVLN4CGO%7$Ws#t3^JEZCMO|-^*%Y0Ll21#^`Mv7Aa79K6*#od;cC;H#0sUSCx8|DwIs$Raj z8qDU-U=H)BzuIM@(G_3tS-P@L=9LIs2);tK`SUHodw`{OXa5cfUHT;yJthBM&>bhQn_2}^E=Z!yD zUBU&w&phmC<8j21SrSVc(r)ZNc!}Y^7d7oV{nPX^b8stbVK?^i-Xuj#*c|rIa#ut1J(v+yH@%HlBq}^m|U#Xy%9jv31~K{871zN z8*wRs>Ni+g_C&SnIejoZ5=ml41?;1YXz`3mz~PCS^4<&nF87)0IG1eXWtr)*6-^sO za@+mw4@*jN1P^FmL}F<_N`o|TdzqNP6bo8x+2Y{;q)1Vn`_g)*K*N?kX_fY-Y*^gO+>&bnIhIMaOP{UI z96n3*h+?h*w(KF6guM*&=}C9c6a@5_>18D_*hx7PxQ$4JmSV~!4N2E(y*s~CNn_#g z$$uUio)C@UAiAa1#Z1c8W-FX@D78lrCDGXipVkf!;>pgcsVYGZ2qL>2Yb5;d)po$J zE{JSmsq4~sd6&z`#L_r2MsAin`&f!D52=PEu49O7ScqP-}21S1hj){Lo!ir^{z{eANE zkGL1?u-5F9YI72#WL9MJb9}^#LQ-4!8$#CZZA-SRzp}pA|>t z;I5UHMO%DYqaIfn65Woa5p=;QHPqP@z@yElyxd0N&aV)gv3<0p$AfbYF$8_Od{M&c zOH-wVxnsM!CyFyLP%Z!xM@2Ij^Ia^(s*4X56nZVfj|%0z4PP;a!E3OeSARrKq_AR# zN9s3xK6p-oKS;6%h`dPENYk+$wzmp*$r6`nzjvq zmc-=~Ek)BMaOqZ*m~r^sDI-h$EH4DDFeaH4ViaQrmIkDo2D-2TQ6allmXC5;li7HU z$b}sRM7%8)cl>gV6Ri-0i-t&yi)j?V&s93pHiWff?N|Hs%S~fzh-4i4=UqND?@@m& zpZ%A@w!6)ZpxTraC@=2|KDIG<7uPjT$S$gbCKmuF7A|eUq^kKGSHzlO+B*4*K(yRa zeu+gD+@-S$st`ihIIyQ%Qd_1b9Q?-AnIB28oZ)#qK7E~#Rr;MvrM6*<^+C(pqV#&g z4?hAsJ`IAA1UZocDckLedCmk z)l%ayEb3rWatPKlz16(HDimQOg6B?g!Fxy%kEVpa|6-V9WPI3qFx`x7l>J%ao{0U* z=d_{zX0NHQ@^q@JhEiiP11Y{$BH!OERZauOKEQI4|9LAY)?r43lcHqU+` zUB-xBetn$SWZ|-*MlR{wM~@gIkjEcoG#~4Y$O3w%Koj<;Zo2xBP^@=eOCkg@ZPc96 zM*jzS_xTNH{66~LjKSzLdhfkO4QB!j^ay+w~+qC{^&M(?7x=s|QM z2x(5f`~1#6`@vqPth1k;`=9vSYhBm-dUc^#K5aq~v zIcPs%8pS7*?j<7>L1!LnQP7{Uwk-{7^<*h!xCvN;Q+_)f=FHf0|F}2`ilry>v&=s(r$5G*+SG);kxy#?B~JP;GtT>Wp-LV0+u(0fc52X2&jC#`op{! zvOo;DLiga|D@d_e>r9j!mcafmaT#;j1=nTvSFkXVa*0eZ`GaDKd>+5GPMN@?(dXbQTqjsbT9D!ocl4mYI&(+c@>@iBbb zRYh3_URu*2u2<<2O^M%pQ%GOii=IYyy}`iX*}8G!e-y`T94d?+Bb`VpgYjPRjFKWI zQyJRT^Iw#KswQp+2{qbd)2k%veD@MQn$Hav<5#IvMj}|Fr%OXqYo9xz=bt21;kLZ2 zD&!?euJ&(-?6b;V zA5(XUrn}Mh2^)Hyj4hm}bkse*?-cQq)hX~DH9O0*u&+iMiM=Zaq-L5MnX5=>qA!!~ zW8_=pLHqv*YRfLyi`HqS_O=}NRfg`gtWv=NtxGgD`1|7$rA$^+-EPFh}VE=>f)T&cVc2@C zsqntP^R&YQVj)^?XuZ7=5v`vaarv16E@TBMckH}pmMqF&Ot7o3F%6+3Qhjq@Z`VCt z8nsyoda>u-qiW#!Lu~$-d?;&s5w(i<4Zcnk{OvW{r!&U@^(7YF5H;?+YB8yUNWf}K618ZZp!4zM z#ElwdorRyIdE%LlRo*t&A|C{1Cn%VdWhff!=Mo0L;`coIHf z7afVq_6Y*&7oo3Snn$im^|lrv$jo$bCR(J8$}X-HLff#AYNU(;xpR9*D_{ z5jHuCQ?Z>(RB;rGl$VHW+46f!im4Wo$wrZcVoF33^-g1>3ceh3h-@ai1R|-*4;nrW zKM*BQhi>_)ncr=?PpOWx=+>TM#KV2^ysRMSfL+r+0kTYDl&2^6>su33b(PUd{&=(l zfFW2olRv>+Ltkw}rgTsof{y%^$_Cz)(RqzB^ML_!WQe35ebGH}JfA83d(8jepol)- z_YMr)>(w}z+YeHdlqYZ7%DbbBLnVXQ9F(6HW}a;uRPxhb`ShOWX*`~WB9_gV9HSK* zqA%5#AwI0UL5i|Wdh9mKjkbowlIT+syatJ0btM(eBF|`6q^0`zXPg4vgOJ1FvFXI$It-t)Ui228=T%~HilMC>(msph&lDl^J3V`YxMT6`nf44y_N^rhEHXRd#p1mB*Xr@6( zE?HNUJkE5$)h@VHhht>t)P{kZM9FV?c1`r&(ZfN>{REc*ynYJr9n)p68qI%F|Ib>o z;FKrGEkow?ays;ublz&j4fv$C%XY6LIqOb8 z402S{e3K3URq#VRCsiEZ_3^5J9ts0Eje>fj2P1nmL}=OU4CV!2W~ZJ19t4q^%$+?HkB8;&xEB1a z}_yS<|k z%u{uhD{@iv9&6YiYFv$tE&gW}AJ>mjpV^wWB)TNwxJHIlLC&=I&)3g|Rov#g^iwxjVfxbokQ;XQeRc+j^8!k=F)298wm+=O%`a^c|cpGH! z`it%20j=>P{E~^x9ff0`dfKlA{nRI4ip^E!V<`xtoL6R@maqE7f(T;ChExMmoPq{7 zw_qbYpaYt-J*)5+ISVJ6ykXHi3wLJ$K-F{%8m;fFxJ4za^nmixoyId4%kj)p$$clp z^%b(;F7fR1zQZ}s>JrG#bw9Vs&Ln2hG?AJQvaHVOPdAGEdVWKDW;=Y6m+iB04~gh8 zqXq*X2dBMIsKgDU|4Enbp1P0PArEY)J`}McVu=NI0{83Pix*A?Z$4AYL)!b+=X~Dd zcAJH!W{ufhbmvS>MO1{)RK9OuV9VRxRWigKuiu{b;u4{9yE#5yJc+RrbtSX53pTjm zIVN(hPjhj)Ts_x`7k$Anqx*Q+)ygS&(lwI1zs+`^Pj20ME9qPQr07piDX0-N#fi1G zFr$cUfC?V1g%G3zl59X%ZZI7b)OwRVuzF$)HvFIEbC!^rRGLH{S03dk2&W$>`ZM4X zUB)+A_Z&N}^Op zNF1($fn!Dq(lOx=ib(zZU&k<&FtYh&sH&=BGGre#z_v`yb)Djqyf6uim&|&GgAwA@<&{gsZZWLh_atH_MGxlBEkY+EY|Ow& zDMPhu|Ew7O=02H9F&U4uk_!SB8UJ~YRD9VTqoL@X{Njgl4%{&g@3NFrbTPCwqn4p$ zkB3Fzk^N7|dinSeuNTJiIsh?T7rM$yuTaD$OfbY-9jp5$SCS%!(V-Aapnh$0JW_Zy zOO;Vkx43y+ja=dsmZm|wa0!l|SJ#mJZG5%xwulcC86`Yfigl0NDFa~z_ z6e&40FeF0Jp-&$=fsv{2y;bMZsy{Ghm^-6(mrZdYM*kOe4fDFD~ zz;$d#O4zI-xA7a%KTuRgpSmtbOZk@DwSbH;J@_`R?E4J*F-lvMY2lH_r#9x9L0$FQ zxxnIciJcjPI$dI0%s?Avb-WupWiB_TJ^mGAuJBLZoi@Fcc^@Sj+%Nluy+X-SN~n6N zKaLbxXki-@X4Hjy(Pnu41Z@1BC|a7xnlcZfy2TlerX5gWoB`=$aEQM7zO zC`^Gzy+etXbqqUyjixQ3k|!4a?G%46RhrH)B+4u!?_*u}!nLH!1dK<4bZ|F(ET5=X81Y&7 z7izBDM*}$f9Ly`(3jl{HAK1+ZV(UhrK53rJ5;fUgK(Q zXGm>>(Ix!Ui+r-@`NKb3^t+=HJ{dq3v>0nY;k_P=d3W%A?Q3HTN2*&tX5+`>O^HMj zUY)HUW5+cia%>r)Tz?yP!{~DE@yK^~Fc=u6j4)W!V4g3QQhjHvwfahEY^O4fN>M9S z{)W_+iz>Ajqa)G_9+aeiEbzzO&LED%SkdA3~WziANHs&A7;VQoKj} zVIvQgc729nf%{Y`3pfjfO5&X59N`CsZN;4Z^>i!E1M`_XY;CYTj_qXZen|;ra5$p* z=T>qRQB*}%oNjtCb?-5baVe0UK&Y{#kbq#(5qyhYF0AFHnpp%N5k*cUe+*eYp`xsSL;K_dcWCPUecsb&#i84~h`oro<;@kOr05Xuf{s z8&W^3>Xw<}?-Z}4L3@uT6-Q~Oi#lMjD{5}>PKZ!I(R>6xSx^0EN}a5Cl2v4U-kj%e zW8XgAoj~~7#PR8IAf|R(M8bQiMa!l+!lb$R`DoE#qcl|rqT*JDG-<*Q~na%## zLy-+JSnoJ9>AmI^F)0kJ*e{RBn_B>r%P*R9laSJ82`J;pYyuZ|r!8Ffvi6Exw`JLf zo>))r;(BUbENs(tmU1h@lW-(ZC2^H`;v`g zYPM!XY6<3x8~))K44<9sSMiw3{`T5Mj7fBZh zx>r>#&K7#ZB7jd{hB3;eoxni2sM{RLr@bxWNBTIyFd(d|L=)px)u+L=8J&X{!c(O0 z#u_HZfvGeYu4jq>vU^=7??X?`xAo!$vwP7#Gt@Nucaybs1OrdJJJuvxXqlJrX zRGl6koZp;h)tc;i?7>rJ7TMSlL9Q+1FIga}N(8x$t1v80!Uk5DPHQ6_o#Gw1zqqg<0Y7rTR;uw)(lUB7ivGh_g3zT=uB z$G!*V;#Yd+$Ng@5e4uxNpK&Xv^?g|yQ?$4X8v)#j4KI{$Tlg}~l8WUjL+_A-nlNHb zyC#FozJ5Z-2|8kubmo(oUvA0<*`6WPg#9%NwB%qm&d3 z(lFG>bWYMbxB*~>20SX05)=Fl-F33peuU5J1LINg4(fZ(V*m|Yc4y(bB`WeL&E$sR zr>CK)`R;KWz&C^eP0NI~6e=_XE*kW}qC|lnekH5HSdOt#!ht|ShA1IW{+BdHhY^ks z^ej#cAJ}3kv@bHE4V!4I#KyHewkpgmxyipnRHmt1!QtH=a+vrzhkLuC^e?Cev3lT; zh|LTWv2X(!v);k&*>6jizK0BDTKmy;u+> z8*s0hJHRI}X*iF0qPm5$%xb7}eE)&&glE*ZwVw!oBI)lpnpVsg96ZFHSkLQSF2UeY zx^RO>?Rq! z_r|j%+&3mVn)V3D+31dT>3AJR)0iRVlbtQcOZE2S1(TiP2h*vDH;IIF0gkKxI3(7y zRe+cJ2iF^It?d64NbZr*DEYhby-aI~<*9tdtMe_!WwP4Oouea@PpfG@%69!aCwrHx z7W=aM=X5ctGUC4Hi8sN#l(e-v#fkIVka?9p(|e-sKl_`J@Aaae2IG2B0bB?u?DAXy zomlm-caGqq7jGWJY@=uaLl%A%`0Z>Yd30Ipm_IADo3VWQ{@o&w`h5(hzo3iqVWLcO?#FO7sQkL#}3JaJ-ErTXOBouiUW;iDoGv zB$C%Dt*7>m1y^oV6&O1AWv-^tP-?z_2kG)gj&}7 z$=|3-+e%13*6Y(D4XLD@D;cv8l#kPrX+mQ>a=k71-}SyYH>7Yur_phLz?8^O(bgqj zH|AE^6s=abOrZ4P=>SXQ2k9rI$me;p&L!*Ez?uza$v4k*Dz=iuf8{rC{n@p=MPJ?2 z%COIio#{lHYJl&E}C2Xgy2gLkY zit&3e9mDi;bMN-Vv%UKcuyWS@v%oRaGnSBt{K>||8EPVA`)jrKZ7{JbL~Y6$%Zq8K>Q#u`h)SFX0aTLTfe$aWJ-khEtw{_7-6a{ z7DyvnmfVd4eC3Y%D+Hwb$JPPJ!7&tc$^SSc^BIu$<BV9pQPXQ{sUK?o%alSyP2GpLeL4~$ck?1j*w11Oa8 z8I%*nzss&h9WL($rFGOt@yPzbdBTHAnY*;3Cl6PVRRyF7vvCo=>n9}ODvW3M=FRe#OB`-=i;cd89b?`20ll3eqG?sl1jWE+O89 z1fDMP&Rd_J5aMeEWz8v5zC#(T-s5WTdcYpD@~esNRAzo$bEKGZjaiYRBo&yoQ=m`F zC13YS^A!9{W)fl`JYy(IX*AS^F@se@ z21h~*2Vk~3n9 zmq>*3v~ZxQop3-sGmSc*0^x>#)_evi9-tH-FJ<5lF_w%$lsxm)P_VKD>)fr)aQJl; ztFb(5rd%e+9Sex~V(N_<2DMj6C5k;18fQj)eg!`(C!c z(OV$Cjs~3}PPQ4-Ezg|nhA5OP!={iLXTo<95_1@D!iyDtR=Yx(!8Lnae1}V%wLZ8|wB7HaH`uimp2Wxg&iHLV zY$8p4UXKn(y!ZW?5H;Dx?k#vcQ)>PpUaCKKa{Sm+XC|{U`lLac@f(~cFPo{+qvn|~ z-2<=oT%-LHiu(n5HFZ#K+?T`e{(j%RB%eaHNe{SCm%L-Xmi*mmgGm{}T|#ZPk5US_ zTV03l!P?*av86ff^1)n$38o{ z%S@elKurq0MAF!egO?mRdDOcPD+IH>R{fY_aZcCxb~!#Ox?ae+yxOK(1kAgU+Zf+R{bnLS?h|8N zGL=Bew}Yo!#KR-9t{z`4f`$hv|gF}wsgVDI>Qwb#wTjKJm z1naZ@%3ve>>KKI5uX5BTkHPsPt-2-UeI^}f6&Q9$tGa54b4g$jB*{&I2M8%gW&j;> zxoul^BkmN9c(A?%&#js(B*<-?lAX=-oD3fDgjlIXs&X(S@~Zt1Rh`NV&7<}b1){MI zVMwe=y#w&`!)L=PUY>*gUXm}<4PRF1dD^5u(J1s)O=D25WUzer>SJ^CjEZXPS59k_ z7~%zM^DH)}5!;Dkt-K)wtoSJ);_0gxf-ITfDYRFp3D9&{tE-rck>?eS3yw$@+;vy2 zpw#Z3?ZBeeCCV%<+8V8e6vy^!}HBU0m^|VH~jBVu)2@!1kdYjR2 zX}Cwb>GKOa;F7}jbIzb$`-c$Z701mFPPMWQI&b&+KHDga14lAA`g$&?ZnVKU))rijGFpzV9-r<@qY(UB@N78>} zU)Dy=$GYsm0*YIots3#?M&szO{osbw>>;$&T%V3IgvCa7VnPXq>a0offsmMa<0)0@1}?Sa zku<)gpow~+ihDwhmul)$>W)whG0Ev`d~4`$LpS7x+81aY$_u-Eo{EZv1~X>a zlE>bvWJJZ#sMuDHMilQBR4<#B9(nfar;UVXP>)0qsPf(68kUN^av5T$c0=SiB*n;9 z?p~!O_!MjWyXRi&u|;GMWKvK!n3SN0>_i4PL>FXoq~R_F$s^+hmlI#pT7jG#H&mH5 zozZp8I7Zj(#7f@Vn5^2dU?)WMleXw4fv~4427mgs^|;&%#&WDP;_f6Z(w+V9AL3fS z@mg$+hMC5YWR)R83f^+Rg&XM2zjGoxL>FY#4#e1=@gUnJwLf3i+y@c0%-~tDQl#d` zx>8oC2My{Z$%3s0tiAg{B2JDW={i;AX*g1PCDIlI-@Qr41UCir-R@8vKdVJEU-q`X z(h1XT$fz7DXT+2e>}EbMLkGEFVXp#gM`@z@x?ka&{@3JdbHXU_&M_auFC#-TCx*Hga*x^Ju$s<(>{6{*@gG7g2!0L{3(8Si~|lL@cik97uzF1FQC zMrFnz2rC@(UVDC~00@?M(>~V_Q?lg?Vi%M)6`IZ|cwwO*jo;%?3jGpfR_=nP);Dy< zxR)o&Bh3aFif#^VzT%{mP_>Oyjej0LZ`ZmQpdPDp39X@FNp3*|?R zrim)?b)%>cYW-jFQs_han~8_QTVpPd)YO7A?@-v2u!s+))^LmkNzrg4E8Xqb zNm;S`k~)c-h735@-6QWsb!V#+;^(_`YpDqnV=jPF{v^h5?9d*<=Bc&plkl_p8PA7T zt$E#7*(CO^n7|45&*kx-T}Ik;#yU+Cr0o2N?PqKHwU{Q~Ry%jyu@es4#dA9-nOgpI zN01-qWvP)Dm_*)6SwEWZ)IZ?l!Ix&3aDBeS2NLiIq$4aJz(f%EF}Gsgj#)hnwEuM+ zK`V#v^-FoEDp>gDC5@@os7pr7RvbS#w+KI`zK!{QR&c6O0RN^n=QL~TXO!bRF2Q#M zGJ&~Bbf)Fqs8gt8M_{h+6H>oO8HOUYraw^~zUY~=+-?&m@0tmNF&a0I>^=~aSe$vC zZn}zyZ(&-nDK}ob&<~AJS|1i8GFYm;_a!_plI3-zN>X$k9@zY_pH&%LZ~j_0=TP!4 zMeb2C{l|6|vZw%n8XuC*K*yhZcV_;bA`536cN;(!RA!V`Y!1=r;qM69#1)G2WoMdw zK^tGOYoH~f4DNEU&fMlCDAns^s*sR#Lt%I`QqsRO8bIHm(TuD29P9*m25A7zFa2m&zG8I{??$b%UwavuAsrv}H>uxu=dQPR!b5gs(NLYId8T-?o49p4ck2yL z<_*4c;ifc{K5SR(HjGJJHa@4^{;r{`e4RB#XA!5U^*Vy3f9|C@aogo?hDfn8va-K} zz+8%Z^yX?aEzI~1t9+9$m$ah8JpNGN<;o*GBCS6omz_&oEHBLGx6Vq}!kf1rOvxHS z_QD{$*6mV{ltK6DxK9fRnvL`~@^>?NH%)uMmMqlH1$#Eh`_Hh1JkIL21-r2E{qL}^ zytZHeO?-}nkQ9_(tMrw{A{ZW78A=bRytF#N6#UN%q|d0Y)`f@M1Bd(RgauQ0hF08^ z+JwgKU+$$uwMrO|ryi6+G=LUYz~mDC*-x z*k}4Z>1!e?U+E+N3tTjO)@h@Y3%j3PD&Z{f(n?q3&0^w;Q2aZ+*EKKkIRCuVy;0M; zr7S)@kw-Bg>Y9SnJu#x%j5JM5{qsu|m`WB9`%znqA1=lk~h|}ZTZ2G*@swd5-s6JpSVH!tJ-7;<4{{3Id*!DNJ zY_Z!{w5Kn&p#AuyzQ^zjzelu<&jLXF&wH2%7&u-9W!YT9+t5@uW+`H4I}jJKMB~wX z(|g*64<+_gAJ%?)dO3N4;b)(y2{CytATyTSMGzc`* znZj&^^YCOWnebv4(879uxQtHYvI1_U6x)OgC}ZnFMV+{XJkJff|LnBKad!XP&NLpB zXpbJNyv9pm{(*PBsq|f*+aF}AYmnnm`|p`d_4F8w`p|8-J(Z;MDaWUnFYCi@_X`8S z0$+u=u3!WsSApT*l9Dn?c?pp(&K%BXZL0Ap(&ERR!xX8t%hE3wKFcc*p2QhnD#q(N zGqNWbwn?}}HJ{kqZ*VKf`;A4MBz(TSS}T0wCgZovo^5_`TDAY_4?r=W!8vKO|c(S0)MeWTZbQ;ju!Fj%%( z)njfp_)SXpSg(6P}{@`+ejYgCf)nBoCbAO8nK~Gt zD!d(WN#r%^zuKgI_n{ddQB=-DBzkwH)aQ5a!k>l$5QwTNNxr$hd`cyARm6m=$=9z7 zY-wH`mu;ud29~E_SSzH-(q^{C}y%piy!p zl`!hWbPBpa>#H3L;LUZ3DzZaHw3u~!{t}0LK!ume?&F`*CC)9M16E1oV=fv|!utJ% zH^fYZ>9Ofzg}M3vIHa%n%Apim8B3E&IfT_GFmsu2yS-Ge$Cz_yLaPY3=>tM$BH_Zy zY_ilsqE54~U%Ic(IX;8j`RNcUlR3i_zK<4GLP%XoX!Uj8wW-n)8aCp)8p1pEy&#SH;wO=T#Q~*^JR$+DIrxBwfK`a+WP2;wxg(_G7Q;~ zf?-mCHHiK79sA>BHXF-_g*YMPb$#2kg-=dBXPF8iB+f};pR$xD$+%#0G*rC--${u* zQ+#;_t{Sp&%>*k0%Yi+7#i)Y+Rv?)m+KNK5b}msb@!FtO1I|I^;=N0?vgFX|ysK!U z&USX6X7+c^YR_(hO@OTTs`?td{ys57;7RG3Tm<_Q|EOBz;lcvnxdK!RcOEJBsgHY= z7NAb_Bwo{frAJVaLweK~G$Be{(#H0uaNq`TR+^c%Q{i!p z9*QGKExU5V9_9=Yp} z`UK4yzNSAi5!FI1g4L9=k;RRyVh!Bs=i@BBAotjU4awO$^7E0`-iSVGKJRGlG*RT* z6=&PhX_5`!PiwAFMSA5!En=M+3(62kQ-2xOH7;`OQ_UAjMvo(Ufm|jaNg+-`hm%3= z2;7Y#g$QaHW5eH|Atf?WUN(CA$d@4{vp$1!5!!$W!Wm=i^TVI7N~E9**<`mUju;5y zkQbp-B#Qew_#i^>-o1VmBA)XN)?s@ZIUiTBmfWYvj^m9Oy0xIJZ|UBbR0|mDBi7x@ zV!n(e_NOIeqnTZ*m9uJy>?B^2tlP>STTmqao9*ycK^j4S%F7hGMcTNU(eM#nl(L|q zyau1n8^HS7Kz>bw_@|TRw*zUClZ=E4XmB6OOHz{Pfx$;yzJ(C{TAd*_xVse z?T|=}D0rdY0}2Ay>p}VH^q=}hgG;fqdMFI!Aum@qLyIGqq2HJ>C_8F`y%zco!)2wE zqHZ!X8=81u<8bO7j(*~TOHZpwdsNS@k{zX{)rDRHs?)!2&nRVoY%|0ML6BB<2ta#H zRT%yhLs}*jHF!+RU#$)mXFoorwDMLIbaT*b=m602W*HHVeCJX$E~kt72@RR>9nkpQ z3-STS1mKuYw5tzW!P%-wEhSnNgi1|CAV}bb>(YlKCzag&dimx;Byx&*jaRV*BY2iOf|A*WkkJRLBt=KD)zXiMD1s##U7_Z;X+- zjZp!qhd|<3#IB_VXJJqf2$eV>@mO_aiSd#J+S5wWx{^P*ka3b|C#viH| zoc%TZ@Nl`;%B(*rOI^Q%b$$E91tdPYpGea9lSXMo6LE14AOqh{GZl`-Qr{R7)01O> zzfr5T`m1faOvP{$qP9VWa1HvQJvE4+Ql@MAatHUV8F8l_h&nRiiDs_|U(1I_r6bL<$EahhMyPTIM=F0Sx8M4?^Zk`B{k@}WX_-iL%GCsg z%A-|L+ahs~nZ9((icb`K$wGj>`FRJbhVIUr1O?d)Q&FQ2-**vS;;%_dk_eS)kJP|p zfV65H3X{*N&7)%^Z|&+ndvxB2JFuHY)Jk?Xb*Ekij2^4aRnB0fWJyPR3RXL5+RsFxM*VO9jR+HG4iWSwJm>v)}Bc z`_(2S)Q%&szL{Q~jfD3=_7A**R;?@e)%D3YkXL%Wb!ao*jSAF1)2M^e>;t_P(@#AF z?zizrIjTCZgo3ns=h+_|;D^(Hk+!9FaDYcz{gF$h9M}!uEL5t0qqtAUmvDWd z-l6QXNrv1qCK_>lU5DvUGVHha&Bcx;TkguW40zch)XpRdDjug4{H-M>Q?m&~)mmK) zMN#&5t2e(4Nl8~e&Adg7J;(iHkiShD^0mUQl|n&{t&CKv)!6P!9RvB_`%!LmD%;)i zcQ_pHjzGj{dJ+y45BT)7#_VpF@jMTQ;fgRyGGjV_K(8I&fPV^QYX#n+UX(YHw%M9T z^y{u`lja*xt+6=d&nufD=~MC^VU`N#H+ZG`KQHH!`)GW!HJ;2H8A zdU2rzT+qxgWI{AEw^|Tgm!YnsC~kaW7SZ|$4@KI)>e>zXSVIbrUnaRsm%wc*5ra8?9z z?oR|8e(}^@Z}F&-z%;9sgOc8FW!)`sO18?cWfP|rY&%%7*J3>)AInd+0^r;6^^Sh? z4cWvE7F|f{vq=*|5xzpd35lPRg(s>T_RaILkhJ46{+tpF(1xWOc!VZMYf)^H5-|J6 zZmf*=ft3PnDTJ@o4K+s`CspX;$$nzT)c7f>L&sj+q4F%&84*Cs{3xqRZM*ge$yBq4 z=>Xq5MZO3Jy0WRv417Ru22H3fhjHvnE}%pQ$Ae}vU#;oK!Tqd4N{~=C@1^ssP#H|LF06oQJ?rExb&z?HFtYJ8u0eA@E$9{-zPx?F{7p+>g1d*)O(n* zqu}_NfsJx^dZQ~~`T+wQ46$oAI>{+X5F$IMdimuLq7J?2^|nc+^Z;1@=6IqKt1!qW z=%N!O#-$O0)*4Xsfn;(42w`V{jsPYGU8uP#$X=>%4ZZ6W0uA)e>c*lpR&*&&KQ*0_ zIpwdF%JzOc)S>9moRRFCoWLC07=!+GdH+oE8#?nDcuzwFLwxFGA@{iG;NLF#jpu?3IXI_+K{uY%$0?kQJQd0oA#mWgW0`JR z?yGQ6BFosDjLut+Zstat?nbZO@;>8t38^DNyG_!TVqaKQE<5tc7au&6j%>@Xh^%u_ zb#gjg6MjzQjveN`ga*Qt zG-nS-Ci?7KT?>Bl6Z~{7Bs$8M-z-ej3~ekg!avgE`%i)7C3;w*^sbcX9ZLVG?0+wi zLKy#7a7Y5jjpFW2FWuf;x|QxkN3Sl#kGV8KlUk0{z2kN?WRIOTm{Tje5yh30ow9=*OL!Pm;buMD;&vF*kg?Jp?`IieUZDDUJBt^|pcLVE@EvML=Lh{xSw758AMPk&y8h!MqNYQ1~hdW1`q_zOL zYqMBIGqSBXk-*M{u4=ZUgg`Atav4bBKHo44s>|bKHOnto*$mZ|?5sGl$PZxE@$a-$ zwg?kQjO6GCBE2-$RF3)}%FbLnll%A)dhYpdv7y_-NTr&jv*BxxaGjQl&pA*}^GI>; z7%Wk=YB)4-O&dP}XPpJqBUh)mJT1RbaSAMJRT7EKuHKvopFibkBReZe7JjO4yE<*r zmNFrMp}D*%Xx&+VRjhe5Yp2*;Do*ykDHe}5HuIA0y<*T(=g~4(;6>#FgR=TZ7q=)O#Ymyo{F~rVGkg%nNAeZ~S=-=cJvWq|U!@SGV1(%lu-Xs&(Le!KypW=lJZT}!0( z9oeKPr^sJ_IVA#(+U`0u?YkcEVVP1KDtBk8@bEdH-(qFE5KCxO((syF@x2${IXI(4 zCwrWtICoMsZG>XVzOe&0oI|XCEdzRQorRZps}w7^_$kv8L}|X%%5x1#c&zYXdVjh^ zbHQRO0D!2)Sx60&IAZp26p%^c^R0J?{G|Ux7p+C-)1CPxvgYXq63~x+8%z{KyH@JS1~(opgGTq6 zh4IT&lVd{ZqB;}IZ19(aLzNZO`Xx?Fqf!0evnb&Gw1nWa;0vrB8*Qtp0mU+2mQugq zA3zIKLJ6%o(Hx_XF=FzM^XMjxbsL!0*7+Q~w4m4YZUrDfh}#LjU-^YyIwcXqk_`H5 zj(qH6s`QBHFijEvmCdj|t@TDXQ-v&3{`$xaAPnMQ`@Jn|c_shG-`^W*oQh%o;W~1_ zCe@Mb9z^{l1y@~toT@p|V0n%(%#42wzbDL@JwOsGZ^Dn>i2F9Fb5G+)zpa~z<2ns7 zfkj9T=@&aFOSm$JmH&CqT;{Z4w*2hvMU;!>R zji_jq4!WnhtFbL)3S4hVrU0)K7=F;z6B*?g<$Y&FOCG!4M+u+M+eB+>@D0;{LTV>K zZ>3DO#3TG{_7<5Q?htA)?k%}W1$du-;-!NDG>J3tsee5<7wPJUWaKtciaom1k8ioR#N-JYWiWSL3K{i|WS#L#D|2LR|`GRf%ym;jMkV|Q&?z(!^&frG+{33V6lWN4XDf#OLHFrW# zTI=RNmOVV(THUF83{3Jdn2!E)h3Ad}xUVf(vy2KXNQX@3yo8LC;|c3iL8adRhAyQu z!ilbkd(8{%G7bgb`jO9ZUmk}4U`)E30vU@o0RCWyuNnkj#6bdLWu%bz?yW-1ZKtw2nO}n}R{;)t5TkS)O)ZW2 zk>Gtwd(5qC&W$9=I$+MIgC=1ZU$RMF^r~)B8Q2i#l5dbT;U~9W6o=HGB_VyXqE&1f z#2FAp%}_XluvL>TYq4J1J=pm0fjb_p|4NU2G4o+LfluL?iCGF`VVekOYuN4&iBF1y z9u;Osc24dpekHsl`S!%QlS~mfV*#=`*o^UWV*KO!oKA%iPc{bJk-QurGzU=HmMlV0 ze3P`BMtk*ha*?QO-oc`HcK^5NMiGv8KvmzflR=Z6{M8GKI=rt5ZQK$L0)Ny6?gN6r z#@0x3=b|-fLOO`=WwZt^-iZ1afXHgB>E?O!C>>J~k0AZ{Midpbi~uJ9^L32dywU9T zMSP*~z(+TAwL4-)=a9ib4Aq(0M^nt1?|9nT<;>p9a})U296&ykZjM3lcyTcgDR9^dLjz1I!{&*uBLHtA`*s*L$b+Bv5*~{T}{;0{u^9ovy2w5RfJJ`kII0SMQZDZ>HCe8 z^zP#B>_S`6IGA^m5LdX3OgfaQX+O7nps#oRAL0UW-PSF13AYs!1! zIh=4ht$}@A+5bTx<@22Sdv$FuKS2o$DQI`3Yo@dPv|W|XDQ5_p`=0V-R~|FdcpNKB~A zVnu)h^AZOZ4tY}2kHpa#`>Zs&EFTvZF{)u)DdU~V!E~%+MfjDKniZzLqq>)(ebjOq z?kjp7fnp{qJd0M>-7X|Esv7!QmGf1^ARz`buiuzX#*hpc<;i9a3Mx{S8;BXr+Fpvp z!))K?H0p`_Cy?I82+kR}Pak~Lz6_c~2Wr#n@<^4yf|gQcWLUMoWhX;+zxUxd1w0;l z1DD7blfS4B>)MTFj)&1+Q6zS_H>md`y$PEk~OzT@sOdf-z@N~s9Ms*6V%97qZ zdiA88UR~|d6$Q3V75nFIDGz(;(l#|eLgg6~EKtaxN@-norTqqj1hLCetHi~IJ9$w> z2!i^>Kpr+j0*81n%iG{PjrWu!1RAqeL^W=`);*v#3LwXWWQnVrNxO8U5aihCML1-I z%5n75!oeHu;g?1k2?TAu?*7_)Us-41g5#!yXz1@HY)X=r36#7&U>GN33sGth|4u;* z;HqcEKbJdCDhY|%x}kb^!nX&A+X$aaH$D`{kmlz3%bKm2+zONTF}z15S`TE8Rp|*S zr%~a5bl$}Xlm5#RBdx2mt0kuQgl5&R2b}6FFa>B1geR`MPF%Frk_?iwjesmmsN_35 z<8(+|Sjl9uuOs2iGnLFF;ntGGCVm1!O)H(Gs|}2AooaRzBl#6jwlAI$xDz_w7^mh@ zwcRNkfSz&iQNHBnh+6Jl)16~~)rM!QN)kHn73$~Z4A^SW68Z_D8gH?SBLY^8UA2PE zO6iE5yngDNnzoQR>KVsf4|aM5>C8HRZ;Uv`%pAo|p=#C=2~#lh=7 zNWpifTg;#O9R*AfulYEJmn`{8lHIt~SCRYTO4O`9IYGX`D6@c5Qld>)J7tdwG}y5V9%z(- zaleQ_&6+fAq-4$s{OxyE%`cp!1~gY+_tWDssQmm*-p897exI4ICTNcrh)(gj#I3Z} zK86XmUkc%2NfrR_6RP4I2ehX|f0`oXK%N!gyb|fy=s1!xB~97QXhC2?Mx>4Qu(@rSHM1l8cpoAGa-)z*doRvPjC01uLa)(59s;2Z2$2>UXxJEq8g} zD1wql6dk4d3pk`yZK=W0+IU9$1~KM8lj#4N%Sy&I>`D$&uvLZ?YJB{6Pa25! zNzF}?`uTjnHYH2n&S*SKT`WdmOI8+2<9ldJO=;p58;5(;sg>qh(!bAESjs4i5$Edo zdnU#r0rFD4cLrs=pfXru$J^`!NzlKkO^I*x0RsUGDK{2>^_2iLxG@MTXZ?p%*v9u< z)07Q-gR3DT4J6eYa`Z09BlW}MHYvi{j3A&iK^gZO0arA*N4ZR(O+}p(OM02GCTirf zGmyU?EUWR<3$Gm^@FEhJC9F$o5M|=ldLPZFu5fNiO7;CnIzwaw@{PJZJ#I)gYdc=2 zD4k5U*V4GTi&Rh5cA@|%_%eDlhPN0O)5446!^h^nmn$&kh~HtN6<`!gX;o-c$&DZ3 zaTS+1#%HP=8MXy|D(MPK8TXzNm-8U$tqM(U0dV@OdRRW;LzJvS(?TM?g{B@2iqsNI zvKq}PGd09N_FWm0bE`{MkHe~3daA&XNJ{ECxd4A#pI|hBtO^rd%3wTb{Dl)Pi8Q5$ za#L8ca;hUye2#x~Pl!N-w#8_{Z`wpHFN&Nt*35U<6bn+^qs;pj+a?r#q$&CfmW=!e z^b+XP;<4h7XE$&aSs@A1*1Q6e0!EXTUg!Ejg@_So#(` z$dA*h5%?>pe`|zrP06x<?k0Fb7Rp9Ie)takb%>)}Hng{yPBopGVG?J# zEJ9g5Hw4gsPiLItQ+h3(wZh11w#kYwEWXQXN6MaC;-z9~aF<>AahxMC-pkVAK+qtC zuQtK>{-ZL4kt}Qr@o4`9lCo=4>VL^0{da++WI(;OpoRfbM?(jg|KB;JLxJl5g+Q`< zg>Q})#DK`U`5$sf{{#}|h$!IyxqS4$bw`7PgOih!i;IgJ8yo-U-H`&b1%wJ15Ipnk*AoJXG9@7(APxwPiH(a- zNK7&&C5cYX$jr*l$wiQ+=M@wd75{(79o2vR{7PJwTDhZPXCR7<%XG4%p?m}ptr~;2 zgT$21qPPE#J35*vkd7t%vyBdr`M`9RXS{Z8Gx;BPq|()P@uf*PGXloZdYYYT_;y&O zyW{&_GksRs?H60Om7HXy52_Mv9$P)R^+D4#!kE}g1F>%lzIgduuye@Q(+70_x+2Uf zHmm&GdUsat|16^6@27XWgyz0mLC+O>KLjtItmHniLjWsZ-w_}Bv^bNTJi<{zuU-NZA8Cd7IF?rdbNO0$DF#Qe<=>4?sIg$Yx3JUKtWU?HhiX$}J%Zo@< zt_`!^lDb<&r7H?EmJut&9C-%`joDW0nkYI-e;`$4c`FAW=L|~f0dnQ~%{zo8wD(h0 z)PaULOEW4xIP4mh2$X81dKK3kYTxlI3 zI_fi#wn;hX+U~0Up6MEmKt~SaDxJH-PEuAH2Ux!Ptc|mOySYlRT2A(uSf(d^IsP@q z;A~QaedKcb`Ez)4`)_Q57jsV{*)Jv~(CBZ2)n5jy1$*A>+6`&3!yA^)K{;z4g2Imu z^E}0PK66B>qvqyz#VXhHPQRGjBFHjo%bZLG?(^5ZztHa`_`h?p``Rf;C-T}ib)*Pk zdlT>H+`_wcyB+r8(FZ>fkL_{a@65&jNrEuqp<_8ujZ*m7&rCdELI0>N7m-iJmbc+h z{8J2;IAkxD_=uG#de-!s^XKIcx5zg8K`WoC-O+Ew;+IVtz@K}$@-we&O0iCU`))_R zmDrVKs1JV4@IIn2bBZkCbmeG9>(!65#NqB%7EauEzwdG7)-LXyh^pb*Inx)3@5Z!D ztSJ9eK5~;>lP&}EporTlEqQpGS|M!V?Edw(7A!TB~cIB3_`4-S(AhuK45o~D0I6l zO;WY1=w#$b5KT6Kat=)R#0LeV zq(BiE1}zLK!6uENFN45XTt#v5fPqHm@{HsN1eVB|A`lM4Al4Cj$$*mbsbFDlot1G_ zwnWDRqh~T9WU&$MRL*q!kmv_AMYi5VEF_GH#~+n!!w+m$mSm)aVLbX-;^oHeGlBFK zwY)Cn70qGL;tC}Jp_*(0V0fAFQh`huKYHCu++uZuF&S}0){wwlxO%oSuN)#@DHjC7 zO)ax4+l~~3?gO);XIN&*LNw10zXLoOLR1@ZCcP#TAgrS;^}8AU_pE1$*xM-6q2y}xM9gTBwOs@)FQR5 zg%61|${`KuObZBYY{@^*_dAZ?6f!kRI;|6Yz%3paKbDW==%0R_4ixddkANzBCCh$V zS1Y5Ptt2{77iPcWXu@kD&Y@%R1f+&70w}6grqu3>s+L@NlcOJhbKQzjb%$c7VbRt) z87?^%U=yci_H);~8CD;A*GGX~`TNV~O9dKi;+N@m9jjvQKS!|;Zxso46CVVOw5Ubz zL5b%&v<#H5+ow{6Ap~aad2$S%Cz7g(GR&9}_ZWO4LT%YQAl7ETC`EBtPW=V5P50x* zUPeaNlOf$Q#SPjLi-cwoXNRUQu(Zo`*}a*MV3w2+VX#m%EKSf*s+25CBb9#JS$BK% zK|Bx#YxFzc%tgI}PDa$z5=lB{1k=&ql}~pZ`dT4@`|k|gz_%XBy%H2uA!=u<-^^F? zedkMQ_v?=01!g(u+}M16E{0d{UCTb~g~;Q!Mj~4?F!vuPJISourkV)P0p@ z&^>nStc%w`f0K?STKeu$Gbi9G%=eFz1vxoNJ<<4vCSg+cwPITQZyQg_uU)E?9~ko$ z{ysGk&QzcUmPUPkQ^z8`1345ST?OpM*C%KxY}7K04j>bXJ#@%{G+~zRAZh`eJ_04A)JLB@2NG?|JIEvfztyS!)nQCh6dlMec&~pcEAn8m2 zrJ!>p7gsc6%GYyc)_jY}iics6wE=5B#&-a8$*$E#4)0B<32lXfNZY4WDPBjqY)#^+ zwk3NOPNv#yfY*#y?|A2eBm2;Kmd`^=wsNz-9I@Dogcli^CM=YBjrltC#nVqI zG73J`4{_Zg0%G65@??I(ZF_R9im@sVc7;K+KknJb7pRvfxP@VlYl4^nG7}b4yjX)0 zz`Kqqreebt1J8HvOSE-2VrMvg_W^+pBsRVwZ>so}h!60$Djl0x`BPuqxhq}-8J_ok zf0fZ{6>qhL;HqxgS#9M8^zb;mkvAXC3A46Z`#ql#c)t^HUz4elTCyVSTSD}_XzFbY z+ASgW6^}1kpvkF^neALfcU9xroc&_tl;6cHHz226CQw6-W^uaCy+{}AbX{|s$4p4B znEfVeWaSUPvuZJep~@{cdI0)Q{qNH%y?$g1ZXjt1`3hIHSBihBnmVb`iuLO+f9yA^AFsx>6CGFli zs4I!s(54B(|GxBnIc(?5>NId?YI+Ml){*OiNbb&ZWr`zg71pBKAS(p0 zM`1rGO{F6eSyhIfQQ5C{ z(YUddGaBRmuxkgUDT+xW0!P(b<(1=7osst5Zsjj;!j#i-9YeFY>MIn&1biF9g_G@> z5vwuRNQF>c$Z~5m8%9hX(i}jFEdJbR2MhHX;YFxOW2(Z zihYxgjl5PJIF9AV3RY}D(`fT1|AD3vrPQ+@7KKQrT1C+P5PD)83JEKdM&KH(;D#m% zrvAHa>C<9u(B$N>=s_sV>ecK=Ai|nn;KWR=Rd*lGgV3~xQjgr({OnLz`r+DmtTxY< z)Qxl)U}er47U2}-){BZ9Dpkr7v>;XRPTzCqNykwZcJo6ybpG(3_fmkJc;3pT%;5+$ zm3wlq%N6S3L2wLTX9n=XWv+0ooU!C91$e#<2Kf&QCoXBWvm}?;8;FR;fsQ-BL+no=1{M%E5S%hpEXg{>?Ms0 z8r3zSj2a&;0`+3eG41U~kJs&yJnUAoKG;_rv7_3Kwm(hMuFxhbltIynNBahD9LZUN z>38i$^M`Tm$C^$2e%k{g=n-;~KlIa^<+d~9KMfY-?-mr=$c+jLfjv-8e#mt{W0`BP zw-DR#L3zRreas*#q%wcpr!p65htulLlY?-RFMd+E%9DOHjF(4L%H&#=yL*ZH|CCjp z*NzwN)InsKK^p9;*E0lv!L! zC7KUK^_e)CST+1fg@5ja4_n?AttM06v#++6Ro+85=OrGJtaBG#L;b`h{9KFyAyvNd zR$j=(wur!152!J&(zsE`3LG>mT}EhtWAVh~ zb?!~XDYUDawe|Mx_s8FJW4k@rmUx_mJyl-&SP8h!0pEAactB$@s#q;{sp^jSb#J#@ z4HR2K%j(mH>Ss6=Gg~b2k1L{5-g^}}ZBS>n%CopviaAi&&SqAKl^6J!mr}95+wE7w zRcvjd&cPn3zAg6*%L3f3wAuwI?0MnT!R6iTLQfYRm3nK*dR2+4GjH*jOS-@tTCe9K zR5uLY4cg!kRond%QYEH_pr*K$%jeO!QJ&TzAqpbd=e)O_dWfV0o8tb1SUP(`<6lz<1v{<@0cDQ`Qs znj+7JU2xF#BE`k`I14*Zlb+qGS?=9$*{H+QB-pXYl2gG~yTI2Tjn?}G?E*ZTU46^4 z!M~SG;gk_KM|Nwv5RZM51Dd6^O4g?~JcXw8eF%A_&y2x=moKAn0Ne}** z776hpqo1+cgNUCUrF=Sp9O;f2YtJay;lXT~mbz22L9SIBP8HlSbH7_{OO@V~k29>n z;gIO~>d^h1kpT}{;XBWKHmnDn(dVZYcQl9!_K#7m04~ER!HAglXT{D#iYCKB1MIEY z&#ZNioj+wL_EnCBdKJ7mneNXR$XnKY?W=<73#s(=l62_Jwq~x2bFa0x*k;!Y>kFx1 zFPcc75VBMH0_=6oA^g^oPDqM`hll-IeFs?Op(1UKdt_Ih)s&R0tbb_Xx-)dY8_3Dk zfUMYbvkgK?;ih;xPu?tnFOELN1LQqv-I{+5^2(xyR~+JADW|R1hs{^FpV}k?^!}#X zzsN*6W4$I<@TfR)bgMK;6A5(qz-nIC)w=h?6{|tPck|6}jci#gIY9}i5Y@UZX}o^vYYfl+$g?60 zoxs`~ZJJWUgeDr|7Mj>k+#bMwnsgSR4{L9Hu=lcIl<#svDr?2V8@VQxXfC(ccUfu6 z5`s;^(=N(1CgQV{nb=m!ADTC0%V9Y=d=1HfmSv0UkFwG}%g^RTOOy5MCYi8|baJHi zop)(8hf3pv{GRGt2yKljQi2(`TC~gT#%nCT*e+>E>wI-u^Z=$rlu^lIlZs>7v^i5q z+UC9%?@Gvrq<$Ex@^6XA0O+>7)OdEuI7DyyQ)VlnFyZ)OCq!r+IBoFrC8qyjH1WO) z&Y(K3>-dwkW~Ho91v4?9$_|kY7WI}!TLHtUb^K5%Ao=m@?4Y(t!~QQVOMh}a8wz5> z_bQJCbG0CupT^6zR|i_i!}(?pFpie8O|Ukvs&e6B2P^_Dk2C(DAA*vWrTAK15-6HR z66}3|G(C<8`Cq#uZpouJ^KUMsXfo9!M;V zwo-)hG>)@X#@t*sbfIjns!qr_i;z@M&}3&zscR1NA#y1JYPgqsDzatK65T)FgH@w{ zF?1Y$7Vz1g7LNqx_&5sKVJDBjgC8DZ618SXl1F$>;@bAxU7FUNDt^`?#CDFK*$MZ< z!?bh!b4GBL=A%3PQSXu#ng7AzT%*{F=v{o8^0^Ir<~Xkz9>Nt7f|>u5ZMIGvK_MqzI0@wa~d%e50z z3KRda%P9D!P*qLLTK76^i|W8fv|ha*aK!HRnJnYhf_K;?^v%1UVPtD>5B4#&@Y4HK-CoISYF#NAz1d9A z5yObxkQr!+=SHu*qu1K`$#;q7fQ$7aDAG4O zjJ&Hv^y7pTa|cf1CZ(|ZdbH}og79cFnj+s46ZAIQCsB~)J~l>71$5R+Y9@sRUc@~` zmftENsoD%4?MI`*pR-~j5dx>=$Y5CXGN`~Y+o+r1gseA=+6}}kYuDuN#`Vl3d&wxa z`2<`SQh)wKc7^>p^Fe~4j`THuf;)ZIHStCf?l~mS>?0n<8eBwQVe`E3KsN0liiM&` zP+%4=4vC8I9xSmG+cyy-IJr3JHE{9%t9XuPLC$Xl`bZgpVq>;hOIVL=+DwPIJew z`--m5N+=~dYXw1JvMjc2uarHbedk>Pb6~YJ18HgeVs%!>?I*?>p=;P~bCgG63wQI~ z+H0o1;jO;q*!DpE`>ksk<&oxuqd3A^U9j)bB>h#LG<=mYG^-^(pA%A#ya7NCdbC3x z(U`{728mrg^<>JHbY$?Upo?W47eq&6b%j#A(9_?Usk8pKt zoR@8*n2g#9HiVq4*HKW7xb^6c4J4U-#FlDs+9T!|qChl*z!bVH$RL^W>Q&fZm@FOA z?iHhjK*OcxA`nyV2DXF3Z~0T0#QhW)-U`suPdh-^%W@PbLQ}+lsN>^jUD1HJHTb~F zIu|1AQOg_Chk_4WZ$`x3VHhizGa9FVV3YTbfJL=I>t73buoy<>ojwtsUm5pfN3a zh9Gr7R#OyKG$_ob5-Fzlf0m?!-?1Jo%a4~F$v9Bc^3ey1ZylpDscVV1UWws)m@`Wa z6)MUNL;F}`D$w+y zN2HLrfm1E1AC9>?E*t)yHS=IBi|MlWNOIeTx(`^O3SK9gm~$VIzC#Jv5qwY;m!w!Q zx85K0OHn#;@T$4VaAW*Yf?(Kc*e;FXE%{@^XMt@T!B%;_gGK6rl`1>=xnU{U)Q{;3 z-l1+|Buz-{wk4YM6!4<3n9_W~-K+;UodVcfVjYDEW|@U)4bd)`c3s@7TbPq6=M{zp z8dQWAjHh9^0`kp&OWRKn>d<1I7)w<0>XlR&x=!0F9~!-C-~QoO;+`lQMl)E&6&Qf| z(qxq0B9?t=P0IZPZJhO$u5bu|8I6z+y zLO3UAv;|rkl43rcD=viwOi(x>V25|5FcLd5Yx5%Kc#xftn_F;Wpzp!_^JpHfY5bbu znOvASiRjpqoX)x`F@pG$g*zLxT8r^3P^h+h0tUC>w%%}Nm%F(hZ<%sV)(dyIlHMY2drcBFjslqU-g(*9MV z{Jfqf!-y#l6WF??m^BOl^w*K7yWfL^akofvj~~5>hs9z8eKueUAXx%Bk7|Q z+C&}bn>TTOl|FO2m`=bXt$`IxEs9#c;b)~sVd|2>m$R(^h+gfVmjjxWjbTBMawli| ze8n}4Qt5a=eS)a`QHnOBV?ZCyRKeSpx|WiWyX!tt8eOFLE+B8r?sHe}b6Bz%VW0V4 z=j`lx1E*kTZRJoE;75w4NsmesdZF+Gt+k z(&y6cZ&k$qogo2luvBDS$OU1Ib}npfH}*-J@ND#o(zq7pluZ(87Eb4J9p?gC0Eh5VzFS(RKpyl$7E7eX2Kw_xbiYwzX{{6g?UM?T z?d0?^_g>YPV4#eKlpVvbu3H=s9ly_T)nb6=p1I-9jR81sRxhR;=T|1c2X(_LPlvF6Nl6PRen!51MN$JD7bCMue!9B{Q`ujck4(3< zHki{;KdR$JXmebEM~O^Ugc$l_uIPUYD6xg5CPzKQIXvGhUzEcclI-cGoBj^o@We~# z6R-!NWz_k9?)+i9Vx>yljF3JOMeD_Xd!!66trv2|>eSsC7dJQ*|IWNwANj1uV5Sjl z4r&B}x{VkpzIU1Ee@VJztMS0Y`xWl%Au| z-6yy&uYI1`fz%S11dw%T2SZm^sQazyvi5gmEYXk$$Nj*oNk%sn7ZTFqF-gKPbiqIC zn2$)fyVS7D((R_noeeg`;_D^P(0%ZGhB9>9C2NqJ z9d>@M#=qVFBoLmVuCUvx`nzAIDsH4mi|ectb2>6p*Nvo9~*Gi?tAD2VD+<1P}4 z6EZ~2{ktCns~P2ZoOw&4V>BDTAfjbOzSiRPWW+bPC#Ei`yiUa<5@ia*Act7L0$RM{ z)n;yBp4Ay^7gw2~lOnEN>efeh`At+Ejc4bD4Ogf77tKXd?BkDyTj4U|pp&Lu8EnJ$ zE#{|lMd2yVIxq<>;Am22vg+!UB#TPfPnfM0und{3xq!F$RG@oqflB9KfmV<^*fOtJ zpnu5@BZC==trl_4q0smaKi}rCsY>eqO~kK6`4-?=p{8tBW4{z0l2=Sb)T#-!ZG-1S zS!{|~EKqSO6G1AgL4We7$EmAzXikI6UeYhoJ1fLje(BTB_Pvy3(KvE(&GJ@c4^WjX zi6*cdx4RHI8d*9D{wce;$n1B)?nU|Zp3@@bFxXf^`%q%P-07+>0xPX!=g5hz9RHK; zT##g>pq*pWQEt#;xDb2iBRjOjR!ImFDg}wUq_vwqiY~Hu1|3Ud&88}#)W_Y9xW}rC4$??d-9kO#O$v&+;C&oy7Ux{=b`_<}@x2&Q&?vTHJlG8Ag zZ#elgs_gyx3C+VlcT^Qa=$I?uP?&R)$#h!8|6j{TjwOnx|3}J4TxD{Qn5L6Jit1!X zNFhU2AsbgN=qy$4xDmVB09`3dg6n+|s;CXS+Mn$`DMoGytexTHBkM95Yl7f>=u6h< z79cr%aDYaHwo43Ydk?a9JiEw4hDT3*Qmt;h@8htq9D*c>e79d~U~;O7rR&57bJP_6 zbxLth4Yc3r(k!wV$1H>Nrq~_~##Am8m_Faf@pS|-M8U-hEk6G}`aDeZxd+?4i5tm_ zOYFAi*zsXB;;oOUamhOBEGGw*gbw_z1NS>qTd^^)Y+GQg&GyC8w~>-@Z(r@rDx-E#?Z=iwp* zDBNbeq4td+%s;*Cr9EmU$BArl@E1&W!0;k)vybA`&gp@==o6lPhi;l`Igos$kDo`r zCyb=5cBo`&+7vYEXexm?Dxk5qWFZ23%RgUabB&l1W1)u7Ql9wN6$;6JuOQEpJK1rZ z?Af)eZ>;frk9E5-?DVikt<8QlKk(`J%krs4&$+qXDz}rDD}@Ocn}CyNzteHQ3y1y1 z&|^5sztZyT=Ff04RM`=(FJY4&mp|x z0Y0dUZNDInWV885{D;Z8<0qCiwuv9-IVXZ99pLPlHj3jr5*}R5bSWkONH~bj$`6=N z)aSxKwHeio9^$XHH^#I^vitpxdfqb9qCV#8U3!EX6?Hp6cBUgm^~6+emr4NY}V zxdYZN{-R`h4K=JYj*2;u-w-uY%EfB3)q{l6Pst60D^udvbS5f|p&d_4pIsHeh1Iai zOG{K7VUoT_zGPG3HO-8fBdQ$gA&)Wh;tvMMoP*{KrxsQ00I!3E2)W_vxgwt8GKNmP z+^WrQI(h1IQpxdHOKnfkG^Sgc99txVF76=Sj zcy178#pCX#B$JphFFGmC*SM3jT+F@5GV&thPK!pGeqtC9|1qrfT7|uThM7?oy=O=W z&5T`{=u1#O2NLoKm`J0w0!$vK6f@-n z>jQ~7=j>N+*xIN@Y6AIp8T*Xt4%%;UhB={rA8xj!2YDf$Hi11frt{IagHdj2Q$Z~{ zjdBIDHC+6;^On3S_}q(&3JJ;iB*_)HAgsB05_8@~%Ej+}(%)xTsQ{zL_e|-!qxXu$ z*HO$|m}1sangYJMA7LjHi=BuO=`VS=t0almgN{}*UyYwiH@nT`AaUFqN@{KdyM0OI zXeH`&aPoeuBQz8`d9QKfPz4|it4|Fb48u(y5J0217UZxhn80Y0b2Gcf+q)2Ups}Ry+GY=mxWT@C)&_TA|24QmWMXJU(YO06c z(9>HAsQL>M5OvSDV`&Mv>yVCl*8RrT+MMG#_>PG4gm7W91EyldQpQUeAj3Y*C$Zx} zqZEU*|Aw@@r03i%rVs!er)Zl$Z-R&C$2^2szE7UGZ_tk%X3zLO_e>9=p#uG+vhi3$ z@%`Ue{h{lpUY7OnBRPpuI0lzYVu!-@mBd)Z+!NTUP(Oq#Zh&HG&>pkDGVM8T%t|Nj z4>oPC{n|HpqAcgC)!v2{Cr)HZMrbbds?yBXl|*6OYJo5o8m7hY>hy z{WYG*#=M$oJ_g2=O#FGn4&!O;RxWzUvD*NKz+_Q z-5-xNx8okM0f90v49io#LxZ9!5|f_!X)xk}@9uTl);Aw{_Qu5Is#9G3X^5z$PqDGY zYUXY2jUmBAg1pTHXsz66pcL;sZp|)zx~D1TBfbPklqBJ?Vs>^G`LFd1ZacBjw+0aw zPT?$~W_+tsDs-bx<@(RtH)6`WL$WU}S? zFqV($WW5Hd;$WcGUzwV(G=2B#u2kC_M+o*Q8dd<@_HAW5VrRw;j}*xA+$+2%9^WwQ zw;t+w58e9?GPAr8x<4PQ5PunC6i%NrzoWZJ55)HCHy8L-ipp9=U{5F)z+W_?qeYK+ z*7hm8;Rny66ovK6ds|9MW=pE&vtRgh+~Uf{&Ovc`pt!7tUi_aiU74i_t~=Tv^T4HyS?eF7 zLk;xaF)lJqNt~~A+L-!8Z-i!gXJ@yQzGbwpu3m<7OJR}-M9KI;)zRyzJaa@FQX@xg$Ve|w{%u0pF8aASQosX2)^SnI*0z0AqQgm1 zg6L97jQS0=*{#b{7}#`QJ9VUWvbX!f@SnX7QZ`qopef!YIOQ0}a9)quhV*0LGd_cs zU7a77MaO5TEPpc3FemT!R|M~mT4WRG)3_N4Y=p1rODCToiitAu}`HBqMX?=B+VLDSM6ulOidU7v)rP`w-2%yYF-b&sWs7+5r<2t=O9TaBf0VXS(1`YsE^bYcSPx}?x_Zz($6(*0P=&NMH$(y7z1&qs-kCN9D z1=CB`{pkq9g`5_cV7zucAr;{}D8#2C07+x(5>Kue*?Ltpn-Ra}EDhI~DaD+oa};Cm z*I9V<(_w)E7`uw$Uh5*J>kc^EhkCqo=~ z)D0%8&=MT{p60%CnWXGD+F`-m_oxADo5kJXgd@RGB{`JGG7Tg5={A8H)aJRUz5|y# zmRH{pUS-h9#?7p2FWgAh{?BG!c~qg2Q@c%}dxk zs|&Drj)l9zN9?|>eyLye2*d2ge=e~L3LD>}a(oygd5OeQBKANz9v2g9>yJ)hqm%Mn zq46d|dkHyMaC;sO^;@IK>SX3PogFT*p!@P%>e5M46_rsN9r2U^z9`%6Jv<(gr@{|X zd+a|S}3+uraj=bFFHQ(7$F?% zed^@0kL^Xr{ISnPS~lVfkn*%ud8k#HPbHaYL29}087HoRA1B^(QwtPSjvqTe4GWPs z5FclMnel85sDuC$yylK#EjS+Z+)65>)5>36!|JLTTkC=A1lmss!*cqB(ur*80p>qRfU!>-G8?!I~kz@T!JT7aAm`tD5 z#+IlsWBEqH^+~p$71|p4B~G0(YyQP^a~cxu;;IR_EV>zSjy6-IdT$?rm2|rZWxWaEw)a;_8z0|AArQp!UvZCfGRJ-_9Jy8x5$ult-6Oa zjAXa|5)$#Y2VKe9tb?e8Y3YL!n48&pPm6c=Okd@0CCa&Qtx~F#8TWgfZL1)Tc2C0V zFUCOhwRN4u@w5PjWF$IBJw6ZU+u=2!>}xnqfXXlD1iZQw!qL5s*&{9FpAF9NE}Yol zf}9DChL4~JMX6cXSCAY2Oc@lzW>wCkGOMr}%v{7bS=G)|t57P9m@cTE*e@f$;EDFy zdyyd^c$p-+OJ!4li%{P_UhzZ>wwY!7o-#=d1$o z@|Vv{+-oK$FctEkR3D)E*fy!}us~g7eB>Nvv9h)ivjTi#rlO^PdU2^vsq< z`~R8Ir=EXj$@&KdhlWQ+$Hpfnr>19S=jIm{mzGyn*VeymY;Jws-r3#TKR7%(J~=%* zzqtH%_5J$h_U``2!{g6izyJJwLc;{o!5a$tLUGABjYk^_2O^1?74zVYMMJUFFC8~V z8;eI0!O}5w3QZ+rsSvHFD&w)H(uqu{)p(vlbJ7G1 z@8)!KqWyo*j0oudJ2PVVKg5h?YW#iw!;Flk<3(>De(cag!;EALnEc7MMo|F1agn`u+jygl3ADkhrio%`c$-OR|MH2ka946<64`xH zQIdKLd#Q)Kt^!Gt{%c}Mda=3{Rs_aR$e|RecoG;O>HLowIR!YBK`-8WGy37h+)r?gVLV*Wu~mpmWNS}8CCtM-os=zU+H+XhPdofNdS9kFzwpXN%abVfVi5>_D;%pdLfxYYe;QM4iAF>7fA7-OfBBpCX*W!8rr>_PF(OWQjjw;Aee@mX zG{<^qd9iRJ&uMPQZlw8UhlIvnyV2VhP!Z8>x|boMPhy0M)SdV!f_s*OgXq^{Cr0e; zUl1TlHsejn%%j^g^?{D!osVbiK|5(`hSp!YaR%uxizpJ;D!bS}&s=vb$W`us3}pHP zn@L~Zy!jgb;_sc)v$Y@hfBgJ%ei(}p1=ZITe^b3UZG2;Rvy#&B_3;`%?dQ+g&gb^d zvPJWLb?*oi{u?s_N&UZLM%u`G?f=S*z8C*r#Jy)wQ{mgM8uw5FkM4p&EKs=|w^59i=xx5vhuZ2ne)o9#h5Rr7!Ho1gh9S|V3B2u^3ew!NThvyD+Z5s?B);D>1#-Ii zIfnVjh-88;B$~RLpnfI|1kRs?CMaKoqZ%Ra#Sl)ePQqPD7{MCrkdVW)K#=@99<_!e;n)W%?0>p%-_+V%ymp=Gb6`1VuRKH8Tav{4A zZSGWOBf9F!s9A_e;}$fnDe>UH(TunSSs+!T6p`qHl32~lnd`=pxNfvh`}-}BB`)&G zee*?41ksY`_|6Ij3PMrGR_0})(<^F)N@9$`)ZV!|>u++nJ-kB8z?7nVQk4IN8T|^& z5;BXfiu(*Iq3GYCu(rQL8Z@u>(pZcliL{DT&{BTrH`pUksnK7!T)9bmTi<)kOr6Xo z(9xRL6FvE69`8+tKJ@mySa{1U+g|>QVM8DJ!dm#ax$Fq+M|Gi!U$_(|T$J?JGJCuo zptr(JGZ-^k{(u%OcQkoD)hlAmTNILOA^R-<#g0dyx8fpH8@sbXH^i|boiAS?cHqZ( z_{&FOcJ9XzZ&proi4eYqH2L(h%Zea2>fd3(eRM)5bo-+k?5b z0Qn|h9HQy{j2aaG(LY!(XLb5kl>K~;|sr+qwT#f92bZI>~ z59iMpeD@BkxO_ciatbpTAMGZYVMi`%ccxulz_6N9UFYo;{z z^Q0@?3nMyp9e-zpXEnJoDad8r&$v1LKFyFBLB){QvmJp%kMqV}(bh^S7HS%~&%8KW zxR413t_zVxmTB8c9?;>Q$4W1)-EF(r4K-x4|4h-;GP69Qh-IVkm^ofi_`4Kzxdj=a z75j}1&m8hoert=Jbyzu_@U65!ow9PHDJ{1fO>>V51 zCp{P%7G80m2u<(Mf5NcQ_fY|JZuN!JyLSfG%Q$ca6DD%FMF0&d-*V<{Kbtz-voidR zIIOz(WJ~%W2oq=)tPY}_Yo)=|c)sD-RsTOR!YkVzR zUex>=lLXm3c5eAR=8WlU=^9sG*9lP8xqPw}z+OA!Op43G${AH;8 zLI@%@lF#_UGA7A~R>a%uEaoO4_$HaPaRfOV)FcRfzkk@NMmTmYG2pj1kmkgrSmcp@ zt?gEUrNtO9*A)=8BGD!UH}8yJxv>0kZXesK$W88)nI{u-z4JRlXw9Q8J@0=$w}iut zGuut_YuyxW02WHl=y@L|(wO&M@!kcNtsO>FT|CM_i{FZgX_2y9kybSWCjai*zTJBi zH|Fd^*84ZJ9k*+}g;s?Bkb5NLn)=u90xw}Q<1sZ6MqiY9ciN+( zS?$&2B(RJ~zdK25j3yCyGS6K5_am?<9|6}z%lc#_kwG!iXHki;5{-y*${IyU+W{%r z5?*zM?FT1JC9AjR-?Omw(DHG5;wjvxolJf1ZnGL|M1VEy0%ny$zL9#q-%hSkzAu$% z&^HDU*fP28X_st+uoQ&?4}#{vcLPt8+!aXXk_?9C(a-lahP&g#E|F>ih-jE=P7+-x zGqPVls7%Cc*aIaZ8m!rts<0a2->Hlok9d6f;Ku+)b}X3M$Au)!x6H@sXEJb*HSD=- zG-C%a7ZzAwnVF~H@?MY(YI&nE%sIv-gDr>b>!RCxeYvzdsiWr})CjdaS3tXh^g(#i zUiIUfq%p@Ik`1}x&$VgmAMu!5)jUIdAQEeEZJ>;8yV5ESVp{fv#PKuoGJtci$ zT(+Z+%;OB}Z1QN1f~2Xhxn9+5kS$di-bN-Bkw;@ z(fpWK-MJH4lrQtdqs)%bj5BWbwK#(zm!h8qu8YxYKK@r;&b7JZ-gz0-O813o5t8=a zv$BESdPX9!q=IT&rH(w0)|~c;{3Wlz#k!EJ^M_v+@w7F$(&zjzu?)ZDu(d@|$aNaC zXolZ8QYqc-$V&v&dwS&3S9blO&R`4Z_`yFwl(j&L8pIOwJc2nPBgt9?~kU6g;ne)!Lw?1P2_YpnxKA z&>j=mC9$6PNjR$Zcvz?uTtJTRh;vRw{94Xe=`3Q5GGw?ADXp!x`6)`WV|_UbyH$vj zUNX$r3-Ix?@>h0tJF}d-2yoM94^Fgid!he#DYGi-Zc;V4pdRZDj7dwrFOM(3r<@zE z6jGXiNQ}z;MrkIwYw6ou{kle@VbROpn|$CPbb$h;W#ccc=!PT9?-j0*EV9fzbMiT< zyj^Gw&Eprki))|s*$q#rh2@1Pc+y<7lIlZYp86QF#;qPOXR%4+9q-)kxK|YsZs0my zP*ab!|9V4ZFk3irrL&evKjY*im@5f6mh|k2V0w!<{B-=0*qC8_s%VywouF0vLX^0g zqPe#Xq;XiEDk!wZmt0=aI&(SPJKTs^geJ91e2&&Xj0`=jF9-Mpw;wum{AvM4!PzdI zgN6}eC&=yn=Z_t%M5kNc1)Ddm2iFaj9WbTD%f_gs{G@B1snAS6=m90ru08ukc# z*Lc+Dwzv{C#=2u2ZFW4KQfE7wvL+lTxJfNHFahoZw>8|X{SG?p>spM+0k_K?gO^8B ziE_SfzT`ZIe)LC@8P!}7!VVjE$W~W@f+8N1(Cpv(6edyREmWXizhgoEXoXcy$z{L8 zF4sf&)3VyvJ4iYp)v)cNi{@$Y^YOg!v%JMy!)d=FIXmy=Hped3Se;MR6$BUGKWth} z65W@GbijrNT>rP0qx}35?mFWBTHsk!qcdwCiJv}QjxwCLul#o4-gOnD?Dm|KjT;c> zIkJ*k)nV_oodp4i$xww?7eDkr^TZsK(!BI?=^Q^6j1F^9brXSkhszh_CKFlf;abKz zRDHx;Ohvz{b9V8FtmhplaIl`eHi|X2pq?Ez9b2^SJpNmtVAbs@Bq42)C-G-g3wel* zcfn?Cm%wkM$kFm#>fGv$mzBmI^pT+q26m0)C`GaxkKD7KuJfos8b?(mYX_b|zj)UA z#JfGfOdL3L`Sxh9SACf_s^-Y#YcQ1Ryhn$qVCkw^xAk7S<4*S1G*oclfm z&_fRoQg4R^bVhlkgPct;Fs)f}tAOQQNgMd}jzf%pjZ=MiY@5O;&9c?Stf_pQoxE?M%c zVE>Bs=R%P~SIBa0SA*)uUyzXG8w!6AemBED!oU@pO3u;$Z`oIK zQ;`%iXl)`2jdd&Z4JcoEi)U7w>3YDmjuiZ5=PWN5M(ID|Rk>l@bfxsftk_X396*YI zw|G3U%IWPskxJgr=E)D`O&k=!HL{oYO2+0#Iv5pH z1o*9#o5WWnylNA}32a>J3s%q@#3XO0h%i$dfw=IE9~O7pN5r^VU6Ob`U%NMz_(02@ z6q_wfs->2X#;yZPVl%gGG;6Rg0}{s8bxj#n(H%F+zFXVuu7gJf`-aRUHROnD{GKJ3 zMv9?#e<3%%YNYsf*>Sgq5IBW9S5zM-K1y`9CNAC$me>?dH05raJ0Sl^>36F=rz6eg zu2pz_VwH7+I|_>a!o?d&fy(I9nGYx}%XG)WVEYB-^#2~_ zGVkGsnEf78d3Vjf(vgdK#1L>#TWs6fdD70UOzH0=^8o$7VMZJl`)cib zJEtG=Pi{xwlVRTGdt^##W2z^lXrB%c>}%jjZIvX#l|DD~FCgc5sO%-`Uy(l86%e$- zwF`ev<0X4G!Ws;U}Q1u!+jYDN(=V)8(o}&#_L;M&B@|-4gk-O3V3M^TB)1 zQ`%qXXs70q9I4N8G`+X@D^ZHoa(G*Ki0ym*4*m8(8l0uzCG4hu^KZ({QVIt1qObF4 zvaLs7j~O2dW=@3JI;-~F@vypo4C%2~HE<~z?%Y{?Mv51D;R3&}REV55-KF8pmG^F= zlRo5VDJhgV6uCMPs7z{_fsj|M>jgE^JWSRCe^lc|c?AaMXQ3+b6vfL?mZTgXRf%t>L>SXHEk6hb-Rq*#FcPSF>ettby zDpUJAZ0f6Q_nu~^cSq9053l>-g3puR=Z&%^(aIckM` zeG}{9TJqHoVD0h0J_$B$s{ygemV|Ve1Zw~hS9|G2pTPB#>OA29!#l9|=|RXonAf2R*Zug=I&F>+!ckGDIWvZ_pS3yD=P@hglUn zvAQ)(P7AVBv5EC!9S3lg4fvsnz0@VQwt^B=_LU+AuD<9gdo3a4P@~`N@exLtY+@q* zF-yH##u6ljxDK#Sr4%S+jc=q29d;`Al^*J!DQuoU6Ot*>@5hme?6j)=s~89jjf{;? zNKVVlDJUNDlFmD#6f>@gXn8Jym=L1+%73C}Tu&i!Yf!_jAqGDSsr3gYxO)}UDr}nYk zC`C4VjpV2ebNq48$EDC$S@B9*nAcIhg%px0*)h)$c)~Cn7KYw3d+6sfHUX^@IDZA6 z#Cf>JkZ$5S-&!Z%?=iU~w7B-_6(R+fK8PvsTE*;D?ad3l^$}!tvZWBI8GbRp6%r`F z|EBDA0&V1wAhU&FS=fx;>ZUH4VmKFkeg}?4E3l2j4?J?0V3Qc?)&zF@Qjv$YYvp=g zo}4O?nHuz?4!I^gzz*gRWaV(xE@j})*7Pk|7EBqgGO20`V9Fo%Q;EKX@c=qV?WI+1 zGlM)VrrdVfA=Uq<(gF}8dP=zxB4`dmKiGuhyg_BVDsOF18(HYm zL7WN}XgsLn&n)U;CztTTJ#Kw(@@RN&Gs3AgooyLB z_x+3&%n_l-70Gh0SZ*aPIJ~aRF9?~uao;ipp0Vb-gSN)>bqPGCe&Mln1Ac8SvXITK zpz@2h>&dw33lZ3dYW=E9;S>*PnV@~F3Nn$)FxDP(uRQ#eYfeA8lrJ9~H3GgbzImpn zuW)t(E*|;lHN;2s#|IgxQ`i}yfa3f^qg6hucgt;SF8iO@c#PYoGrJXPO}39C)6mus)V)@tw|n3HCbQkq-?iMf%O{idp*adeD=66ym@4y3ebp{2+OO#lO)3 zSEspbnhHMs<1y@dzQaM(LsQ+%{XK>UeJg*c_j!$e`1*`S%@^=U!Z6a9q&W3^Af>S! zVvX$diQR^vgN~{;b%fsQCFVfa=wGC*PI4)nS0ETJ77~xHLQl&2dIRLv#YDeLbk_sD zG4{+ihv~7XdTERf*S3`xxw!5|skWWU+)5)p&S^zuP0n%Ef9ay#t5S(ZniO;}MFvRKTW%Iu~0<*O$4SOgILsIvL zT{zSUx{o9EtXWrmZq};mQjRw#2rAA!Ynyu$4GA00=*6JmXa0eY3QLpEcyqzfEzRju zohMGA2nh`g`xEm)KRYt2Emtz=2U%^DDLsqlQ;Rf1jG-1mPByvRHDanLi*`^;tLlZjT;-*rBt{?H z8r;&f^shCIhgDK|1nCM-`s66Jq9lJnJGi&%U2Fbii@#=t1mywpomFV9;s|uC>LPcw z)aa!J6>}qGNb#YBX_jW3oWz--{@8)zupu8!n2;fg9-J8X>~QIMl2_Py9BGb|S2s0s z*Hn{0PT{L4`bj9LOe6fQWCf6EZBE!=FOA|v#|LATznD>IPkNiDB8`8Rj~COkH132( z7zObO0Isx=u#XjLhO>@6Sdq08+2;ld!_m?3S<0GRQCWbkoJvqi^(^73X@yBZ(z_jz zPfYew(jP+u{8n#j8q^n4X5X+?)V`5e2n6jJYOP`T7*4uP-FF8ZA$>rimGsAgI>Sb? zTJ`=EsCnCaC)&I2E_d%Tq5#bm%6+@D_6}BAn=jdypz>Nex{a%3oZCJWVmWXC|BC?+1AuLnsd!a2seIWGaMZLh+r2r1^Mt7867{X zhr=4sF~7gbs9g%242f2DrxEQ3W~|EJ7JFi9$JQX2eLvb1MDwkzBKTwCVmO=feZP9; zHz9$|dLKe=iZK~l8n=_Iin_71m&wZet=iviCETW65}oyURge}#JWbbS6|E#1Z!&!4 zN$;st23283&f-MbWjPj1>7x?3O|7!NO}cIFWFQ(!ssw7vrEp(w%D(yZA%!i;vvKBa zVgDD}&3TZv_sio{Nb_=}aCK2i-*E`!0K!8nvmg73Gn;~XB0YvzSmPy?v?CW^?2}zUOm6hA$~I0ukVF)TxZ0zZ6Oprfn1G zTw9v*HjF~ao&HdciNzfAGV$>&*mSh80PT3J;N1=+Rklqbx~dFKY951mndDKlwH{q> z-t!DOAjHj_Cc(O|JDrZP8?sQkEUM7^8vSobr8$`@a9Oz%ZtKQZBxWQnzFnTqKkTjo zn<>slIbZ$0u|G6N_I1Y6M%X;1W@wt$%~nF?G}S|L9KMfL{^Y_8{sY&7$4#FA9N!$7 z@?mdj$~?QIFgy~yg|b`8?P`StKh|nU%-mmwp!qVLGaAG$K9yVbbb`5~@#5+lnw2D- zeGQR?gyM5j9u`R+V&j~Of?pXc z?lO}63u&&z%>7s%4P%x5_b!e1!w~tMlg)5ybHlH~#OqF9!3PH37zT5fX&pZMJho<7 z8!qFo%nb^Pk-D>c+U*W13|7`Ink$ za^`o{6k;aB@edQFIx2#DS&L@jn1sHf0~HrXf@EMfabi-ppWRCrzp>M z-SIqhG50J7V)~<2+I_e=iy)QdIdkWCfYCTH2W&eRa;|mmJ2u#7Nr^Ee37FjN>Hl|N zO!!K&ghe(%2hA@Rjc}Z)TqCB|?}|rAtF50*eMH3*m<=?n=Ir1%81f9GFkcHto%6^k zkH)#Kvhw^bG>;P4J5eOA0NLgyMUtc@B=; zVO~l>hVSDJbHjHO(#6NeWJr=vRNkogCbOs{M`#bT%}w3k&?Yz+l#^Z=0szJ+kS znGhY~c0#gC>YRgb2xhR}NkyHIRCW0fw8L^SVX2zw{o}bv)wK$-k%Zz)9k*N(c0;h; z4s;Gp@|y6`**IHDv{YG?)6kM39!J#A4wwo_8GLn_sZ2)7i56fR{^(DC_jb08470Ym z^JaW0B0zN~r*8Mcj{PJWnpPsjl)B2$Y(Z-{s~d;X%tCHbd$^QkT$eSSJc=31XVYPC zo(fg3Z}dM!(y>L&c0-{0KE|KKENs{_mT+4;xLu{WOm8)JmTH@Z?X6BI3bVcG@pL~}anjbpFvi&oJ)6(}`-`DU@ z3wJOqFUWk0w5*Z!Y zk2^N!ch+-L*mtejFR}36c|_dvI#^d-to1%iJl+rgE~&p(IimFcB_X zi{P(C3(tp(@5jm2#fIxfPyng=_A%LYK0enm&b##{4k4t!TIShS2OVZ@~ z?&XCXs!T)Z!+r6o_38JDs$~xG`9pluj5jNMi#gtq_4t-disf&x|D5*CN1IW-KP<5w zDEoEzr0Ad!D6S%SNJy>6a`;t<{~yMT8mf->V=2Y$Xe2V->Izz+aW^Ciz>VoOUM>F` z6cyj-Mv1heKyogQJ|27VF$NrQ+}k0(m>@lX#?SQ+p^Fnfr` zU+f-CxT4II#e?I;)`ND&#^os2*AZk}t71MrCit+Fyyipilifkny5%E8M})*&T;mT| zNmL$4p!9(39ItYsHI{!}Ge7dqMLMCam@gYY^n6L6ko4a1oJ!SwOhCXQMwd$Ui;BEO zmQx3r?K+&9rqY)>=yuUy#K?F^lDLBYfYR5Idr~Sg*&7rbFWfwtWTdQ> z`XdW@_%EB<3=#0$%ugzk%MB|hfK)8j|NeMdeh^lq{|NSG88|yUl%m@;oO~|pvHQ&Q zkNpDI5%qz%;N{072x6E!+@GUYSTKKIsh?uQPI4dltn(MyF{0EOShsyD$)-XbCMRrQ zBRZdrf42;X(;f&L-H!=}DKPrIjVkB*GdshNwJS9`d3?~SBzBS)s5(yDq97K|Zy+Pe zI?u7$J86)_j>_}Tbnk=~-~vk#rM;RWKYu;@>{B!uMJyfFVh^#X^{&VgL%TA{)-xv7 zx`E+g2KJVd*U3wsFFYQ+Y<=SpGL<9xK1eetAX_(T0L_8f)5ma9X(Xqed;O|GeNx~a zMsoHV0RLn^h}o|F6F!g#Hp;&E=34}XWD}lQ!=gup87FwU^O{#Siy(1#y(AC5s4RG< zO3)kGobKI3yf~h<_M!^jAAI(O#qn_9d%zNGk1n}|@^oCJl!}x3cyq@h&Rod80fj-6 ze<=Z~+NFfGqvQ__aOT4z1Q`!WLCyjxW$JsOifokCPY?qwd!O9|4@v@Dz24VLMTza@ z>H|N=IJu!}<2L(+sdVIcGXR>6N0@Pkif25JiOy;&NpXjbZwjZpT4y=ZBm+^NuBlot z>&#eAz70H+{jInkvAp~{_=H)xUQc}RJQ&FOM@BK%LwJ*dU{BK+#p_P94AIkrTiX6G zA2C(1bQ)!L2?CzQ=)RCK==fV5=3_0jSPizw*RiYmAvnSPhnfBi>g0p=&8QHYCeyNe zsJgQ8Qt{3MXY|%76UTy%;_VGAqNR%-T`86{!%L;=rOgX}exAMM>zsM7d1$;YNew_I zo&>dQ8NXpLu4%d`-{iqNs848ILGI&1sQ|cVkKTlvPL*U|U z{aPV%S&~>8ynmgiHEzAZwV9LoaI%6TFLVObeoldSt-vmti>o+vJAb9zvS`w z4hxZFmt|Pp75qN$ld)4%1=ip4`>{E+J#> z_s487m|anM(WTF#^G}kVnbW6cV%Ga2wyYys$mXRtQThXD_zq3$dm6en(Mfu8Qp*)5;HdTw$ zvp6krlOgGmL{6JTUYW!a$)ARjixMwpv+U$37?YS4K2VyG$u>_+tw#uE(U*CcQL4JC z!z@`Q0+{-45_ha4hRv^shoNM%_XN#Kz`HM55K-{CnV9UIub<{FDuTOFj5A}lnJU#n z_>M*Bj@HtY1IpE|t#@)uqz`M#Ci zun=l+N0F|FEvu!3Xe4Qgrjku8+ILUToS$a^r!FH?$rxD$Ogs#?RL8*)Omh&&7e@6a~&T9iP6_=A5rssn3iup#{th1oZQN zM_I`U9w#%>-%dnk{h==SK^kesYWg!GA$U=VKi_TX<+jxuaY=w|@ z%A*5$=z-oxANy|`Z?6p1NAFh<9K;i7Xjl&H88@zFeTDN>FB*e=x8(i#ADMe2_2(P# zODl1~G8y1^9|~-(A8ma5YqZq=Nw2N=9pa-~t^-L<(aA}>za3(jg=2}T`hZ;4$NGSm z^0@Dfq57*IcEs)#yO=9))|+?=h$t*ul+wNk4uUUGy`FCqO=B9dWLBm4gjX=d=1a?2 z%iO^6xn-r9@TU!b{Fo|ZP66I#Sn8=7w-VS6p&w#`yOYHC@=|kB)kwR#_WgRRAGxiV zZLZtuQgtybytMZNz2xB~cwYU-Wda5^&Y;9YqkGda~&-EX9*wi!kFel~HH%wk05Vt%DBr>lSR zZigGCH!$*b|9@DcEn*D-%S7ZJ$XkP715TzS$GSMKQv{bhqqCHi13Cb(vAOWAmqhCaS)w$TR)vxZ5>m1f^zq zfXG{Ru7!4>sn=lLYp}miivmW~GkOQLN1{OhwVG-hG<7*nE0x;RlLedgs+pcidx<%} zI&c{8P9w90XEK4(*tF@<<})*9Q!dzC-92#1`kp)D@X zq&sPBG+b>Hcj?FX)78Rz-3@OTg`EK?f10!i8;3)wVLGMgbktC@(S& zc&snOK@DTF?Z{2?VRYnB_WsFVd>u^_8 z#3!vr`^Ll$pqTDc|L<&llwI1mn)kDfCUNfuRz}Ncqvo8!wbGxn#06$s**sc2H$*I% zYYzA7vsATP=R_thvYZ}BGbS~Rn*!3Me-p}GZLrjWPdh^1nkdU%tCiQ8-`)Ex81eP% zzMt6bHI_v2-;nnEd|EqO$!yioC>X<^&pLx_QPYdX7BFIbcpHoI4v=d~TOAuN8_OWV z`6NPRI#BDZCC|)5KrZdOo`6&9Th8Rm;sg%F#qu2>S0o~UmDesm+U7}W9xMrqcxfVfAe}AKPiJkBpuKb8`a||Q2_*=$Du@h~^VuY3 z3(+M)2PGow83WB_AUeIDq|el}sNoB>mfE!D=XfFo{bI1f_B34Vp*v-))2v$R1aGW9 ze2{pifR;qb#+A6rwfA~mWAXnr4LO~lIiEHakFwCAE25NiD(Y2)y8HA_|8Iwem)eUS@ zo)yO#>(gIky&?CUCnc4dx-VuwCfRnW!Qs@(N~BoQn(SA#H`FZ-qUL~}mydAcKM9BM zu}O|v<1Fg5a=7?&G`i$+Kh4(jUJ`bwh(>~W*bQBgBFtp`ALW|3psLW50gq+iskR`$ zB~N#%mlRipQbbuuje@hWl}m+W%kWm7mm!~)0!mZ)`zN>ERaU7`?;6bwfylpVMrOZd zSRRe%(*1UrssdkW!&mp995LkY=J&LiY4V;loZPXFCV%q*b|?2wv!8yH%T$E1XX!(e z6vLgXGO>FLJnLu@zC6J`r`|&g$&cPD&%bj$?q$d*gKmcUbgT|96P^a_dNTpTWR6q^ z8--_vVJ9TkKvr3F?k2``iea3^ywfoZx;wM?shYNjmP=;_V$@?}z`WECAe%KXiKp7| znpF}mV$t=gPE1{;U3q4Yk_ZSGJ(f?ZSCeWUXMJM8f$yYQ{B22lQO2lG7UB^`gq-VbX=7qSe7&)iN6UP5^4*+lAt4?bfG@bf(B||W;umnKx5$6VU zDr!_gGl{d;-oQ;EYE1q3zc3@^)npy%*8j$g-Xjxb)Z7t32rt0;S!>?&|5wcDi9G=1 z^8--Rw5Ku^{pNpRM)uQu|BV<~10(_03jw4eN&3%)Apr0{Oh)nX@mMT2FE6j8q@=2< zs;Q}|t*z~8SO4>#!Iv*zcJz&QzMATJHQoJs_T}r5j{ebS18-jpj6NTn?Hqjba%g&J zXsB~|u4i~|aAbODY_4;Bsc-zv@Wk8R$)%ymg=-g5@66ip%-ZD4!o-`kvDu}Wx#iLM zchd{+t{q7uOCM*JKh7<0&o8gPS$)5}wmGxDz4-3awL58X^I+}$&f5FKtq-4;xAqo4 z9&K*#UJI2rc8<1pKX2@P|G4-4!@<{$!|%I?Uw6Lz`10lG^Vc7T$Co?buJ*qFJoshGW@`B~h7&L< zGwx~Kox;mM_+MtG8zwK>4;SjJ8t=`#==ieozsyYCpC9_XHCW$xEgJ{&4=k%C9sA3A4&AOF8QbOH$cW`>FVmqWT;rc3K zHmAbjPL6pXVIbGq_HZEYhOw_884sFQ2P=QTtH)pjEC1wa^vB#4=h(SclYN~N?3o*; zX1`k+<%bx^W;-g}AroqHNl5o%_1h~$l)A~cw@a4k& zS`L3o?_}|VE#1Q88>v2S>a0jz3VwgY00?%hT2;*g(-M1zcQYR-j@P01+)Vf-CSGfj z+Kr;Kz;-pbnlQT#QMMZX0zB6!v;sFt-M!HA6r4`m^(&{xI zY+9NBEJ(%~CL>7Bj|YIL<-lArbl?ww1PcD3e(kKS)GsGP<&*3>RJUXX0*Nn?iVSEf z{@JvETpjVFZ#1XuG{u!W{;9R!YA@?U&7TccUp13cApvzZrHdbX(b` z5_$zaGfJSl&GmhFA^q$!VLmKhF zAG#!bK>SD?qTr+sP#EF|T%qXh{4q&k)|;hiYqD^-A-xwlY5$V!9@Dz&y(V%Kg?WAP z>2EZ83gZ)u>P?8V>A`u^Cen~>t(K9OA9lfXA}%svId>(nB(Ejt=TwLyskV??KNN1= zZYsHflNq8{ziU>&AP4!Y1>T@43?gF>>K~->{58y!s+C|@{taW~EhD%6AwMb}kUC8xU?ZF@T>DaM^pv#=4pDHpyjzI*( z2s*;#@1jL7ml+{Yr3HE4^^E1k2!#f2W0s$uL~6#|RdO7;0JA{T{R;B>ywFc(y#*2) zev4sjLS9c`2=NE^gXJ!@0e9xWH{2}J_^dyW>S!hK$1z}iWp!w@a3pf~-e866kPIrK zsU*O9*C2Hl*8OhaEgkwy4?Z1A;bf%hKrl>fYk=bpA1QFOfta0-Ufpel37MwwLNd`i zc7pIKy}eA3#3c!zJ|C&zDgoSDF@MCRWN4X08LSDb79SckB)?2~81splY*1v{RAGRe z0IFt{@0!vFwiOPY8Omm|1Eu(lz_QJs#LBine#q8>-liHZr0SG^Mj}eL)meEZNrhu4 zs6<=Fo4@|hsIO(A)cXoavF$rS6PH6~qNOi#UZ@pZzEH$}qJ4{mlGXM`J>df*iH^m0 z`A~kN(xI3GH32n?RKGS9TWL+Mv9DQ1ekkaI(HEv|c+1Lgu_{YXjJ=j!*1m@~{FCH< z(<^O@1rnl+6#$0IPHJ!t0sahCSYZH5wW5Z(5|-a(|8R(0yx(Gxq3Od*5}ne zX~a|27hBdIPlp)-XIpYjFHG%6igS*OR+d8&!%1_cer~mouy5t%RClbG@f$U5`OUz^ zMRnlm5AwcnH^E|m%v0JDP+mw>xXeL*_(}t;&o|2n-uQ{Tr@5E_^!Y4_lbZoL;qV%}kwSamYLa&A&fCvuT z&dU9sC74uG1|wGV&WnDqjQQC2^g;=vZX|`A%tz?d3H+c!n|?W5Ry<+9unW7I--c1# zl8yv2U9v#To40PqlJ+r5pFO92w5yp%8;*S?fDUBl<=th^$bH3G=9PAMznqsW@FMK) zKM4>$Gsg_IeBH z7d-u>>c_cM_*{+B9sV63T}Ubvd$K)gMWI5kJp1dr?)`#6uuK zeW3v5Y-YVi-q|k2FS1RBqq6(InQ7FI!wYP^`-Q(7T7@ zpD)Ne4pIK<1jF1Kpjs3?D>vGu_T<0GTM_*?I8%|0LD zJAfQt#MnoLq3b7Hj)b+KLZ6;B6Y=c-PS}AY5QVDCQHjU884uN8{q~ILboc31=pJAw z!nHp8vMFvBgo=Hv^=rQP-&vhm-(l=5XzAs@^V(!O2IHikwF6&&1Z!s=M?R?(^NC{E z9q2nrHv6;9NxU34dv#jy_Rroe;?->CtFv0Ozn>k6zgFMAy6AfQ_c)gLdyDS%<(S#O z(_$WpKjy~25(hIM!v_EQWR0oQ^U*D@XyJZzfxrB?4Hba85>Kv!rp-Z;yfBh($f-B@ z%UxDtBn>47V$cs{CjcmMBq#-n;}wtqjzr)Dk$}`=#{ouz5US;rd{C-C$q2>%+iX#+ z9IF6!nfO1vND5vQJAx)-miYK(2B00LU5%znCm-e?|IFcStK3ZY?{S(N}EFf-`&Qu1d2u+A?K?I2+BQe)EfT0P( zq@E-(Ga&b5lFz&$O9Vim4=bz+1EI$xn}aN2knC4lK^t!|crOUyw(8eIq2BP1o*C0L238q5Of zqiCAC;-jL{!753RIt1)89x$E|6BeI5o>Cu_POqAjeTidF!7oprKHhEBVY>2hXu)`DoKA+#d3=3Sel{|$F*oF z`V(2A66_#p5~7LMLHz;IDWq$FxQW|bqEz&v598Jf?&0%c!$8h%G;3&G4!j-LpQq@At7Jjd}B%?lAi=Agcn7lv&O6!{>p!@re_dvbrLssND1|{1bRQ zaSW+bf5#0L&tXSDgVHp3`W<2RFE-6l<{_H{HfI;G3hC(mCjM| zcI8M#m4XKIG~e|?cS>aDRlXjq@!uT;&o6u&ytqE99F{DANfD}Q1b-#q&*+T8l1+R;Um8wwmd`cmyU+%m;ZK?{o)-an%wDR#) zg6YY#VFzk5Ewmjz`L1}4@I+PlilI2!|c1CD|c}; z07K-}7@Z})Vm_vTOAWETRt8=#sIGfn7hSccRvHCO6EY$&*AeI?(46Zn>W3H#nKZ$P z)Q)Ic3AIev4n{=0ba)+E&x^;wpR!oKKpyZp2VNv8M`>Xc-LFNu9Ul)9qrG2@AmMHtDV68E&mg*8l^1HO1Il@h^{ zYnYm>RjVmV@e_l(4X;(4D*hAHvBTaxf=E|bz24Y}qpOrZC-rd-MIhDcS&oOB4Jm+_ z`hlxwZum0Im-WfGa#K4-RnJx(MOQL zDO`4Af68?76udkru1-N^AOlzKe1Q9fZ)0%E6^p_D{D~;Q69{Xm>c#b9To2!=48FcK z5qoRM3^pbbi&2xL+Hxe^7i~CAN@DkGiuqIiC=TybS6lg_`dFo%S#9`Oyc!wXMx!;N zkdiCbSWk0Atm&vDRQ##T#*LQyy_igS$`lvB_+XHDtGl%6Rh7|L#G3ODj+ZyO$FeDt z0#lwJMn8!Z$9*$ICr^}-O}^2Gk19lU-hg!Oet!BCGZoccxFS>cld38JAFr?8Sd!9w zw-*vyQh0jjxq$JYf!OnlJJ()VB-24_k>Th8jzm%o1v?vK6faUX>;*W2mZsvL#UwUy zcIS&FV=-90I8=dA2gR2f0l=bFe=6FiPJNuv!JZ4hwa{PE{(mudmrZen4Y#0av}vqy zcXxLQ?hrh9@ZiCNh2SoYyIbRpySoJq!IIz(L4ziJc;5HSnN#y=YCg=&FW9wr)m^pg zu63>TVh_oCctwJ}F&1OUl)1>Hkp0?dCJ6|^LxX@5_DptNb98v9-y%o^I^~bGZ8WDp z82OObci%Z@$gw1^9O>~AV?@$eZwN10%+9Gqhk!t>j%0&GF7q&sh2hm;YNwKLV2rv* z=f(Hd@ao)WUrdRrR{izDtgH-0>1aj`?6Kp_Mkg#ZlQ0X)t|j$#|B-dLNs*@H!fI?& z)ZYvUboEVav(j^7%w^m3OFg4mBws$Dh_pL1V2-6LtHlAcgsiMQIgK7W=dZ<~3!1 zOuXovV#zF5Gpw@ipq}R%qpsE0LCGFt%;MgtQ^^gQnJ}}s`Vq%8{;n8fr)a&$iO&>` zzD7~}f!RKO4Fskmm5v)p6YyMrfgX&RP}PY}p@6BOe5~lTZolXi()onjPc{DRD?GKm zT$J4_j%8$dvCpx2=E^hL6!{?OpUqC4t^T#SjuC2~S2W2Mt=X2|1!c7YbASJ+44|k2 zR_DGfnSEmoJwoUkz3d6vtRanF8Ln;k<`^2Do%KVt#;AJ@Mp{wUnN#fmc_)fe`FMCg z{zlPsES6-Rf~!W&vG5wB7eLXKh(7;Ttl_&KHupr`cZ5puz?w?6^oytH$CEFl-HTFL zyD>exsg5PG(-ln4n{pR%DJ(0j)#G1s_I_7aRyo01vbsO@=6o_Ka3wFh`LVa9v0*}0 zF%FJ0R71CPEV6rQ5Zi>eVVKqEI#sUmRM%IX#ROp)Shfk05AA4X+jR`HiFE~ht>E#+ zuHgKp*O?-%xPC(k}tU`H@zN78j*1ta@@Xe<6p>v(YCC<(pnYF za+c$HaaL^~F{ar_YhU|f(WQ!Y1s19P-jgSA8mr5bD^PdZXP2^nbL5^W0g}M1LopjkhX7l3z{T$b0O+brYSLn~P)mX2V{{B++ z?aV&WjZCPVn0Ti0?#Yv z{#Z}Ne(}36dHKP;@%ZJHp8iWB39SA1n6L;hBLnVZ_b1HY05t_cKr9YjT}?%LtOR;Z z-8gg*hhlV0C>AIZlEo1YL<1#dmRH0T0qHX`v4H64^pedSq`898lJqbTsibCXAu5Mt zbT$mDBNHB$N;(ovno}w`P>4QRo2gh2Ov~4mY@=V+ZEerbMnl6|tJvbeN?lb{yqu`f zdha>0S}(E z(l4nMU4&^;2IemNdNx6P8C2UY0YQ>?*75^R=n1uFiWdZ$0&IUaWv$}k!$HZ#hFU{uAUdWMjgh2^iSQyMwbLiMMprx{|5y$~) zBbPa2@mj)vR`A=C8XCna z+x_yV*fjAb1qUX#igzs>tFX-!J;zh&_G!axTD`QJpXQ~qGUR@pDl0ylUyUm${_E2A zNPo=9?J9u&ikd$plq%3$T}A3~UtxpAyJumbmSIYv9B75X(NmT|7I-l;GR*)yATB~g z%0a}`e62&V;C`t6hNMwyhL;Ec!Y*e`zY~Nl(fnY6ZZTk!Cd*i83Jy^jIHNDCiN~E= zU11Zp^LOL~7I#vijaJ_0H4M zXh`2{UaPhinLddQSg8h*HbiZS0G zS!R*=36B!NGX}otc>OLBR%b%26J&a=*3{Cs-BWw?K3YD^wjx^YcIrko=1cMV>#IAz z>Y;ka`J;pp%_1 ziE=qI3A7diZe&=oN24SkYTX$mox`zh+jhDQ$941(RV2x;pxhsr*~&BZcyzEgpN-b5kyjB~z-=oLXOovzQJgKu)vZT2 z9ML1fY2ztmDzqmg%x1ZaAo`S-hIdehbFJo8n+LYx$ajba-SPVD_2Lc2$A!4oV)y^>oC*7?}Q(NqePfpfda~xp(tS zNz-1^;d$5U&|<0h`FgN9%~_MUYy2_Rbs~D74eK}Gq3P|@ij*N79OvCGX7BXl30-2o z1z$28gS+XEu03yZQF}aV4}O`8&Hh-bSH4Xub=`h2JWuS6iV@a)`uB4GG37TaE!hjm zn>Gz|{tK}7{dlwjSef%w6HQ$|WJ0e0T7F)FSlvPe1ceV``(K6~P0|3BM1}%6YK0J9 z@{{XBvdymqr6lPlE|u!`rbJ8rD{^)_ zS4=~jBs^%twW`ufWBWiGE#)cq#OSd3 zvT$qid%G?!67kc5_bD843;ls+o7o!GfewYg9~HDBhZn5-5Cy_$7Fe)j=jnFB>E;-U zvY|V~HyjEj&6u&=1Ih(%USZTY^3h~5DEUL5n+r+Elv~C+YGXp|LI^GG)fQH>XSW=z zI}z>u43WPYxq@<|__p6B@P@idu<0+PI#!<<>0F#wYQP^Sk(s-Il}$UguG*)1=)mrp zNbR72;SCP?F$!=as_Qhn>5$Joc{ywkUfdyT)_Ixy_2=WA?=PqA-)EJp{8wDf6E##! z{>BIh(-N%PUX1J>VpFH*^;MSRxYP(&?I3^Rq_l+PmU%8a`+IcxEd+kb;seX`w87>eP-J#qjYNm%!l2pboS>Q{3;R~uoO_>SF8Eo0$z?3mgXmC{a7oU28raMp1czSGD!%v4%TIh3|tXBteX! z)_JmA>}81G&aJd`vxS}l(;ZLpXy@&jDI0Df3+4iXRjMY~ZuD|qxvLgHw|(Tu(F%z+ zOYyYl@ z0>nKqqkOYZ)1=eDKdDNbWH~JQTz^)X}0pV_3Eqg6tz3Z$TY!$ z^QRpHq{PV%UtBg^vPicIOY)K2&!`P&a;7*w*s46@U{nOe2L3GjL^Y}s?CF^3c4^E& zOKJUa4MH#{uQe+ABSiW8Hyy)M1RO!phaLt1l|Vti@z&l!>)E7Q((_b;X) zik=SvX}R9u3Nh^w{^PT48#gY}@h{rZEj<+3pk)eh#~)6i(Bun66nR@8>Hw#8c=q9_ z=JO$L$KV3O-K}InBJSS2Ru~7FY};+R9}scGnknmHk;Ngz#UZj!slM+!z>KnF{B(AP zgVJV4U(T+*y_z^82_=nMSvV@Ot9ck?8%?dF!*=)(B^ojQ+A%QDE4C~7=;G0-en*J^ zPOve6G2BKqwZ*0GV|75ozfnw#yhvzRDJQHP#@y=mJIc2Q!QfmLzb%a^Ao|zJq8$$82kWjtI@$!GPFj`#pkzzb4{aY)^@1V#bfjM6OE2 zA5a`rqL@5c@XP)HIjsp*gyQdI^pFK3QBr*8EoqX+SY{yP?X5}Fw#de>Kl6(L(zj$L z^aP*@IKH73!kdZ+D#m~@Lw@_~FZjtpsw^DkjLfB%9`l~)@$(-g%h*y8-f^*n;CVC6 zE2NSdQ1Y_S4@S9THM$Yd1&fJ(Nu;Na6Ijo^v@Cm5?-I@-X&JEp>k3$5_i zk)W76`}jNtMKwN%mJ2h5dti%Bi;gRk*TGLE!nTBfM;Xg^P2Y|#?gJ7|Whj5ALkWkx zIK&6xE4utK-bX1*Voz4W-8S?IaQ0uYbH#nkF1v%PL&)zz1ZE8Foqa%m`^?#-e%j)-lK<9g>|{_(+qTxATyd z?Hh<+@wV*)&eQ_$l{99D3|JU9nRmfi?18ev?n6t3m**sx7;7<}VF@d$XS78jFIz4N zid{Vos5d&(6&L$&q)_n?LB@KPQ#qlloFJ)3jl8$fYluHIG7LcllJbEd#*aZc*_J)q4#-idU4^gl?0-FfsMzI}ORhvxq>( zv6_7p;-=v3FIb$PvVePi6iC4f3-dHVr3JAc&>)H=u;NKNWTy1lc*~~4F~IbMq17Ug zEE3)jBBoF#{li-NDCY7H)t*K=)TD9dhy)0tG6GdN+uQG-WkGGAcb#4Q=PKyqZB|Zz zw=RREG5|ZgJ8zXItT&%xk_V)jZ@8gN;cs|hmMR!SNdET=A(2}x&yB?C2h=fsbs2|m z(H|@?X~6qk_!6D4K`p{-S+C#g?q3eoa)*iufi4ikR`hLp#XppwCx%95I-zv~iZsIQ zyX>(CKg1`I0S``Iaej;iyWj5mRh=*e7OakWUXH48_U$?gI)e6Hrl%2h+(8^Ey5Osm z7&KJt4zhZXou31_Lp}lyNtN&bPr3VD*trJ{%@FAfEmmb?PHiMyQ>}w+hz{Ci1S|sJ zP&0lQ5qKly??4u-cRwn`a!9G!8EV~3Poc*J+~OuaVCaG{dTi667g0NQw{2f@4iDq% z@jB81_2gr^uQHN<-g&0MFnbVE`1tIfZKb-hOY%XvSMNIhbi_>0+hOqW2h&11V<>{F zQiOCc{kADC-EHqZIyqvoU9bKB#iY63Q#7oS#|BW=3txIxuc9DVGF|6H^3dG+?BD3@wiYsj7>tVc(PM_oT3P?Q+4~xZzDY1qO{Mv|PlW zEX$lqNLzuNnSAWLydK`=5jAvT zwDF-*2wy}ix}0BUCj}*WL~GSapRTc_8m|Eo3n{j)OJ8jzRaUHzp!F87v)RIEpm<4F z8$Plh*1uwx$s!^t?{MB?jK3?)tKv{()4cO_7!nlpwdBLo2nh$e6T2*jJ2RI}laTKk z!%jNB3NaT?2riB&%uytS|BC9DMTO!Yyd4svn;N+Goe9O7rBp2n&!-R?W4t!;bz-nKS6=%j5_J7S0=F&e0NATsB1lRwV2 z_RI@S9Bl}iCyU;4FQ$e&6qrkp;H3~Oap93`H~u_lE_$E2^?LS7-ReJ~%xrW{b_^_s z@wx}BKhg-$KjGNgnK;B*e%S_c-o{Hy;*o(efWBnNL-Y3lT-y>|^=9xs1N(L5XRIy~ z^vY)81g|;|vJP@v0Ws>S;>pb^aZc{?b$Jk_({USTC5QpZ zoq|MxLIU6x8^W2XMEJ}G{G;VXp~Js?Wor`Y^)tE6=Rrr@yRvxRcRIPsCEbzzz!rUg zzDbr@?CvAK&N^>~M|20t#ZUs?N~rO(D8Q=cr3C$rOr1+=mQd)2BeZ_!=q|XH&2Tg8 zsF{F4DSyCC%Rg_cCvxLFef4+r+bvpr2hH!h_}~2YlzdxbL^Q;!b|L9z7e5k>{_itL zAxI)0H$$dgt7E@S3)zZu*Z9T^qXP=>?y0D++Ejh#Apcq8m zf6IH2E)vFwH|1&6=`E^bdC*L;7sP1dWF(0qFVPfp#8x7q{chK@{+;V{&v?7A3YFqQ zt7^yb7+N`y+5OESfJi7zvZ5aAde;=Mf+?8dB<-KL6ob0MU3=5A(I0w~a_bZCL?aQz zpTt9gq_oG3EyutXY6jKrG9(kKG6U;W#*;Rg5$w}qSDC-1rwv>(&dGK|1uE?_C2IT1 z_S+QRGkUTF=Td3B)O>{-K`K=aoD$y39Wpu-Ef*+@&LHXE88%x;-scf}EPDyR#q0H@Ov*T&Y(fSsDqQt z;12?|ut7QRzsFmaD@rP#P9{Xbq79bjj8h6dh>bYTW)C5Z7bs+^WOrG(bEGTrOQJe zN=msw{tiI}Z$+H(;L8}PVRss-6b10?L(D${hL79?L<7^jCXGY9a}-a628pY;Pg^9a zdy*Z-5#aq=m;L#YB;M?IOiR>MtjQ201x7|^=qiSTUgNf}LE9JzIuM;BMp2TKqqsMtbLxL>6Lf1PttPBi z*EBV6ZpM$2MhM2uENOC}qmM(kw-*!}E+pqx1+hRN(vFe(Keozt8kvo<^qO@kXo<9f z`h_4Df4G6Oe1dM?$lZ_urgf!y4iDa`CEE|hcj#mAp&~IT% z-TmHhVq0h3&u5G5POWd&x>}%^*~;fIPD$J+Q0uiwPlOgesal=Dr<3xIGv>8%>0tgp zLECps9R!R`s%T1NxU6iI{ zoVE8QQWRgHL`ED1D_n2=%Wo{iDeHpeLn6MF*%D%ooGfB=pB3+vEx*IMG>{5vTRV+R z((U&-;a`J?d5jPmCS|Wx&QTDvB1H)y11YSWEUeJsmQ>?TaBIaUZ=PXZ(&t;&qA*yY z#KyY}oi9IN8CO2uqEOzC95LR^PSw}WPscW(aCIzN=fKj}!f3j@>L6#TZYfw{?idN< z1HwgWa9Zf9(L@2;J|9r_=R;J6jbN4h40Ax^-TOEH?)>a|2FgZo@=9PZoHucZ6LZpI zMpowH12c~X@mR=mAH>nZE2D7%p&&=)p4wFVU{BO&qGk^;Eybo@sEP2~QNzbQX(< z)-!3LUbWUjz7cV>d1;cj^$94Sh3KoUa(kqx67QT)d+0AnK*bjeroUE(CusdnZ!OiF zrr7dx-uDsU3^P@&{9+qrdI8|T=eqOzXUo}6C$O(}y|`h_@qE_OfFZrSzRVtzi|QtUTLTe8U5qb7?*PLHYLxRgS&9ilqH!FF z02++ghRx{Fl&-8|UT>6Vnlm0mE6bbs5SS{Tgcc13|{(4#*#H zMBOx{f!wLc{Y7R@aeP2C;pqc#)BS+jDObELsQdI3zH)d=YEtjNgZO zC-0BGD_RB``>A@A_@#J+DwDPd1(&ICpm>z{o2Sx9&sC)bEZ!eDsle&)ixaHEZuNsF zMMGd2lh$&QVA3#`3H;FU;$BTubX~ku@=m&2q?qDP$DkEF&rQe3<AA|GnAa@(u|yK5xz&oL%C zRC!xiRuP|$G$xR|0!_IcP(0j8WLA}lOP3tCO_$Is{n`kZ4FTAt!se5#TC$1c``%il zuI>UCELqQ0Vnnql4Bc6_o6i601aw$@V;BBZe(7EPD!=E1;}&8^+}%)l;+> zE~Is@FT8?U0y=zE#3Msf(n?SWQqdF|+0xApYAVg|pW>Tg&Y+moXsUKYJfBTIO3bxA z^6VJJ6{8bKOLUdDynP#UlUgFLY?_n?ZDn{9cC4@G*lr72lKwJ%OERaas#*jX|8t2R z?s*z-G^twI`KXpr9T?1AlBB+qLeij2c)v=!+z)q2TM0?OxTwgWdAU*4ABixu}U=as%q@yEVC1&;i zrPXC!!(40+h#FfSQ8HS9|S$e8ne65a0KkA#NGFqv%vOd0r zuHO1+$cRpC9A0nmzoi9O;?YOq$hpHV;g6wHLWPHtZ-oaTB-;^9G=;?lw;6kGIZ&7#+Mi)dTbJD@eD z4WD#!?|j1oC@!<|JlLt~4R?e0Jk)`n!hDK)U{duXU2@^1x#8YnDru9`+O}>in%@Si z4>BS3uF@}MK0&Ws@~R<;`ZO!fyOZ6(lD^wg{1OD{fr5%|b%DG53sV!`{pMM{)q6hA zZ~Tb)Y)YqznFYL(XKV*v;y$>ez&&HYc6`t@?S(JI(R6d(ByY$`As}E~0-z(_Xvoso zo?EEF9UsAFs`+VOe=*^E4krBb(9%K>MT;9lNx^_Ywv?%q6*o+p;ii>!JRMZCi1!B{ zJ4s(rTsx?h!2A%8Im^nbkd}FA(V?}RH!0ac_K%6?y|Au@sN$9Pwyq&ok*L403(1Ny zzzWo0fk3kxteq*NyZ!OQJ2Amzo@oV|8HjC)d&iUp;ga(Bf`)3iuq$ExhbA9DFW9J^>F&!V%ZNW@^smt`ROWNvad#NRYGtz53~=@>YceMpNVFO&%wK4I^c3yN79I{L``hJjuS zQpT4BOuR6ox159ZA{F=*AoQ%iwruldi~>V!2V0e&ODu=A$Qqk5)JUXAinR-TC~@0` zz3s?^-9KBis4aiusUvW?RT5q;`|=cKtH+>FfRK{sZSQss6uNy^Ec1SKiFzk_ny28QbUX*-XGGzofkynC z2?81+-jd2z{%xr-x1}uKAJQQAiEdTchh8|lgz>8b*b2z>jT6M@xF69XG@)9F3Ua1G z$jZCSg4)fj6X6#1i#YX&kT)Z|;#67pxsZ@K{u8NnF}Hpgf-%^9U}$Q@qp`9~#WR zj*Lg<6OQWR8Pev`G%p%eN#cR~j-XOtfiB|3hRsKo8-*r&pi~~S%=yC_kw^r0j1{Z@ zVn$gq4HYRo^Ew9SX^Vd9C~!zX{kq!>y&I5O(OxFkQG@F zJ<-b`(Mo4NuAyvg8|D^2UEs}o87nHzJ#PzNRz&yWUL6c6M7;i?%&S4%2Rbe_6)n=@ zyjVo}NeFWmsoelVzA;c%?vvbb6Jdy<+Sm5jO9nPO%X~*6f!k}V2wjVq;rzM1(r#Sz zghjWKEE}I8Hz_ zbR4OjFFzoXf3!>W5$Qy3cxXOVo*frbBSHlbJuVj*Zo{Hptu*G7ojgM6PGg3jXkFj&Z5DTETwEVnv&r@O;oVX1tI1w7x$F)8LLfSC1wvw^DXv8c_ zl#YvsRq}#%%fi4yZ*QoUwn>vxgSRYLOZo6fnW1m4>HKzS>&h5v#S|i%Y4}hS$BJr_ z=xJ~(yx)+~gF?m5rAxB9aJG*nJl5-b-3SvKt7>H^+JzcwK@E)SWUSHHywwe2bPe=` zIJL!Co2i7?V(-!B<*`@Ua|Q{pd`Ye^fuE9n$wdql8e{twf|afaC}^oQX&W($Khe{Y zV?H-91`rTzkk_$cd`b>Y15ohnkd10%k_DLl;2}kMAR~<+HQ=STq$PJLYj{&bpQD{d zD$d(1r$!`gVjN3ctvf^;PUCHH2SNcC_#M|9=Cdk8&ef7j~Epw$UBQ-7kiLEQ?t+TnU(>ZMmC2iBtwu!2?k<|9p^!BCF_WAUVuLT`r z$(^gIo!_!Mm-0GiD>}!Mx>l09*2=o3Yr969x<_A8a&FIBY42i9?@VLgOm+Wa{=m1w z!HtT+ncBgxErYY=L*J^0mI{Zriig+#8z|R~t~ZY^HIA)zjV;wqeCwE)ZJzp8H@(?1 zz0ouMt#)Q-c;?%yRPLVL7@1w4m|gAtx;^prThrY3%=~i8!d~0LM)%_8$l_-A($3V< z&(7tOSGzp&ZEtF2r~Ui+()abgwcU}my{WZdJ?p1S>$^RhH&dH?uZVf%$LaEqlj)zQ z>p%BLx6YQg4yU)zH?|K(c5XLzPG)y+mUmBIP4m*;_0;~;#=-UW!P(}~@44ff#pB<* z#}~^dx3i}&r>CdOXHOevw|i%|8|P2E=Z~+-`SjxM=jHv*)&1|Qo8@cx=FQ*T+rO{Y z`RwlR^`E~#AK?2h@YBEW+y8*)|6hpb|F6aM|HJ14;Rxsi9rL3p|M#{fGpM{fEsCT8 zNW6<)q>N4W*BkYTnQF^*-NU?oJoJ?f)+*efn$eKTsM0m1Qd! znaF-C1jq#43dIyU+6n_JvTTPF7}#$|yh7>iND80-g3>HI|AEpwF)S6(omh^xqn$XO zF_ztUfff7R1d#*iZlc7WqunHFRM!7MX@|Y!S17%gqAv6wC#}f3pQZ;gieY?bKx)ls z>T|rGX<<%!kY$rWYA0*qxK@(w+;)7BYeeN$k;4$Gg3g$_8FR=G_-C!MAQ<)Ju;?{& z$5I@^g7cv4kv3_24 z81;&s_+cB4hr$C=6UtN;0T46#no%(F0c`W;*)bD3Uyu_Z$HEDI7HCX4*Bm< z))`1Rp)EMRuAqr-#-csE_G%O?U;~kvVDpl8AC<+gYaF9w{&9syZ9nsSQcH>RZt~hL zo*PFp9-u^>VAE}%DMY<$Tj%9Vi;Q!gF)%pE8qaeDWQpGr8YL$G5wfWIe0GEOh9CYn z1dVDwplMT=*!5wX<%R~C(1T})dDbFIa%(klleQj%NJ|

            fTLxw~7Bffw!wKC*T6a zUUVwF6pX|ryd6EB*wMw+z5OtgtVTtXnJOR~MI_sybvx2HozQ|I3BC#^HjfV(yRnBP zkK!qvAq-=12hX>k(&ugcz2A!B{`au+NlF&P$KyVBzUooc9sKD@QvpW?hcjT4($}pK z#1G`%)EV!s{8 zLlM&o#mm?V@+7CduJDeM71?nD9xu`!SVXcgXax`jkS{Y#3}0bsy5g(Jyxu&|M`x49 zhyATWW<)JUAu}8R5V^fW_qG?IF>ppzB{3Xq*_Yx_u!^(~Mx67Q0KEEzDEpV6I5L@G z3fvU?4;~1BNeSWvj>gaqZk0x^F5R(7{`%fD+?Q@73KJJO$V_b#iY{!vi49vcubD`js+hZ6ODMHTmC`1s`D)h?n z(l$`X&?5uv@G8#z!YOlLNQp86CBJIyAGL}?DdJ_oS%D4;1Z@!omhqul2`4}ySO|gP zc7po|TOd&~DoxL;%-kY=7y$X*%uqT&wNm1lL4}X7da$`JKIctPz;3^5aKEII0xKnMUaILd`%+6zkyX@lERr;AjZ*~S!NdGBkV)D*lB5QPk>pv=> zt63844Pa4yyNndCZC}-N8TrZH2pls)Z8;!fF!hi(F{Aj=Hrmm}-v*V}hP9C&8jc@s z^MEB@G*@G?x@4J}b`xuNR7G|$Bm){#LnJm>-af$lgvNNY8zrc)zrViyUE}g9hYi6C zLKrL8P4*Jz&f}Et*hi`2^h5Q-OM6me+y_`@@z^02=Hs08L49ocW^;w)t&MYHZEj^? z69shJILFn?*O%iMtV=eNLBt<`KVvFaL~0{@g8-$+{HComy9}*pt?s<}_37ksnj!HH zXGZiiS#JpJ;({RjCLvU7+!LS(3w(38EKur(eKkS+`ql~GB5I;7qE>CPhw zBa8j|NsHV+ENO9>pZ1g0B98%Pduc&Li-ZCH*fjjs!o@_DVo!2_r;oQFf8}4st~SQ6 z@#!pNQI_vpX-5p>P?Ghi_W@&Gwg6NSHzbA$iEjemv0Dgz+pRP2w{NLr@M1Y)oJj-0 z=0$@@9MWD%auf-DW76ob=cqU(GjUoML`*4(>Ac*}6T3FDyYrLD>?mgFl!np^XXd|# z+@(=eNRVhF{`#EA%i?Hd1@zA;Jw)y17qMu%{F;41CWrjBN-wP2_6;_i7Ag>rvzNmU zdfslR->hO*ka_xAwE0K1?6o6l2-5@W9s1i_&!~4YI3x2uONHj*$yvihA{$SEy#=$( z-2i;O$xrbV65&L<1)B_cOHd7U6p4-@IQhn>z~3}On9}nINPmRPjp%BL?(!ZsH_DN|D_Sp(U(2lP_0yM7G;2P5vr_hAa@pJG6cpNSS;6 z&~eOH_%Kw}nFbi41zcH-P2fpr=R<`lBc&NCHtf2E^BcG-TT-V21Q7JX5YR1BgZo)1 z6>U*9E)hrUod@@g2m}!ME+e0s1$K{690w$<=aXi3Q4C?ol0`@dC0qr9f`9fCn&e_x zwAANsk!AMdj*loYTJ^t|0s@8w7$BePO1b&w#Yph^dijuqw%CO%kj{35QICUuk%<41 zGhhoA>r6L!oNAhi~@jS+Bql%HQl zG73fwm=6=~OkW)|{^%wxvCFSIs$p-G;VYlvUX`YLlM(AD;Et{#QG{$bfZFT(#UGtY zgdfcbhN1>TQh*@|ULw|33j5zAmKfz!WCLg+IaQB{&@i!o*E#qQggwoshi z(88pF=9!u4Rg~t4tlpO><~)-5Rnh{Gys1aT$xg(n>^z~%JOM4FWutuYt!(ikr1j4H z^)>cQ*8DBff=PG`@-#nB1kCJWH@AP1(i9IpS{mrjgLW;7mdaQ7M-f)b za#@G~DteqOL^dwE5iPo|LJQhL3zr5$5YUs03QmnaxD7Eyc@+~I7nAw(;I9``Jr&cC zmC%WmFc_CG`IoTdl(2P`aIBYbJ(ci~mGX&|3K*9P`In01l!|qgO01VkJ(Wt6mGzGh zqlXfF22cdLm*Ezd9nunehJZaR(R?7N4q)J0M_e8MawMyAqp7lP-f}aoa`S4iCK*uP zkt)Oj?VV)>5Ep0$MkaOx$Y_=0yO;TFA0kI5`2U%^|LS?CO zE!Gv#!41&KRt9KHS!p>1bvZ%iwICdP0%}TEL2{_er@*dVP~u|!T{5H( zjo>OrQddW!8BjT@HX$(t^)4s1s2TxSREM^Jva4Eu7YnV;sc-j(nYj_Efa+ZwE8txX zIXU3$SlsNcdXnx&id;O>TwG26vdX6hMhsl4=SGU{MuVINt(=OR*hc77nPwN>Pq=DB zh*$-AF8I|M+jLcV6gRP)He$LrN|NJ&)hcLfYQK;*O9wP=;KD#)Wc$YIA8eJH(_qK- zy7ZGO4_qXq079Lda)n&H=qFe_SxY6Td0?H`L#EtezKt*!&u+R+3ZsQnyv?S&Dq5^u zN31<#zUld--N3Q&^J$Zvc-yb)GWvjOf3-$?+$L^}PO*&+&Gok1*lI1uG6!(QKy|rs zYjv7Gz+bh@1JI;O-a^ye=GVG^# zyH8q-zoGcXR{qMZw5zW8Sp&7jZHMPnd^RSy&TTdR)@fVZr+Epp=k42Buk&-P>s9SL z*yw-fPPlALV4K{!8e94Ox#lPr>So-xFJAeh|@Kbhb(>G25tV#Ja04GNeO0y9$}86qjuzVA-s$xju?+7o`DSGd|+dseYxLg3y7{S1PVkT=|j zK^N4kI`Z0;C@K%)2*m>lYu9HK0W&tS;~%?bb6;lsOsDztdQiwKZF(BcPlg;ECnj?6 zR{ddtrqiB|a}zI#z`mjwk&gi^w#&8@X<8GQJRcfALQT1tu?4-Vfl^T-O`TSH%+6P0 z)}65}{9P|+158-fwAaQ?SBfoOKXu}r*C_+~vH$ine;z3S&1Qhsp2hmmq`?DhXEUpQcZ^KKuW;X|kLHL=zyxY-ITW&<`yMPx11)VUSOWWXX8VcZPd z;L^)FGqkALJYSf_>?G~D?dG~%zf5kSKE|K@{x{}=J-H*bQ%Ux1#_VwC-|u6! za%WKWCFQ`vW{)`6(GTzq+4YE$YI_pickYG?kk3rvj;(FZ*?cr#5U zofnlju5LjU@7zapF~0jgRaT!LW1siiVx400o>R{Jpy}ODKW}Z{=(Ge?x*5;0FH|Wy zf^l)6&l`0v&akwXZS#E8g!=Lv&IWX;`hK>bN&fA&{^co~r*-Oec4iZrJTTL-f9D{u{|VgXd!u@i8#`N8{?r_Ml_yMB@3o0D|4;Md;aPwE1oN`7#>rU90+x!uB8E zxS`>h)}!j{%ly{Pzvm>FU}6H(qwAw&#&C2_$rHR?SxjahFlrM%Lu4q454I-35rfu{ zv}T^yG2TeoK%5y9s&>(UN=_IxHHu6yjpCqE$fB2k{kRHdE*>HFXPe5nP#UtRNWEa1 ziE#lX{cA*kXYm4w-<{%S zhhXtShFLhclUF&HsAyIk0ip^k|ynHRCDyvT@oY`tTFAZH%PfOtIZsFhoCYYkQGQD0SxPILu^ zz)%e%-Txr(F2AA--vEyj0}SafbUJh+Ev3>8(hZW*9V(%84&5o;F?0>xokN3kgMfgj zz%0Lwv*+xdvuF49{tM6Z=DyE;U7s&m)Cq4SJ9t_kI-5UINMK&uLse+aak65~V)-ax zhRW`9nm4)FQC<~?W{%Ak>3%K1aWS>l zP?yc8teh{KH3viN$x$O@w7JS7G#Gz+*y_aVLnFHZ6u4FrZIGzsA^~>6GS;Xr;#cbn zP*3bpwQoV3jDtb(E=}@ud|b7bZ)l#&bp~VZY_`_KT4Nq8Orxq145^=YB3P)^f2342 zYB$MxEKDosT{qlRg;N&06vePz6Ey-&R2K7#7*hzt65hC3i9__AmX8!{PBdD58P_~C`xS_S~GUaM?e^V)f7Y% z)YjO0xv$+4IIc#;*ZIA}(PYl9s%d(yy+jvj{x?Fa8%Opm!R?-3v z5M=)1^3QbL-aT-aFwA>9a~?UnSCCLk3>0$h8!NLPpeq8vyl(!2>rOCWr)>6K{LjPb zb{^GLz+%?aHOfa@y_dTC(F&70X4)u?H1B$CKfN(mk0C{4VY7}_R|8<(FVC?()Y@}V@JsNa6hwbF9u{A^y}r1$H%?r_~{ag=z@h9Kk`P3a0Ug)7-=}D zHpI`7;w21v>-pv-9%X-KhbD6Iw!U1qDaDNaikKBb3b4;F8MahnSzqi-^LJa$%9hkx*AcE^ z5X3WFJYsX}p0)UQQpzk@Haj6mReO&Z`P7^{0lW1a={*pOB5)m!}R4k(e+8x zZ8{K_Tauboi&|vITelpEPSfRBcbYTEa2l#7wNJb}kpXkWn>>Dyu~NI70lRw*ga0bx zPPYCoy}4*mTFt*!skFOyy)(Y(8^J?u0hEx<57xM zv9lLKfSYl1f|Wj_CNeB#=0f81Gv2YfGtaKpJReWM?oRR!iin}KHKLYG zg1$$?>gxepYN7u%^awlC(+Um#p{c2PBTz%V&7$^T|2X681A`wY1xJMbh!FFi&2jsn zR*e{b%Sn+%MG|omb>30u*3Mn+%=*Tq^AfhdRFRXyTEw=9)SlwWd=)b-p5s~N*Cg~C zeHN#=X$#1!R8>O9>L&*iR{1}}ahx1>F%m(AgbLBuY z0!ljK#Z-4;qzT-bUkBXs`TRaw6}JUVk<|GE$$R<}N6q{2HrE6ctzR9!5+0K#4F}Sz z6geM`P0$M@tm923l;QSRJjF*3oy>StpE+fgEP6|B$oW`Q==N1{-kCCLD5BSLcsmjn zn)L6_=AXb$aMn?jN!X;YVoHc;6x$8CtgTplOHSFdsvQcG@(>eQQ@X^LRp-`J|3Y1R zJcM#vg(Q1I&zFq}7n|x-M5)55YHf8Xw$lAi{jtyZo7gy85rej#STXB89qxBUT;F>G z|7{@OPk1jw3mV37IKJpJm)6ZXr8@t}To~_~>HD>D4+F=juv7|HwHq9SRNQ=>zlrMO(LT4ll5=`Yuz&^{VixXHP|2j8`gC+}ih z<#gYgzY`V&pWufkKYb6y<{e5(8h@Ky2DA8WbKAJ z?aPFX>94Fqzr#1kFEin$H-#+z$Ex3a7D`QTD{cHwO^`mz!=`r)rT*tm-+b2(O@DuX zfqb~|NBUacu-YWJ5>BDj3J zWyys#yYVE22~a?O#;aqxCS|;1c5Y5Wo`oBpOjJ6nK;bWxIeKY?768 zi?1ZE{Uu+0`f+-S4SjDh2hJP9s2ot$+jfc0ERuxdcMUy65F`uba?j5}^?1a4~rM~>`+kV=T~sdS2yWrKJ_ z>xy0CW)E1ffd8aJ1m4HBa3YyvE~AeJXm-t5r|;L8;5xS)Ox>l7nXm9Rs)cM77STo8 zu0=SB$^5j8cp;fw@6d0iH0ZM1;zZ5X2c+{38Wa^HZnu2v1|_~ztaFeK> zEzwzjt9uIRTN%0xZhb#4@M^8OO*(BI+`#DDk_%}PA!L@$5ID=HP%rElv&VY3 z5y{Gsb`X&{uaS2sM?8qIf2vB&n0+heN~%o7VP@37Unj(SD&fzWVx`jb`t)@-d!)+g zb6A#R3XMA*N}Mb?a9STb7)9?kn|iaFl9vyj8;QkyNSaCK(9MjXwq%H3h@5pLi1>^9 z#vVsDvq!EF)Ipy--@_of!W)4rg$%5^0`e*+mEEw%P>MwVD(6yUs5~Ukh>93H-+ci; zYba2v8Nf*(v5RWXqeyn``9|@IcTBoFPiothyIvaNQJy(yAGbkY6Q4K!ZiVfpBZ1W? z>HB?JUPt9rw(@<$i_MB?ewFXV0?EYNDZfA*DN0%Gu%0ZsvDcAIPntzY>dZKR1Gd3V z%t;yBJPudc-^4b}tcqT?KwvyNCwDZO+Eay6C5+MloTD4e^^{l{9uNG`%Q7WVWm1>k zhBn?h1M5?tKE|~pS;n&iP=ac5rX4&f@%G^b>XP( zzU1%pT!E+{i!10XWn?32)eT{LS$}!yYOUs2Oyw>?Z3WHA8TGbe{#4H^cm5hx#;7J9 z+DdH{O-k0zSt3@9>MCL4>{TMqK8C}@?+i_^cn7srof=zazUu@>*2d%Z2E1JQ0vl!( z0`*30iBKOW5bq=>y8NMR>cQdu3)U2c9I_|SsLG@QLHA-fZ|f_tdlxnguwiEv7#o@Y z6w20Hnf{1HfGm2uHMRY)i*%03)6$a`*(4A>$qjrjzV8$^qKJlG4+I9KP{MHq&gl0dbZKl31C+Hl*jSrzs(KWIpZmur&{ z(sDL|R_kbAZC9ksGK{W7eAWzL7$hN~k3~_^ibXUlwntvDMvYJ?*=cBt)&XyKvqNw3 zmg@CYikWlf5auzs6l^$kfK>7&(QJk3!!`VBz6z|Q5+27pK>hp^EM_z+Iw+b=e7`Z7sqn-gexL235ryv=a+Ny7`O3I*hLc627z1=YbN5rCFhLY??Vh z0rrI=LF38XfdVwta2#R2A+Ham_KJ` zsaJgrj#7qbZZ!l)C?^+O8@v4>*>}pRqJJg$Kty&vqi9%^M9lgbJ0x~Yy}40 zmgP+!NS<$rn$ra1uxcBLM}isciw2_j2imvRY;#liQM9h1z8g!+v)S^&n#2_w!&33> zD)X}S&5&%omm*|EIGZC9l+u8VbTEhIEHh|S`j@L|F?17O?r0bfIuK4Ed{Y7%FGG!j*^87_pCseFfmQ1-2fheF|Hj}+fWSx;QF>m+;h$7o3!Y!Z%YCYnbuc5e3T@g*GX>d= zH~e69v$;y#)GHMOyloCKBGunc##+S!-|Hi3wz+67puc8u!G#pT+h#QyFP-zjT=tYT zGg&!kFEGq3YG>BW6En$tCzG|!-nRiWlv1xXP0~%)h!C8eOyua+*};a^=Lx%R(V7g8 z)-?$w5G8`_Ke`vUjg>}eF9(%3$Eb)a#$PGDu*23!G)z26cx9!*3E*WIbc}B@VJpsy zSZgzFzsB$265^%gpB|AWj>=K9*F~z6E|SKuy_%&-fV^nv15ymVtjZ%R0fO`i+7+ar zl|}oP3rbpofl`&2>QBy7|1ZGqyM2>uZ6;r@%j@l_i$V~gB5Trrpy1e<_n^S8+ksG$jC@1zq z0i-FcrSD?|Li$AWXy|chjV@bX0wwFzuuTg-7wkzE7PdpFaam_nDmnOavVo@S#;U)G zUWkNIw=nYAzn$qCfhHqz^)=#vc7?a`+zw){g?TXH?TMFC3(#MshUm#f+{EKv5-*u) zlW(~&XXEX37Jj3Gx4mW&&AQ5hE)(kcWVq~=T3NG%Wmro5_ajb|b1$g>z6(0dTROLL zouwmlqQ#yo6*-pLOV7rtd)XG-aO4d3QOtwQVB45vm`8$S%adZtpQ#J{E<)CY#U;HQq+ z``4aEQwiM1Qh!FzVGA!ltl*;THk%1{;ZPj+e(`M{|`yC-y_9y5PcCM8As#}|(hWj`i>)&j?O zAu<0P6+4+AF|9%KaB$)`9CCN9l*@{ZCq{WqgsKHB0&8v*7-Ae;+Fef{^ZkC(uWgsA z<=Pr>)HzD+8zDU3YESri{*m&uh`Q8!8kXq3O7NL%JVdcR*9Ry{McO@K*bKogWh>j8 zUBk|-VtQaTaAMy}CSukeHK&mgz>l$}D_32j`gFjBkG*CZ4wT4k^s2DL$B93fqb|hH zIUvV}c^*9k_B6`WEnTcB-qxUNtXA%At>qTuVUUsiDKV9#!_xaM!KM*#jLYMnXRQfx z4q_+a&qs#28t3#TQtz6zAVq#V%lBIO zdwQ8En)*{wLr&{^6!e56K2^Mmj4xzkefaF9Q2HlV1d7F)(sem%ZVELVH=5ip(am~t zPye$Yunsc|Y<+juh)n}kk=$?ciW3`C1Wr+9k;-s{7_peG5yODv%u zzy-Ez?;SA?g+jb3y`O1hNoW%OCn3gVCI+-bh;*VS*!EDG1t(|-_N#1PIs_-Xv5|O0 zQKgXJyhy_p0$hghrVeFe^U8r(?7T6Rh%{}a#dv3?8Y`~*R&!sC?1Djnj#o0NcW{b= zrke^XX^zB~3~!LB4$VTob;fM+kfriQa*7rs!Lh*y9#qUtSw3u1ghQrDiU#zj7xEx2 zlz(%`>`T3*9+m!H+mM;kKc_*2W&3RLrX5kjC{g_UAB3gZdxT!L8!sJOk^IX7U|t}u z*CAPO-2M%*kplb3cS)0pPi!R__U&w?Ki@21l-U&#E=Rl|RLBcZ!}Kn8#dw2Alq^Ub zBdut`{#+6RxRSAO@5ohxd_Lx~nyK~Iy<1SG!zSibebL#@QJL&>Q(3jOKgL=6$q<86 zTVAKRT3!Lo;oNM2)S-%LH|*m~2H{w_k8T7pG|sUsjs>L^QSgn0uf7W!!*7Rydxw(I%sQ8<$O(hYIBiz=UsFz zW2YfRP0(YrD};kv$z!Sy|1|7w<*dd1@%ND*aZ7juOfD(grH7Fvr*e*@W9iqV0E=FE z5w}C9;F5`NHSOGoZ+NBp;dUHCGq&$H1XQuuGOTAEJt&2i+&idm*Wb74G_U&qdwjhW z_#?+`C3=NRc;{^8kOVE6X_I&JjOIz$Z)_tRWk18AOXLvpDvH59C%Vg^z5!cU^rW1j zX&s}Y<4N=^hy`P@%=3BL)Ty=nv)Ir2=q0hsUfejgy0--1g*)15yWz`Yyh!nzetFtA ztIb;99>AGT`8h_itI+{*brk!O;PZqYI>4N)?!ZTIrAH_Ys892Dg>F_ZYr6 zB1e~@3BnQD-`NJMmWc#oSA^1tDQFd>=QgvlhU)$ri4|oo-}u5E$x=tVgvZAWk;72= zRrdl7PM(_v7>;ltCY6!;{hAXY%lDl(m)PYs`5HvxBO@o2PJ}dNRR2nIj6#{zX_1G5 z$yO+4Pv2;Wp`a@VlQ+vMPSOID44IJUq^Kj7KNut}_LGY}q{CB0MzLlKs2n6sN*56c z)055T^TroY;UzNm^>@6HV#f^1HhKULsXbz{G+cwrlJDu`AOWF5a2!`-yZ*n#81Z>3 z*cLu*6mbEp+_-CGoTUY-lM;I<6ertZ5>i98_?Qe@v(}lJd*hoFdxD0^*=u}zb+Oc8 z?6KmDlGj9v?;~vt? zqKm4|_{|w7ArzJS?SkLs@4!-1k5FH(%ED)Xjd%qBA8+nxsZ3#`^_;B%xYY_Q!#B7f z!^W@JcD|5+8Eq|#5tf~AKcl#KQYP=OEB$^n%=RdsNl{-ES^s^9L&`*7N$V@4Y6787 zsi01lo{JC!ZInH9MO3Gw6-`mIT+jZHL3_dz(aO>Eg$wST)&MX~*(EXgMeV8z4gLCFE< z!Z*PouAhCEy!INzT)3mu{j6IOUMIMU;JK`5%20@9KC31;DQVTLI9^GUlQH8jQ34N! z@W-zc>VMH7n_qR=mCy*BcNvNKUP49#({Vo#Bxx1}cyn8%s?l(vC5erv^WM0RJIfWQ zP(QITv$m;7p=9$JhhcL3ri=1;%b5nb<)8GwI*bw8Ve!5GGK*)=V8M-DWaa^=R??jC zX8rR$uS|x1+)-Vjil3?xu#GZUJ*r2X!qOkVf@CaT8PCy>F zRKP=`$UX06+ywn}aIv5isAIuYNlwXaj^t+Cl|(o?BvD1WJ}`JiYSE$RQ=&HP|AQjR za#UKB*eEr2Eb(B@z&D1xXl*lb251v6`OjvdmgWx0nWP$aewC^oM!WF+Jbh6N1<8!_ zu~Iau&<+K@lbfVUE>6nUyQ}J@gte;9^YnGlzaq#Ic5^A3to>J;&iP2TKvQ=VbiWdM zCH%yRaK7RJdb5o$2EfMS`%23~A%AMZ2s54H+fYad}1AIFckN+lOth z@e|n*jH)d4@>EChO{szOE(19^Z3rq(N{nBK2W-J7JCwh3Im%BaK!!}pFI0=fY=-IqeoCC zvCLrE+;mFA%tahLd_1X)VqnWDpMhcex=vN~VOHx*R`5>*!O*~sImUVwwbJC4>gT!2 zBEVz5rfPP+Wwru2lkV5NMB}4jmE>r6+X$*Xj!U$(0) zf7{9;7d1x@<-_L)&6kE~&heqTws`3EL#bs%#l13uZ&H*LX@OjT?k2ru#ZAR~Q#PTI z#N@nG_>N53lH`NADP!LI<81P~c~*S=wTTU^4mXRmPbi5kcDQje03UZ(QEku8Pm9&p&sl=O}qkSh^Zwftro(-7!{J; zG(hIP$v7piz4F7;Rw2lmQ1X#MEkA_Se@MdJ`163G@!;;ox&mFb>?f6oW1xZc{*Ilv zf_0J1^}aflPSWV|{Io`HJzgOzNob$~4u=|G&5Y2cs4#dUL&0?U-xY`pd!Cs>r;rAN zlg=nqpJFV;fU#}Rvnk!bXN7J^(|E6NRncrxVa0A6Q{zbH{iy2ss7lVlOB>i+$KXtq z8!%sXtK)di(iR}U%;@+~5E^e~jH*a>4HyvFlO7u8#sI1t6xhL*QXI`RH!$cd0P3`n zmP29n@oO>h0}NeA!1ut&0XFgqC`PBhmBKnxpsE7s9{R?>vORuR@k}#0Bpcdh#?uVe zR4=p$T9qmW8^=cJ3`PHZ!&JXcp(_${7@4>muWlz(vzfK4FlsOF!WM>|@iB_r z4y5vQ>Wjk#h7?2<5Bo_loaq$x(`h`^Lq4TKB1cS29hpNevkYMve%d>cE#IT8bwNMmi=Tj(g#wL)sAKQk|i;$*_X6P$gh!Xo;bJYv%TLk^=bwDczh* zhOw6oZD&!Oi!j+1$!$;;} zR;jJCdU1>jcP7hZt0gc9_{$Tv+E$c5jcg*hyiY2bP8U;wM1@5iK;$jaHrG%Y3=)5A z8I+RoUIl1)^F91p1}&(ZfPOb^BIDML31m@ZM7Z>w+t4t5!&w30)=T%YUQR->pk!1F z{Ds+KE6kH;%wdSqT~skgBds1p9Z<6C%(SUHMVd}S_I<1z-fBp0ZXKpF!QGpou|3$Y zfP^~AX=^-D;?=OLfY-R)OYG9ATY7Zc+g2|C+V%VD;;9D?Qi)Ij3pMJ{1o~lfw(t#^ zvV2l1ImnQN@dp2FS>C|QuL6hN>JaBPL*3^>qwx=)haH|(va*kIs^Y-UN7-L!D~!B{ z%S=bP70sy>k3hV({^cbpZIi~A@r?yWqo^Yq0+uu8q3n z%5}1?2I!_lI_<>JP1=zm!28cU_Mt;s*oy;n=s~S+Z@@p+)p8OFo4G2nOyjuI>QCoG2^E zqT<9X#ISX{Sjya5&=%aJU{W@_2Csdh09x!%1>G|Y3@JG;e3*vJo~O!Lh#U(Dd@Lq+|u#;$?SJs2gRTnfc!%2j)Q>pzK2?hqOtYx-chpo`yj{ zlA_(}g)zyBJdHBZ%LDpsP+AHE+t`0a+6rCq_FbqPkr%`e?H;3 zzi2;n%BU2t!A&$}36l1U49QfJU)l_-b1F~K=U#WZ>$dWK<*b&4$m9fN-ZZ5LJbnN4 zG0A|Ljn-=kb;w-ddc(xWn6p|LiwvC9Yqy2alyzi3VvUpo?2t_%!v>iKFe1{mALwW@ z)l7f|$DBsEso{kxt6jXYIcCRUlzat26j68C^Dzn%yz8p^SPXgtE_>k?fldY^98y(l zjjw(56*8g`thy zh+;1B59Y4AE89E{A=|IAzF}#aDKq_;{=M zZ^Q9P&o-V&Hi&f^|JV9~Vy5Eo2ip;q+@^9usN{QDZ*EsjVUAH_T3Q0|0yif)HXA0^ zm_Mf{eDyk9hDxL|bIfdnK~I5IDcUQw1GL*?NFk0K7-Nt`4Ml9EVKwT!G2}dQzb;wl% z1@rt_T2Q?+v0NaPz52oz_2I{m>!-sIN#e&T;>hJs27iYiR~I2{ITkE>DNxKIFqE<` z7vtKo*LdJ7a54FFGuQat(G_iwisWY)5{Je1OSL**uskrLwG*1qZ*ncP5Q26t}7bf20lYonOy^jgMrWJR#u_)S~!G^6llFDw;s^RvkS20yfKFAAb zwVqDRPtn@nKAke0K*9l8ls4rpc~qbT3S&q8E3t;x9S!fq8s$40--|Wrbu@htYqsfV zb`fj&)Y0P6fr1y%`U0i?TSwb>vG&rA_FA!y7Oakr?te{Kfd6hIT>T$ygy)EQRCe7n zj}ZL5-8Zkrzo0X+pf;hfJ*22Jrl|2buI^tv5L7%6Sv&$QhI^Jwc$Uohm5lk7%tx0D z2A7T{mo<5m4}C4~4lW;rmUlT;EPSmP45}DUs(`yxPJ35Q`d3asEBm~v5WZFOfmL%+ zRb$TrgM0OQV)bZJb$@nsyK~K^bIrC}&5lpaYFj6V}z}7rrTfVTV zAlPsQtUIP|Ah~YvYdzv?{aSGSWOBpAe}fuA8|R}NCyN^UiyON_n^vNmW)qv{vzjJi zo0qejXR4Y9@>(WCS|<`)mrGlRD_gsQ+ZLnR7INCAzP9hCv`-eaPu8^$ee3uU*0B=Z zu^!toR@E_3)iM5zHYCFrv)~KR&Yj{;L{ryzLib*E_gr$%bau~FP48r4-+pG_T4CR6 zW8Y*_|7uSEVs-!Qb6dV>08u_@}+ddK)Ge0-s3VxwqcziMLV*>=d9JZqTT9i3V%nLZkxUdf#~ zY?xWfo4qfd-S3!P%boj~H}|u0?zDDpyJ>!}Z+?4VezRj?Z+v0%nR;kPoc1G*#t=Kj zi+43km(5EjCCk62m)DzC4%%1tYF1C%pSvcj`xC3X#cO{`*3O&PPT*@-gKMV^>o;@j z|Eby6Y~J>4UQTWvFKixH{djELzJPCEH1AxE?VK;{oUZKb5AB{kLlFIYw}X3sC-;7> z?VUC5Bir{M=J#(`_kY0;ZYK}_Y#;t?I!3M?-*%in^`AaYoIcK--tL~>JOdHqXSWMy z59{au_Rs&FT-+Z0{MU7j9K1%3|3aSpx|zB8y>Roie)F{VUyX?KXCvbF-{fE9;y>it z19I;XdHVD$Mf`_~_Q7Zt!_+p^Qb1-Xbr2S7DYPEQ z*>EN~PH$`M1`;n51GGN81&{M>K^tOwfh>NI9P{SFN#3$Ob2%b*foe1y^+I*21#LYV z!4VoG$LkTABI-bZS$H+y7@v)J6G9Ky4U;Za7@eTkIX1F%23_h@O=KF17D*vvg@p8C zaA}$Jt=Q_tc;V2yY)As2-?)00Ez_KMw{`SDO(5lLx5!rmR_JBvW|*q4zu`vPHFAXW z)CFOanFXLOa1C%j)0RuzV)(2fjzMEDZ!Ua)5<@Tha9OfvI?xFMCfx@iMl}EM_!kJg z4uXsLVnkEfacvt4|LL`7tuDAnP*6VjOP<2kYP$Zmo=*Ax>_RL_j0)`~!0?TPY0_b2FP~flP7r~I{9+9MQ2VqoRh)e`Jy@Up?mA)m_K2JF1BwdUd z9F5S@weQk4{D`svZiN1BFsT^H4>t43KlB!?%(#Sd!_% zoIUxm0D{E$`!Do-JFY<(&s)geRWvt{w!x26TZvo{dK`9UH0GXs!c~Rc-t^GYPkFnP za8_CR9btI`Z>T-e=mTz^P%GO+FWJ^56I&pK$|rGjLJoaK22}|pI^_gG$b=^|nf34# zIFA#WCozOZml*5e$v}~y5DccA3BXnf2v_|@hcic^ia!-=FTRD!lniVXo%MKou{^}u z3JR1R;>37dm!!o|nvYYO%u}@ma5c`xe$2R`J60HC*)v1ezfcEIbneR8h|0uGsbPu4 zQ(|Ez;M$iJ7O^zF7crF#C*q0y!s8UE@>+O46BCBP%-TB=;TmC<9GvW#IU-i$7A?a{ z_q<>&fjN=Ug{P?*@qSX00P_=|V#q@kchcUkDiE7qc&jqz#zu=@Vg7}ZOD2=06a!Qv zHg~9r-h*q9oG*T zWJg^1Un|jRj5S;77`Yuh(t^@v%}Mtz9p$T%p`yg7;VhRDUV*+FXL9&>nXYoe$%E^c zUGmiZW&J=>Sb$tfUgvpdFaBn9Fo92c1faMUD?T8~zO1~NLQ$Tz9VHlFJpc{;&LL1l z_y+^Xg7nHtKArl(Ovlw69XCE8)M#dt)Hc0;<{yuN^aL;C#5Vcq{r=aa*>KWs;i2-J ztHgZokk^etl#%v4aVs7%>crcqAE@fjVjngcIYf}bLi_p@E6)_Hr&fq4K)GwCM8xxM4JLmHSmS~bOr)5_@Q#FRTh{E(SxhU{Ka^xYPP89F=> z^*mIo=-=>D8dYKd9p3$8#@EN3^MDud1U)36k&%dd@vG1SKF9`^ezgvLV@&NhnfkjS zjT${JJf9>>Xm~{NEo}fU^(1R|(^&tbd1wcGy!mMVPRfGG?lK?s3rYRZCjuLk5((ft zl=hK-syFBGT_SlFgI?8`OVgJ1edT~JkVBc*lN9ctnG%xZPreEjr#`?lq-`1EPAA^6Qi@z=vRcp*jF zH2FeA>z@+euHO%suP$-F;quO8-Yc1iBYz~k?D%S-hR^$)mgh|*Ff9r!n3G4nrTFGY zuy}o{AMbb9f^;$ej6^lla-|aZN-gi4?tz(w^6{kQYu-M7@eIbL4evaQSPYgE4GX{( zhF3il@E}j~bL-m=7F4t{Nx;4NzRlN=As}UI04<@R#KMakTlE?jYa^8k9fp^y@f?UGPq z1*_k87?q@97OgZ(c{mm@RBQ;UB9iHAaCusy+#gWCq;>hLa)e8(v1Ub?3e9s)?g3-IQ3w!z`iY((fpkGN}8sJ_7QEfOmeGC_NBGuxT_A% zo)*bA!9+Yz24wcC@N=VO{I6v+h7gQTTR5r;KL3C;GaziCOBCPF(RG%=2D6k>+) z*t7AR2P13-^-TKpOy_x;Zb&mVW;?M&;x|`2l|2?9{L^~6%{vUyR^cze+G%z(}6_QNy~1_{)W{_MQAu$ey} zYeNC961c5d3sP# z%HGkNp(ZeYXubca&46Y-11vMc8+OH8HXy*X&qGMy#zlyoqIrb(@0*phgxV-skXE#Vvqa%3_yDZ5M-FepGEDrk-%+WzVoes?I?@hBtcB7G;Q&<4RF`zojhYH@p& z+KO<6&)Z`RT|XRtO7-eRpEL;xz^57Pf%u$epGx;Xs_;u}Ux@r&qqI`nZuj7{*(G>-mOjkNPWgz&oBs8KXvNBk@-f0Cf}$wV6h>Q-DEUgXR`M_VPo& zG~k)GG^}h=>u9vi!-|hrUlH)(J53PqrO~}s9d*TZ^u>j#J?MlF8hEl%Uj{qcB9>a9nvt<_(ekIY|Ny0^wgw^md9hqnCjD>qrJEh?)mv*UlI zElYgc%d*-lI@+t&+H3x`!>Bsy#X1^|I+}euTC+OZJ38QN9jc9FIPS!LvsAvka6)tV z0U=pWG{`Lwe=q>IRUOaWobXT`Z_Wtfb_Jh}hPPkA3j%PLkv*L_v+!+>u1$^3A4YiC zf%vUvSaN0nZwSr_2VuVvUaSOWEKfJu4&1v3P1d}tIUoE;MKr$#I&;ACM(G-L=)SM) z_LU^%>_NNa=qAvB4@QFuwz}?(dY=hJgXS zz1vrPay@;2|MhXApgx@fw{UyTjYwJjKpee&IGhlK0~SaEgyPr}i_$HrLMcCiCeGQ9 z?MBe5-mfD$_(KDaLk08i_#h!?pR8jKMfRYd8$m3n*Sc=t&s87x!vK*+r`1;X$2yRs zIK`{%Zr2GorsVT+1ou-mjoC!sJO_>k=b*26mod^2z-fks0mTpJ>?W-m#F~XOK7dHY zyU6?qN&QB3)<<)*!5P_vsT1%qTteoFp*-p_>bfx&$1Y}-!Bi-GvIG2N1j>9E?OPje zKO1Fv7;7{hEi@*qoB%Nzk3q~y8^y;gdq+$i;W-mDt*#^95V%>@kk=V#&}_uqk=XyC zSM&^c{SW?ZDX{f+U2}}@ufZ2NI&IE6XFI0c&fw=&6FLv$x5iWc6J2}RlZ02}Kd7f| z%=^%shHv1LZ~UfD{bnxU@P6abo{6ynV>rwDRHWb3zF5}`)im`PoSk|oHh$KPZma|k z&MH1i;?$Wo(KT~ArQ--Y;m^}gjUR>riLM64N&uBnh((JflM z>0@&nGo*^+C@+8<<7-F*q0T!RjJfZizd~G3ywZNx>fs}9=U32DO6NPr@_a{{>$hd zzB*8_%8v|_*)ZxUP+q?|wC5Oq5sJ5^Z9FW35wjd%L|2t14tms>-D z_}f;OV|UTJ#nmfpb(4!uTP;ms?bZ)ZNoN_r%oJFrh`fvJgPLMmF zx=nW4X7`(_98$ksxi;yacKk{Bc1<|;1kZ8vA@*!(c2^EUmh^SYasuSV-8;KBQ&io* z>)44yyY7X|MJ)REt^1A3*G+0xBM>=1E4ceuRr-lI_a<-`fgqwehtB4+5fino5!z|X zr^PISMUm_ykDNns_%#P~a!vfggL^n;qklQJ=T~JP^v&ufE-I!viFoW~BJILA>eWFM zRC3e(ZQSES)4K&I39{>8I%{43VmR1jSQPn#;0!)x{8R43xh(2!h3WdvoBd_~9>wgg zyXXPUiF3N#0V==WytG&4T_^WhUCGcPD0R0)Cm0dCq33t8HNJv$TAj%nVkB6*yu80U zg%_!I6SaRwF{{709;{S;Om>q^e%+9G)3Z!N<{z_W^0Zb)FdFSl zY=a6afI!T)ftw=6-ulD?m@jCBjO7@k?2l#&WE}_bAUyOHc)S{q%cul% zb3j_ZMeJGp6;QK?RbK8)J)~USrY;(rj1u+a(wJ9+6BKV3p~@^NKPW{D#YRP&OeXL! zY?>z~%Ru9n6eYH{Ih1Xr)05)aIVzSe1GW+R7I^PlO1%9IUVWvYE-3jbk?Xo6S0CRV1pyO8C>JoAXlF4|x<} zJzPM?W#q-kS70@;EXQtzO0GAxqtPJ6sK#6|S*xq_6M;wQHa4GX{hDhnv2@S^XNCRU z@?!<-)Ha#u3yL{!H!)cqaGVPQCc)gv+qDQ=p-1(nN}h? zQZni6?j%^)CF(keKK!=|7F%CG8Ih!`d?Nm!uoF>p7e9Bw8**>S$KLvsR3^aFPwb(> zHxAHx%@D<3-!v>vG};sN9Q*7zhGz0k5Xf zJCxKWLDxyMOk^h~`O*w{QNqk5gNh{rc016?C2!+7kyTjRc}HPXy6DB7eF zJl31huH*U)!aAdnzy}pd$Me%>TChs8FIM{^uE5Cf0(`>Q*sOV8kU(vI%JnKx5JwPb zctZ5hk(vYvKj%?ZwD(|4f30y=$M5SY3A~n~zs#?DO7@b8x>@%h9oDW4Enkb+Zw3p# z=9>F9%AU-lTxoYp@=J>;ob`Qx*SyIeuJ!1YJjBP20sQZ(vCgBDy~!z#o^MAZ-*;10 zdY5waS^n*IWZxi?&#JfnPsGTnHQKUOBUZ21(XTp9{$8k5Dj45}?QH~3M~a9|e_%R= z`+tlzVaX>vbz)Cll4@a1Jk$M)EnI(MDn2^}b5bKVY;ZbsaQr`$PR~UOlMIfjY8U>_ z*MT*GT5n5iZTNFg)vcD~t$e$_gTcSHfvj91)D|4g)vM_lm&GyNk?avE_$6`%w1}$- zZgKuxBh$a~VC-}CT8{V#&1>Q}il2Fr9f^jL$kvNbI6my}$VSR23X)1x-X(4)l#_@E zdnq0cwl)a4mMjRl{s0A6Mp-T(6pJff_vgMPsNHkl!`ou^V5!K z`H>~o9Z3pCrZ(%pVm0d-_N;dH(=Y4xMS9`0B&38mRswkR`85C~C0w1%QERqVLe}hE z%pZz*!&|Lz6jg2t6^BGFXWk42d2MX$u7)BFGv^!8nvD`WSv`xL(UD43zKCa)OgJle!9Vr;^X5#?BB2ybX;L}@n;^&Fh0PQHN zs?J4}`XB{_tQp4gz94qa4nhG+IixaOT&ilOGUV0qiKwG<1?xy>;_qL3fyQU$1|@;29XZ2mNCnE zU{U101|Xb|II>Z4=gk1Qk{+WQ-ndPg$YZc3B5zpkrc zs;-rapApp1Nu`k~ z@Y})FvCHnCQdwI>`NRu(%Cy57e%lz0mUMhH3L43q3~hwlD#kNc8*x5!iEj(!1R%>T zwb{9C(V`rd?4EC&@pwP=c=A|RoFcO))c;H4{Lpnl(=!;SSGMMdH1gnTbUYa%l*%y18( z^3B3cYO&|f-QK*!d5Y<>o}O~}5`tF6&QUx)$s~pRm4U!{zxM_4-o4xC%AQC9k1|r9 zsa4RZs%dRmWc#>s+_|pP(5>0?CEJfs=EhWt{D{V$#(6?b`E8^8m_o9$gA^5%3G|(N zvs&6|k2={-DM4}2Md91mvA%}c#Njl}EJ@NOeAJTdf&q>~e>dLZoueUq*XAnhPi68yu6!RFm4{&T4g;)9o)ypKY2y zz0UVa&Y54Yd>*NS*a!jh51hgXX}l6ytc zMSd;nFEhjNRG<$N*O`&txpY|57;}nrk+e3#_G0lyiBb8Fm+VyX(Wk+UZ!xIf=p;~t z2oZJ?I-<*b#p6K;qY33of{T3)?RDig zh^lP;%E8|)$C{eRm&*QD>?a!jD=#L3UuW{i85tT!u_Ef=pB`MVf%Rfn@{F+xd$UrT zzmvdBP}NigMsbNB{GAZD=)9 zMIU7tg=XllDw;hgngf+A9LrKt;s@PQOvwr@OqFaLl|IM9KKd)!d`&45Q{st@8cR`f zDj9S-R&sfObB|I#Xvd5qJ;!=Lqa4Wq3V$5A#k`OB*GsO84HQZfkf9pP%+(**fB`lDkT0GlJEdY z1ga#_sw8u(q)4iys;i`#s-$-h`FIYe#}0>#0c@=6U8}0TG^=pxmAyYEZnIB3B!wq5 z5^W`^6eBb4{Zy)(`s%g^{~h$HEUAD;e%?l>hE}xT;*OXhLCaOr4w56z%>x>a8SPV@ z<}7V2M!CngWnW2aJRIq|Do7O^bAI|t>m|X3p)nCFFXePp>-`lg+$k2^(yCsPP8v5f z#l}Ovs__l8j_}cInU+a%rM-P1*gc?asu{Ly&n=3K#ObL2iBxLf$3J5pRQHtZzZm^b zoCpq-YuL=6-w~iLiv1R)F?UDR^bb}&Mzms~@fit1-Pm#GW|mE*!p%Av=74e09#VST zu>h3`M*rUK`td2Wd@HfYZ-s9_v~T8ODe+?D+#cfbiCO1@GzUDRH)FB_U!ditnyOXPAT2g^y+xnemn z#|IXf=yB7uxVzhj8^CVF<>Zc&dB<8EcN9D$3E4SQ_+d1Dy4u(dS|I;QQl9cyG#&I~ zIT=$4Gjt(qJ7#9$cuG$#y^>U}uX+3bQXhQe8RldzLnzxh2v3Xgo_lHCLnoI6SdsUj z&}4!?g=J5EgnR5HZ@Q-zWJ`n2E3_(cG4*v(LZv-RS*a79QCc0cVq+TrAdy@q-#wRQ z+`B8g#cxiO?3o%u% zNq;VL#IVkN_Z=X7+d%osRI3$JSC)mLnwtF~q`X;8fJ`S#p+Cg~FIjb1%$%AqYPKUP z=vC7}2b`I&`jC&4RNI=kvs#q;a5#~mp%BsjIzxq)+<_;#;Y}_A{;@DKBdNy{Kkbp7 ztO~4w8$|srrKg;cVMs=ZSm&jQj!qesFqv9bX2pmGUiYqOYN{MTtAEFP0`ZnCVqyGb zU%a=MiLqs=FIVa%A<-4s+nJ68Y(DOdsKR2pB#S&wOWdGCo}-312p)Z)KKOU+@JK}y ztgFsNRuYK!{XxB^(3XK(0)JkcdQVoWP?nD6s08bGeVWGep1tB2zFrSMjnxPGa*mSs zDSYH3l*7SB>0V+UC-sCc=kK%&nf>ys7pZ%>>Y@=v0MfD^L8B>2hP1(gqz1r-ad(M% za+@zvNFPPKikezg_oE4Zc94Ku5HR$Gae7ZP{#};#$jgsB?HN+Ab~Hv13Hc9Usj6|p zoE2lt)g*V>)xyJ~UgBI0&h{G}v9mrNeS+lnYqA7kVDnb0;8)`Mcg!&6RBN$DD3q+D zqTvYeTzM}t)W^>;T%eeVdstzDk}i(Q0_(ni*+2Zrd){uQpZnX$>K$oJj!=DP~!%!EaD5iLC)b`E35@pzwt^TWi1*L z4zAFZuYlkY^QRPG>Gn(%G!cFvu1>SK_tKTBqCaj2pA*0ARRdX7vYT#n-7m5aoRv-s z^Sz77O;J-jvMfLdQWAO-pqfI|G4w10sEI7;z{6|B-POPHr~sm~c(1mzpoWacXq3H- zg<;xjO>>|~oTwco|nJcrx~Bnf(@U6IK}h&7XF`S`3$?uAkY(WnY=Hu>AG4_eSz z5_;xB*&oVy>$FNd8zYvia)~k}9S{mU2{rQ3&gMD}TI!@2o-CqUex~Zo9_*yDc|0Pz z7#7`9FbV62g-*_%%`V-4-|<`Mb}nMh3kZ;l!eIifb%Ul*K>qYs=}~iQZ$H|d_WC+m zE4w?vnrTu|&7Sn!E|O2LF9tz%IAW7-v>rj; z!qI0M9(Sq8dY?oL<;Jw5ei}t=V#(_G6W7?&>H~=p6Y7PH4 ztL3D96z23|#DM7crs4G9X%(`p%oDJ*WY@@GcOxsqipLyp5XA)=%_SNqWm%A< z<{#Q33b*4e>-9wnkxj(7-*P52t+v_^gVo3imkTMZUYn-ZYekpEq_ZQM4I{r&Z*8QT ziAZ*i^AuC)p{}z(DKa5H+=D zvcTkn)WWa7LK?HSj>Z>G%!hXgNM@SMdy;$h@aMnklXpf-5qDk}02y*JXDhj;S9V_n zj7Y! z|37ariKr}WW2U6})M6T&D?1`_`BZZr+87&jD3>6ZxEV^*xNh6{>K!a`BQGa}ag%*o z{QV)_orrCAxgt{=u2LMQc-g_;t_f1IYd%`rw>^a`^74IZz2d-iUHS@uEifr=k*B9j z^SwgH9~9pEK154OEo77Tg0=I00#}SCjpNK2n+)?!I^ocY2xC+(=PQ5#GY<#(tNqhi z>D)R5z>IN{v{7{aww3v3;~DM|EioIXyi+hxtVYv0b~oSmjL= zLw=$Je|Mf#1D_`af03Fe4iI;mqm^G-wKP*E!L~m)>iWSgDbIIHTb66ocg3!-sQ<3{ zaNGW2Hodx@2|8?YhF((CPl{noo+S0AF&ys)yERdi2bC5tpy2W+PamK9nc|U+9D4Lg z>nCFQ0wsf5Z^aC^SQ4}=0s(W8v#mYcs*Q=M6qC<<%-G=Pv(k=5UAc7%%S@IlzH-N0 z5!Cu__RW#Ij@dNnh%J;VtBt+0nTo2PK0$FfMx~R_FyB6Sqt`?lR~wzi^gD1Xq?JDF z%{ymg`XAvd!xvB8nVDvJwhJfMlfz6;*2g?s`mVeQ64iYMHfU7^tLa7a|*Sw z^{G2+u8=qp2}mUi+E)ClGq z5g}u4u}>@MvtPeS!a9;v>@gS%=G$VofO-_g*4IaBlgU!FgYrDAVQ86_i+s?5PeTA| z3J@Yv4spSz6!lu75fTN;&duOE*%*o9VvC6sixDF+RtG~eC^z|YIev3U>bxEnHO?e9 z;WuS=<7H(g=TdUihyz`7@^SN~0gd#IM|8c}*-dNTfkJIBj!Gmm?I2rTmMnkhsrT2LQiqi%1q00Cqk9Ork=IMhX zG~8LPBI-IHpX;k*@%i2{J0=`iCkcH~Qcj5jd*2-b)QHvfQDZ~TC4S*z6x;WLHodzqP2UD{ zAvC2`r_GMFf2*!6yW@hF_Vp>#@3ulraYw4-$=w#0sz$`N_}p+$Yk%udzv$I>PAFZO zv8ILIYHKg>sF{>n&sDSy6uDQktJjDZxdaw)ep#EflQp&MuTS#KPBTlMpNqlK3^ujQfWKW@v!_(3B{3yKZOz^e6l9@mbhXPV6ZA!a@TPNAEA;wS7p$%Kl zsI$e;-v;_x`>1M4iu>eiV?Fw(4*)oK^iK_J{4n;a;fPfVc;DOV-_Zo z5RNemakrHB-D703k%M|$y6@mM>g-X6nPyD8A!83?azgXN;|fg~@CO@X!UKtXDR!Uu z7vmxw9cnrsoBVPeUkN2;s$<&8{0ueky7Chfen@>OVUq<>*5G&iua0Uy~R@|?P{JrJ%9of!q?&MB>FEK?5s$~P7? zV|7VNWgg3va2R!KyZztwPNwka*TA#a5YYFK2!qX{qz>;re)4wa|0X z^5fehmpKO4Vn0c1eYh02C295Ipg?Owd;qsKGuP6vZfj$D54VkA_0qU|Yg67Mx2-(a z@^o@*bD0#6{k!VrxyII(x&R)>Syh8@sBm4j!YdV<(X!9;b+rw<+?RVI5-lasCB{s4 zhGcl>GmC}P2Pk{7p;bo@re ztG~ySggdk2wHF2XlU1E~Nb9LD6}e}>QZ+HXdIkJBE+8plo-8kC{oV2PIAq=~wotXJ z^ij39=wLS5)r3WY+XjZL-HdzT0WI{r)39gs$l%ear^gT-of=QU6r9ltvs?(XW~o*) z^`_?Z%E;(anf}pD`D@DhezFTIMr!}iN@Kk>W_H-Pc5aA!F@UsFrZ6si*Dn9DA=Vnd zl`5KB&(ZhZyY6teIWzNO@1sLFD%u}efQi%LVD0`pM-wyZ$M3s|GAQ++S(Hmd^_sQ` zLqkHx$+p2?fCj&_j)DcT8>!$hbqdGX%xH((&o8xux=5 zp6z&hDF#nYTe}Z;uxSwLv+`!X22Orr_!4h5>}#U^t?Z3>!@u&dt|dk@_56yiQ?Gm) zdnE+=pYsjq8_xSPyK%egFr!1zUWO?5Oy=_5M;@>sX-$?P#@G&?Wl~35GUTzu_@d5{ z`oHrSGv|qo%}Tb*D?avY|f`yGqPLp7uA59k*;zXmIE3Mg|5BYdGLQUk~-wi&J;NI#9W+Ox5ypBFa zu>=hi?nCIv8w0rAvqdI-LrE%=5ef%~ST7^(S+`W@D!`E0>>P*C)GNQb(46U!?M_%{ z9}$nC=O(Y24AGKk0?nOT@EL3hVdM}Pu?S z3SV-@Lmq~-FzFg@%~lSKL=^uN+3EWY$tkF*D!oy`_HFV*8V-}&q9r>PEh9D!ee_A?ke-5RdhDti zIPl}*Am1qp(pMP)S%f*J!q-_C?1X5REU1SJ736&e=O9`k2a)RR>VfRTcFi&9{3(A; zRo8b_KAPkG2*q@)SHIhhXfMf22Zb_G#0Ri^>;?eVDyOVzw`~D=XKt|&&`zSS;zlUW zuXb#yo0<0K{SDKhNjpq$^>qy@m8KGwNd1|b3`@!1J5FF3H$_^LKD;QZKy+uVP_YUM#-b!EL&o(ahPj7w;l#764^w(GN*BErDMZ^=PUv8kYx3mmI9MX5^1%Ci$=W z>fja2S6ww+RempQ%X$N& zN=p^G*GH#hjU@JE0gbzk`2k@{*r1OGR--BrKW>q7NR35n#lKjrho-Ae8S&0S+ku#Q z8^o9zWaSm;IgSX!oq9do55HQ>OP!y>W36#a&2<8fVTQCO)%xL~#VbVR-xs6S!; zmoCAfB35RMBN?D*LaV5VD6a~%_BzYh1`fW3s^yGe*Jyyogy7y3S#e6LRjS5hakOe{ zR$o)GwY{rG)oK0{O8oF1Y#N*6DY{Z|5cgAT)aZAnMLod;ap{9O$6r&Mq5uwC^U^@v zl{nRrAq1;;Mbfvca+|Vjoq~N;g@UAL4POwOE)@_WRETb5?u5nZy_=`4RFHqqBWC4nfhSlY@*UR4;^}HsgddZV}Z!>DILWq z*YOeIwshvAf3_h9*$8jJ7q_WawJmhF}Qqt4azDhm}G91-nA4zB* z>aoSDkqHg7)`rH`R=66%?KPlsIRgO^_flpT74%b4Rn%^VB_|3m_%qI6SfS!SJS2ym z=nK$I9c?mLM?PkKkB;wChg1{d1nb3P^=`Oa{pyh{D#U)RAXmPHU<>92H{7H|qHA&Y z;-pP&bMNYo3&9mIxf9*(mDDRUZo|ThET(pOk1er#DmYo{Rv$?sYsE>WEK0k4*`Fbl zcVjSBWGqm+F3t2=G$atUdk!C0;#982v-0>g8)%iFa-)?}C!Gq0o0TLA0qD_L3H8qp zB=m#;?p}aBu*%0fj!QHhgWV{D-tA-~bO33`^LiLtxYv!j(!?@5%1JCHADyPEvKerK zjB4<3GKJw0y13Ee^p1_esr~?egM0=-n*W;vM14h{|q=fDz>+2 z0j*@@9sKBDl`RDUc@9pCu;_IZth;I4coi+}&t(oYq>ZMZbU&-GvJutNN;Vw+GBm4K zfE$d3-??VkD*b>?+hq0=WH?S9?t!JSaNS;nH>E}m-wqMHiCCb`M(4wpEL4qn$R7Dv z%Y`5AZ*8DPMnHgzg_MiT4`#u?CGojW*-=NGl*ik?Aix=w%g;3|3i<}rblwrbsKJ|2 ztI2&`Wm)MGxU%=4piIvrpxt&4xR@tc~%q(SzXn|-`c`NK`tukTSJpv0%Hi`XYS zI!jmJ59SCTr_BweFXXs^^*drpYW@%$z66>Tw;c=q2daN<2Wzy(ace$PD8O`x)S0SB zLzYBJP|j$ktCWh2O!utKS`&Ry!bv9-C>mBYj2)L%pElQXz#QQNXIaRuB(4lb(tmdp zH^4K#5!aTadOCx%st@d6aFhoF(A>LGw~QxW(XY6=#@@ zLsn%8+0cI$E>W&nkym5*5|A7>;M0^w}Lg`h<+|`p3z%BXyh6|`s zB@yW}ZT1Qjgoq{Kl8mFh|CMlp()4NH8ShB?EGJC32KccN9B-lEwr!vw%^ClFi92(n z!~d@UeoHeh=j;4M6re!5Y`EHV7J%XWi(>?Js#3aIM)N+h4LSCYrOf_MW{c355>*&>z5}N4w~S8%5xMWtJvf4!4_Qhbi2-Lof^?WZSF{duQ)7cR|!@ieIbr3E!k#hITmR$DCKS-DMd zj4qGyifMTKI%#z}ctUE=G=B{834M3M8MYI)Z?hw|B`8EKu|bg#dG4^TlRxxe84OSj z8BE+yT{3M)NH4g*Ms;FoprVVJIgF(KMGJWQ1^B*;{qGKM++oKy?3Ywmkk(7~$24KktZf=AMkc}>pfh=y8lC3xRn-!zgi)m;fJ zbrM+I&a7p$gFn^{aQ4MS-x7AI)t~De69AlS+nXRiXGt5?v=-M4UV9APe5Ip2#Jse_ zfgI->7=bTt{QEJ8)>(=EnSb0@ms%FSlNT{<@6laVkE#7dC%8V$s*^)ZhL&051=wDs zDqKbK+!*Yb3LWYq2Uq!PY5Q}#D^{so0u+yGF#8qHW|+_nX3}20)9HS$z4+kC+|!fQ znn&m|Gdz?%tUS~=FnQos*=y0Jo%LZ$p2<|~88>ss9s^n#vHK@sbI;;gZ`-*4Yug{15& zzr8m2d2RO7+v4Yq+D}2J|Mvaf-bVbqeeLFaT`|3bIY1VOhKcsC?dQLrZy$z!K1{xS zT=@C;>+RG2&!<0cQGb7;Fci>&FmNe^d_Wd*VffT+WPE5_Xy^nS@0)#yt(4+kig{n% z5?e!(02nX+FWLh2ztR>4X#f59UrbDlM{0+6YEwvBX;fPIvvJ{&-s6xCb53vd{od@C zQ5&35W0~3Ok=f#x)#8{9^UUsw&aQUM=?%?kOwB2K)-XQiE}P{}e#(V^${lsg9rehC z`R8_7=gr#ZO}pidxaCdz=RwW#r!DiB%nHW+3VTBen_~)_42sr16wO%|jejbF+ZQ37 zieOGfqaH;t>*6`P;$_$3Hn-w&zhY=`aZhq_i&e>r$8(sfr0W^kFfCoPEZuT1oenF7 z#g+cZFRe8w+cPLTFfKbZDckigYxOTfWR+?rC0zs0ZbnEqGPHX&ts9ZuyVBZ= z2yTwsTD(*iz2mbnD<^9Q*_dpC}mK zP9E9F9y$3rf`pCCrjA|Kj4d~hEkCmu)#E$EgVlZWYzvtH1m)Cc@Hy?U7|5R?>jBH)b zZXGRd?Nx6-HgBH~Y+ns*->+^TJ!=>(JCB2VCnJ0J$o(tW??>eC$MxSg-A4~QN0-m! zMf35~*zx7q@zdt<$;zL{y+60V|6EU;UG806_FSUIE>W{rsN<`ftE(&c_0#J0)B5$z z_Vv^8_0#3`J^UYP{2vPW54HOE%wIemKRrG37dKCTf1_^xPXyzcw!i@ukdEg6f1@p) zRtJkx0?~pnLn8low1p^py2SsRw%}xY&+Ym@(H6m^Si{Tz6K!$&|Iikl|G%a!?AE0J zLF`zq^>lq%V~kFVC%>DAbCgNnrP}Rfd@8cr%d%=c+{?cAG}=vP@vhv<^4Y80&-1?- zX3MeiRw>r|gH$-gm_XVu$LB-fFOug7 z<{|ToVfJ#`0R)xSG4IPL^DR}O_3kFZ{yTqa9w^Sp;V0>BZjTWb7hB>`ARnTBU`GAT z$?|rf^QbBzo6YLna6-%3|YEN^h zV>o1$O-d4>ASV@Pu1(Qw_O|>3IOf@FLIe`FC!*Wx?;hom$p&#Pb8Hz?=nFOxA8z(7 zwfJP0?PI{+fcRn=3~F0P-B_XZ)nmsT>_4k-{tMe17#B!wKUXB+dme%A!YExN=d?|o zy$(nX&C#)*-($g;NHx9y%x5+N{i-Nsq6OCgH3cQLz1<9Bh%VUD=!>3kK084zRr>Ly z2BM2BFe-d|czQ5!^1>hc*9UY3hjFMg;s6vjt{U5<@H{6m_|A+0HQr*BhErIE>@be` zwu)d}yl?-g)1=S%<3G?A0R=$W*g{}omUa-XVq_ukGh~2f`78`l0mg$-giu2)2>k&H z%qULuXl*KfvUpb*{cpZ-a!HvNgtlk^>9e4hJ~Ei}hFK`up)iGZCfeWiIR8XTn?iy> zZ<(xdxNpIjMCvk*(1AjHC&-XEg={=8k`YIoFGS=)mb6+FE(Gr<@Y%tjKVy#&3Gc^a zy+Mm6NJJx-0%LI7yV)Cg5AaAX*F?&p*O+PsAy%R zEDkb+{;*7}10EKL!Q1|V@mnFGbM!^_-}4z!&L9k|NM|QCt8%3z*HC7}IiSw7be@|p zgk!OgWXN23q7TXXEn^ydMy@L}l+lK~ zpyCT6a^)`OJw8yf;Fzm$7b=knL?^Iu#gfjjq~ZK4k?;AuH?f zIBNxay=jXHC{(6Cf|foa34efasE3S`0z8Y!ecEL(Xu#SfvUO=PfzTOKnGnhv3)1oD z2tc=($zLBks`%T!mp>3D6)*nw^zE`M7Y1T(8o6TIqhX0`B_$A9!fJ92q3DFJLHII6 z#S)Nx{9>h$SGWDnTRbU_quF@@iOl4_2VAVgz|eJ(O@Mmfk4Pdev&1Jb=Bs)zA%z7n zZQdD5x-=vx?uUjWy3yCI@9H+F93pHEO^HtCGvbKN^JW82g}h~X)A}?Bk$|A%0D&1_?HvkfUw;l$Kr2QS{sjpnt<1)o99v*f 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 @ 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%0DhdBk-A)Xr`AnV03dx! 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

              8M6-(oR^ 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
            • PH)slOB`B zVVoyN-YYO1JP;iSEjHJ(n&XDO6B*AcC0AJ<6WSt}6GxYOCbkr*!VDghE~E`3H}|0& zjxveW@kw{Sj5f5*M7>J9uTtCB!psR()e~lzGxkh zt(rD1ol8yl-!j0)&OY+nTJUc+elq%2!^w4YB8pg@@4KH}y6^WpkwoQ&gyY%3aW6`GO^tIa#s`fW^T#yy_WC}WK4K7CDZDlm$(mfxyk zbHIq@)P(oD%Apjy#JL?#*;3YEE4HXm2p+Ri@<>eWmJStasu|GPTH@TXreY}S;&2+M z9gT91^qYRsdKvYBW%n2Ex{+!&rYN4XoaBO(J#V82mDzWADgE#14Jt@K9C0@tMh{1h z+xD}VvEwkQt$rrVA~@!%w1K0_PAge`axgbSvFfWmv`~KuOB~Ql{-KPqzFW7NGC8#6 zGAn!Tv5)RN>!yFQ?8&}lq`Vj@{K4gJEX>Qbv1M=mUsRQ9bYjvlN~w*FAydP6O-|ew z_Z~75V#c#6HZL&SVk=W|e8sLDhnd>&7LKI5vCg2Jq0gX`TC_?|x=Diw^Mg zQZiY@&-ft3_;R3POUx{qxZ%iWS79j*jH8ueIxLfJ7a)9yOu?ZR9R0XQ=nk|t$NdSs z0CFxfzY8~jZ>2!2hp$CS6v8*HfyLctYYlm0evQhJ>_#XaI}I-RKO6e@q-}a;3vw52 zf1#rLw#Dgm;F)@r>Z!ubnk33+FL}@AhIWQ8`&AF<-y6L4)t^(Z_<8Z=qN!2M*%N8U zbvQc8GH5(zsr3jK+_moOUFv%%nc68|EgBTBLnYnBD33CZDg^n;s?k z5SEED4O`o%mTV~s;_>u|Fmn?-7`?u!r5JK1Zff^eQn#p_`?6c{2J1IW)>Oni6k}ws zu}(GOI3Fq$(D7XfhX4j>ub64XM6iSW(9Mb4b?cBZxyJsN5`UeaeN!9 zOWrEfT<-6UibP(6a*1a-KQ8SJ|ybDTlpjz_ZF8)@n&$Zf%U+H(b;n9T*J) ziK$z8JoqZ}K`#ByXy#RdS;P}yFM?T?M!pZ&o0nP5UM=Duz8$)a50NarT(qPZc{mJ} zrn8&2YnGZ6lP8ZLFGB?i z4>jMSW+m0b6C1*dR7pr1(XG2{Pi&^V}M1qI1?ExF;tjIXYXdSb%D12=W{2 zDACEkHQ<22!M~p#NtCPy6%YnkuK#!gk^680gEs=AR{}m6+=u7?4UJ0wl&%@Evgr4q z8TKwZroBA|^7m9%Od&_Cf3)4AI#8uUG>}X&@OuE#!{6wU`(P`v&mmFq2Z1RHVv9iJ zv;cTq7&cmTnP_lPB+nCec!+{f(f~_nL}!Os;Ezc9R};ZLi1rYP5sP2tP&5p3Zw(a7 z&F;)C>-aR&p8EMAjVMUPdXRaxU%I|CohddgQQQ_sEGV-*pARj1p;M(rybyirQ`z5K zI*AK}f1Veec~lQ2GF^pHfw|}H5RA^UoxfqRfz~bJl1WJV!pPx|3gRGn<~liM>p_EX zQ2|Ayujt{m*x|J!U3D|B_CZ(ujzq(cu7;ly-~Yba2NGa(2)MTkff&+A_XuVSL7_k=W}Lptps^#+jdwaEWp zF2a{+gZR4l@fCLQW$pLe(@mW)O&xGc?bJ#iG|PaRWemU1XtK?ywab9IW;DBJ)Wl}w8fLZ_W`DQh1eBJl@+WGbCSB307 z_3SgP>}}objfm{pPdU}vxsw`sTl#q$hIxxdd6VXOQ*L=(%K2NW`DdE>``YmHhJ9+^)YJ+B|z93C6a7~lVI9ie-2dUA3yY3kqCsg2C(-~H38(K8R7GyA!-N0qaO zpt-yM9Yv^HxM^NEdvy`=7tcx;FRB(-A&Wmo77rE|7pIoDiq;M$*LGIcmh;zN$~W#B zHg0=2PAfMrHa9n4QG~AD-*daCJA2#1`&Xm;zbg-(YY(0`4*mlqfDiBXj(;|t+-{uS z9iN`Ox(JZ7t5+J~;QX%p;$`UKaq{AM;o{}u;$rji@$~1z`OjZ1xA6a_5eDy`C-0tL zU4)gp-*OQ7jOTsE<$w^VZXiVH<$l$5#Ab^>Q=5c|8FjWfxqL{ zc!5TH!xkj)*V)!Y`}dvRaAa&+%?|M1U>p(G`^k>RgOM~QjY7@NrlW}*A=mB6&gLI8 z#R`eET3s!t3snZS@29$2&sV^96NOrkw#$u2!La55Gt7I80L{bv{g2WvxEU_>YU= z`=rQm1T-{uKFTt2tUdzjOm`e*TYuqj%x2W@)B!$Tl+EP1wVfX4dku5^0Qt7%9v6I2 zS96SY+OKBKe?Z|pDUK#}IVp)_Rd*`*w@GnSNckuCI4@#9YDPN8v8GxYJqIt?7|^2zB-@46g7D>+`jvT>+01-cvPl5sjR)~x~ROVr*xTQ;G@06 zyH(|Cwl_$rtT}FW%uCgV6ayd17qr@Pa3W(Vb*1*M2X#;wZeVhVS)z z5&F;EH&}!UHa-C7U4b~(dd21`@jrKuo`pzUqdIv%eTk;p0w?#t_~N^>g8&6$o4Ywx zw)(qy)xW!U3%W8|cL3c->sEYa@>lPG-8VTBo3mqgfXJa-V1&7rxEWXCuVKQ>qzGH! zFUg;ikz=%$bzmecd=Q+zW!_L_N_at!jMs110R74rFX@NZ0H%3B7$O##ly&D3UNHhH zZT_UZmgrfr#K%5wZ1Re_c55FMinn*+QM1xwd(kBScNgIiS9FqJVOfTGNB)*D-+BO@ zA4VUBvM3}Q@rx>Fc8DV3Wd5RgR^9yHXVKc`Bu2xQ-M)iVCLZWzPj7F?Qy;p_=c^&Q z9fjK`I3Rk=MQo6wNfwn8_PTlALHp+oLIiG31fU7Q^5kiVb3WNq=EFR?7_bC`-K`ik zwQPOvP-TEHZ`NP=Bjre1cr>rC4SqB@n!}y}TR%;n7*wpt@LG$`If{USYaI@NlYt|6 z>1|23RAVQphf=Z6RMdCH&}bMD5K*P3omKO=Rz#F+l&OPx_v0R;X{n04T)(j z@mcUvk|D)W8tXKU97KhUz(A!Dt&J==>7$c@NCZNcAM50{>7;#xiyvKN7}>m zB1e(+e5jiv05UuQV)@Q?W3b4>5t=Lz=xl9pKWcxZBhAtQ!sf7*VDyNXCwWWzZ1aSy zA2V9*kksmTg=w#?Q7lhT1c4{|z7o-Nn*cO=|L|}mVcD+$++lHTrT%O*KWS$qbT(^Q zL>#YOSB+LHgQLHO4p$8|GI0aUX*SweX!EsJM`%2R>*383K>WI5H1n0{)%HR*tr=Aq z`rBervZrDU73;J2?d+0kM+;7-3IpWijfpb;twuz9Dq>DI=-6=jJ_NMu@Yg7!Nr*M4 zZdR*X(4QMTi@Sal{#oc(I)CVEm-w{`1KW0Idu{6 zultFYuiZCp`z`kpzR}Et!-y~bMX?>Wc1~YfKHsTJmbKF3TJp!dnU~XBb%~}P)}3j3G={et{taPRHUi*+oF* z@53f1z;P9;EhT=d13c_P0ceIJk4efCgpTasdp0`Bc0{ohr(5cGkuY5#d|@#0GN(`= zrRZrT7Wt@I$S%!9DE;D{rhqNQq>|wx3y9`ux~aSTR1T*sk&Qz2dPEX)GRnJO70ezw zIFfipCCE+srD7}`g^F|&jp^6PQ5q9Jjv^0nyo`#K@5PE!StEMw4)R`G^h>9*sgGQL zL`I@HWFT9gWmfc^8{WlqSv{Bw{u3vME${;k+J_SqhdRl<0Zqu$~~$D~eE}&mXgG>ykUld~+AEt#i)Z?WrLoAk|kCdW3uW#|*X&s*3D+ zc)sxbLAblqX$p?DbUP+}*lmxxBHO0%bP@$^lfwlZV2#g+36GEaMdj6MbjPZD)w*zV%WW?9JT%gO_m7#!eVdVrR(jywEy-iBlT93sq^n_;wRq_ zW|||7Z0&{kOQhf$^Rt2cg6Vht*Crv+RG2)nm>t`m?=>VZ)|~&L80-3{mK8*6YeX&S z@Dg^MTO$%UiIe-%G`DZj{9Hk7t@^zAw;5g#phPZDDMgSR*dm;*o;@n^8JS@r)!3uEFE^%UHGB6>Fv*_dqIH1&%f)x zwEdM$6uJKRX$-!7%d{ESj7mC-;4U;k4svOR-=xw7eF~2vcD)ur=hS(eketT|SVa;3 z3hvI5pvw?xJGC5M}=$tI*ryoP;WYQ9D#{*3ujz300qW@t?h7aMEK) zJMed8v3wDbn(mM!N3ka8ZC1#lHGkl{_~3+x%c`=!DP9W2UA0oYMh@V|gwaRsB72yQ z#+X;dpc5E$=wi6;nmj6FjD~;k`1ZvX&W2kGM&Xu~zA+4!gk}& zVl@2s*3+5rO&%j)xkA7Lf+KK>5vYs9-`NT8n1m>L z35$it=E>sl{fdv0XWR8s)$c>VL_n;**G&S){lRcfu1cMKH4geraEp@*Tf@8J(lDKo zwLhXKUSm1ir%Xq33diH0TJuBT#TXyJDonCSH{|Haec0<@ya!o)O_YrEzj$C>bYTRf zwT~H&*%_bFrL6CeZTZm)XR+{3-M?jUWM|-A1Y+lhzoz+8$WJrh&0_Qy&+^82LA4Y$r^PhC zcOhGA0a;ns%7Gu9s~M{v04n1Ll@((|fzer`qW56AOlc^|vZ=`;Rof%v73d zS@}-9+iSiD)dJ0S{FPa3AQ(;K8gaJ;(UR$nI6|TJF9|}45@NFwQuUIkC}AP~lGFtx z$OAG>=6`Ghyj=v$T?Eirt{wvV*JA8#@OuQ#;!Oe;7Iv&~ujFJF#XVx3n`ormLlIog zH?k7tikxqhgUeMp-vl?8YmApkVU=r2AQFWeqUcue6{8sRVbpoyobn5qu$2i0L`=$J z7w@8|UyP!mTW!FPs_s>z z4yeh?L#)d~oM%GT*hPy6U>5gbPhaE0*ppv7grBPLX2P+H(=g&?(R~rnhJ))y^XkUC z>L$DDT)paMu+Uuj>lY>Jt#xHr^HAMq(R|Y|vJtR4yl_em`8v%aAe=P6z0~^TuaqW--B0B+cA=c#Bu8LjOyFX?TN>&>t2AxQ63)@v&-A*_*Ydvfh=3&GfW zq&b;D%L*sP+Jx>+^hRtzqeEV|3LtLSWR8yjubXzlz5YOrfe(poPv+gUn{BL60xq03 zo(lk<6oKPoe-76mM^Yy{_n>oaj}R1KQ;XF&(I?J5So=804;oMnCD2G3e1qd)HPOXb zH}IJX+8u&{Qa7N*O(Vb80ZSxa0Cy8h4dFCGQ?UC@FYx!k{lQ*+cIWN*C2e-*9W0w& z_2=#0`RyMqVAdP$eq22g)C0Dz?MoZ&_SmC{7yb2ct~TFLfU|kKy~Su0v@HNK;3Y7o zbAd0gIg(2~8VMc2?eCJ+Bu&HVc78?NG=_5B#>_&;T=IwWxJOJ7`x>N15O4-;Tqm-i z1I`np?a;BmkL`7JfTkp3FR84ycjs+P1*lJMW6s=*p|@tkG?+VFl9hYvyE6`3bsO^BeV<)uF8v^aU#(tTc24Q#PCz4}hQa5Mv z%%`!RTPH&Lyan3jar)1bAaY4ls~R2I@X#5mu--9*9zv>P#RumWZgfr17H6_R}?f2MvO1=0Cv@lKGQ%luhEC4+K;Vk## z4N&zunRiV|LW!Z1<6OgT*UQ1O3(l?(FZY#zTP_UJX3;PXOAFss%xV8Uv zn>Hnw6_kF}3pyV)HwCArRC#DF9*6Rz*30YHaOFD3p4ZbSwhk<(KZLHBGEA>*PBl*S z*HUe-UrrrR&yqBBDr|0-fEEsDmK+MYU(yx|pLc0^+REICzwto+CAOs`qLwFb7D>;R zhhP-ecPv@19CLRRyOX+vVTgEj9X&0h6z*edZn-3NBw3PTZbR^U4uY)@cIt<1pD;rp z!(-1=-L72})UffXX)mhn;Ms1Q4G6zCfb(h%S$fLxVs$rh%9OWzifd*gar>XfvZx11 z=-bVLRk1cc>fr2c%T5U+hCu?yE?3hZ%qC%L{O zO?(hW;#S-CHx%MpyBol>Vn;LeuCXm7#V#xL*M| zd;ttMnqwM=^>&}HrMYz{_8hiK4v$Y9^k}qAx*qh__Vpy5rzTB>LyrklHca|X`1{Z6 zcp(CaGk&jGd{8is&&#*r+v3hZJ92_?77y@-exH0qSLMi#3_4#fEf#{&(MVx-ofG zRrsS9p4jXBeRSC4X*lVaop!v=e9)KcShfG}m%=N(qCXT@ch}$lIrZMwVxPNn_hakK zG;+7);{x_F!fMKY7>Iqos3egpccGO0jQN?y_T$Mrm{-l+iC)a?PK!=3URWOK+@ad% zy-$tR_Y-yl5wSR5pHv&?`Qj+oP9A>GmdhGRGgLkq&h6=b9^<6xioYvUP9ayA4$W<0 z|EfMVAZPy#c+?-)dv|f+q`zkjWJgb7IrZHeZrZENP|SbhE|@>op-mhwbg`;#z7{`J zv%;r;)ph2nWi`x^v-~~&Ps~++dopo^*~@@F>YTNU7yY>asaJUC{$R8k zovH?#^@}=^8fzt|p25^8BQjScx9#ruDyn4wdt0ZOz(lgB=fY!6yh$utVv^y z7GD2xCZiDrw@fW%;A)8nQ#vQZiFU3&_a&rJu_<*?DawBNU6k2xPRJyA!L@uDt?QKn z^dD#IMw{YBm9{O@#;CgQf>FShFGL=nTQK0TMG)yxa%?@*kh7Upctu#$#K{7+>ztFX3KB%#MgF++{#3UM-~1hw)cm1R%)VMpv` zyZuNzJKYr%F5FFLlmXqoP?a~N6{@&suHZ(5t*gNw_mO11fNX6w2NG8$qEmSEs@#l4 z>ej^=Q2A;h*0k)+q3t+J7UkiE=3*s*Yh{VA;am}J{KU$#7mVigoi&l;U(Y^d zvQSxzPN1LMl9xNN;-4$tlc`jr^iZEepD(JXK}1iErr;RLh~Q@l||6p z)TVZKjH9+T1gme%YHK(@0lMNUpl0(9hmp3P@Z?!a6~7*{1M^@qG0rvv2bFm znWCIg`!0<Xl^U>cGyTFzxnJ!0JSWU6heJd3J5}qF2&eW0QO$s@_ zZfbQlR!$zGqL<{cY+H}%f6OxE>v3XaNlf!hJwg?| zBf3mb*GS3fJIAu#BUZ?#9Z?m|;yVdS!s^qGWbWq_dEZf|ZA`=2(kdO?g2#jtmCfv% z3SzF3q<+!+CLCsQtLdhYM=Z!;FlQpOCex2er>(?{S9p6m1;HiP_#%L+@+=M7napUyp|)Pt znH%s4*G~0e$igWj$$lwa9!+C0nldgcn(#zhi`dDIhN=SY&X_JoJYk!ihB{b+Gg)$9 zQr%b_u=c3t@rFb$ZkpYs=5(&o2cZU$6lqvU?u9iBRZVl!V-XfCQpx7ZQB!zm+>e%_ zrNA8JoUG|<7%l%(SQ?X)yI)*@yeZ3zxEhg6vYndPh#;gQ7sFkdkUvt4Q0Bb=mOe@j zs8}|M=*lY`R{#6v_ywWZeY$8N8sUvbX zz>OxLxg2HiFvsF`|7U{p!9?iFZ0&vCf?S!gSiyDFQuw%?BqNe5Q&-G;tLF~A>{hj& z^7vhyNb_&DM&-6kQ0Wd8G9b90q8(2fiXxij@w}Tj@;-ogK4fGSC{`cn{liZBH z{n^pe`cMw>TuI=`YL$m`r~5wHt>>H1<#bt*L~0Cn(B`lq|J~sHFst{ zOv;kMO$RM513QheMt=9Irtd7=8dokD6>^c2tSg!G3jXW$)kAOg878JB^_M>tbALlw z%F|88%rCrV<~B}^Nqo~io7;NFXKg85m8P9cWi&|~^KkS{<&;Emw%S(YLH})zk5I*D z{U0Qv%+^wyG9W`|M>+zL6TnZ@fmt82 z#vDXQIdPiCXN~iDD~n+9U9u;xayn8FqVx}<7~iW3jtDV1Bs5!wZ=Ua&R}u{}h#dUQ zYC;P%&O_#NI6)strON6i`~357va|I>!N^^QUx5rq6@2W}KV1>a44Qxnue27!PR9Fp zZ?-qpO!xuG;Xj~%@6#HU=cXl}CTp|Ti;Z+Gn=TZ#X15pX7D zaW`f0E@bha{tp*{NJ@@aQ;x(!j@0dcTm+CDWt|)qRE~P`e_VtoIeHv<25Nc6{}&fw zNw)iPPzt4{WVRnXm@hS&3E*y#d6Q6!T0X#}*_omsbDPrzkIFT_p0<|ghg)*dC z{1Y3?=xvzAP0hob6B;CI8JOnJmlT%ayP@l&$gSLEIV&a&ci|`vk=(nlRVL=YE2C-l z$xcUtJ?4w$DA0e@e_NKQaG=qKVn=2?POLehpsd~|#UYUw3?|S0{t%LHWW#A;Ca%pa zgS02AU!L)^kDOyIOLbo<4ZFxMqMV{}h`@|_XzumTx6}Np71Zo8W5CV>D?C;WTWY>V zbWt`GrV`j2UbV&<*&XiQ$kZ_;)4D4%M9CdKWBHLO-7-rnYR>HYl;q5qk!mg-d^*e? zA$2_%hY5uKQH9no(0oB0RCVs|Et86sN(!J*J<{ug*Q^symbIA9mv)Tv4N|_1;+CH6 z?;d(A_95zNa+UJwDt1$(6~R)QU{~`IOdM2WN?nj2wQin`ADxgKjU!e~E?4P`f)<(Z zmgjVnJ&ZyTRoe_Y#t6g>GP<&fTGng3Uu+3E75EQK)&1r9SWD=%Yt+Bjb%!D*RE{zB zh2a03#fre7{VS{Pr-=PGuJ&|RBF`=3+pm$u+VMN_qN7^So)Gs&vj9>}U4ezd*hAO3 z9w0S`Hfz)Paz$ureO~T5*_`?$-iZV$!)>rpKN_Byz z9?EH3qC$Ix_Tuvrow$5G8(97cNn+%PXD89vzf|=-;2;#O+*?;iVKSi^5lA)8zp8v@CXow`T;T8mxWB!hf+ca+wR z&9;Qu0-0@!6ny^JqHy{-k}^Gv%4+9U)(n|Th<04L9Zp5P-! zPmn$=Liek#U~oc<=ODvW1X(?08(%#TF4{6j^_(mcgWXV-TJOc=@DX>%MhW+(P^AW? z+y`g6Df=kB6^TffZ@wxn9BW?=pZ|!_35VA?ksPEdDBL|#lkuIcTa4v-p3R6f)w-v% zQz!mGU!FySTpH)QK;itDi1z`HA#ObDN4)xRk$D?Ii*arnp~CMPf);*_2-Tc%b0rUV z1cQNW7!T^f6mhU!8k++{Y+FVHKW6?3kw=r1IYEOSS))2ZLmr2g$2ENx?=E;#T0p!3 zv9nQJZoX`5>ftEw)%w@ONub~qx$k<5`20e5PI3X^I~PXwpmS;jz52J&InS~jCk(7- z%rj4&IFbLB%YRW=A1!fkHhb&6gPTM#<_4L3cb3r$61dF(&p+trp5^I>vCEsMnLg2S zDwU#fa`Kht7%^61W>EwRw|C~GpN=Wvs*yGmGB<%)5K0G|&y0ACzDs6g!Jii1hXIyu z@pI=IjQ1Jj4>Iyms{#L32!j(J2;O6cTs=H3?A#K=6WeJ!mh%ekqPG&2=q!S9pp zTZ-d^Rq>jTU?1xxSZFYD$geOvPi}DX+O!&>uZuw3BVa5)G?32&-7 z2U+BsvJ{@*(F*V!i)W@MXX^=l$8pf`9T#O-Z=6krzNjUm2Nim#e;pSr8wQidEHXx} z&)i6q0%3S6c1uRmjG1YS@PK{(sNK;IO;lMOTDk6%C3Y5XwFt_c%~I2-WYt=BXzCL8 zv0BS1IXKrZ1t~U;OkJP(219aC`@h1j6KOdGUQEnV^Vl0O34KT~=a)>0k#W3;yLzrw zw#R`a{i->#DP@NSn&VaO+)~5g3`w&1%w2VPRCO<_SUszop4|B}9IaWH6?*aYWtW!M zVt~5j-u$EZ^;+mf6S=S)NGOY=tQF?M2|(;t#Y$K>8c2N&)OUBL0^~EXf+s-f+Rq{* z%HFHMf%TF#I_$_a0<670;!$Xcx#lg&PfUHCn>pXS%Bln!8~uVfQ<$B^#>y1g)?VIK z7M-%k-g6Qp`mPbb!)aGgm(^-Qye)N-fkOfdN46;5#2qu;x?pNj_;QO$gLW&$U`_f6 zLUW2wVY<7$)Mc*RZPmM%+}*&TcX_k8r%l!LjxuuTnkd{I>7(^a`UTuw;>P%w*99IM zgiHixBd|qyR&w5UbQ^`%w?+=#$;N`}^n}rSPF8ib&NyL;a~>MGCJM(Ye4)z5I2e4d z{WJ}HD!l~o6wJ6<>NPM^yq2*T!z zKB8GUIT#e(Q4Aun!=!?d>j)eU7V>e8jq%QH6jv36tFoljUCgJZ2@7%;v7veLYXo(A z^)v>Q{2pgT^b}ZJrFKW;1sgmUW`r^!Ng?~h^$7_IBzQer>xvV3!g{)x16klEy3Y?e zaT_-9FKOV~wO8ES{8<{u=q(3jg}pqFp=CsCLm?&Ps#?u}!+3+CBEICyc%4u%bIsd^ zX~lh4Im5j*TU>u$%+d{suEN6lT(Jk!a;Myrw!^RQXA#G9@d|Q37M_;^dB7gWPDpH% zc^6iq3(GMS59*BCMP*x&$sV*txtYAst3Js%toBo&yU62}&G zWK(N5#=9KRnZQy*1zgb<+i#Dn2}Ld`jcjBQz@gaP0@>_%fOIl;ay*_$V#I36=Shm6 z;F{Xmyr1`p^r>~%kCv~+bj|t%0`vp}xRP4yG+L^x3N#0~F`xCS;t6&g(#I|SNwP%8 z+b`Iaiw}p8ja;azr#g_W@Cj4DW$g-cvtrzuU0THtouao~r1g8d?l>v_IIX|MN|v@& zFf%f9cgyi|r+rgTzMQ?~trGAhi*CxrOdTpOpC-3j`X~`mmmPo#>B#(-{66Xl^iS17 zku=lWIIZ@PrI;Zj*ecsOh4V*Q?%JPZd$NmT_-Zc${s}-+6Zj0bL^$T|tLhm(y?rIZ zn5HE)NrxbF01K8xAn;8+(7M0aNXLaDng^YxPe<|dy}5-!UNZ>(t)bJBC>^vBW-6Da zNb!N z9D`UjiB1!<1Jpa^(Bz;BT-SU$;$V#|2kxw?e7x*wUH2gZ$L+JQo~%i+0-Y=UgBL8l zvSk-J^&-ZUTy6U;{dQ7Mm4zcUg<_w6$M=ZHc;qYdBphnCzV?vEo$*Af?jL^y53y+o zSR4FNts1b)wU^$uG5=P69-@h9{mVmJzI^TRnW#FL%R;!?`W;V>8UA<1o!Rw|O@(Yg zyrd8FR%UaI>)yURg?a6fv~wr=V`dG#u-BrZ`Zm_pa)mN; z0bdzXdb}&1u7H_>Puz^F7%2TY8*wZmexM3L&p5tP6MHyKWUTm=CW(4Go*BDntKGRw zE6%G*T!jBEtEeCrw9^0T@w;*=_yW}vGg|w&X@Ja^6EoK9t7;M3uLPb`9y?8_9=-M; z?t{Zk||^am0`y${m?=dy*U45qZNm`&XnUql6w$p1|`dd6=>1< z(63rtsPR$iHCXcKn0L|gt;ojGN@j-?L_grm(y}dX$)(nY?|z~9#Gt3LmwrzWql}JH z>g1#K#<=CH_t$gFmoTSl-DEGBd*2)06U{JK0o|rle9xayo8RZtAz7jS-zR!-FjIv( zXZSl3WyR%J*j6rkNb^g4E+t9TR~f5H%YcQ+CYurx{YYDFAF6TF3P#+O)bc939P8qL zGy{ZI#{YQFlxl`yJ)7BU^0Z~$Rg%^+O@EhdAf#*^m38D*)z!5;f*sWLxwVyGt6?$p zGmF$co;8hL<7d`3eZlO@^6*av7YQ{^j2T4{S4?{R?_F}v8^1-9{OU>-|NC7Rd_;dH z&XulH3q~UKWA6_MG05vdCxklphXz1v<#&^iGJ|uA&Oh{_@v*FobQ&wvXS#|IY$=fX zzLC|BG70hBRwczuHn`k+%5qH$oOg1;lmkUd$NIm*_l0Z|VaA$7q)OZiO2340-w^q#90?T@vK>X{LN&do7Kg;;RwC7G;>Z~x!KTZL@1V(TJHM2 zF5J+^w-XF3a7*8p65?OJsA}-ej1ro@|9T?wN#HOYkML_(hDxp7N{;We^-y8#C&8bT zsnd<86_9Sh^IGUX!HfEdPePZ?8v#OB?dRP>zq+3P%SHGsd^1EED11A{+#`H9B?NO3 z<`h1QJS_dkMOd@%5&6C4`zG>dH}>79iBc!?57VH8-mc@K4>k; zRzHOV=fx+|Rvv+xtLSb>R9U@KXL^B#ft{#PFKNkcc@v6GdeI;jnorNe_IHl^&-^>$ ze+Mk$!XOpid5WaL@KDt`w14AKBjrjFEceN>=7uSfw93q1kQdPXhP|tWKGDSbG3`r{ z`7jkmseV+Li>AuFOM6e;VC_p8gK>OPB1Xx|_a;%~XwHdKo`)mA%pvRd7Pdf<%s*$% zG=_%jE1vQTqrshCf?~po0auHnhW+PQDa%+$xV*3`KLkTf+iDCsj6x#_iDU9;Reb^x z9y6LuI6J}6LylhjSRKOwq~Fq>^IGX3=iBrl^| z0R3~W*9lEIS`E-7D)Jai+?G^^vmBd#>Qjs*%~cTm&@v+&>|nlu3oO2J9byVm)IRyE zq%3%vEABJ~rt`3!Tph}Uf1Oc73a^s8Z0CYCei%ZkD@xVNSi5RuWeDu81o}wJZT)cFQd})kwz5nz#E|1?~@Td4-DyALUth%vy9y ze4FJ9F^5v-D3+EaPf^%X7WdP{mzFfLn*$p9S1PCXLHe&&6h-sQy7mtmCQ_OeD3?jH z%u)S?-p4|Rwgl)X+y%Nv^fAIks>8!Mi?a#Zrq3Lpyw3eT?IC+LZWjF1oYK5{!zx)c z;$(^Sfi`I^pbeZjj{2*M3`R4GM1DUJU zeu&sg2TD_wC7dNkQ>9dwUEx-!qldQYb<}>w>Nd`i0DsC*4ts6*LwHoEp-vD+E0)=nMjXe!4E9?}dQ;YOTNX40KDTIp~C~ilz_JwTp+X?(OmsLHpO`n_6R? zQzs7aYqEuJl6Z78dc`ni{ZRvq$qPVbSu{<2_jWb4{}J~tqW2HT`+J8c1NQ;M;m_W5 zFvcbUwR%m@7PVqntnAzZVFBPD2Ul}TcCMuR)NlM#{~~m!N~FCG#UW|E4=LxY=4Xch zX%5i{^tePczZhZElsar8BlvS#TTb$Wyo=ET`@K>feMz3-K>l03k2FxPsM-&omWJ3c zr7=IrIV4yEi!pztFe4N)>-2yEPEuMpBI1m&{@n~h28qCMXwzeZDinmhag@o~Wq51uz^HeF`dx_vo>FpFQ`Q4meL@ha)0oo}Bfdg$>9Bb1_hCNenzoEG@DncI`6$}H} zq?JP=3)+~U($1vvfCyD|voAF$sg>03hPYY1Df&^RkB3rKVuS1Phgw7Atxb_>HCgpa z$Y*lE@m)y+m;L;*!6rqi_w(5ZA(9l*2hzyW7M<$BWzpqINXp#cKyEV&P*$+bmx3K+ zZHM7%%5pin_{5vsNiBlVows2Vr|8d&a-F>~v5FMDdj|pDQhMOwcE<^>C3RKl5?iB^ zYzyR_>{;C4lb4Xlwo@={NiK`z#aq1Ba?S+zh@lE9!T_b@$K%}8YVl=#gcPXprT!oaAP$g&T1Xrl_LP zi+$Rab(-+|Gvve+WrL<0K@r2*0V>kfcLP(t4()ab6#3wWha-&!Vd;#n%3_Gib|_i+ z^QSrD{ZB>$L%z{a4 z30MX8dWjP_(GK0q-}JRNalAWYOb#RW`YJf+ByDoW>EjQ-9f1sr(1JzMqGc`lEA!ec zfVIK}PrKGJLC8GIdlvtO)HKUJbPcLR#~54c`BgD6{KXL+M>7FOr&1h*t;=`E#X4)+ zGAl8-?n)ONflZ~$ad4Lk`orG)kEkRqc2yNksF|lcGLTmn_{CKi*PzLRQJd%$4ayQ%MGKUgeoreeH&k-6J1<%{0}x6Wow{5cj!8)|&+R8+ zP`M^g)Hg8{%Ee7(g77rUv1D2hx?95 z%UqxS&zv3YV$kE%oa$zHtW$|cR8bMFY#_ki!<3xMha~#lhv!qE{Mt{XGejv@a+%U( zE@fSb1hnO@%1qrn%XEmvBnpqThWwNCW4@M71}Ld_qa*vwt~Z8Z*`c`j6#kP@PXbz; zCT)B6p+2%Y%aqoXaDEnzvDDvj)nOUv``j4kQ7IR2n{?Tn<5?w>UCL^~%$Ck5v9#?V zQX;;oi!gHsrfGSS6glI&ce4gs3=~O92>54*>TSpYCrRZ>O94(aS>L6kG_~UY7|b-B zjbcp%2)~WG;|`Uw7Zcb~OBJ6_RFlmrUn!rAsW6zF>P6CI8y{np)0U%>Y?rM_=VIX; zuzKc*&q{0Sm)SS1Eto|dNL_8SY49?o61Wy*osJyDA7}=nrpPbuu$qPgG+Jh*{8V?o zryGS|A8M*gj%}ehnNb9QS$9R&+s7`n4yexO42gLdp$=M|#c5K8#80e05toa0mWEsW z;YVI|RLGn(=P$=t45G`1q-YW7A2gQ^BZ|msF{c-W`w*Ri803k`oazaLiZ?1BJ}73; z5O<6p#DBHP-Y9*I&_ieLn9?D84?m<&DipNssrOysWL2GnN}^OoP8aFWh4$XX(DKAk zrTwh{GKYNFx9j8@o|sP7LV_pfBrP_m`?ZN;>nTR|?^oOcy{x`nH}AY~{7v>|q7V}Y`dPyeauM(rF5xxw! zXc>Jcww``k4JRu|G{lKB3NtWgbzc9jB710(M3FL&=%84wN^{oIOFd0DXY8&g(`0S9 zbhUbbmO7WCwgmQ}nCcBCUVAUQYBbh(qs~o08teT&?QdPG-X7!n+P(S@oTIB?v_+-I zG_2^GM)Fm{k3)N=D26YfqSZ{qv(+NlR7(ug8zyUvpao?mgpQ9-Z%bt-iD{EsB@4wa9ZzFj|NcU4T6$JlV)X z5HW&+&&Aj@@qh|^e$OqgihN-*-tNakUp080eZ71?^E&E;kW1oP=(NgrwtCUaIB2xk zCwjZwKStuogj#z}vhZ0cw8j14Uzq(2jg+QiPduE_OR%CltqQHM#ghGLwiuRlz z0=cd289+eZNP8YsARi?tZ{{icr%(Pbfx_6Q{DG&eHv#Z-JD5LXBeLfLh`N z%p`D3t}#gIG)if7O{w)sDT_|YmP=jGNNt2^1O}-?Mya(hkl;&d^OsbpLu#W^+T?%B z1pa9?Fp$6?eOx?a2SyQSWz^_pEI4Fzz(9ikr4hJgHu+~Zgk(ZsAi^z)S+W+yTejCYVVenRg_acP*QD_9bu9GY=|~e=L!I zVVvJ+kq>pxAA*4d<^|uw3R@EjA(G%T7)ziG-nIY_z)S+Iq7D0^8L$5#6D-*k*E$q; zcoa`-mrTTzG@F!8n3gWXOah;>E*MK-TE1pqzUErq8C~9MS+!wOy%=5H|KBFTSIDLt zWFQPOkp}62$pkQv!1+5&nVT>9-dt1PXxF%#-#Ad+*ag!FzBTRmHBCk~Ev7b2`nC>6 zwQj;#0-v_-%(nT$wn-RE5ZN*D-zGr>^f(>5RSsQ%$pqn@i!hTQwC^NtV5w$c<$r+$ zjYHGjL(_31hYh0}>0@iPV_PtmAbotVZ+tFd@-c1lymN9DCKIGi-9e|8I;UsKXZB$% zLDcN)%-nSL{7d8fY4*Zy&BCvNg~fq|joii4;>Ano;vq~Us9ai`T-qvM`3KVoa@PM9 ztnZhs-?gmY_iUUkZydu+f{o1$m`O0TeNy}LZt&-Q+3suS?r#`Q05b_T|H~xkJ-A#x zINLk;HF5Z`dU98Pde?CFZ~yH6=9KoNCnZU|XVzIERg+CmQYBzJN&4R`K?~$N$@MVvug?4abL39b&YNNKmv^_Q{{ae= zD}Hz8%;egue{&4c+AC4!8=J(vA~zLwK?D(58%hp~;;Rkf$h=V8j?$!F+>9|))ZC6U zw(c}chzj2zg6uZcWa(-|Q(;O0Q5-uM2vZ7*uH6wZ+x81}sviMO^Lvy3JzzdPBe# z-g%r0pJ33vhFcJ4?;Bh)*XerL7k6hBST&E_^2X-1a2i1QQ0LrtjBR+`ds1qU)Q{&C zmNLP)RkLt5gMLSDn)c*(2c-3E+Z~u!{0(ly??w6eay>|h-HE46mgsjotRRMf`LUCI z5JX?H!!b;gWGar!IVviKu=7z=?2#mC7Kte40Qa(Kk&dP80)W+(z!jsZ#($hA^Xhx| za+lb7`^LO|3#RXSA2<2sa}+UAuW1Cbb`kn^2>?k^^b@A2D1s&XAhZ6lpkMEm|Mfn0 z?mb+B1p_<=i74E0xo7jg_Umx=1AS~^D@1DdBA`F}Ag%OGj80Mre(|a#?HgGi3b!d7 z3cWJ`A)^w2NwW*;aE=i4<7EUzfIh3i%W&Mz0#I3k+>{1L@JwZgIg!7*B%i~ftAgOE z@5OM7P$Qw4k5GZHp?iz^!IXN7Qi~@n! z8CHNji^O16V(l%Y+g!6M`=p9S4jmo9dcJB#lDC4JtE1TpnV zkdFUB{7{z^i~th~NM>PqH?>$dhZy~OW;(z1QtYqX;>Z}P!RP@yZ=scPcZK~1{dB?f z5=r^La63*S1j|uX%;~~DTt!7NAtr}n?KHrl6ZK)S!Nsc(J1E`e%~0=}#qzU@!m&~3 zeujODU}Tku4+`RxxcYUr{vfIs&210|1@vR4r*F%1Qr zJ+%Qq@9Z-@_inW=<_YfbDmVEF0MUs35dSlgO62tyvhF_;SRhdV3PUe|lwepumsT;7 zPD{idUWPVBG#D)k?5J+}UaP`ZtH#*F8{zT{yOJXMOPfa46*EMyIT#qD-CIjM6iSyd zSJkop@cmd1j|*f5kJlE5^ce(?Q!c2>$)xO}1{;Ygw+`ce6BQ?nrm+Vz^d~z1fd|=( z^ukGl5heJS-{+;IT8P;f_=7{=xl@SY8qzgX*0(f&gxTx7r{QZ@eeuns5$Es5#t%Q0 zlF#vnzXwrl#$}k{uSUtZ-kBL6C7_Tmg9kBR{)SQ`K6b2QZ!b#(9FFS39mKGlU3Jvlqe z^t;5cP=Nc9iQt6l>&;3%{|M`CBH}Akz~Q_Fp^E=0G*xkst|Sn{%Cs5wo;XkT{9_KX z=K;V;2cc+C>1b@eaQGAtV#r{$k5Wmv#$<0=yvL_}0~L)9H&H#W#o8d?+lU5b$fzRA zlI>6YL2b+$!YeaB*+nD}ZNyH>JD_cB56n*MU)ZjRbswc3=6oFGFYZHWaS}lDu5?$z z)cPrAT`}t}OO=zjX#@D&;hh|?PRw7A;cFGTLnv(W_7C14 zjdW>T<5>h9TzwK~Dg(E@ckbI2HlXbma$QzB2s+Z7<)0~MxyhHQ*df;Sf-14O+i(@x z%Jw``L5!3AKZ_ugrFV!_V!1&~@;{7C3qti~Rla*|d7J!#>q`CSnrt(G!%qQNR|4Na zlYLK}T9s$WRV_MDUa#sh#1|G-zh(meQU{vA4VO5@xZh8PMyUvUpw~uXfWS8%UOWdT zz0>Tw}T`+~H zIq^Ei{V(Vb?|`5$cn(Q$mA}1@=!Ijr5IvL7rr1sRhH!@2QFVg=9i;#2e1^meQapS*nh_{m>HF$)1mWPne9 z!}N7ELIxJNoqExxRI!4VO|>jo2g4YfoKdxslqmr48nc$d!=IMtqYFl{)0R;A0G}$f zT$#gTdKb850M>n`jxn0Xa+RR)J&br&q!UCq3ILp@Gg<;|cn@k^0TE_h5HguF06$IL zvgC8JRe+8JqGvB!-%iY^md2tweV{ADwyC(BsTex|p8Yzkq!;tIDE1Y-|DG-x2nj2} z83Cmi0HlByZA-|~3{mdokIF)`;CDiHOZ2(L>~KaE>jk_^i=`Gt3h?AZexgUsP8#|T z2cgy>DOSl7GG-Gn`Zj>bHj8lGhFVV{bI-t9%bAu_jI|90#+V|5!10s-1a?v6=vm+< zSpH5`ip__-9~Bts34f@O>fx0NX%&uM;Qq{x?A43bSeN{u%bwrBD4mVbVu~JMiu~G^ z1_B_!rs(^7VO&AFre}Ig1!irXF=`NCZJ(1ug4c-19bq{u;VCOg&a|J)RPG&*VK36B zYb2+gRM#|2csDGt57rt0a|*y_b&bdhg0CiqZ}&!08^io2VYiE#^%VvL0D$=60AL*; zz=PMqO-`IByZ zX4d=AHodI{?y2et>;OJ%!Cz#+i|*u_`0ykQ*ckB_!g9f3l{~k4g-NN>mix$_rYN_r zh()FF@4)aIXi20=V(L#=x1!jw+y$E)+$(j!1Q4>Sv+`*vyyE~o?{$Ha1_A|1F_mC3 zjeapzN1@IgJk_`WLsH&nXHG;rI8LS#2r;~75K3kea2uqEDiIDkBNIT42?;{JYn3Ff zRv{sgcWC5wYAjX$Tk3>YrcP4!QKO7Cs8qJ2REr4?_gYgSTg?K1lEjWa1jhQ@82K69 z^#y=Uc7o;yLZ&x`Ck5xD1&MwJlxgHteCw!i!b9KyaB4Hb>*l~4>Q}N2l&LhsY1UOb zyaCXD>|mUO-G614zqVp;h+?*hq9=%==sF{i1u4)v!_$KhO9iV-nGnQgMXEchYu2kF z^3`=D5HT>Ks%SNzGlF~)M4lZ2iGk~mf!lIJPz^$g+CeRt1uk4;CLPkIjk~GsVV#>| zHtnEA1);i&qL?Msu6NXKuGen=t=%C(b_UlvsD3}HuEkFKZZ(VSxPuZPidG;B9NNK5 zCZQKuPni-Ve_+Sj*a3Ds0|CCk?>p$Vs&&Y|b=66A=+HW#ZynZi9f-6Z3sTpnT0icL zxpK{SMG^lg=f}DWV|atC&n@47Sb_}(1|a=aT?1)uA{!|~<7xeo80~{%hv+;AYDQSzjP>Y2@iT=Fw8deg zCG)?;f=dd_(O%#@Oe~ng+NHpp2VuFu#DZW9-8s^42Ccd`t(f(#{;_RaMXm0zdpEVV zd{ct_*;Zm4EQl#uJ_rxM*_u&@lFy?3+k$WJ2p21U=W zL$Mb{%@yiEDQXRXf;vS}!3LmwA^cY6PNF_&nOaAfGZd0UfEC>CD~bxCz}zqD1S@o* zP-2$bL)(PfusB*%-^X)IU~ZBivGk0@V&t3RdkK+*L(xZJ#|6ud zq37OZwH|v@G}$?<4JZmc1`d-N)K|3~t*B@6yw#bb_a~&4q7%x^(#lnX<2(n&^zQ|ys=8E}4Xbv77yr#6V#*?Jc{Akzt*uS4%uKt0cG)ifNEGaN8^88pKf z=2Pr-nSg$(8TjPTKQYlOEj&C=iC@UvB}<7(fYCd((YyZKPTe`g9@ig2I;xQe@?&nx zfP%QluwvfG+G1E*eeFjr$=VYqfus(@A}?*W7i|%7z4Ds_iGHIf^{r`}qxa9Fq1 zz(F_Qm^H?TILp8>(qOq?Yup4>QSn`g@Q|+objYCp2iagX%UI@QE1APkmhh-}%^2zA z7#26G@T7x2b0hIu^-kY>jFALA9H6e9gx~z7gcL} z(~V}?UN(S6n*ibd&;Fnu-`)mbSCDW=*2MHs7mOXB5uXGS6ju?3#x3oB_Af;y0vsTg#v;>9wnmo!cYiU5%F@{Fl|r{AKaHp9%h(?Fu~;`6FSS z=>8Y2*^n8%qAo9%?I*HMtoW@&M|>kC@>zuual?(4soAs6u7uk5VuRlJ%dJhv9^L#d zbk-R^n1?Hjf6=wD5W96Dyr@UE^HZTO!GGBo6VFPluk&@6QK_}r5&ssWv*>*3$4k4m z=?3l9D!y@FXIDFiQD2uxdqez`t}sID^Um?b#vo)!4`&Okw1a_zHSxUL1ngA!v`Onf zQqPR{*B%OHo_Q4NZ}J;D7G5OTY-Q_4F%WKbjKe_L-S6~YT7Zt|yj^x*P9Aw1Z$W&I z5M8>Ng-0Z@PEj2DPTchmiQ zkWpR3*%F7T4dyOSgAv_})j@}mL*^5dYw#WO~g*&HGA9s8a<->cjF4v`;2Lw*-s!ULm0*S|@} zsS`R@;xCYQH>)rQrHwjKJFop;mh|Gc3~IW-TRp#=_9B7D+<|+J2^Ve3TWrG6c#;0S z^LBvW>|Fc`E$bzH!gfd^{`mAS;kT9UEv#mzZoY(T!I{2a`Dd%X4|@uo@jv$o$U6G5 z27*KmORqW|YVMpjZstkxuxfkJJ{;xOA!|GDA+tT8iS;e}FMR*m!F6#uFLZy%+^dxb z5}4U9!q^0}(lYpG}~ z+JG8&v}@Ub@;o=&!-z|~R2riruVS?`m^KrC+qk{BMFy(bP-W5y zQxVH=_mrx+BNFBe3#v4mQ`_k<^45aM%3BHzD9Z|sNd>Up0}5~5h;;r(S1 zODA7uX4ZVa>>X1TQ&C&)6?X>uov zApM0piD!72iLq&T-DPelt`z4xq%drPy#(4OKJhVCA91|%xA%>G{4PH3O-Dx(LX1fK z`fhaH2zZ{gb{aIU@+0m5UXGTvB*sSKk$+<#Mfou{nsO~b!%c~I!~Je*Q!_7?pY7o; zg*QRI_-hHGO2e#Rp|;(L-~&b4WyjkuT$2++b{w zNLYnj*18VVus}6vW*Tau;YWDqZ5o1fW#79}+4-vl^l(4FILyDtIJ-&)-)tVMQw7vp zGQa=IrpSS$wdrPrUnv~f-E3Zq@o|ueDYc!J>mcbAw?&_FMA5a`5iMB2TAVwVS1|Ss zbA2>sa?8d9z9^S#hC@Y4(fo}n-OgSM&jUBkm@Tv;zO%g(BT}ZHcf4KptC0Qt*cEb_ zfT8W+o>YCs5t&YjYi6uHYv`!K1?=ACQZ5J6(P-*p(@eLEt+nlXrmCJsLapgIbL-13 zUDf@S!eP>a;n@uJ5gYw#rT(G&;%^B$r!ao5JhfN#W6Q@iW=M;f>Th3F{=Hif9xJMe zH2>ly#}S{kDE3%Pc50umGSdOpA8cncpky=Os)}3XKKIUGCX5Pwp|ZvN8?rFRf&HtN zSCl)OFyDs{=i%7>S>waok?@0cfk)-QjpCr- zH;b6O$vtWrBzXm|frU+svJ3%M){x-(={@d2>9DL{Nr8T9s3K2ts>Z)QS`+7{bsv2| zr@H)_-I$qP=~Zz&L4rbUAP1eblV;eOpG=kj@tc?Nn5q&hi>&2e(am^4xG5A?YcF znLAbbs}_mNNjD>iWKl-Oz!W8~gLcR6s1lPoht)sT5QMc*T1ZKw;?;QsmxTob>$kZe zsc65Ml(}(PtK5=7NG7T;)<^X(Im~ENQoNL@D%wNC;zu|1J z$T9_OD(1TFjH(dH1uchg&e>{prAJi~V)P@4lZI1oRolT2jLnsQViMd>imTFf&5#>Y zRzdp>5yWJX0_phZb>n|A1&y{+*CHCvCI8lK9hYzJ*6cepTFlCTH>W6g}L{9WA4oN_VKxf+;YQJb|j!68=szp2bzb%v8fb^9n zo&;2>8m@8$vubfrfS%+nA{#1Pdj`C|nt0#g0lWep<2N@PbB)v~0`hV}12Ob)la+xg z?r&0m%iPFKI!`L$PAohUDh`;ewsl@va`~QCq*gD?HCz9fYP?5Rkd4ffQm6`At&qQ0T0>_mWgbv;rKN=d1uZsHB zIGX*Xk-l8}a*;7wvxOo%r%Yd}AiRh*Y2={0xgn$EdH$}9Mrui7`^q^EnX~z(rFWF_ zbn>%3Y5enKk$~@}!*-8m&Qxi77QPv${c4;916(*>e4Tk{@!Oro%WS0?UDxIhVes zKFa&#Ano+|)sa{fM`N98MKd#^W!>(+H6JNjfuBdCUyJLB9?3+$8EARNt^K@S_o3n( zX`eH>b#;4e^+mMucJ!Rj&Kj&xJn1A@R9X0moP#D>e~~C8^u6adjqNezFEb_WZjY`q zJZ%iad=C0DkEONm`(H2O<^MwTxf))%-Jm|}Dyuj57NBcV>zCnJJ zv7cpkO|DRa`rW$eP zPH~n=an?<7whQr(FXHSN5*%a_oGcPt7DNXdpYgbf-gfam#dQdu3e}7mNIY}VVF^nJ zvm{*1_Wp(ND==r(d?Bx@B%iw#>KjN+x9L5g9E49ptyoC9A8iw+>F3tue^Qlv4$aYI z%EB^>J1IWqPP_bvNtirplFi2F7B6-1ny7onX-@D^R%$s8ScnzmmJ!BMk_R-H`;yli7Zsv$Uq<3A`06$& zK9OO+3FH$9VP=gAHY;*vqZ8&-jy07En8zrza|3&eqR}*%^g83axyLT`8o`QPSs=-t z*oi;};f& zJe}jZplCuHfNA=*We|MRFWD_oO)Y(cMXtGLog~H!88KrV`P5{RklOGU+|aWg&Z@K$ z`NWJy`KMWy$2bB3g$}9BcMg=_f5>*q^tGKgWufE5+MaV}aOT)K#6(u}z1>6Fdr=wP zs^INPKx!kt4QPsrXp}cSEwYj>a#*nft!qHE4-jg0pNtUB937t-1CCY+pC9I-sC{47bBo`y8gujV$RK!x=%}`+c&8MNmwsuc;Nv;O3 zH0ixU*2hentcM)(3;@r)z8V?7+}np_O?)t}b)8m*k!~w~Nu74u{xd?ToQi2w< z;Ot2-olf(=&_?l{CH;Hm=*!L3zO{bC5Eos)5JT_6OUZzsHTYzNGM2BzVnk4pGw&JGsefN7gqUTOxfmeJffDk4AnH%U5Nx3!EBhgfqgYV|6<;pB|txp(Am zP|>e2b!Vu4K0>UWkoJNr#(7pFVbR7iRRx}MZp1vLx(MntXxsM!mb&A?=)*4QER9@3 zJ;BrjlFU(Zpk?#doKK|#eMULsM@ahAArsi9;j3Hl(kL-eH2)e#>NW1xB$0PT9`mq) zQ&TN~44mlXx8Nm`?cGI*q1@FM*;!~~Rmz8It?6$*kZ6m&_xh$gVhn`4A6sqW&vH!b zcZwDJ32JXp#{r5?Tf^{Ul+xkz$1%C^Av)6o!da{D6N}B9#^%&xXz;hqJXts!xJOfG z%}5g0U36WXG(=NcS3JV0VU}5Xw^Ax6 zw5jn()wpnfn!x8{?I<7Ow5A6&1TaX=87`t&u9UrS*gb@k}5zGLv6B$&0uOGtZ`LcrTD=H2RN0Et~GmaCz^_+ypdrapFL!}jmG9f5~ZEYp;T#Bp&u9H<(Uul~6zRZ95t zWa0*3)hgnYSkiM@Q8k)D5a-QQrF+Ka<~L6U&KhSJ7fI(n6WOlhWn=V zKoCRpy+>GS=86||9Ag?%`{Y>DHfy9zdn{c|Gdf(3rO%(-R}CthTLocz3-A6=BAJxu z_Uvf=u2%t9zT@`NroZV(75o`>s5HSS)HfJwiw)GAH7(<2tL|G37KlP^o`|5PUkb2L zw{pupqF)TL1tU6^)-?a@s4EmEd-cZpHj%`%LN66;GF`2wdgUUzmR!NtGy4p0<_V3URvFpM1cfzX@1qZ+D#(Tz-$R5i2KedWY74D&znou4j0X(7z+pP zp1hpCw2frZj^vZ+r~@R*}Ay=`lXH z&kdKqIY(usc-r&mMe0LO+Fbf`Dh5IY)Y3S(2d7&VZg^lfUxzTVYtg9q-wO zpf;*T(~=62H8tX+ClhN+ybdZ}YR;Z=8a>?nQep%3|3%qdHpLljVS~n@>Bc2^aEIW* z-7UC7u;3&>2mt~Ku8q69TjSQaL*s5igG10Df%Nn_r{1Zl`7l-UAD-I#slC>H-PE(y zkpx4Lzs<{bSL&Be5pueSsqH!BXIx=~;sWi>&p*PZd`X~?bJ{`Kf17{U1r0cK34k3h z%gcFE2ICd($PsQ(&T~533Zi}qgX%MxrCRC+{g6LKCe7G8gM!YSDmRA&84!wI>ZZdvDwRnz!fPdr)WBPjqH z;*ODq8b44fJT`UXZ71D0?_nVJnt4SFF^RC#Vz*+=Ecp6uPc$J!l24-P$=P%F-xD~ zO=YTtYSLJS{d#3=4+Rvw<|P|(ox`zDo3;`M&rFT;>cOANh9qT+(mC=N$woQVL10gm<`&F| z;469pL$k?YBDHvc{pDpuQ0`XAHWgVkSjg#Z^Ur6)%HNIV!|P8W}3LDNN>- z@Q2)pS69}y@;Q3Ri(%%f#_L~LWFv?iRj~mCiD;W&X7mLlh_j-MJDM5ZO_!vQ=}3?Z z{Iul#rIcro@z_+TfhuF5D<+BFvSf@|a<7#Ur|(H#kVq%uSRU+tWE6X&-GP{Ec^xx- zraP3M(}kSk8)w59JI8|UsPO4oP1F@1GoKGrX|AtK zr0`jD4901d#*T8*YSUu(tHOwFRUwxqIy<4-EJYc#H(eXp=!9lh7*4MK8_X>`(NhOQ z7iue&Vk@@b>%mVEi>VX`P4g{4Iw(rq>F=b)e{bIuToLFIc!yG)Ww#N9Pw;eLyn~n8 z=l{Wog0zh$PkgF4>HsZo(+XWnZD`twN`U$TWuJvH4}UDS71R~O(S_+ zut=?75lgP*dVxN!`h2`skoCg3$z7MB8NHO{`o8yCj6m2Dsir& zHh;=Mumm!6aw%3d|6vKTQIGT$c$RQ|OKQG%h+Ve4X;r%X4@(fH-G0P#od&d>Wp@(! zDSkH`6=8d~>YVp7!~E&JaM%0~sqeZRNeGsp3Z5gm=F5Hl6tvYhyRfJ_juYP z1%LSqmqJ2i?L{U;Y~+a3q7aq$qVqulas6n~7+CuNI*=ezC@ltmc^{4kB$(!z7E6w` zpCAzu!YodQty|tt(f|qN_M-z;z2Xm*aW&iJUmyS2mK>6BF8ljrry(r04FXjQZwic& z1E=#iFfrNl@L3m4eMrtej&{Q%PwgyK7$6&;vawy=t*2=q)Mo-(zEL$uH`5!!o*gsL za*1l=rY{++*;msfNO-5*I-sqA&BoVY^EhQ)RfN@`7`mPmy_8t`%oq{fRFy3I^w2c6 z?GQU$IT`-byEv|j$Wi^Boot*Di|+dmL>e*D*apIBPe1>@q#f4Hb~hXf25)Ma>l zRsCLcn7DPK?{5Je7ZTNA_Kzh|RLqV!+=I9#mQDS4p~UflET}7MxitV|ms7w3bKd zmzqx)taFpjFN@9q4eRkAD}A-~oO8HK7$n>pV7U`_Mb993iY-R+8RVvG(@;*5=qj-a<*au;zn z=aY+2;47N1`6N=RLl}KZ5=+$BK+LS$k~i zL{=54t?iPGw3#1p!DLtvJX`tFHoW|8AE^vhKpq;i9DHX=-uH2*a(utU(*4l)bc3l1 z=}Q-0w2HDF+k7JTBJby=6NT9ENcw{2$_Nc$*ChxNL{wqXBYQ79>N4siX-B;hDQ{S> zL;NFvJ#9MsU@V|vRy3Mu1dKI8OVh!l8OD%*|MRnAk(@sJ*NFG0@ui%9$Tbbu&`iH{ ze_)^GKe5#z`j7rqNfi8e_;-Dih099_QQjXk@Cs z?A$OSGISt_{eq#+HmTLb>WAx+3Ggg;{tzWaoH2cj?~l)~&B(NoJa_7W)|p^AW^PKT zDTD8^{Yh|DRIW@x1xqIS}D{eC;8oA~0N`6}>jEOgOciG-$m- zT)If%RlXph=&8^Ua)=T=DJxv)6@K7vrURGJ^o82cKOb;A#}~888)e+T@D*qK0VXS6 zeW|L^vc2;-J@Zg?OsdzSU~hW=;_h+C8Z-KnLHVv;x^~j^>$RU`2ulcwUA#j>W!Qrw z`SN?xAR0|zUN1ob&{${^Arc)34ZcQj%S0I|@;R-?!yOhM;R!BL5+&cHz_-l7L}Bv2 zysfF4uHHWhkVGubW0WEZd|n}iVeQi`M1e<@&+@*?WA+;>@b3_K#%tTiBt_6}*@d91 zMWA^PVN7pg+xiT7JN!&{iA)^>x=B-Fa;q+zuP@i2EU{sl>?;-f4;mSv?0t!}jMslF zv)Rg<1`PUnI`iJQjXH)^NgZl9`T{3Zj*zz`9V9l$?yO zsFzfq`+ZwY?s=r1N%Agn2O&Z&qVX{BK)* zkdCEdkU40C?n$|6b8VUyu%rRs^Z_rQOQgPt>?IMT)0Y;tCZILzy&{fXB)T>j@WZfg zDxA@q->5eHimb%?b3{~SPkUwLGKWI^IGK`kSYMvp%x&ZnMr%i~T7FC6x?r=EO~+Na z->kLxl^9fi1Ulit(q>9Fh|iCgwp}KmDi&w357|h|z>Zx>6SN><{!$#1Eia3{R^TwS zQbDS=IV?{;r^K{&O1rDIV5vl$<^ol1&j|ZPUi}=uahL+x64fWiP zx-94tSdd`K+E^*BTCHM=IjXg}e!!tHgJvkJOqIM4{9^uvmKm_=s4%sbQ>5uXWWKL_ z&bHR@l44{{6^wOIb@X8vV87xMRuh_DwK|3oRdPy|UdOv1>5!Yi^TDlFscJCG@Zr}- z$^2!4L$NO)p+JT7-c{C*!y4mZ-5a=&=BV_F!yfNVO~_h8j4n0lFKXmeqVai7>Qn=W z4q+%(Bb4qFL1YYXk)x#i9(tKA1Z`Bf1p15Y7P2CRtoXIdI#M&-m2aGAJYA^cwJMuR zO+}F6N=%^#ukk_9^8I;p|23p~`|a_WI>m zsm3GTE|D6Vkr^gzoX6I2mI|Xx>(OoKa>Xe@%tw4Rqo-Q(!T(saAO~s=wqJLYKbWw_ zjt`nZt+^Z>L&FAybZog4fme}~32l-7el}65tg0%cd|Xi$^{Hg5V>)YF`I_Nx{126= zBKX6UOwzG~PgG_h>XU9s4o(}1A0sPp$3`5$BC#KGgEsgolm&kQQoKeV3QEi4OGOLi z4Q836U07()Hz_>E1J42>jz?1d*dw$`@HH?!@Hz z4o4{p5f!k*9R*QFCo<4wNntCG`oWF_8%!o89b@EcvP9P(`vlrM zT)#|Kt4L84GD}V;+=H zUOI<1%k2biWu*hGKW57v0fZ)9^0RU1Bsh!o&VH0TkqJ5Z4#wD;bNnXX2UDiop2hhB6pvcTm!nX~U40fWpivl%POOlIAbcViZIOlpBGS;Z<>SNJEA8RRnj!?hFy5e?1)-9qbU_;#4VcK5gCtFu8*)aY*Yh_Fr4up_twd|n-(xUKkv6O zT;bMiIMtIj1Zw(c4D5xUWg-2Oc!|?nAeRMWXUSYa#Yx^v6Ob^>(S=;` zBg4N&{3F(vmgH41FcnzQ$ivl;6Vbm7Qcta}%b<;d%B@LDGy7c4-GX*vQkP6`35I>v z94Ig%(DG=$n)S}QKYN(zGm_K}kI59r{y~(~B7R0;6?!ID$QGsrY#3=3mukCV#IG>B zs{`kREEqGZzVB1!uArM;j*6@9zPl>&xwQB}=D4b|-%L;)bGfOQY?@JX=)HE-lOKB8 z0jT3dH7Gu6w6!}p<0^NwuP-)Rd!#SKQ_giuAAb4Mo@hyaH{261AJnWWe1Tr+iiaj{L|Y5BR|XwFe-}Jm+y&^ITy) z|4S$YBNM`BLo+n7mT@Wdb(B?;E$d)baDDNPCpku*`y*tygqXWG#FOE9qX+T6^~bd_+P#pAoG{~Cw{IbC zO0Ax+a0*<4O_5NT(MoO8gPXyv9;RRY48MNiX!VM_uL^qmP9p7d^4sYR;y%5%?`G~l z6M4JwD|p#p`S-{N)lGQLYXpnke-4gznne;&N=3L1ag&!I-U___7G(Aoh14XK(3!)Y}NDkT8y=(7;#i2}Hu$ zMqk~5J|UPQUYJ8dMzYk&bMcg+Za==Jhz)tax=&nhO-*{x2Dinl>HDzUC*=905@}}2 zp{E6Z4M7#j9C?&`_!>s^kc}4|@hUXw{ad%Xc5g!sHu-7(wl=Bs0e1O*3i*B^kb)bk z9OJ$>l6(h}yl9DGN6CB9Qu~h5PoiaCJIa2DmWOwg$B9;?brb`UD$6=5vqY;f11jsD z%6fdOrbTOV z82^_#a7k%LI0t5_jsB@s2Y=deY4@6il$!qkAqT$yK@Ns08=(l~z`1EVvS~573Fg~8;NLun;0=P>4qV&M z!`nB~+vgC%LGgc)0|aak23<&j{`}FkRo1;2({mWqdx&rjQu_`Y`bWS6^L~Rj#e*w# zgG+;hgWW?g@W@fp*cw7Os2=}`5DtIs1yfM@=e z&g`|!ZXu|Hthv30`LlufwX}st1abgfI6w#o#f!_uix(4%8}mzBWy}AHR&Np10m3nDS?Dl2h_TTdD-Nyex4sP!LB9Mcp`=^)tKRpj{gmbX`^k?nA)WO6veCP!}{{r85 z`5$%g^7rNL_TRt%n>qk$;U}MF^#o%Pv73!T3I@XQ8C0{C>kEgX$@rZ%M(c}4;%Mcf zs8kw?$C6lkei7)YS}}}BS!6^D0EYQ^Q^kClR*`CsYICWojJF51 zu1Ry%a-HQs6t$YrNvjRIeX99HOU-(#+n%iXh<@#6r}xdt=0t1VR!;ybkVd@?vNI4t z#9;wztKS=mXHd&kZ*TZDkF%z-_m_JUdGC6Kw-6+nMqupqpVb(pcz>>pWjPODE zUaa_^qrEt347UAvc~Zyy1ZC!m{r^%2Nm`0*C7v(0pS4nq>?(exnt2`nO0#ql`32Uu zAV0`(D9t!XXSPFl2m0L=)7ek^HitQ$|Dg{2{v03X`E;`#<-1vr*+sY$W*+8%g|Lr` z{DjymioRbI#gzo7`Z$C~PK~ijKCCcQO57(SsDtv-%9G0K7N?VP$Qm4#y&OE1@vD^F z;J89`-Gu?nGkivW#x?jK>R^<)>Z}1q%5m1%`FtJCJLxtMQ{HsIZ(m@rD{7VcCCo{a zzdJc`^tIOt-AIQ=+s;Mjf2o7Z7OUS~4+m9sT_4kT>Zsk&KqIdsldXaL`@NaxEup@D zEmI$|2V!_j^sX_f>^Kt!hgFDY>qn?wX%FH_ky%}ju@-S&k8`%3T~Bbe(l)|`5v2`e z-=2}9xE2yWPxq$@ow)_S7@bTF9$1@Q<4Zo^hY)F^(Fx*d7$UrY|4;|`246P?@$}x} zc&%shJd0U>}k4+fD-GRoUXW4 zkTEUPt*jGHDgR&@yelbfK7^nS-it4cveZGZU~i?waRkt`gRy0gEMEXCW$|bLM%&&H zAh+#I?*q`b_XU$tnhxW1c{kX8rg5Iza`uR^F@mJzYkm*54)FIg90^2wlgk5Tk$;0F zTb_##&PPpPLIzpm50EiCpmT)0K_wI4!lb@l%Bu)wf{vAK;1SYhe`}Vnik}8)`S#LEJr{~t?_dtFI(oM3Qa$)I4VBca>-nNUO zgo(%p5-wOqD5n>a&891gHVxH$uSTU>bi;TfNf5#5wv9|N6M#wuL1Hx`pp=@=YPsDR zRhq+8JHgt+MNkJVALf4Kf$fmw0HG53{bU6g0Q?p6j^DZdx$RJ}&_u)nG zprsG%<&Ug0%FL$^5cLKC3Ro3MKVU9I+@exJkK}L(1CTJ~w~?rE6#H!j)qPY+BtM;C zFr~*M)Cfy-DKZoSsEJ$#3M3zEv!5}lU^2WVk^bdUk&Dw8x$~m{US|Ao`P0dAPs^dk z3@aLj_Dm27*-pt&5u1%ORx=x1i_Qrkk3vRKAMH5E?NGz%s@2m6l!DzMAO`leC5CY(VuDmUcio8+6E{n@8lb zRx#ekR9}B}-BiIdvuN;|pRyaJTZIQr@iUFUP zCjc4OEr7#8wr-_giQ#U7hNFOi)ECJOOMOYKf@Gz4QtdK2d?c7wFCWJTqCnbQViD^X zOl+*&8-_=V;$^}xsLfRGTe*OvDc^^NEJQwU2eNs$)Q078$trrCV6kIiOWlPvXoeSn zM6gd+b041)5n8%`qsIm(5AgO#CZa@RH#CmXeJ8v;_<{UnD6>-0)LG;jx$HPL zxbL!?q6z#QId1Z?vf{%;gu9O70x0mQ$i7tU@c=&;Kb2Y7HGi!P0Sd^Aj@Q+A)=04l z^0)+1-ltzyip|A33DaXVh9X0^|UMY<&p(rd^i_TneHco+(_F#pk|F8O5MZ)j$gXwp1`=dGZ!%{QH|=iNd8 z$~_PBczHfX0hw@oVk@A_#@FcA00GJ%b30n9j*agv-@m4BL<&04KKz7#zv};uMz_#M zIO_KPa*yD*G$^na-BZCyIv*f@=kb^J$A&i3f)>yZac;&VbH$@^54k70=UL#;R#s?Y)$jH7$lZ*f1wQR1hWv`fzHHxI(7XE3oAMYO?Tj3N^sN_FIo-fXF;g_#rpl0+5I zw+^!tCXj_I07LQ7bM?Q$^glWu_uZlEk{Y9UU)r9R~?3e6=7Jw9eZJkFn9M;F0Zh7sJ&Z7i`%BoG9NZbs*{T!q>Q z{r9M#xK>1}*7vCt#J$b34#5sVLIXi$+E`Ic-5hqc;=eCBWBE`kIB0j;O4c?9uHX41 z!%5KiXOJbeFr#L$M|(ll>2^*SVv0VvYY^;6p8seEw3jGv@G-*jfvXVJ>&vJ&86SUc zW5#iIVN;=8MTG3iY@p5nfG-b*Iz&d}5rroJt1lks z-ZJG!Y6`<4PW7b)ARcLD5rxr4$SC~>-=Fk&@(ex$X|!a^FU*4GGwAYK7$5Vo>hP0S z@H6*$GWP>;U;!YN8&obNlxhGV^{2F^NKbkOl<1v#8rOKkuI322GzKbjsu_9;;$ zJ5D7dE<;eGQCeyn!|M_=^%A>83%kq>yBrBSAALZ!D28sDn}1 zw2;}hbKqF0H1a9OJb1VG0>1z>t&zakZFFq}c#w?38ZYz~KlQ_-7=k)r_AO*}DtyTh z6x1rr{fq*%MH5ZVFV!ugh2+yh(0w3UYqaX?gux`0kuTf0J7`!g_^6$ONIWwI1?ea( z+d^8ILL5jXdL|`0z9mM!CH##gTrD|*F=H&T2i$N$HsLZ( z1#+T+*}a$+mMCP&nzZ>yoHixKPh|lV{cm_gvK0SDZPzSgDr`m4jM$OAmf!S z*S|1Elvser@MX;5R9ls6Wlc9A70=$s`?b2Q;oR!w395Mv%;OExeEKsEdF#pwzo7s z#FXZ=w=@0{S{RKv8Qnfsh422YBM;cxF5Q_62X_3c?^1T}BrPD!z3eEj@A3}lSgq=s zMgsKx?cTlu72u~j#L01qy6bPfvQtQmkC!U>X_rC0)K5JXzXh%N-j8wILT<>$O>MSvB1zz=2 z5DZX*@!x$)dL^J1|-A>{`C$hfICI1yJR--zy9r(G8>qPCJD0a9-!=e2Wpjr z4H~)-n1Tn5VME`tI{93Nz*T*Y0lh{WLrc8Gj8y%YRy{gkDD^X_2H1V@7l+fV|9j`i z?cZUKZ+)6n16w?!(WbAyp0<)fEu!F6B-2%cyw4*Y-$q|;jLK$rdWf~hsEwG)^dx4t zibDr}Joh+)dOfd(iZ;edvpYj5+uHLpf_FB*M_~cV^>Xqgx}*2E9#3O{&`h zo)IytQ5&;CVVAbFjS;6ayx?k5F(`i5b1SSGo3gq`6by?v>*FA3chqh-a__2B>p23p zZ&4BDQuR2_K+}MLv*%uPSWo3;+Zol=w<^LbzmA9Oj(W9`+yLUo>_OgaU}H3K?%y6K znUTu)nJd5c?um{UPAp}sz9G<1Y85sL*Yt5#M~&K4dFMn}*33R^Mh{F{<2U`_GP@An zF_(=$!7&^94TRk_b9RP!D(q~wN9+hV!M+9a609X=N~qv zFnD3997AbYU5fr4_~#uQllY(1Mqa(N9gDRs!=?dT(@)?MimfF4U4~Lk zF9Bzdv%8_N&g1H-^sIq;&}>uI)XjPubRDX-IhmS;QJyoUoIpwrUe-BVE#GWEd!E#Z zpQ=@x;K5n1^lzW0>{QjCGy%%PKxKzs;8Y5@Vt0z=M zm~qxW>$) z`Knnxl#XjUNTc`9Wcz`}jM8~8-M_Zxs;#z(o^tM11FOlxu#}vyHXnd;w14Wvz2`vJg)ZZt4~Kp{5dU}}RkJ@Y zKF=rFDR92+x7ii^yiPAMyJ|jyn%$vFFjQGH@yB@tYj!2TrK3q~Vy~-jd41d`y4%QV zmK)ZYAlA2Q+MX@e%f~yF1MKW|ULU4uZM%R{;PxkjTI(+M0$}^PxgDQ=_G2PLq10_u zIfsst`>hfSLA}TA@fY{N9klPic@ugqxQ|V9NpZnF4;Dv^>bqZY4+zaiY-&3g{GedY z1=!C~_h^#*ZbCnc?f|NZcicp@7dx0Tr_9xx_WyP(kq#0$T5F<7c3p?syJvy@ z2k>u)DH23SX8rs-lT93liZ82k7Q1;g*C^lHm+QNZv)gyNf0n4-=w^>TQ=U1_wu}Vy z7$ z_KT^0->&_F7-w_&S!<4sHC0y|94-Tan2brL;t;NR)OIi&FJG=rm)7=CW#4`PoSn~^w*f%{z! zOiv6-cD3gIeVDq7yJ(43+fvpz?A}@nGi`Ox`Wv5545PVo{JlpHnn!`}HM~BnM8ZFP zel#t^CZrLs?8Y&>hY|Igp#UVmd8u!=hUKD_Ts849(8yHgs+grY7v-Cw_EgB0yXDJ; zum(jzHGWo+~Qz60po&AyPgjr&hu@n{dlAEAx#t4 zTr&t=RGmV{hx=Sv+pGCe(C#87@bi!CcMv*-sAPVJqPFaykfISRRZ#Kq$4oVzAP*6U z)Z9j)Dr7r$ue@bY$Sj;kocYv=noyf#RzLmg+t?xeB%*h+9cY2B>U-l4jYsF#2YEUpj&h2rC0L~=F5!idt9rv4_L|TPlT1yW zs=BMmA>F$O|5L*S4E@kSv2(s_74&=cu?_T>$_tYkQ3;1Kf&Wnl--VcUbBZ<0{Kjx} z7DW068|hSJPMWNv^^rBKI+=BbL}Qq97N*_q*k_AfzdEU7v$Z(6^%cVCdHJN|NR2rf z$S(9%8^5pV+C_2^ek}XL<8@XTKF7M;I=n(0+bW#rmm~_O_9@mJXk%AnK=gwsxNfy& zisGxK^zP4^jznd@Vmy>j6%c`rYnrh9B)h0*dd0D+T5!_#L1S8tjiRdci~Y%$GIRe< zJZKz2|B|c93#YdSf;xaIvm}5a$AcU&aT$%c(%SY|){iD63%Vn?ZvuN^A`8QEh;aXd z)B7bepjZ^yr1Xhx=lHRI zvI$Qr6+9O8&);xy_#$W4`Sa=DhY{Ky@=lvNSue-R)~`&wJTCTcX}b46FpK{N>Q&+r zvRqNw;22~#5YUKehkL+6Au{A|J*2@50D!=%{m?6h2bXHFOR8C&*e zB4QG87RU-qu$e2kWkWJNSWzWF7h?gL+EEqCcMPD0TG1WL!-Yc+z(B0G-;VAgep#gJP2$U zTo+#BSs%qmh+834lJQclAvt#Kxdm$mNt|3($BgQRzi5BuN7ySkk2d~7Ty$~!dFc?SOi(Vj; zbc)jy=uvv?XMTdul=YUPw1kkI)M{qV$d+3uKW2;&dANfW9rTfOPJ{i z(4vTvn?we2p%RF8(VA=5>n}0YZ(7qkNo))5t79V!GA)v{A539HS3cI83y-xTH%(BM zT;)HxPZg!hS&R7Cbi3geAx9d-sfW!MK%(hpKv^{2Th-8B9t>L3;PXXEh>X+=PJLUb zRVyInFr=CSA|sD&OZdV!H4ZhNnvvM`7 zH5+=h$fXI@;(5La;x=Ya6!cUCGIhOX(FB%E>;a( z<@TYAbv7gw#w<>_vS27fQ5#&avwr7yLCfwQ((rI_d~oez7}`Q`vywn;^qX$sG!2YD zo{4TL=|cw015Y3RSV`N?nMM??Djt7k>G*8w;nK-EKddrASTchbL)GZ{gr$ws0+f5T z5s&(5)!m0zFJJg9jS}^j(lc-@hq`EGE*@cO$dKnxqp-FbEAmm>fS5V{sHv|TEec5* zy)_Ktj=NTs+cFzPNwTTEmxy;?;%z9Vxgm)W*K#GSG}38GRJULwZ?qdGj1Dnpl<=`r zl5SX^KRU#hBIjAV)?wL{)k{}ZnM_OhInhHJ#;ImCp_`R)qBS@f|C6F!?TTSL@dsA9 zv%*K-R-a;DT;@-k6$yIqC~n%gPjg3=4&cha0>Vi#&961rl6wa)zU)V#bQr3w4^cQj zR7%vElzH>=3v16h;dfCJ#l20ty4?vMooA03gRyA~kwdI#NEWi4#EuK8k=6-wOVTmK z-}De)mwKlc+0gn80QvqRsW+TzbIaos^9Q%(OT57FYv$k2xEytvvvX8_ujy+K_)#lo-twoP z@1>mju;u8<>4eHB!zIqDsC^fu=8KBB3W?vNJ{!eB<7<~EE22K}1;s}uH-93wP^_c8 zgiKv09)7>?g8N@iP!C6qb?xFlJ@F{vQ5- zzrcSWCHKVfw0uX++oNqoQkOU^3JjGBjs0ub*XTL9%pI zvhat8`vdk{BEPk@AU|F_o+5a!#D=lYJ{+V7bTo7@cX9nQgIyT{Va0CBxL(k-P!KbF(SadzR{!mG;}B+HQ|Tx7sOc& z@sVfRZuBG~QfYEYcPc5&QHr`9Tpm#|)e!C=WeU6fo^qYc++HEEfnjt;_AiWNG>OT7 zfimdyh#kA0s8LEW0V3pRCYx%m#V77yx$bD;L}#!ZoRE*5Q>JNqg4jQ~dup$KMXeil z6K9tw_%Vn-v8j78xOE>`=NlwWz?s$EOZPT;;7Av68DFzZ0j3m0+k3|Vu{6d)Xtvj z`!i+l&)jQ$&?=SsplmE8s|h8Sj^6S*Yx>R>Scz^Qu*(elE>kRicF4;oIsJ1KJ0R`s zbUYXatOUlNmrpELVI`yX#iGO`M@5;>;r@zf==Lmaif%7jhb`2Ly;rS1ePli*>dG|5 ztucj(7)v^!j-vsw&$eM*M6}Dd0F+s_R%L4V*fTE7FS$yLq`XmmQ@wthIR7Cc%D+Bk zNPq;gFd@4!Bn9p@L{3AmVgtKF*B>VhR{1bGu){qX0Dh5JYeX0x372E3@ndAAy_$YN zMvdYW%o{EP#D=1B8uvh6Mi8&ENOGx8KK4Ls7jJ(1X_CCiOxZS%OFeT+Zwsd^44o_g z0Z?Ya5%uE6+Vv#xv7WuAoD{azCDA@c<$h$4UB{U-d%x3nzhx8i?{-aIJ=dxkDh2pz;D64Ef|lj zpvl~vW5L5CGSn;1mMc!iv4}_FI=GW5et=DuatGl1d|s94o7TcPYv;I;nPDL&Mtc5o zzRgAfCgSxc9Dbb=2L2ZD933BLJk@b(Bl66!%wmz%$_gvchEYMMb#55+b+H@Ygm9Ib zAMg)3ANme|$Vz0C3nL_eTl|ZNl!ShC!R!x5-P{1}m`fp_tYk<<%9^nBp{0I!vKmV$ z3-E?8_^56uUFW`>NBahM^61S^5iDn_1=orj#ie^)hx-^Lp;mQl#n^a#$UDztHdE<~5czD`jS8J_%*yAgmFHuE;k6|! zavIz|!x`ahQf;abtd-~|d^df1pX%wXQEb~171Y3JHe|4WD2JMH=35g`y)|*rrhtBX zTp-!n4Z^zXqT!WUgX`cVTPMa36ql8ZH8d8K&G9C@>yIlgV6?lcCemjz4a^n)fEP;} zSw@(+L)Tn}m1H}_U%6Ho`H+UIu%gY_zCPCT4JMiyVCKAPk$3huYb>BxZJs>(T;K5&?>B%?Vjy0XS7=FMxcE9^w7hJUBKP}7HYNSE>1Jk? z_xglC_OByLWpDl?>DZxww7zU*EL^SvHUe9AdeSTN+ed~`Px)q{>tP0Z;wYI|Mip~6xE(*k^z;0_(nmUQOd^ASc6fxZ4 zyZKgJIol$kVy1%5Shou`lecr>wUcJY{+lyKq|JkuGZI9vJ?@!}NkUKN18y&Qt$h*s zJBs0k)kYHVPRn$P^`a<8J0lf`T=_x`3Vb(?^SS_q2y!_P^-fn1yl0+8D+{*CPix;BCoD!o`m)HOBC3~d4DgLJ!h*#bwM<{SG;DJo9b{<58v zB)rd%!Fae>uucUCfbhPQ{sf0a$W^=)#NkY4bTp!8j;>m{n8m(T@-6~rvBk@L8|^g+-}kY zJ2dNOI%3>wZc*RgC3Xnb#&{N@v_hjm(@**F&d%sL$1+r&fr5C~I4aKn+;`Iy(%^#O z6x)kDmWgn4eUqcz=^0f^dG9j6VAz=^Yz2F2z?!lS<=Hpqc$PgUCH0)HC|L8gqS6Vs z5-6z*MAz3+em8X_jXk}BV%TIn#)ps*PZuah$Xc3$nt%^_TdnImu!|*3rvEBho zj(>~>c`Bynj7>w81#T9JDCD(<(mmDxB8+gHsT=!I$#*)!-PhFlDnfX;e51(I zvWjiyNV42ouzlBm4O9Ii5aXe9Vl0hrq$rq0!9Lt{WJG2_M^1t@t9qoVu+20}zI*C! z>F@ zk)Nw>7S%p9jRX{4`v&|kT+`Q2a+cb3KTiQEdCNp=Wa5u z=gWvVK=$a8ZZLw7MW@=~ihdYO@z&!EOPg*$z!7bSEdxWR_6sgz({z9CgGySZ-qYXG z%HpzMygV6-3^jX=cizQdfuqX|t%Nr=mA+nXn;PQ$bO-%D;L`qFdF{FEwu=n*L|(c` zru6F_(Q?OPtm|9QZlet1a}DTBxphcqz}Kn_q}!N zKAbv#z^Pib-qzEsRkP-pV|>0WG#Wnmbx)%WjE3P{bP_rf+LhnuBI}v&)0vyhAYf)O zl-LvR*+fCq0>QYsW2tnhH*M*io94@DrJPUR;@Nyhu%M}4<~5k}uusodm3+>>KE?&% z(oex>yn;uW&SgNNvsF%+Qka)kuM6<+(I9{{@YVq?`S1Df?*n*u`mR$~a7(^Yc+sJO z8j`=~ih7|GJ-Oz;9Mp6fOaI^0;hH(b_!_K@nY$*b(kv<7S>&gHIMzC}0#9dYUSgwj zy5Dmy^yO`&N_o<^7F_Bx6_eqmbg--l?iI$>cz)>>-2|j4UwUWEqkRiimh;R^Z}A0~ zrVWNRycMi?Ym1T^R$7HZY`COFLMn?b$_S=q^BfGiX2wb}Y4KO8 z(fLg8e3?>Bbyusi$*c>iElPS^hM9N9y?$4h`y*&x0pw;o{cGdAL%nycM*c7}-q~k8 z`{1XuDmEy* zn|I1AG2XThH`y>{8l^2LWd`{(MTXn#B-PE#!2)*kH@WvGyp0@D%SYd&la=eLH1Tkn zmynZ9&PQrQdjwWZ178Hz2u4sDUHzkie@(w|*+JaZN?ruFp6SlCw|q8(g?5B~3V;;_ zk6%7{2jzG#w1iTIJc7Auql6C<#mw5gt$O^h`;z;5l49SIxQU!tc16EGfy7Jx4Ix&J zdwb>%s#Wf~F8?PwWv&JgyJ}g)Js)k2pswBQd~*9*--q?CdrzP6v)A$%s89TEMhq@~ zKdl7Ei!Ua5mKXrJWMRoDL^b+F@R*mIEFK(m$- z(UJ7-q1q&bv9&HU3^T$QihV9h&+&o0-n_4vN}+d<<7sy`!kL0(jdhK}z!e;pG)1te zn@Q48>8KlSx&4L1fsI*0O)uALFC>JOjnNaRD3M!~uvMBu&>#XR=yPrj3JsNj0HhL%UG}M?50T!CUx^c_25}Q* z%)@(e->n#Lc&J0x)Npwu(3=TVfR?H1rj-=?ys$vVn5_rklmN@%F_l;;HToc;{IYl*x>)CS`4kycv>19Y4 zPB}EV*o#!GQ8w4c(iPrUeiP@N6&6UBBUhu79*F$n6vAl78c04sZws&mXZcO1F4B>8&MQ! z(mx->nIt0fBT-%TyDrmh4vjg91^{N>F#2FqgXec-^0qac#uk2zr`|CMtQ1Sn6>xkI45c$my}AE{SCVW<-LKDkwxEKd{l;VLln#B- zkZ8~E@mV_LwYn@Ec$*|D*>Y{LlMTig4ip}`*s3i(rAA&)c+L^A^w{B}AHGj6LsRbl ztW+BavE4A2MjUi5I{GeE`MD;vONF~7qrk|9{eT=~xt4BWhjOKo(TaUXuAbY*=3MX; zU8}07jMppKbzCTEH_P+6%ab+5NC=xy1-?qSRyzSpLAh8+pejEya&8cFsnB@(TcrT; zRO$@QK5@xJqVWR~5^4p0)ql8OdbE#dN?Ms!y400+_;ly;N5$7KR~NFq4iF$^lf`sr zntw)ZmFy}fAwko&3*5H#7>Ck60#y)CehSQi3C>#_9LCb3k;TsW>{w!eKTP+4J8*8+ zKX<`dt~i}|Bu4oIb1?%aVWx}55=3hd;{C51X(ipZ!NjGwWSeXVC$R5l()xuy9lv2yGY9#r9V2)vG} z&lh%feTQRa11)yg#A$D!_8c}m$$7nl)W}Ta+ycxKx*M$Tv1L$sK29jVc1Gq)kgk8v zkQQq0@d0~~ly@N%3%$jXgv9m7mdQ>|4>9R0b2%QrbAFz0B1a`$Yp-5YNSSqBqxa+! z^Itv;0k}M?I6vJ#2nwZmMg}K-=e$v4e?>g8xBQtI#74otd=C={BTgWpUXgTRiKz%` z9amIMxmQ%B?;Ht_3I}ev=t{)2%?K#BC3Vh)Sm;*{Mm;~Vo zV>FshHjsbeWiVJFTh(2MM3#hY+@f7h0?U9uxM&3X=*Jvxn*ZZ(H=9LpJjOmh0xrHst z0lT@<^0QdVv{2Ix4E0o7{`U_`MdAZlKON;hDVepfl0c5eZOGsSPgiSaC};(pkCJ~QDyAYyxPCz|BwJE!kF>J950rFnKo+Z<-?(vFeN>S|o2GQK2i zG!lKNDWaSuyDvi*0<7N!j|Bei&wf+(Y+QKI8fWA``tS_(JIs5l=;MjtaG_vjipG+txHB%)axc z*++&>3wj}?!uy9hxbMZ|3O}%?+KX7*`Mq~oL*t5Kb}d53uwuIEm=8sv@G~pP`eW>^ zI+l5;NMB9p?XB-Jti{)v5oNP(drN-pcr0Hl$0EWaM=|vkGVQ zU|{1AL%vk{z?&$EohK$Dmqth$ouSoYIAcl2bLDgIsZ{8g_$Y?siro7B?vz|+mXcM< zOjMS^m}0dh5HUaT(!x4&%GxqETG=3~sfyW7Ti>q$gfw>7`2GWd+>jr3|F|mUh;5!g zR^mQox50tan#1pw^_UN6)*Ki`^9OQ8q?i7sk#)ARP3sb(i>8mM-HlO$Q3ZfbObj=N z3LisN1zLlnQN0ASNL!^)b~_~s=yy)Yd;#NckD>`BGR9U%Dbr{k&(i$C{T#;avf{P% zo7ArX06s}dmADBsWraWljP4~BQ%86f(F*bJGjbbkJ=vYZylb^mG<4ppQrhRyiqJJV zzfIn-qH?(%LUIK~gre|YW|_b!t(qlOi(N$oOO4k3KExWP0__qu6pqR^Y7BYYNO7DRCr$ROwF`NE z9SfBA%;9n7=N5X3VXiJ|;t%jizREpbUbzdvggtCON4WBzW6sXZgwZf_v4Xss6XdXw zVOE(+#XsS2Lm{7p{CPmWK-qO)6gA03{wEt&$>`dL6-J%T%3UrNB2k*i{$s_-;m+(L zx6_n5_Sl0mvk_u>{eJ5A9H~??S6k1H>R8g97z3baY1n$miDe=&c6D++jO}!Ls(?`4avAD zSMJ}@dcU%qAf03C6`p5Hje-MJHC1h}%c|4Y8iaxZQ@0_h`o0Y^zbx{v%%er2?jkrL&)b`sp;e;UGvZGbs54Bxp`kwCQZXUdp^XtpLWQ?%xLO$H zFd1g;Tq|)a_AH=&<|)CI+)Kh4NzhfHNKd_c1g zSS96K(^*GJT{nyqkEae+NUm=L=b{}4OjvBKdB#L#moYT3*5b@Wf1Mf2!yKQGK!?C|#H>ch|q?=eaBCro^IdvO3hfLbNa>kn3=QKwfWLHD+kNu?H1 zgn&DlN1n`QO*?T6?96n?)o}WAbEqYDR719AYrIAYYN7OGY|Z4?N}6WQrEvaTmC}0C z7_vH`lD#`uG{qI3gn>WKN73Vz;TSR`<&_PLBcvfd^XHZD5evVENqYoPbR*`C5@u3B z%WkW;zFmrR8md}tVg!e7^qE0ysX*vofOD{xxvXO42NVCsS*rw$Jh^7gcVjvZWbwH3 zABPD5De!pgZ>td-#J796n&vaOH4P8ISWf490| zwK-X{dm<;hK;+%tt<3R%a?(-o-SqWE|1ICp7UCe}O1M%H)F$8F7C;#935|689Op6R z`w{f%)8_~ebfK`4Umq(*gdYXn^IBbHBR`J$x^lH-@zvfPVc|5hn3;C~I`t@P_0c*&m>38@h3)Qy^hkyH>O!*iF|K+bEG7uxv z#UUH@G$dR($WS`KV1k^0Jj4*{hcMmo`V@Q@DLm;Y{3-JFcgI(_ND+Ex5uPZ7v=j11 zv;Zr#_^oIOLuUy(LWxj7(fhw8uhhYve<>*7>#KHPEn4xpv(#J^q9a=T3LadDRGf%Z zzU_q62UPs@FUR`}{om^aW}j27BC-sks(qu9qhg|*Vhi-+N?&tReB#n|j1r+HiKQlq-Ij^1&WX(~iKU*2`QC|TYDq&Ml7<753JjA6qmuLV zz|9|1pxUX!MyXxKsWsNAU9PDu%4yTu|4|Jljnjq|(?|8vr>xQ|tkY|3(ucg$8`WwbLcFt&Me!g^gW)P4h9$Q)$i9uYiFkY$pgdlm{EFf_22SEVZ?? zceHjmwqJy|@0PZYHn%r7c8n!-?tJN*cr^@yy1#dH&wc4xEbLhs=pFDMy!|qC&^k1c zFua&By!A>Kq>mhQjI2zIPUMX(SC22(Om4PJF2_t=rA_@9p5B?Bo-Ul(>X_N>nOPp1 zUC3P6`?_#cu=oSAcnMj&sad=jT3l~lI_+9I9$Gq{T3UOh3lf+AL6?86t*i}ioKJ5Y zEN?6oZ~iXbyv*E!Pj79%iUkcj7kl6Ln|JS~cYkc|Zq@9)jO;zE?VmLtJkK56z0w6; zhqt|lKT40DH;-=4Ude)!vxC#a=Cfae7f-Kf!Q92e!o~CM#lywLMf2squFHShKc23B z++6*5zWsSyeGNal`Q3Z>Yv}HI`u^Yi{r%#9(FH9J@SX?w=EKY3!^^LSKj;5t7~KDP znE(6x`0uZgC-}Fg-;>X;dcn*8qZj;peEI$G|IrKZ6v-mv|4;RTDJ43lJC9Zcv9eZo~9w` zzp{RuVHXl(_wMQ5@e~p>+i_ByAh^L=;Q9mEp@^({;y5pGzl2TlxA*y3MNu^Sc_n1U z`oHyps=U_8iu}|%xRPU8B*}S_;2N1VHc!(%#Z-Mi8tAfNaM0>MdI8oHXj<^exp_`u zii4w%Y$!o!6((9y8ab;B$qjIF!sTns9>kyvyu2BubZf^S`)|GAeg&(Z(&-TTv)2iB z@srHDec%UWAdq*0u`D}PRj8oz?|H6nz=cJ|(_z}Iz-T|x1ofu`tq~#}IXX`w?R1Wj zamKuw+ezkitcWje-XP0gTAup_2x!ZOP<(z3lW2*p79`22i?`9E5DeBN=*NPLq|R}ZVEZ|Hul*<`u;uA2}_%dI+pG9BKOZ=n6X!e@ z$umQnhEuh77!2ta!2lfoYbit=15IhbTipRvnvCp)neWOc$X%Bxbva2q;Pfyg%p^jO zi0eo6zUP0>Kh0YS=h6_dN<&3O#s{$NPNngjG{dn>`jJ*a(x}Yb$f5{?#3#;cg)3u{ z2;{hwolVx5<4n=vvX$OT;dlZ?I{*V(LDHt{cniit!f^XY%4~d8 z9qDhV$bDOt5?=>FOXD87$jaQ zLDP+wI~+?V29+c7CY940Y4uPripQG{2ysW{Z<w z%M(+{qhFM-Dp45&`Vnv&5YSCzcO*?QN0pH@T)Sk$sAMd$y)lw12p|ibxO9=IHnhl? zvz*x4{Xe)+iNfet!;JijH`bZAs8HzG7G=jL+V2 zK=S#q-getVV;onfVbL z&H1^H3$IbQ-1jMdOR;7O(kDAn?ITb6gd(-}$2vS;)irH=46K_%C(EzvLgu;-!|#?s z_PPRS_78z(5k~+z285~xp@_mN$Z{5%Fh63CK-f(zpGhb(+bNfe-t<0+P?)nanJi-r z#0)p&kR-UD8xi9*C(31zi~_q6yj+r~;7y05_~G_b&eq{S@<%wDf@V0S_6@e0;X1>V z9||RQgDq(~9YMd8(eALg-Rm_sc{KMx$}2(7MEI@W6_+8MMH<`7MN^x89WC>ZDgvf^ z7;Y^q`fl;sj!gU)E2~fp-BTDRy+LFm8aBc>p6$@GyF7J_1E(C)EQhqoW!Q zjljAU4%7}-(u{CsFtyQLCY7s>$42lqgdUAdN(#vY;fv;~HBB9*U}KLgt6$|H=EOf~ zXyU4iJrwM07b7T|6YcCrwTX_AjnLMER@aUlH5mtmecM^YEMrQhR^-a>WM z>;uSM6K@@c|~s^;fTBw{?>PTmqtjzc>Rb% z7$b>DK_zjvU@E#;Z(U~nKKMk(+;8G@$U}1E!G_82&bEQN?~PvF%H2}GkcDXtswxT& ztyobT-V{1257Yi2tw-Oscl&gqc}7;P&}>l_`l}Cw=cUy@{AXd}F`-+QqI2gKrS*2ihVke4T^%}im_}e1*ysI=Z?5GrMm`t12pM;n zd0#gJHUuLcV^lQMMJ-9wkrFB;i~j1W5V%8t{eJuKf~aKbxvv9{>{7kAIp3d8F6ap7 zizM4bzpi|`FUH5;ZmJhakrs2#e_jd;4hjv?1|v%~xLsC=f6GFP1Y=!V1Pn6yI?A*D zD8h8O{y_1|vEN-i;@4*cR_Y&fSeX`944R?nrvZTW(40?_{X!u`5au6q7}TK%)cA{IthmZ!oA|q;RYIQ36Z(Q2mhWGD9c5kOF|%2iHO>5&HLSK<-MM5>0e6iwL5A z*Q#9{{%E{=DLmKJ2%RRpDmx@RDG6aPGHXnvp*xaeC}3b0XP}k!->>k%weij7yIxjafM#+U7W(Q+Z9JwLV< z2CQ&RG-fFzzJ4&*E|QKf?#XphDM{4r8WpwxR`@P*V5w1rPq=l2vErkiLJ@j47;8Z& zxM+dBvy|;*7pJiw!$wMi76FOT!XpY!i+N(f^Mm{IlwXQuJC46YG_fWk6LPAlw<<%2 zft)5vfJG{6hbU;B{RAk`hybveLuQgn6BI#Cp;Z>nz>`>ympb$N4h|-lLcq9|V53F# zM7Fo#Q}PtaqR&zC_Rkta5x4O|Rzk?w6vn-nOT28r-JZjlxW+p6MAzX)TI53#_!A7# z#63lj=Q7CD8Pr@T!u%ZiQJxKn4UDV}lvM(wC@E#xq`j-m$*l&6PxGPJ42iwtMt8H| zF4N2_x4y*s12s%_u)hPMG5alagk051X+}=A5pZrq+BOW zNGTwi8?zgXQ_q(D^<)brQN_PMUZotL)E}UX4b4=)mp;b+y$An^3Az*!T$Kh|~6lbmaq;EpYjy=eYHQ0$cY*aHEP&1xe zGuc@)y-@>o$LeXoo|3}7E@J9-a?pP*E~YAPVd8C6*KSkP?PKD_YO8%ePfPQxy&Ay# z*N^vOvW{PxnX0<(-l+apK>cHG{i{asyixz}Z#@EK1CrQ(^a8ZNhX3dVT@Bd(trt)> z5{NYt88?yyHb$nAAjFeU1OgofaE3y$X5C51c}Qoun^1U3>GFuFyC|9CiMsV%Qwf6pz*yI--avnxwK!{3I`>hr~FQ@H54r0k39>a$Vl zC%x&pzraJ=!ne)qJ?iS6aqi^o>R(NP`R+Cw?O`tl4g@=Q@fo+zZgxd%0*XLQ!g+l- zVSRM*gLp2jTtS08&?c74enOt+*@i)v3q1RqM&Z0>8tC9q|KQeBqfmDz24a%|V$X9| zlLA%$_rM`()gc`0Uardl43lAHlU_aSKDxYN`}n>^tWF-6KAf!z$R|h*2jwx zbnIcZ=YB8CCWkGcZB4s?%7AFl&H}Nk@+RcPM%$sV)VXo%z+rF#meJG1yFg&y#YDs$pu>2)k8+~EYf@{g zr8K{*u)BpfrKQkiQu4Ax2GlCMIbIah1g?QWx5h9A#wv?oDJC$;b5|vBW}qAPZmN3- zIMaF2xSHP;-UW<|$J$k$OqrgFeHwTNZDjA7R@oeXr$c z8Q2;Ri60iZF-pT^B^&RIjK`nu}@qDFtmpJvJIo2vyVq2%m>U!P)h-c9x zvF-7)(<*pC%NWS@YI%Z9 zbiw4D+qn}bKS<9s1P#E&zG((7UtCUqtX-Iy*&2bXw8~H}&AYTa2LhF5mZuB4EW{^r zT(-DVhGe%FVmKzMD5qK^CYEtlq;aP5L7NfoD;FFSWI@0v%9ii0+kL^kB#GTw2@@$U z==!u%x-Ttubc7bc%Y!akFc4wfb1Qo=5kuf2>DCM%RtvWWkfM7zVS2JYu?MSXys@hd zG~4V7+*`g{n%&-BOT=`%>ByqmMeG6kK5bQs_Xu)hOsEY~{utxynQXZ1u7a+IbWhcA zOk4(0Z-sU@K#5DHcA8zrWX%@72k*tdY#b(HVQB5HJMUOdw~KZYdxAvwI+r57@J2sw1zYL6W9+|o! zPj0rE8Gm<3YSpA{o9G^>qF#hk?}_7#PH}!SRNrIpSXn?an>`_f$aQ#As)3=ehlhSW~3fV&6`8=yS7l&93O?LXY!As$_c` z%>wVunB~-3aPPU1$El=q%Y5(b3gqG+wDE(-K0!+BKj<(m_PD}SV;$w*Q0V?>;-N_r zmdeb*N8CNjt|45BuCKL275^@LpQnhE_AQ?;Q2%xNW1m1(N!ez9reZZ&zVvxD60B|i zbnxh=%AYa|oSeHl8OYmzob5*X*+&5Xd^>k_fj$cy+FdUTKK-_R9x?Y5Og$K!(Ah$B zA0}}w0b2T$xMFlOMz(bj2pTOZ?3PKy6bO0ULMHMqU)OW#YPu2W^D-O+E3E4|#5(D@ z*ettfyZ?9RfOrC%IvNU`P)u3y)*ub|(S5b^>w7Ih3>Ur|);J_+{99c!ee$d5zgJFq zjizyJ`tMe>>lFO%+sCe7I`MsW(0rZbNUVI=bPmH>%@lE$UFV_(>{K7SP`YeBiE#$s+r&*}5rLOmB z5<2XCbyBdoF|V=fD|Mm$?{6zytQ)O&i0RFFQvKnHIKBgX+g;=OU(uDl7V!jVaQ5Q? z@BD*p-HbBy_p%l-2Yje`>e3e**nYWocBoqLE^iU5Kj6@ zG;K+nfIV574R!&FgD#{X5c3$Z_MQb z)x5$+-%j4^3Y*@bJ7ofREnn$&aZ%M^QtfMy#s)LIQ@5JSCNK58X+txx1vHXJP$4Oi zSbaRcv)=OYWM}*7)Aim+^3NR~3(FG2iO_w2FYE5;(bUE&$;Z7Bv z7uM2-I^q`0n)-JB5~xhVMsD)k*xUuxib5xLRr(YZ-5-J`-PRM3Ud<{HQ=L@m6l*4$ zRwDF3G~azNEPFZy5_g;D(N$v7(7-#xI4u(aW)qwc^ zG=cD^xd&=gT4H%+T`Eo#WPBE}$P;Q65LuR4-%TtHlrhIwnp84rhy_3J5qq#V)2Ref zu=AMtdvVo=`z1Jkh(fzn)dEd1T*=Wcx^O@&FFF<15@&}MLADw%X@V+V;v|M`G$RWw z)Mt@Aye_rNTp+^&53~%>Mn70vtXGY6Xh3d%MM=ZM2VX0JZ^iE*q0Bg$V{mr4ZY)`d zQhBLtV{&F#UDIP7mK5#5%;TFjc(z+_w$f3O^YEZDm1#;6Z}ORYD(eGIL?*y42er3G zHvOG3h7i0igj1ES2+~xivdmh*M;8ZST(5n!qc%8#CQ&)myA7ePZlmEz;t9GTQMsQ( zhjto&#F;IuA7wM>RIywtu5L87sUGxcbSP+Hhp~fRxkZ17ZnaBUi&TcJBXz zZ|a?-BJ|?D6jr*X)$r66-$n3HtW{bEd%5X|4Ha22vc(bwTA`o&SC#C-s&Mv$1=-L%B;3YeigG6Gds) zVK$#DL!~Fdoydo%Y9)u#e|;axTrjE8^K6yY;&+5ubGQ6OL9vlXlda$4ezVsn{H=0f%UK%yio~r$Xw|_*F=2>CrcKYCrOrA}!$i zuy3li5$|($Ng7v)-eTIMhp#WD#mP*mFPuh%29=UnkIPGSL?sn9=J#PN2-Lz{IBn10 z{FLj+c$U^t(=8roKW<9b;wOEk*&yVrz~6C>hnEp%nFzwFKlm@=u! z{}@b6nXUN1(rKwg$gJ@L%wcJT8K)OJDiqp8r0~Wg6~|?lNm84W&hW3&`#RYfccN55RCl%^*zEY$E*$SSdu_vD9_WB{KoAPPFJi$M+P@vnyo)sBmX!)32C%vV>9#cJ*t%2f>uKJpvPRH!pqXOrJ zTUK*M8ftjU4CNl9>hYo`#`l~A#}0QiN7?r*Y^`sTyWCVdRrSr)a5Pt%r^icm@xe_V zBNmA!N7}^r=Ysz3SaKh}psBPS|N6u7Zq@_(aVsr(s{!O<)8c94IdhMI>hb4E@rL^^ z!Am!qV{!2geJ#0*pjFxj9QoGwad$=8w*k!jVR6#E*sg|ziuz|BY}(yh#b z;QMSroD4q;5&o%KV`e`4;8Ocwo+%jO$&3m&;WJK_!vQ1 z{;sv9Cs5+tCaq%os28)`CY025cw53L<98nYBx%8F zCd)M}mS}78ljnx~te95D@w|Vt2?_E_?g^sAx7K9gyu$hXLni${h_w>DdFD=WiwwyN zU(AN(JD4?`z$k*`23RtQzdw|-%99UA{TtB-1tgQ&Xa{U~*_2xXZSqQHDBN!gIi*Ein#1e9o z_&Mm1#r)5deaKw_Jm~bj`QOEgkcZmO!I$>tPn-Xv7kn{)K4AI$XXbOreTDhUh5hHJ z?f=mWDn7qleg6D>Vh(>w7GI1D(C^&r z<|Q?JkYl*OfVI?vp3^nV(^E-Dg?IU`s4|Nnr3U@5PeO!$97?RsUSRnLUoEyo-zWnO z6M8UCLZw_WyO=IU2<-~bBia(TerjJj16X-U$y-XVPGKqSk@1`pTWSmG(`WN+;D(1W zwqjJ{5Os|Hk!}Pw(A|so`2kA!sD1t8$~HUU?Bvn|AlYVKY65GT(?(i-CnB*WlH9d; zdx-RSAj!ROxvX;+k9YUNyu)!14?3Dn^88IR1 zs?w3)kCp$Rn$PxkBr~wWR+Y*{E3OqH{PpIY`62%IKO@Z)ai#GiDb5MNzqwY23cBfq z7U`lM;vHUcV_sE7DMO>FDr4G_9c!IJ!91;5JcE(k**Q7yjiBx4x4cal!Wbg$O^ah| z=Pl}t`~i)PzJYDyWW}lA;fjl4PWE_s&b(0gv;4e2`PxN%J|9_5jKEILdp|D*b5MMl ze|wXPl2MoNf>d%^1Hr(AsN$c(o$-$SKZ^D|*{?Yam7$pIw~&}rLhCf zYuPnml5RvLXDp#+A`qFZQ4^X)1mUO^e~=mM{4}_D4XfDMotjf zM^wR{k1H)5yVizxkd6bHdQMT%*i&T;C}8S{smlhmJE{;}Vu9Psr_Q)D4Aj_6639z{ zQ#P#-mzZGo88wfY?!Sq!(nh$Br^-&kr0xaSST%X@j;Q~2GTA>iSVoPDN5vj8{3u31 z()C(!i#<3^SDjMR_TYLiTchI1RjmcGZOp(~C{?<{yN{d-JZt9L!fuQqJ)zH%&&Q)5 zs97VA?QCxdIiJ4B=a-In`_JTCR`xgbs)AN6@jj_czYaF*Ms~Oj=cWhFF=E-L9Fpaf zG;y0OjiKsyaTp9x;y<~ZC-}@Ya%I?z{67w*JFR)Z0T`-{8IlYv7?4Ikk?wSMP4$Jj z;y*>ZRlM-h+UK)LIyw6Ae$Kdl4)%_u$vCl$+=@O$vh&LPE+fFS6b~dW5ypo6Mwr*PsajEt)fiO!=dpUFn>O}m;jI?GhgGp=1WA?1SE`)6 zXDwE~g-m|q8aQcJb=<6n zrW5kp87YE8u+^EdwRuL~X z;=@IvIoh2-Nf0?R<%oXKau4+@IbDlwvg zohwK}n@n7rj9KGmfv=ZPt_3qKJ@11Liyy&P%~(21L?Nw|R7rerD}Lgr|6p{_YN@Cm zoGJ_?b(5Dggty>TA{r}HK8a_cqEe@Xtz?pGL1^|+0HNHEJ&2j92Y;>AGu7Qpk5ZYTMbaBrEcs8`zVZiLVER(-v0nyoWPaF4iU?o2nG_Y${3c+Ze z*CCC~s&YkUtFa<};#$YwyZtlxXd*bdmEJYkK)zw2u+4r)6Bau@ ziHTv7c+$mxm>0t5rBDIWh6sHXp#k2$#RTk6NMk>^5F^ANW9H6gbKsKmY{_S4rYJ(a zW9@P3>QjA8DZJNrZJuUrfptpQh>-Z(5;>;gIs}P6b-GY1(ye|IdV}MiR%C> zW-Of2%ENTtbn;iQB5G6=75`rDL!{b0LhAuV)Y&>o!Na^8jkVCuKQA{)-Ms?qE9Mbt zbfrRqQ|t?IhX0T=i^f(GtT<#EDz(#<3s+^97ifAKv>ag&bSSPwC%qu@McR@{mNwlm zGjNKKM_(?la1%`U^DjW(kSbimm>LTUS&b##%NgWoDNHuX2Y05J+d3f;A(o=-9krNp zZ!9SbdTAV$j1PY}y(nwnH{vQ1zK);E<5;HJr?^p!HWS0`rTBSJ{Y_`weRNZ?C$lcr2>J$UQzOIZ5+f zsB@m;k%#3al)l7@T2F)rTDy<2q}gPavPuWB`}zPX;3@B@0 z^S!d`AI1Z|Ck1iwN_ynLLRaZ9TaRS`A6EU_QvHm{OYQb(M*=A{eHjabA7|r8p>GY| zA83rJE(50O|0&smzjvJP`uG@$k*=}$G{bj`PnZgKiWPC_q0Avkvm~d05 zoPFn36*qpoGCYlt!4H2Ebg90soi~?Pj76dgjZsU6YsxEg(4DBP=Zdz;DE;yh(nzbX z$9o*FMXK$#TFlGiZ_pX2JMF}wan)G$i6aernwF_6Z%Hc%eM1xomYW3=?*PZ#SlNFU ze`|Su0tz-LVU3{Xd@cpTeqnB1;R};v>ut9TlNV2-#Hb^Q?d>1`+?95#+<=isPSVQw zoaaL*mL|vtBZxRfb+X(IMx=ewl-Sn+8GI32?mnsab0rG8NFD?CW3JhZVg7M+rB>^V{q#t<^G^e?BwRs_g8yQ?f>~?+5ah0zSE9*w zhaHPWr=n!Z!0RKt!7Nl1q2KIw^;h6>t;v3|?j?Y!ZtF{j5>c1#C*|)|d-SR~MlGUl zv(aUdc_#jD$1{A)EQQy?H?c$6P`hBSCtv&h3a^nI@*|6*?heT}J0v#VXZsAwH5#9- zd=I$O_&$XMIk@c~RT%s2->ewxU(k6khLOASFUZ2EPs}tOwG>ylFVncr*HfOC{~N2Xv`|pqkzGr`L5EKB8(~W6l{!fzt=yN zYBTwc+oZub$?<)v^!OJXLpFyV5Z!ncx6$xvVX$J*&i~TI@u}; z0?wKBBzcz5O1~<7}cXAOCf(wx=gPs~_<- z%G4TV@8W1qujWgT@-JVnsnVTDXNg^MGCtF;ba~=z-#f3S^53VKqHa9?U+mpgP@Mgu z=X+cl8X9+kySoQ>cMl#c3GNWw-JQnW-CY`Yhu{Pa5Fi8z!~3p1Yu2oNs%FkP`(iGp zull09s;j!6s;8>|pYN~2?!fu1XWZ56X;2!WH&6p zUiiBjyfyKc82qql}Ko{cb3le23(CWB|q1qlNSvJ#aP+)LGwzs=0H~-XDfo;I%U4uV`s}oceTM0$6h#CJS|MXWTcs*HpJu6k$Xz4~L{u zdXpoM(5`z*q0xN>Mb_{s>om<(B)f7ZKQ2>=bb`tUWy7P?Flt&bO{P^ciH(DNaIslX z^?Lb_QyOz0G9mf%&lfGbT$qP448a-3%_OYu(wmyKEqN04uRl79_9WWe?G_8;xU`)1 z;=}#nj1sXRdQ@B@+EO)NKnx%9Xw-!dP0<6M&q!xN3wST@(DkL)w&F+9gphh_Xi*d3 zkca275{qVNqCDkZuI58??8k*rqX}8|+{Bh$qWoBzQ{r zOz5W-|Ah7%cmkzVoRqTFsYC%3$da1uk?0c1EUaEqwDd*FTBOzl3E06Bx=dMi^ST0p zzR0mcit14P1>E_vbFnk!Xr@jSga=Kf)|Ct95y@@c0+{l~Wb3jw4-~`F^Nx{xq@*GWjuv2M2xaHDb zJ`v2RCyQfSBZu8mPD1F2qn1Gg-wB}zwI@VqyP1>V?Ea*J4?wx)E5OLZkg?VCO3<5b z$mWEOW8=S#Q20ZiO`I7l^_?S zk*l-J5%0gH`hYV2=n{wzl#f!FI6*JeEFwz3PZlVtijRE8#BUNU&0wu4SKN1}CKO?% z%9osyKpZIOXF|-Q1s==jMq&dKYZ*&6XPmTMUe)^(n$)bskeBs``aM|2!t=8L8ky?J zS_u~Vw(R3N+FBDjfGe*X*upcB%)S~jth#h{20S~&)!yJan%VVAD=11;UL&^#q^@x$ zN{!?f`0Iwk$4F(LrCxX*sqzd03#IYBGzejdVCCSX#ZM>viR2~q0(s^%fOC5l6b*-e z^(Sfhpm{`sVjx%|?ih0=?MPrbtP*zrf+ebKlxd`KjM`+&DJyM)os%kdsZv%lDgJs* zi4sPV)ly}lHM^>U90o#+bwWt>n*@W##^;lqs=?GtHY=wJa+TM9qA@@~!he3@8|q2m z#^@1G^5;25&1~`QkFGk6g(R$h1Xg!TUo}U9KX^vUWPiyRix0BUc6AV6ZBS)=wJ>$2@XV}V<{l;4W5wHeTnRv1OOq;ln zZ~dZfV_743h)r8dBPCt0F;8pBrQ^k!iAg4c<-Xe=j$I?s8U76z2Is8D6h zOr~RJEo7g;;ItqmdPbw5Ks{tbOA$fN9i*2MWFQL@3QDB zi*?D743WHS^WXBDkMiWxB>6Adg5llgr@>1I5FIw)zKHX^s`vG;SmqeTv#k(vULRE7 z4ZQD2?~hbV#c+pF&;**87TX^~jU@;LP6^EqqKb3J0UF&`tXjpBkl|`m6HMor()tBL z_JXNiIA%Aju9f1*TV#yJ#F-OsophSEV-AUaP4cT;wC#NFnL=zE*o3-Ttz1}E5rwO@ znd38}s`rx;*I!d3$IC^e2v||DZ(Zvd3X1#b+>`4m9SeTX>qqes zuul%pTAcYMgzH?Ry12$=<$WnJg)b~enyT{e^i5-m!|6nzjfZXyVTvnnkw6l+!A8xJ z&yIY5RDJ;F=c716UuWK!ppsK>Cm=09x5|}i*m=(B+`%saps>W;sa$p>$Vm;cJ181S zpfBxCFU;#IFT-Fn2K#>K+desjiF@(4;aU$(S;mgQ0zAqL*V==Vm! ztrz%uCV4H)vldfQMF+2%bT(wDo|!Gf23s~epD{vJlF>LLM%@lVQJM3NEV1Rb)Mpey zj%`^z)I%Q6i#*(<4e1!7Io}p7iHwK_rP$WmJQ6<9FdhGtP zF@sJefcq1DtUEjpA$7%{14?b#?B?zcEeSBbSDT4VsZHSm~KUEPOIiA!Iz%8#GUg~Z~f9)bTewWbQG?{chMfDGH zFyH8NSuhitrPro~VK)As9m!o;xSw4g&Rt0F@rUJr!SD4n^(0lql!~+m5EAoA#+NMC zah7+Kj5lu=K$bvK$Xm)`rHX!eMs}Br+DJ^v_-WWc!Jgs) zz({JwSo0NLa%AeunpnEiJrzA;oWo+Z~&p%0iOY8y>3u57 zbE!ce-L-v zLOp%Mov-wL>9Z2mv#Ls_-a5Jn5r({>b7IJMBdIP(GAy-5+L|Tl)Pb)0QZby7;n2Hx z2vkRsD(|3=ZFk78$TCdd4ufiKR$U-&D(0_4&y3`QzPRq`AyDG<;P!LVWs{9DMVNyS zEXXTfX>D*uGe8&@u1BrE5p}iX+R5i$LZm+JZMU$;UYDnHldnh86sLeK{nSPUI`q`a zHpzH$h{V;7GxWTeO9mZ>H>g+d^9yiaRJwCkRqyeM{N6gQ8DcIOz${VrL-kdR@GX=7)4&(k|}Qm{`j?_*1~|_2r0@heOb_ zq|tY}QT0U=37n*TU(@koWVUJZifR32;5+dc`WJQ*jpeW=9NU;sDFebaz1Zv@j(bMK z;795Y)tJ;)J^SFBm37Z)oH}#V5_QLif(0P4K69{^OGuGpL_B$Abn^%Nf!6aDH?3|s<-NC0^5s72C3&^X)i(@< zueOe@^tV}_u2`0KAS?+F_OV^avR!E@?}0Syvhnm z|Iz=WMEs@a4%0WK9UMB!4_6mPlWXUT)Ya4l(aYHh5h^sN*$Rn6zSNuRj+D2`jK};L zzdvP4J+JzQl*Ms}I5XE?EN?a)t{q=(c{$pQ?w)MwT{=W+J2szaOUr1EE0XbOw)Jn{ zw1YFa-tHX;(*Im$cxankr9V4hzc$3HMacII|L}3zE5lABTqBV%G>gE-{|R5P1UD~R z6k!mb5pZb8TOE=gJ#L4wqoJRzA&Mr45%O_O(~%GX4|rV25lObo^nL0zUuCw$*fJNn z*(Pnu_9HUBxuOxCGV{0Mh!XZK+3%@1U$92K9M1UJY^U^G36?j+nAxPMNLy6DM)hKLVcc#pv$cBE({!R^@^+ZvK-4lPEKg+-zc8PnX5M5bsHOgE}7 z%3nEwY6jM>eglM5vHm$I}e= zmMy1S&_E-<{IPt!JPdT|i_wmjE_`;V+QPFuFP1DGr~Rf3b+Qm>t*^hHx8I^7S)KQv`c2WRP%L>ES&Y-vx?3YSVHCraWE#}~*t#(v!O3M2s)Jlz685Xk3cnipWP^pC^w`VZ z29R8Q4{k*&A(H4Ll6XzRm4iwOL#kL@>Q9`!{y}oTw<84Rbyt6=%$N_`z;+A6KY zcxQ*&B5=;#=|9K<9$=B>Qc{7XqZ2pAhK=l!(CTu9I%xU)gXgVD@a2`q0kPEqo!1es z)$tv#6K$&#E3Y$aE0hqgi%csNRI7`OyYmNLw~xHe?_1s6TirF>U7dNqgtfYS{q;G_ z-7TrrtG3l6&fS~QT@(t6{5Kpj9Mmfm6V%(o9|i?F?5`)vP*7@6{}nJl_rF%<|AXXf z{7v%hQak>W%Ks0N|K{=KGxy#|{y#9jM&|OH$Ct`FQpnoW%bNNZn1A{P^R@qi`E&oD zRlZ8$+CO3bzp8wV;!U&SC9~qSf7twgh56={b4ium|K#~u|HAW&Y8wBK;rWaI+_Fmp#e#8FVzry^XgS-E1^ZyOz*POpJ{cZCH z&R_nG=l`3{Ke&Cqy}kV>&wsP|C;uBZ|9^)0bVdK$Fn{fY!9|n|C_l9NpJ4tPMxmrR zS@FNad}>moq5lcytK;yx{R_-*_`fj!AW8Lq0rMe$!Tk1_e}(y%g>nA^^Pm3>=HL7i z<{uT>h&=ocn7{u22=hDMU_Q3SBzx1Xz~3;RsjeQ|?k|{cSH<+-VZJ?6A6wxh@6Nx# ze6LuJM(|!Zx$iABBJt<8>yf`I{zCJpqUm}oxUX*|hwa8hs#+6gQ~Wk@Wulf;%70u6%XT;5>5 zNf@vN^ak_q*DSqBg4aKw@7{wLhnRnD($kSkzl#OKMDrf6z81QOUib6XLsit*g|GDFfjO(+Tl4U1aD)-*TX_R~S+i~Q!y4q{C? zI?uTOybQkdkgCLy0NL)-k3Mtq=c^$s^sXPnZ!rJL^2bigvg1#tKqM+n6>(Ugkg6yw zuBK=pil%-3D0P{~{;&DRHZ;Kiy9$kHDvP%&z`od`!}E(QUG3|iXWFkVSTj-mfC7_$ z!2BI(bceUMzQO!u$~Tx#1}lIBgL~w?n!DI40)>M{)TIiCBMFAaT15X3m@iJtNB&8q ztRFeo1cCpcA0rV8p5AS2P)5iM-Tgrv{nZ#0fF$Ja&AA##Vb$OIvmQ;k_H5@XQgN)o z12p0SXFp)kz^N>FyCwzrscb)H-8z*0GX_8sybF)-(Fa?h z;}0`QhTh;H^Nnjsz)!aRz2 znrHhuR=kFu^tw!%!>K<)lq~?3n67}7mJMEvP0iKc8z&PjB5&nnFj67ic#|$|K!H#r zB%>-|`m!a`+#i0$rypV7LX_&;{Apps62O0}pOlFoZ;KTOmo%Y_LFH#6l zaiP*g~M{b%k&(E+;-->V81$P{4J2FFy8kLKHDPNJ0c2Jt6+PJ!|Xe zZM6z7+zq10r)|A5sPw`8De&*Shok#0hWp)vBA9X#nTDwk3ZUADiXG5Dvwk;tF(*wo z?GOM2lXX@LU;ArJ4&c!4BAKNRu}@C)#~tjU0*qyasVNeH`f zEzw9&oI2Jq7AP-IwJ|nKdiw_R?E}zi*+##C)3?RmV1CakY{6WYH8-ypB<_#dN`or0 zn!y{)j|oO>%JwJlUnjmNv#|aP=I@FFE48@_>vz8Ede_^j^GVG=P<@ZP<-%s`gMz`F z4de@6C%rYJP)LP|cpL|-TFtuh#2VWpZ_iYs1|7wHoA#pAwnnO@=9>AL(2z~!N zit!pZ`Udk)aIMJ~A7&q%`QKpva8L)t_`E^x&$&ll*ZMnx(Kndy?`ux{?pORjVE*14 z%$MPt>0jmcR3SQ~h>)R67rjNE-1#o&emS4vN5V)Vcq*7DFqpJ+RSCOAx!>ou();J4 zZX@lSq&AT?{>2{%rG0A4>WMkv05FjtUP$%t-(>%c-Z?}3V>v&O{ZciM6P5>HgZ}&n ztqM*l{YQ4(43bbuz8$lQC`vC{%RKoE38ZrUMrWeyD8=1`&U%mVes=U!3?@$ShZhvq z!)+_Fr~C4kQUc3Z(UZ>(L9Z|#_gOLnAVTtJw}s!>cA^`;O>wB z(L2GS_dz!reLlw$d0)ljMc(m{$DBDc-dcx*v6Et`F+Z(iZK?VZx%(~F`})=SsX4%k z^nL!(`hI=|A+!$V671E(?Pe`Sch(26W>dqvx9L|^4&d>Jqa!&pK}}~fqlouMq4NfY z!_Vs=_0NS=2zY(dayP-4ll{FX^kgGv0Ebg1*Q zXjtJ2skro?C}>YjP{5)HoNO?=$|j0`n}4dMMg=(YPYFkY8^+UkfF87S_u}KcG3#Qo}&$ zyOvxZVrCu6(#OAeetQx9_bXuI4w5;W@VnP5Xi5jiFj2sFfA%wnud{6ll5N1RV}J2{ zT8TtMO-0%WxC~A>A8;a5h5+jt!*??7MlxjcK3FRMBmsKZB#=COF}fIiv?PJ&Zr|TL ze@B=O1n>CM%8F9X%`=S#V%1~L!>tOZi5z=4i?;V2?P3SG1xD>NVeuq`ryvuih)>$% z1suhrsYnLd@Kd951FJwtzf+UR{b6`P@Nzq_QmSxD5ouOI?{kW;haqn zk(>c75r8rWKvrE=3KN03Sbm(yU@T9y_6Dh9tiFdw4iBQK(I4{mEaj@9X@F zJ#$KI_}ANWHVMAUn($Z@aWlM%!Wn~D?-DuWK`^x7T-x}g-9;F$I>4-G22NRawG5rK zo)zm`0$~S+N;HB}F0)9EM{qU=!3(_oJ9F0thG7=W&B+VK5&&I6)5gPVK&isO0}E4C zC2aB*pwaj0P)k5aA4Db5{DtKpoXKN8lX$xS0rLe4Sx)(RI$+3m`047Pg~khul9B`? zyuwuhJ@LS5=Tyi^z70P5nkq`VDxzUsp5GF*W=8>&e4%b;F{f9dAp@_VtwpjfuNWu1 zivv=Q3Cave2`9ZsJ~Ncu7PaIG$=x5p5LC>n3ge*ukr{%S8`KS^79rMpB_oMv6f>jYeiXvFd!W%*T4fDM!$}-=0 zK0?)cMa^SHHA96(UxgnSDY6bwe}%dOGT)#GPRVrd$0-As&@DvFn{{7YIYsa zZh|^dhk6D=*T1O@cB4jy(3IU)@4Uf$ftrKI>Ie>{EqNu*l4=5R8j|svE5h0vf!hDK zFh3{>_c;<5_ivIv1pe7qcKuTRJ!sz?=o zll+P+z7dZ7FOnb9hXBXktU~k`$+uJZi{y)BHCFilMe?01|04MveNFaf&Fm8(EutoZ ziMJR@Guv*<({%&iMjL*8ljqw(B=5gSzSKmE>l?|hYtt4*_Cjg)=xcv>*5;fK2=PbE zsjQFMXrA6_dn5T3@$I-`9f@{?#GQ@xXAKhlEq{@GQDpl*ggh{g&jdo%MkjiIeO_Pl z=o`tu>JlL8#D8jeBl-A(O&dfFM2wxtuL1QTc8zPD7+XX=hn4Ls8=#2J9>8u7sbdc+ zc?(r1XhX314Yt}dHmyJPT)b_;PxL_hbiy+Aoe=e!dG`@^_COdr=neXo)tWrOf06td z!G2H1PFA9}@vP3TPsrJ4^;`zMz<%KLY&}(Uk6GscPe_0SUQ6Zbs=5S44e}0x1_7vsdhFo`C2uVrfl4imC=P&l-)N#^cVLDbL2F zv&Ma*L9|Tc(nOO?8{-vMlQYj_GM$ZMXXDLTP2$&+q-P-iN|bG;@wl!DbJR9LyLy^R zKnHP?6l$BnMt_Rk;Bt0T=fvomVP|dEn3v!X-^8Sp4~Uj{I!CcJ4;4e=d@AR8tXgn_ z1Z8SByFc`-5iJLFU^wlfIKVnF9aS~noZXmbQV)rqCeG=v>LQL5?ANgysF-MG0CoaR z`zt%=jk0iv6}s$SE9b4wnvc4g3@f`xh`R~T8i%tR$tOo@x)zEn$6h9TET86!E4!Am za5=j>LQLS5W3X9_x`rp(TFyXuoh|&8^FdGJ#R^M?Pt%e)^GZ`~Ru^4XoeRnrvkU=^ z7@x*#qZXLEn?F_0yV!L)8g=7zVY22dxomWXJTGBwHo*tX=bX3xsp@zeeE)EY-2{B;q{{FntN7AWa&?SS?6gV+oVvn=HG=(+Udo|gl>Dv@F*$~dO zlx9ECkJ2LYy0I|B)b`OEB$cxS@twjYhHOl=!G7v>7wlgqSygA=NMPDB+FF>8Zm$(y zO5B2|Z?y+(G;IlQbukZ*DR!mUL*k+lwLufA-G7mMBc-LNO$fuM^|gz|xbu25L2Rta zRo027#HX#J?lG(U=E&?h)~${oIh%YF2tbxC`R>i}sc!;VxLF2}W#6}dfj29?*TkQ@ zxKxowfCF`myVg15^Hp8NCjyWvyod%}l^ z7&}V}+s4stJXO8LF&iYg^L#P$jJX>Cj3psI+;GE=f~cd@sfOFE`HxY!q|=+!LS2{9 zLj;0eR zy{AX)S!Qj|TSAz2_-amh|FjNejjx@J8fC3|8lUR#?g}tAPki3OI7c;R-q(i4!cuE_ zG8iI$9u<$Ouh`fb+L=jIKG3Z}k*Nk?PX9>pc}qle=qurEf=;KVdwPg>|C|p`k?u@n zjXq|LyNI3MU$zlvUA8f`F8Thj?mGD+G7)PyK2?3(t#Eo1+x47#@^16Hi1G!x7;4rl z^Lo(bL6+YS9{U5?s0q(Mr~F?!aN-)VnKmt}ar_kf`TSZxY@Q6CEmT15>xkjSW}{yPI4)aee{nq!}wv+SH}w%jYX=lUe#osmkMGnRed zs$*Bi2II+-7@<~+%X2&L-}c0NEbk}SqUuMdH$!{6a0Ra|{LWW$f6jJ}*j-Nhy>5$& zbhRpPpX82q+ASAdt{{>B0?&*z&Gas89DF<abvVd_53D1BG0v zQjAQ06LT8^)YBhKzT?$GK|C!ei&~`>vcD?h7`wn4RGCI4Jt&C>63OQ=ovPnOs7nV@ zqE8n=YKj=lu#EuELsRcM!#%{8U8GN_sI_ohS(u6xXr_Xu*#NGx>S=u?oNGA4jgCc1 zANf=KFw4eEd%<~t`7QwmW=WwCKGLr7S^C9HJno7Lfh2>CTtubJ=JLw7372#14WYBz zGNWP6THFGv`Pyyqp#nlnXC1qtLOI5k;PSO=T1F#Bo{^|l7U~%;_VK&d-);0~%UluN z!CTjq;}viB2D@!{STQkeuPo6S@$~a^6~?xcMq7`r=l=oof1Q6t&*LWLZEd*ALe!OB*BT5#U; zOnhEZUJ71UY99GRQO8l;wqDEjL>62p92BfkU7NQac|xwGTa-YHe=R>&M)2*4tuB~j zJ|yd=VSJh@(6*vJKHh@ChG#0uX#?1XR{d1h zTHSFwDJ7J>e%*)Gx~E1JPStTGHqJ2sDNN9SnmJJFFhD4!-Tv?+2r*32|DRZ-=JpX2bB*^>Ym%qDIig*62S4BF>6aF^X2 z5x14Ap=Qa}lVK%h%ZnnkB*+C8DO#0t3?CNRjXu>kD>IBgz$^oJ=!Up9@js}0Y(-lu z{a7?4=ejj}gZcR8$CFP0HrIYbt`?HFKEJL>WTpr}UdPy9dWZPbl4xh?2nDmu8is!XA5I9+wmx8;#md58(JCgbJk^RV} zw)6LH9%(nqrY;8cN=J2{UwYObpA@fwFNf0!pF`EhJ#C`ekbje#6)mXflML$h%s4YKC*W$>U%`E;v9}WZWjj|_SNS>n<5mcwGlb@&`dIbIYE+$hpa;*TXFYjz z_fSp#%l4Pt9oMFj;9t4I&NVH`w(=zKuNBT&o>add`FJ^1+W%a^dk#wEzR0^^RDpp; zcWWu{0i_8vTjopB-<($aBBV3=MS0|-X~Rsp+7iI5+ZUn-MznK(;d=py-> zIZ-Vyow`*m6>vbo6y~y+xbkx$oDz1x4b8ox)bkM8cQB?0EaG{ORaX>j{1aMLeS;s` z9eqxIlZ(rSi))ssr>OlNlctm6jSGBUF=CXMq{r!Cg$?G!lu` zwC$pZFgmJ>rfh3^Xv&69lRQ>#P`;+Uo+&3qKNsOW6P;=_2FujIXJ_lS@o@lCri!IJ zL{?=07T7>R@#r}EaU8HTN+q7ZrMsK-XfdOvXwI@qhMvzSw$EVns2-gIc`tZN0x#2C zO)h@s6eDP(N<+~B)m?9jRlZ;@5`i_>-k2 ziUt=lMuf{MS>a5Ng;31T&8wSw8Ehf|;=ep%XjM{Dyyq^rsNtku4W(~a>b51zg^m6a zwob1dFw{<+DIdVotb@pbXu#8NA6i2sOCEb6Oj%*1%9hR%>LO28=cKKpR>F&}Hqbmm z{Hg9Xh!Ls$K&MxTZuQX$JQ>Hu~c*Yaz1%qXfO){hpn$GYlM zO^3l?EnqeltIaz#^ta0>i;Nd4*lyei<8#mF2w!8|-KGoF&rl3JE`edW@YI-0=%B`_X!P_VM=y?j?+v%o6E}Ot4eS%Do2zf>oE50QmI0?ztXpSFm+R%Q)-Q6 zmXoU!g!}UJz-;we&7#)+BEYBFnI(8|#BE$K^*!u)eO1xUqZ$x)7KF9ANHkgv-CpcS zvKBlSB?lU^yODfS%Gik(;~ztO8PYI*RP71f&R1ml86UQ}0_(yLi4cERICaOpZRZIg zY8L$Pt&2wFJ^!S6&0MNVJp1-fG+lL4r!*qpCSh~_o4%%>8IFeM=Ct1V$;NK6jC7N~ zQQem~I8MYYeVZzi1=lgm+`EpAes~{ux=S`~D}M7};JNhP1%CAyqBXvbLe!8erCWc5 zS164x^*Lnz>N)w*&)jihue8k>Ys1#~wvg8MMCq%CW?ub;z{;-^qgSuhQRDkEN|UW0 zBHo+F#=km`Uwwc4m%@CUncFAtXP1Ysj|xv;TwXYfCL1H@-f9Dtz14N$%L|=tHW~0# z$zhbpf(_l#a-xyeg0tQwSzy)?1tjet=5~QT*vX`1bs+=j;(5IkQhIhCr}AD6vM{39 z{Ml@$0U^2lI`MEu8Z5E#pw>vn{KOq@Ko!IGPG3(Wjx2r7@^#8CCYKgPx-mzV1wkg* zT5P0~lmk}4WKV2DA~hMGd*KAPh)pzxBO*gwh_#7r;iT^M&?Y-mzBoaTAA!7%%`u9c zxKp4AM66KWxG%m~Il#L}5^YMveI7d`ny4qyT?aK7m4PK-kt^;~&W$WtFvk0>u3&!zVqbSE>^T}1 z-I^1?=bR6sA4h#!9B(lrNxEpp$+>8#`w8Gj( zxN$ak7LDfiR}{jreDoUYZ&VwBcqvA@MUz zSk4p(Lg`G=^WkkCoG=Pm0Yl1)$!zzUO~M&?N$qKCb?g=ds)FWpG7B?FqSf;UlR1(R zU*x7e&EMHQ^C)bfCOrc7A1Q=QaaIybb~$1Mf>UYRYY;2@&pfhu8zmG1QdCiBn>OP; z^C@2KabTCw0rjAd*X1tWBUW-n2~Gx;gFl+@c9UBWU75p_GA#SFuZc{hQ5@L zZ)bhJ*^b-*I)d7=7P*>v=`3Tsqw@7GuyH0okzR|*p`4NXkm6>nA|;%8CjDJ-02=QC zk_w~|Y7qPIx|mUcu#1q;IiWgRv@$OmBWRh%mUO76{qs-#aS)O zelnkWc@i7u^L1L;1d5;vS|;knMZVhA4$4U<6^q0Y4*}^s4#GD4MVkV2T9>wyboyKQ zN}E0U*2buTnpeE=KJ}bD$0xXha0Di~bUs#6ygP z#)w5h6!(rXW{x4VBEFzQeC~CPAd^$CusIzo^iAU{uBsd13s%tz*fd!+qzTy4WOG#H z2Mm~Ik_5S?p@(R@9wxr)Ru@UuL8AnjhtM!%WLNwaAJ$E_cm|>1pemoxqUm$8tcg1i z6b3yYMOT-`yQ=R!L?+OuwWw;L{>jd>_+EiqPL`LVAC(er3MltUBn*wA zTrk=A`iT+|vMLpf!AblMeh@5Yk1;C>fv7IgOi=J;=9o|~m6Szxc<5Q`=NP+^Fh4C3 zZ*p8)YXfeIhN#(rTKH|@`t=F2h>z6hQc3OxhWrJp;J#v0=&U2_s2tbaS2gY>N*0tMo#<45(y`1_&fU0q2s*)tbi>9hmE%Z2?kC))LfOvLR& z7Pf}1Wwf>R$?MT+akhl(&6{HeNCSfu=_ci0vtvo~`7_8d18s2G6E)!@N-Drb%^3h5 z`K`>1ofRV;d2VV3#&>(rCQ}~7MM~>Hh75TD+V{*YIq|r98OE(!;eL*DVbmM;2?<9y zMq)TiyZ-t0T2=C<@~zl}0Xf3})7Z^=;0$|hEZsXU00le-3W0G^b`H{?loD=!T*R*sz)kqcnYqhRjLWe>BKa_ z#?_d#uMEiMjnJfWp~S2l&f`O6s1Z%#iw z8gG$;9qlqI-;UeFvvcI}OlaT(HHlDHHBmD3ne!uk70gOwJbjC8v3oUQca9)PJen(cq%-TRGRit@(WX zDnB*uBSBS~wZm6_MsTSKXy!W#U*(T9v+qGILCQ6&hw(!L_l)H$3`atez7Kn0D4~E~ zIM8t>(9^6?87BIH&E%gf_wb7Cv-*j7Not-bGFHgw^4M2v8H%qrt>`K95&#J&4{D)P zH4#V{84)t$W@tI{4QbpMR89?A#%Q>Lv*&&F(Xufr3B(eD!@v0@PK?%W#B3j?Smw2) zp0QS>q;20u=wfMDGD~(AWRr2}<3L|gVV)|&5vYc@jzKH{Kd&U=CR8c3EQ(7GW8)*G z+_l-M(yRNzAu`-0O5(63;5M1|eSn}C#m3kJcY4_+mDaYqxsk|ta^Q~R2oBM!01Zd3 zENYGI{9Fj`{^{ghVo4ShVFvQ5i7jrBs)bX=S?wgYV-NcYSiR;`wRd;k2Yrh5s`Hi? zWCEXaVf{EMi&C6lB%eu>D*bM1rTQhQmonFKpaO6unV96vh{qx>WiB_BKg_(o0E6M9 zzNIH{j6f0@=Iux(z~TiA&T(vdlr|gNzRigOZpm@#!hp1IN#^hTY{7bQuUM_MZz7?fB4=S^fWadAAJ(O**39tI8nPp(`u{B<}RguL@O2_(;SdDa?=T^mAfp} z#lDu@S+p%yieVn`NMypSt`@bMo*N*}Bph;(;uEN}{stjUiv#l&@OX8;CYXR68Zye; zOLsjEViK!`1S1u=>xu|g=*|c$D(+q|8)O)&h_efba*QK@J2X6dc)u2!?TajI8qMf6 zolmtp-_`=I0JQYBqMaPv-81*srGv9)%sRimb4xHlW@4b0SnBH%Gm+*&93M`!$*zxD z<(U*mVw2Yv>Lr&cgn@81D!dS)yVUZMFCLv{$Jjb4#yvNuaEog1v*PmD^wX;7*FAK9 zQ#wdFFRX9Hx;4n)X1xw6^VsGfEvXDK)xjq@QTGxBCoC!v&6kDI)@ft*wX8D&>m#KZ zVQ~Or8q8mQVaTc7^P3Ia5!W5a*O8c0!l^GcLYrUxX74lb(Ig;!wIG~FxcLhjT%m~@rCW>3WcZp?#&X;CS?&u_KR8P4aK}| zg6At7VD2RW!M;b7+f-Dq=d-VmH$4~FUoS_8M4Lwp*T{XW-<`|}ilLQQ>}H7zBLt=y zPECG5k9JEQaQ!P)>9-^Awm*G^EZA>~|D&me-jrmn-w4*~5L4~`YfXu2Atv@9>%u_U)ph7P*I7=g^vytv2ETn6Qw zrsSdwt98R-`+nT=lKe=4iqJeyNrsB@iVlX#UV5q&8yesB3J0+KxN=76ZhmBD)8iwf z*jx6XtVH^PhEb&Ims}bIyvP z2y@Lz5#>1b$w(NeI?2gIk!#CFGQLJ7k2Rkl4L8*K#;$=8*#$r zE%QGXRRkih^A*mY(u9O5+M>%S%Bo4M#WOUWOc7;>|9&Y_Q~F`Is9H|L!m`Wj>T*<+ zGu5$SL`RZqpn>@*_u=SC-tt3;$DG!$Hj6z|De~l6y~~dzUTceDg<5(bYI`b#l7z?I zri>MYHG;V4NpD3X`D5*qU%*=6~^;LNa!qEJRjV zXM*@o7ab{Ky`(Uy&j-xcdf0x}aU_m`jU{L;#DoQ-@8oqED>N%3JV2Hxj;(wm?>$)g zBjTT*s0OJ1h%Z94rs<`A&g*BhainyK9>(?=S}Ebn<6=wW5H1HH=4OfVc%FrF~fqsEdR`RwO$8o8eilX&g*czDY(zzu|ZjB&p;M! zD_RG#6Nu}181Jw(yc)HAnOj{V$+6~m+57Qn1#Gjz5#3?tRXI8(mqks_X?B4@PDjlxG(^hHNi@8# zq6uGgcFNL!zBaTpPde3RkDaBjGarQ56EGW8T^T@3q-k@FKKtSkn+-mO(9zyj1*xb@ zG^b+^h>wh$>%r)pG#tBIW8~I!4D7G&*iv%zk6H3JXrTSMi8*45v73Vt+>^FtL?WMH z*6UootH3yfh+TOuv=Qr}*scW%R4R_FSdRIQ}SR;fYl}A6*<;F&=NMd6eP$q8R zQ1eXp#a_8P&SzT8TMt2?uzwQ#2A9k+;JWY9gF)#$qnF4Fz&)?Ob+yKg8-Vf~Tn?Swru!%NufTpA1xs4R;v> z?9%=lduP=YSJbv?TpAi0_t3Z#+#$HTd(hws8bXlZ?iSqLf@|ZAH|`odXo3d_(8K%9 z$w*Coe_#&x!K%HhcGZ$+J=b+#vKd`Q{D~eZRu@wUrb4+q2uOVQutRGifiy*Yi|y$X zrW)nd`UPjOv)5`M4($$_)`$20*idWS%cQeJ<4$p-K={oIrp7&!4z(SE6`~}pjMgjR z3l9-k$<3DMtovUk*d$R5Bf^*dXZ@$(WNs&5?1DUOXGRzjv3=y-W)06^1x>4w zx;a~gly83BC!ghNVwr0r1LjG#s5PHgw3!K~T{g+%S08ng{#NE9jNvH@frECy#7nY| z40sU!_sGG@h{F_m%$h1Uh1N!yw7^goIlZNz;rIhN`B-Z2R3#X2R@ZNU{2(58t)MH@ z*kFUWi8B8|*vc4V$Ivgay&~R_4|<%daQqCdO`2ZWm}iQYeUm$8{VL17+zgdMt;r!1 zIi6-oUefVpzHL5-gnC557;uKusy#<+y~p@HK5o*bbCkCqHf zQne?tq(P`{sPm!-kKOOX!&#@?vnczj@ioS(b6N(6ng2er&3Ab*$&$ z!0(0@tXvAtil5T6O|jgzK&6$jIha+N^(j$`(F5V?t$Dd7h@~+^-_GqcAe)+H-qc{o z0~kS8<~r)cjD>qHbIYiVa}gN|3{ji=Icain=2=M6VZ-rHI&tnR#Vx4uqg zz{QLSqRo?Qfclong?Z7?V>12n{BS+PAYE}7;!at|5ZU2eNEcQSmOM$AM(S!tPSGG3YocW8STh#M5hnVqnKOlJA?Y2(j4>oh+3sptqmUg_+*Y~? zo5gqJz&C$gYclT15uhc}6k=o%Qyt2*+IgZJ{BTo*64Tc9}QK--OX3e%G>F%GlHVij0v4ybm= zfsZEmM~^=LbX=u!b}Sd@H`VRPV5J1K>&vILWW}kkEn8?uB}X1~RQzGdG3VUzjoTam zzQJT*123KqV3NpDp)+igQFs>AN3NN>$c@OImfD)MUjQEhDF$2Cw8M=x)~xskav^!^y}7-ta; z-*~%2joe{>iCCUuHg``paBbzXLRo4~rD&l8G3T=^UZ2@dz~pY$^}JMyi74tQZIOX}iipP9EoRt-W6j@#mDKzboE<<}&|qM$#@^Zp8%(+<~K3 z8-XE=8Gc?H_NtCiYGgY0p%t0q@+-f7&a&*ZYvhUJeP$)mm92b?E43yh=1Hf~N+)&J z4qtHNbOaj%9X6B@jQ!8n>(4(Hju`@?s!`vd^{xICY~4RfPgy3%XL8Il${1G=%Ge9| zd2?0do+M}0pl-a%YO_IYPgoaQDL-yYVOfjQ51{=VX8ME2>T^8lKb~Sst(~x!2x@>@ zTElKfAs!MLRj#RlliGwbq2}e*d%Mi>FjQ1WZaQFPMd>!#^Jl34NtP1j52wvyh#6a< zB-tcU{c3ylpz@|}sOyL3)1NzX_TjE~>ItQhOPq2aw1BpvLv$Kbu( zvvi%6GCxdbtMTKE&8ldQ3?**c*UE>5mOKi#W*%NC@dSv(E;|ZQ!zx#v#FyAc>f&~@ zOm0fEj9XTTXf;G1Khqu>%Uxp|75<<ZI?KP7BeWzV*na*7;2j?W9sQPFg(QP;dWbX9hTpwZH47{L}Khf)I# z)%Adxx-}O+QN!+?6POG()y*p2_-by)HX2>v;{h9L{eReBFevOqvwTaE0WGWvg&G5S z77>&jFv8Rsh`cY-kHHb!7gsMBMfQG2@riOg_;~M)>wnPxw4)3}k%SMtH9VQ^Llzqi z5z`G7UvGN1!7K5T_Z?QKI2(#^WXNmdxbV}p#9ose%1z)AuPIlvkSj93E3&jgxY!07 zzs(H`u8!2QhopfFBLdPJ8zgMb=A;?uJ5fH#i4bYsX0g7IWL;$bzQIrX*D6?i!pySb z-;#L2$m}M3s<@--xUzCON?Im2CSXsACK>fM&yV%ZQVPvN^@CbYV{$q&uP;(VzLoSC z)b+j5`6(}T+N^BQQjHMC8Hp@D@1Y+V{8o5Se|eO4CJ=?P4{=+H({)g6+bs{mXNayK z@efT!W8MU%MJgm(4BJy?B#fC53G64$pW&rF-;|Eh^1kxs<7l*uEUvaTxF9SY-0+YV{&3+WA)=|jp7=tk~N-W~ro#GpO)GXN7EI2kRm{chI zrCfNbUbvxCxTsUOW?DFxR9G!vbY@*V?o_iptazv|Y%du*~wW=qxs_{eh`YV-hQ?u_;1B_J89?a`m3FzIc7@QA=oCEBH!QqLxk;7!z*#K-227`r8{_CDx7@nL;ncB~s`c*Zx(loW+J-w1Wa}_`P zP&BvKIJet3zXzM2&0aVjTv&lEY%MG-6fOQKS-h%QyzE{&URhcxSo__#b~LnhIkmQ% zz78)~zpYt6nOomjUth1;xNF}0GroDg^K-X#_j+abux0OQYVUe)Z?9FQ-{IN9 z;rYSg@$upD+OM;LqwC3|v-Q*K)6>(MGx&c|`Ona^=h?H{*|X=pv&-M-7gv9-AeVRJ zm)EaP8&}VJSI-^S@WGqsiJO;KHh=#1W#RVv70f@nyZxVR{_4YB*CTxK@$UBVZs;F; z;t4+g{Ic=lt(1rCS5swptw2v}f{CtG%J2nGSG>1ci7U<8OxIY+Uf zXefr1*KuRCp?D+#EE7$s)L1f>!o0kRuPbQ*P##+PzwrEJqT*Dm{}a#8bg|7f8T#Mw z{6^hYum1(lulxUa{(q0>SH9x;t;dYnPf(U$Ic{}IzjD7ER{qL+s##5tu+JK^eCMET zR3YKVSanq7dAN5}oGAZzl;dK|auoipm8`t@-ZOeyyda$Qq@pC<@uadM+;O_9Ci;X$ zBK``VqLCj+{>*zUCkT+vgc)48cxDr@9zs`vLj5@E<(?u=*|4-JQuNN(6Lv zSIR(a9wo-2b|j$SUx)}xZEO65McqSvN<2@yY|#jn1;$PTzA_Xf1CsKzyc%PCUwAdn z-V}Q^!R0-B1!Eu49Gn!oMnEIA+9-@FL~{c#1-n zw~K}*;w{9+s{e)Oa|kRdrnnk#RHS%=uZi|k? zqoM{}+Q@=nfT*IG*HY}K&D)hkg@C(#(X+(XgV!qY)ee#D55-w_sit{xuH&B*YEcCaYKLl(0fJy7;112EjX`JA_2tta0jlz>|lS) znSU1kxZaVp*dkvE&MWdm>m;_b&L|0#$nx`D2XGW_w*FmQjA+PR+*ot_5gQSHd%_!= z;24G@G@E0h86r`O{XwSFlthxBL6^G;_TAiDpM|0qygS&V7=GowHC=;oR3{yEMuRWq z6$kLialgG+ECd*g4iI_wA-_1oNlZjx*6$zGs}Cm1nt{^6@9WX2>idug zxTJ0fX9C}(77`4sp#6b(l}d@qxl$!MA!_(d>ue=At?Qnc^PZ3T1>8WG(cG7 z2H?)I#1e506UCM$?AT5hTRq zX1xrd>NJF+;o1o^=?29)VV5$`uE+~!afj)9WCJHPF*Isu$+x&hYBpp`y;VahIxGWKHwGPOK%e&OR~ytf51Y1+jA9@RDizOF@*xGPvBQ5eo<%bAjS{g5KU<%W#! z`I;u=6iiUmH>vHIlFBYt{JSwQjB2zmDy$%ke<4ZLEBq79S?Dh^ivnZ-S0EzMD|w%e zfN5WIV)9T=D0zyU;BmAIq~l@+2KI&3v7{CPy>?`#SEQq|-2A;WP&nG%raYHUioxe2 z!s(Zo5;;N0Otq4zV%vzqCA%5*(Z}!XPTsI)$`B`ANTEv?Ab}|h0lKcz1Vu9_>?mGg zGUB$fvlXKJ2$m>fiBPV(S&a+5P~{8o5T%7ABEUuxnamK0je1mLFqvP%=`oxUsu>Il z1-nqEvYDNKHE_mhsrY(cP2PuqVdz>+6_&d#TZIy@0fz-4$A>wiI)fwB?L+eYwKr|o zn;4x?2GFUQDM3~8VT^n3djDH{+a{(gqjU?f826}}>OBr_8FUrO~WGpTaQnH#0RG0ZON-bxX$fVZB3WPd1 zz@QViU`-aw92`&Mgg_xlOZ3m#P$Jsd=FV>qPVmW95?!7crMff`>YIC&Y9Pi>p4gwX z-xm=qs*UR!YSn-)6o`mn5%SIxi99XWCVP24Rsm#*bvIYU(J=3^l4icu6WO=`s*U;2Ki0jb_fos1tMA^0t(sBzm1|( zxd|kesEnjv`ZZpT+x2m<**@K8QNJX8M@9w`^$KC^OU8KG`>l)py&I8{xM~LG9_h5M z%^FP2mUdAdYPPjc{wJ=7ZsAYI?L(mdIeO4P znwuVhDF0A0P%!a~ML_F!yk{=pcUMI00(+F1fI07gOD3v03kPBl;@f(EO$#y9zg~~t z@`e`tCIx8O7ue-{uKb_zesclSToG$q18oa1Xe-<*?gE#CfN2+K1cpI>y@PZTgBaU_ z92SDqFM>iY0RL{pU-kp>E^(mS=&VPMXb4E&iGZ~NA8zK5#UNlwJv#9PBDF=3#s!Ml zQHbMykm)vBSpo1`^NSucUI#5OzW|xi0>Rx7QScRT3&fGx`>0<*^$P);YB9 z$SUKVR68oK1?Kv7z_wiAH#icm&@dup0U|R$;s*rGbypF`)^J}^sxv~Yt~NxmKIAMk zRN8%qurD8VXZW=d&}k|J$56fzCb9k6#)@!tAkai4E71E;0NCJiI$!Y4J@R?n#_|Py zWuCF|`VhU$XI5DeZCsD6U4R;T0oX`%d8UtP(qo>~#I!CzCg4KE(?^ui#Apn+xCh0i z2*&E{0`n~tv0l%)Is%>7q7@YeF0!7TgZxpXa!G{xZ*D>QMYx9`tS_Li0+L9k2Z$fG zUq4u#UMTSF)ob9YpDc+ots`_J^sdC#*f}+UsV#wc5j6#j-Fw9HykLth#r)wGE20mn zzZpev8&SaG!%QF!2;SkTD3k;%#N7sCd4S@{SWs+v`Trtofh!ZX%hA#=0Mmgu*A}?a z#QN&DjM-Pf4p#|!E+k=FWHx@Z0t?_7SY^F6MXZwY?Jr=0#p^1XD(8cu;9#aimh46p zYPOB>BQX5WqShxQro$OvmL`UpqH36KbdhV7lP@Ca(?7Aj^FL4vY(s2u5SBmojBRd~<;uQ4gTB z#krWtNT{UJZo!JEN5bg~lXT6@?8sD~$t=9dlo|TQRFCR8liD9Bm_^F^BN$g@kS__0 zHhPQ5-zP=~2P1x{$EXJZ5stHa$0ABx(TKberU{UhLHr-+WI`j~U8UrASxY|}eK*iS zwY5fH@X5N?EI^IMIjRTFfU%3XFx|F|Kx=YuxR7KlFsdzpV>aoh50sCA|FH~+AmoE* zoNkN+?vzkBm-C;;@*gw#SHe&v3(!7FVr1517I6WDqKk{bfJ`pTKut7hgu=WqfH) zEVBWj(9R3zUkjU#=^Y4R&(7dnUEs{Ol`JYGHeO&@UmzFSNrqXMO4XN!cb1x+lo|ud z4B>QTC&dzgmd@GNN40Gt&#n~nDrLGdob=pV7YQt`Ek{v}lXA=$f?Xi?-AzwiuhV zlvrT(fq{z`I2Q#B^1e<6bKmW&aWCpyo!47G{%dtzZ}mxT^<2*|&~CkGzlZF@iM#MoD;6nt+@>%(jBA7aGD;FowcTSC1)ekL6+O%0*e(*m$My)UlBH71bZuFkfz38J9U$=E@R*-pdRp$OHy&_5@XEsAbtj_ylS=&}kXC9rq?X|~O^hZ8;tLGOohaA4$EK;6V9hY-4HYUc?z zr{$cX9C1B7mOUJ1^AnJP>3=FBAYW9K@+_G-P)U75@rAk;1W2l8e0ur15Y&O$^4e_6x6?It{ zpTI1yUi8^qtJ;{KXy`AA?P-Gyo_DQFZGg&QgOKwcquEZqjovQ*-ao#}8|ytLXX93o z&S|H`akh!)r+JvmAO*)-K`o@qWvCLqF$A3)47NZqiS4b2_3A^0wtS&Dh=WfPo3Pq> zNteO>&7MHB%}$rW6SF?tr=h{Ur&vyR$N3!Y(~79r05WXz;CYNWc5^GP$Ng!(&wumhKWGJP@K_CmYr0z!yQ!!) zieI<7GckJ2)}N9~%vCd6;@3+SfW=)q%U#z;B|&8a8LEP8(4Nnoi4Xfw9cXhxH=Kr6 zD7pzY)&*UNY{ZvJHb#RsyZ7U|DL1>wIJTJm7qlsRr%yL5#QP7;dMVE~P2!iz+2>rg z`cwT!F~s&c#dmhq_G#4)f5Xo=taAq>dj@ag4yDcq@XxwGnIEc4Oc|LCG5XJe&Cun+ z3zAbkuj+x{YFm`&b6x&>PUc(S=hy8CVadi$-+DJ4<*zSOvmY9IC~DXG&If~f4#u+4 z^3@Ohu}@842YZ_X4*dg+z~dh(J$iV;v$&6oLkyaAvV!f7&*?!fMv{A$kP;FG>%scDxBB~4+S?EHKgPX;2-M8iQ}p+V4_0Gcq;yZion}*e&LnyvJcXAc zwZpjQJ*byMk7nbX`Qv+7clMm)iqoUzPDEVXcy|+{OB>@L@$SmgqhL+!1edGjp5JYO zo28N`NuTBnYlcNO`W143{BQ4Eak`6NR{oqlq)ZI~x<^ISNQB_WX+5CYe_L@iqhmey z&tj)E8Vl4e^Y1?n=3`IjZ|t(p-X8Y+a)uv}Z9QUXVXvG&EV^7V2f*G=-;d;+uVycR zeq1+T?{Me$^}r{7p9Fw#&BiC<`z|Q2^`ACM!Dp`;0_xg1m**)1w_$s&2ZxzaQ;qv8 z2q>los>V5piwg>#!(eUwxXBUZB_up?IQ_oWDs_&u(xZB(Q`?K#*z@SE)j&LrTs*ze z+`dvOi(Z}0>fC`!@@X_Cef!i-zX%|=GLsE-H^{MSk$xQrmE0%G-Ao{y8v|f?^&^pwH)4#v zo-DDAGfy9+Y6<=R9301uMN0~ zcncpU*G^$eqfMTWxyR9+s)7n-PK|N;vqrKAdP6S+h)zjeb+uLaZx<2)^tEiV=dxpU zdLA-_f_ST6bp+|8RFm)-Q5~*Wqn_{=G6$O7QKERwetZcK*-5r9h~1)01ZY z{sK(fs_xBIb0yNmttW({bK>e>)6!f1ERn@6WtUO@7$2_BN}9-MjN#H#a7eAJUHyGp zqopP@VBY{LUUO{_7Cvv{JZO#+Fn)S$ZhH&bndIq@h|6jb_y1vX+|uzvHLC9I!D{rA zIc9;C*Ef4Wz*uk{pGYsqW69?it%tid;~(QG9!1sXR27@QA9M*I4L?rrnrJ1>S9NMBJ@EOm8}sK!`HuZ{qj(eL`CVB+ z(7^0)X+!t9z?+z$*o#nc>%U(wxI=4(x)KidztUMcUEgd^O?^=~<6d~VO34 z(q?=?F9C<%++w=dRe>_=kom&w|5(=-=P9z5^5CA=iu%e#xmppWS#XbQxH)0KYw#ob zgDwDmm&kx?LVZ9Pjq2AjAChGhgNm4QP6k7tB{)w7#KJ+HHkEC;tBxlVZl)nK1hyK9 z^_Hb)#M9@G8rQ73scOklbsKgt@?f`1L99Ad74X@|54ItM`h|)}1hvs6bv-^|dP! zPAsh>Wp{TA9}%OzDoW;fcU3FyIG-v8+FCuRYFb!;6(Mf4^T(}*1X)(N6~`$Gs=G69 z@o-hhaA90HegK=C&PyZuO4n zaKq}+6G|cKxU&h~jn2s8ykjPFX&ohW7!D(1CCk3#`PI246B* z^#O!(-w`vD(B|C!T4AAYAWhRG%# zs4BGw5#8D}KScKC{GHR4<5qQ$whS1x)8@3Kr+KSK_onb~TBs6(898MXZ+cah`w2Af zBa32C@<3_KBYk49}~cnCO@HtG~dr9-Ib z{%p2}{{+i`evn@2al9#c(N2}JqxBA|E0T+6AZs*73E7-Y&i^W=x`8f1>~ZKk z7g}JwgHD?iDWj1WJkp4ZW zo}arZC!8lam{5$+o@f3&)I5}iNSvuLl5az*29uVc0ktgz)x=dRv%yia`{D96| zn<^=0FG{QRIE*jxr=7<0%AQ?2T;n>jwbA zyT-ISHJ`7eRhzQzPlJrJxRYm9w`;IQVjjUsrBI#)+uRI-`WAdHWzM;GRH$f=)QBZ+?4CL}1|oTQvNFhi0Rc zZ460WT8-AZ4OM;8>PRwQr|vqehB;JE4J>jcX6ditII`>-`6WiGBQfPbcl>4;Wfl}a z%Vyg)*ZAeFjMiF*h~=AGg9#6t1=Zxq>2mR22YWxEM&Qi(`c92C?!m{ONy+*dq_mu? z++Oew|8J?co>8FRY?&f+K6Ujaf6LDkaPMJ8q4#CDTDhDeUw=mZcAvpYON}lOKJNEP zsZKGEPxG`p0Wumcwe>KdxiOKOeIguwcX(a(369sK+S@$}xw|{yNp5FTtTZiZU8I@21Z#|K@+3>GixgBJs!}jm6SU{q?5&-SeQqw~6_ToUVEz zE~Df2Z&UfDR$H$zhM&H{pI`R@y6=88WKL*BfeRZDR3%YOCDEKE(f#@Wa~xZsx{MX- zU%`^tFiGHsB+i+nZc?mo7BHhRj^E6tK4%~~VP29aimNpoyS zbDl}ReUj$Fmf@z9;bE8I6_eppmEkv)feSdx2>Qtg#mWfh$cWU)h(ctJ(TVKC zx(sOpw1v4wUQEvSvI@-?CN#*C!Tk5j+B*Rl|#VvSoG9DBbJiwgV5=Yq*M-%;%*JFcjOu73?HBMtS_>mN=qa#@F za$rhx)i}8}DZWz0v(;_0)&L)y_9Q|H&Z03ni1G)i@eBl&;)l|Tqxx!IXkv{7)nFbe zOjLugb;KgFtyu(INI|6B%@>>mUv2Dk7M*6J)5WJkzL_YHi4ktXX`g6LvclP;6>6DD5(rtD@U^m&T z4c#sa1bBYk%Q+Mh#~tuCY>{*fReael9i+O^S9TOSkzx3wi{N|CQHrx;KI}#n;H+{b zLsK3_vG>HdZpcg2nC_)2_CAQb(PYF~N3NJnTiBZn>jbQOr!C3Pd5w2F*ACTTx+5 zr5ks)O3CF0`;k%g>euw>8w`S5wTcD?Ob(JVYaFy7pr-@*=g{s*utuIE?L}(t-NV%R z%`DGAE9c&{uMxZXYy#mJvDv9eWbB|a4X>*QU)T=FwF@-boK@o^g!wOBt%R{Adkza$pVlUf(f1xG+g%-YfKW@ zy6MzXGQSO02k)g%v-F`4G)%Khzumz`lwKTCTogQwK7ATi(T>z0!-Be}z7?(Crn@7Dg@-0^3Y(J6Su&7b-}kxP))fV7{2JncK> zxSv=hLxZvx7uI4J;i~^{-!R>gR=rPMZmnTS2oP;S`Rks(*k>s`IkNcHpuVtzkGIE7 zErZfXS=WW3OEIBhW+KdqjY!K_B9}PK%#fujC*P&Ywm~v_?rp^;FA7-D6ndzu zwhvWU!r;hy#=}PJM$m>yGJbZZVrZIadG|URYh~1hLYY0#h+qv-g_>`b$<42^Ad@K* z2!Ma(DR?Z5V(uXQ1T}dplDeE$5?#njWLZ^RR2on_Gu6rNc!KeD*SPbU?5{9WOQ%`l zGaZ-PO23tUjYwZvck#P_KWde`1H=+y7X()^^yIxNe03-5($asV@xAn8+W9gENp(%S zrS%@`f9(MLIwlySZJ)xg@2kLdkgj+;SQ?tFzHTwqPm8~dz_w;65BJh-P;M4AG9M^3 zD^=#pREd#@X%ADb|K^jrot82~3j8Eiv*pU9I<$d%qM0-~;zvVY7i7UGT@WP2blv_Q z^ulQB1^P7syDgBHc1vR}!nw|69FNT0Q;S^>EnAZzFf}V>19YJ5(qiq5TvYU$+APCs zxTb+lpytw?-sA24OKyx~aIy-Ra0*bWHpZ>bWIcp+o|!B0W(!8o@Gd%MWhj+Tn(gSG zco)PZ9K!#O*7EHg??SP8d8b%d98KL$EVAW3`Gine3f_~U&F5KgQBX#-XwTpAR2Y#} zg0J*70U}&GKv;0M@`Bnuv@iKok!{1H38UF6*Xzb zhsIz5lwyy7J5JICe2M$m@z#Bb-v^tDN279UQLL2>C)*__>|Y}k&v+(jQsBKFwnkcA zDHn7^zoP{k_l4yoj94~|h%uN74W#EOgw#VqO%6q(e|mkbbP4@1)Xd=Evt-V`8(us5 zKBi2{P3#RRUMaZ+ow~|*t-XBHKh<>&AMDe7TjX##+*42J&#Z*rwz1M{-@;buN-HW`&T=1j` zvXfuu@D=yNN!%pDd`zdn0F3u*gq_^MO~VyBVTndr@~D}B(3AvksRLb=$uzd2hYmGG zrBp)#CQhlIl3)w6MsV5goBQjgv(ddn$Arnuy4$L^KPPEYA6GRQ3?s<18EIIg2s0{X z^MZMqIF)&gFm&6CLwuVtxnB&ihU;7n;vJ$zXe>c4d1^Z$5J?Bk0Ssm$931KqG zHu0Axzb>~mIkaGY{1Yyt&}*1~8%y$J#TP*Y;j zs!~elL|M$_#^Xu>IP`FH73+4B&^1N2>)$>!M+ojpchO_gnE{aak`H?&n1$g=pm%l- z`19>dKgUO-#Uc}JPg{tXR@WX?CM!Edig`i7*!UkGL=3emOlvT8e|jA4u-NNhJY-xM z{)?8DZhQAHtGTLct8Z_&l!8&&5$TZWQnk>APm(YTLz#%}jY(>?zCU;0__Tq5potymgrbjj-`zbwkT zS2)%`66tgf^~kd|R@Zqn0#y!bX611DXUd!wrThePOXylhhDlm-*$W>$)!K3dZ$F9n zm#H|qSWXX5$5nLmFv&Kt*L-nNr{PBtF`gV_nQLLjRp3%4_LQnHlqX`Vc^md&z>PR) zIB~w5r)}AafFPe&Z>8in&xt(gSsG8~Cl%g@&1jM;%^!v;Vg@^}0D zMrNK3y#zIH0VL(rq5c+4?K9ekVg_rjVK5bvE+K`KUqn;u%_7DY*e`RHneVM3%7zg| z%onK(JMK^OlU~JhmxAw>eqR6Z+KbIy!~5A~xv1U3SA-bp{DSsqVo;?{uD-eiG&P9T zCZ}^?-n3G@pp~*KMJZL%`9(J>lB0|X$*9#;NSb2Df$7KUP$>@?K6(tZ#1)tzEwAn? zR>p&sgCzj8Mi-VdnJDi8tj3Lp@@WbY+V1j+cDe~vqQqt$Qw*{RGI;Kb$A4^8n@&GI zr$!|)sU`rp=Y}%k2u4KYvGSaq1n9PM_?81w$KW%JGurykM0?Ekmy&Vs@PeV08D*Ox z+NVXO8-#^mb++lP;LJAn-EyXg&xDU;OiZP?1Z}a#NenwtM7&#_dVl{5&nI~M@k!`v zfBdxWfIgL(VK#(+0EO)92c?KoW~)}EN?q>7(hH<+{!WWOV`|x~j2Y+pGn)p~?sg9^ zzi!KWn;ais6fq1#GqRyjTGr;Kcu>F$qZ6i^@tsP7;(H;l39g&+ z?+{r@iKPh;YyQl&+x3vrQrxjUG8;+!Jj-nevJzsk%~6>elHW6M_6joze`5t*3S{v4 zZlm%=&kIj~8j(mhwoh2L(5FvM(L9>f7_PgQ`c~c`+D`~A<9iI(%i?==l(Y||snWrA z?*$$?yqWTRPCA(Kq20?SpGX)Lzefd{E86E~$m!eVYF-({7Q|mIQYg;0@37)~jz! z@0=+R>H*L+lH7hbcCWk2Dk#edYjY@SeQmrf4kdOxYSd58I{So!_;sS?Q->^LXHopW z>Wa(XYwRtfYgtDox9Nl@h5nEK-oEw-s@l7*vsV4;2RdN64h(DpN=vjb8|m`jCyBbs z9B|fL7T}Ty8vaPpTjUx>rtqU2)BFf`D(zSTKE^@HwN!tg)w<|yT#urTaPQNdqhrayIw@j8YUz}&s)|5M1Oaj_K5!J z{`Vq!(U0{`>~e_Wo7mMDTd&ylq$phMW>)2$`0b*}H}Shwr(W^Do4#=I`<<9~5)TL2 z-y|N7o!)moIx-o?`kd{Ju^jmXz~le)zIW-dtN5M`%ZG>FRUnAK7>;NQT(MW)MkE2u zt~?SBw99%Q4^%zgYlBbLMg;0B_JhWKFjHP`^R!`@7XGU-y%hw#S(di+7|={WgkFvp z!%ztSIC;gstkm`jy@06h4vvu_x!$EL^Sil%pEFjWQ9dAHCrb@b${yA4eOx^aW%X_W zhQcmjY)EP(?d(FdGoSTnn>~uLQV5nNe3!Wx=Y{(dBRPnv+K`Ip>KIIbnb5mEM=mEap@brW zQ7+1J9HlIbqIgboFXW*bb-o#xowC1XCk0M7C=OFk;9a{At}b>3^DdfA@|C6UVblGn z;0mKXu|mtPf)kFzsjoZ_SZrLz8lJrKGb|bz^t)%D89OJnXcCQcwdYv89J$jRVycWc zt4zq&<|2u)ba3$WJ`EF4UEkvdBvVDH+gpvG%Ap11@PWye4~kb7JbCOX5BPEyCiCL! zrH_(Tb!0_yyedajO2{SxTX_p$a}0)vRf$%8%=Dy5u8ojTCr5=MA?d}`P$WQIG15eK z(tUJ9@uRldH2<5E@kAYcpZr8^UFm1rCEC+9POrh1tN=$nX{%ZtcjVBzpM1;0)@wg~ zEEoDtNW;n&hwz>d_{)f_N`k)YsUrU^AAT2EML)CRfk-Jh~8S!hoUgG$&Dprm4GZA4d7#UM1wB3Z~zJjpTR^=e||g6V#@X z(#S_%Gh0$Q5K#;A<_WhXOx)n}nuwHqJh00eMVcyhHY{44<*8_G&sbHxmy_7iTGk!N z$J0=PyG4#w#8$X77J+7~8pV?ny+b|}K@PuDe*GNvEK`v3nPnn}NGr>mM}dx%hS7A~ zTb?v3h2#g*WRyN1G5l;c_@0L`55IhnBe*It99@q^anRh)XK0vIw4l-|lIfq?n#Hp$ z?U^lh0ZaCREgPjkVl+sBKKRr?^uvdY;C4mUgNab~GNyy$t4M>f@$6C412^FgCY@3b zVEpC=X{?wcu(Q|01>SOl{)3$F0)gvFXUeSyt!qtbq!2r-3f8Jrih%_ z^o$+5PPvqsCts)!@~*#dq*cX<*v2$YbRWg$iOhDz=zwG7tDE$Nl&pcN9J3m>HX<+t1ILp)>xpW6v|WK& zTxo6xRD7HtUc04gV^LKTin2@4)FS^kj6eZOivB3OBo!7#G<#(mA%CNVvq%||15dSt zQp<7-olVL`Tw2I5Z#>vi^bbWSSDNn;$$AB5mkn)_e16kIges1>Gj@z?fEtA>pyacV z^hSwLd8HsMH{F{bfZUinJT_Cqk%TCnDYLNA;9x;nX-;)PteLqKthaUB{bpP^$3!WX zU5|?C5?ZZU*jbqz09zzkgob;45BgGYaxCAaI!_>wc&rvtegO6`EimztpAn0()U?!U z#(EOl?jXX5)XNYWvNEaBCNzK50BeUl?8KpFE9c7TnkJ!$psJivt-56Vecp)Q)T)*> z3mgjL5n17o-^0f-Awb($UQwuAAbiRo=F*RlwkQ76fjStr$8H-Z%x`WN311{c8+OnG zTT9XL)KPz&F$=CpwnDYu^bb{Rz$7o+Ot6$q^fwqR#jN*|WAjO;w|nHw0LoM0>xXb#WlFQyA&@F+=F{@ zcPrYK0?p=qXa8sRo_(;t`HsJt9ONL+Omgr%xo53){VtFa`meIDePoCI$$Fwo>JT** z-2IRi0;IPF)fRA&iQ0;F&>SRhS(Zk*d^ac3ka&0zr+98`rolMANXvDWu}GIXf{G4p zKAemgm5L$DnqtJSkufzlIeBMvJ*o7Ifwoi;xin12BGJ~c?S~@++DBO!lO^CwC4)}H z7@}(t;qt7+F7u!_iyzSl2mr9_)=y}NRMEC4e=~2Dza_dArBR({EBqs~K^6P;iCI;; z89n0TG0%TCRO?c%?6BiPH=lGmj7O8|e4+TZHZO0bJi>+GZ=JzgmqMvNbco0gN0Yrd z&Dmz@q6(LB@hm32L|91iBB4lb=g_d(AEqOr^{PZA(KjVLu1Y!z$L=O{H>V{`%!){F za>oT#y~#b!dyz0ysw zM054XLf77r=8WVyV2>+Ny8$Y$PEqN*3!2V zVsnQGJ^pI&MV7Jeegv7kyskoP#Bedgu{h0!+Z(%?xM9l?+VXl!o34YVOq}Z%dW{Xh zOC#JGC*4My!b#0T0u}laG5+eDYJB0OLIX$bl18%>(70hrZON_nGWg*>2R8_K@H()eQ5b_1u9~m08JKG+F{> z1N>cqm(l7Z9~%1;e6LF_5=-d| zL1~UMMh!DLjEfQ66Opo-rm0I|JGmk0q0m1?M|l>3y=7$MREmtd)v$tpe*;fJC2UOh zrcgjDh({a#xJvQt9s+dM!{Ag%Of_+kr&ts*a_KgZ-&ixR%>U7yiLN8>Vsrj!3M`|- zj$S>A`N?kJIT{(m^@lDi>zV}(Vy+-P`9`fPW$}*9ELmDhu_q7}ZB*&}maNy;O~aPS z7d*Twczi7C(xFLtsSL24Qu0|FjZO@Ym0{KJtyE)a^pvF0yw1-1lm5{Nl&Fm&ftp;z zABmDop$35@DK|NXSp;M1#m?{MM5B69*^dUR*b*41hiUib-Rijm`2DG4Hl|E`<@vGJ zH2&St9#N@FU+_IBgy zI%4Bu95$yUdy3%!c(NvZ4vu$DbSvgL?YorU2?4y8RQBk`3IJK|mzr~#qd8q;sj!sz z&Sj*f@iYwb&p?o;4L_!6WcAsR;0?)Mp#WyOfM!ynT#8kM#5Cvr=Eo#u$&&leRI^v6 zOHFE+Zm46~1Q-CVXpa}t+7;4bh2<{{8cca8SvyP0HI(Mk}=Ly3f3TEHrgl&+8 zY~)PgisFkHLR4+?I%y`c-e&Iyng7U8n}l!>gc;kb8teF&{)RtTjE0IWP6%p-ijhSc zdisP+dWS@L_Y2GMg9R-=wbd2AwMCz_Kpq9#`({WfR<_ZF@Vb$wE`)EN}C zk#qR|*2I4Bqrh92AJHZSzs%Mjo^8gs!{iJih2DpSXw&>QCPHQ?ML>G(Y+UT;vXPUx z2;IT_WT5ojq4|?r`-AaIgmX@t+YqwJahqva2;CnjTR>iCSYC5%UY%F|pm%=vm;C;i{6=uWD7awUr(n*v zU@WMhE2v-~ys*`)7#dLA6IR>>DQ-f`Wi2k{3!dc*e&w@v6*G1f8_pH0o)xQKE1Kgg+w7};fUBlm zs+PQ}ro5|0ysH)is(K(*{i#*Z{Hhk0>J7K*UH9sB-|AJr>Pi3V;jrpq` zXwyP+(|B&vU`bQYm*&;b=E>0JwbyKa=xdEi%T8>|Jfw9sr*+D|ZTCytNOjvlYa0~u zeJG**tf{>tpkw<>$9{OnQh4Viq;owCx)BSVPk}C_LC12SGqupMR_O3+;6Jx(v8-z< zx@W(?r@yHe_PuW)y#J)Ke=2t1C}&``b#O9uXsv8$@09>39^R-KUg#Q`g^j=(N7vg% zms7{~<6&pDu=UjO>%8&vyouGkiG!MngYN&j0L4>>-BTN5Q!B;u7bWut&GS10^UG87 zler7G)eGmf3wxD|zeg9>V2jJI8~|)-ePsD)X?eYJWxI8Ct#s|aX6<5fZF6yLy=48V zeEq6v{i=2SwrhQ7c>NN#e)#GFbZz{s+q|9Jyja}auikoI**bXz0%~^d$9Ip$_AVCo z&b#&>2KS#v_HQ=!FE;lNU%i0VgO}#RyY9n(lZSVUhj(p9mnTQ38)tVd=kSU1hyC-b z{r{=~(2JMBi<;%k5{l?|f)#c6p&*#&hkFR{d-zk8)3K4dAUd_%VJtSEtmY;0y{1U`USHq2!35= zEs8?xw9ESJ8g(f7nyWl5{iEx2T9#>7eOjLD6LTu@+eFk+GN|0qwuC~zBSB<~%o@Vo zF$7ncsBKvmov3R+sy?sp`gO)x-*U1y-cY}x@~Q;5F;*2<6sr{FCmuE9z8g=}R;Kny zMI33{@Hij-z7xS&-);fP8SXf7D!S^t__BKiJuCLFC-uDN8>34}98eQY*6*w>)D`8V zPy5@@tijhp#ehz(Ecp5_2$JWz86r}x9ULYzH*p`r`*d+LibqI)J0@}vGzeqcr@Nu@ zP%Fl2D$>AolR}cJJnJu28yF#zx!*v-diP9skEcWwI5aDDU)wSddKc#f)cDQSg3H}< zEwjXIQ|FCA8=#4VrN_w~iY;*t3?mH$$;R;i2#c9%DxWvG3(>tA)ZmLuO$x&zY=H0l zo{wmiRUXB+tlU=g-4jfvMX`t&zCuj*8B1>rTm=gP_O7VLG zg8+;xke<4WLZJ5@ICvpT=^{4Yc3l5-)g}-)h-2u#BZEc`_$dRR5x+*b9m%nfy|CnQ z=^*{6>yF0M2(rejgrhhKbNg4qusjdh&M01E)@+Mk4b&oKEZHRUr0Tmx?flM(g4S>t;h!bM( zT1f~LKD$~Vb4bg2{kr}jsqsz*^H(VK_Z2xzs-0li12%xxqyS?Sq)3F+??mlDPffrV zYp2FYab$rmhB*@NAZ$&V-G@y2wgG{jV9r-b(3s%mml$OL0=j2nxLD~5>rXv*DM4es zH^1n_za`;7IyrZr-e!pvxlbX>@AQ)p?M7R8?NeP>Msj?p8utl6rf4vbr!4G4M3bhA zlJhbfDg70?9k_!Q8l@n*F~Z6rNgyS-5XpU&7=k8Ph!S#;$0DMvUKB`&MDs_M!D9{r z&a}3}R|AQUX~kJPFyL?mNz-~hc9GC&IrTgT;iB!vc{)FJ@ z)>s2~`r}R9`Vq;;D0pyG79Q}YK3WxqvX(c-XK9tvURREAW6mMd{nZMxgv#tm`yumr zS$S>VC952J4x3UjpiI{qT}Gut`Ifx`-&x3@yIG*W_d?DkNCQa?^ka$F?nF|6g6~Xr zLK^A0Ye`FF>5Ll3=E*&)e--g1jk(YwOBxfX&oAP|h@r{5AngV@$o_r~R`8=u^LaYgCyD<4pV zLHjxw5|h>AChNDG_0VAzeO8*J6E-}`kF>jRi(vjdi-6az^V%Kn>VxwaN`I0{c`?Qc z+S`p4uMI-PYVQNGlWLb?)}b-ABQm90zVE#n?78Uw$T3-n_=ey&I%1D2_;od;fuJAQ z@mVS40hV<0rWgy@BaJ32z594WFh~msO~>*w!a(xt05|`D_e)o-+fB_DLciU2DLX`Ecx@s z>(5vTsy0+_FX|QrxX+^2U3xjI{6y*`cj(LY)-)~Q3&v1zmL>cW2ql=bB>7p$qrAt5 z?d4jCL|n+ZXZQDlXUuA?t-kG3WeXNt7~T5%mCsxc^_6?dlLK#`46Q?wt5s|%?dX`C z)-LzYKXW;#GSY+HKP@{0&iz$h8p3-e3SC5>vUil=z~BA&^==V0&=vgm6-axRA-;I` z0Iom5BR4PZx0=caW1J%2zn#0dRc!1Wuy{^TYMjLnG44r#gr;2TB?~We_gk+XKmWl& z-NP{b#39w0s>&u9Uh;Ivkfby@C+7WYn&?=n;rFkjB=5TYPTH4Wetn*#zZ&o|FQj%a2;kgV#b zt;<1QAQfENiO}qJVfPa$Ki%;J>GQAE!>-jwy-!I)p`=c9fp*R`QX3LtxW8Q`rp)l3 zPO(d{C_q88_?*AaCerUjuLpFtNzCGhkcm&i`rz@L`GWh~g_vG$sHaDbCP(k2M5jS= z_Z2gG8&83EF%q&EU5U}o@|~v?GPpTA$dqoX^bJl?)&c19=$#E;E`NX7#K-yiDp$mwa88}vsS4;MXnT?;3p0Ts)_iqt`n zJky`@GqPJB#!3+0AEFRqL_C*aL{c}z0Z%J+WMmsVWLIg732D(cY+<}?)CWPB0SyS4 zK~i$kfn=4w=6Z@cj2PoV-kYo;F9^8Vyr_Yth@CBt8lJDs^T_x2p{xqwdH`zR55PEy zw5h?@0Q3kU<_L@>^oRSeUCd_J4OpKOkzC+^A|mCG?pm;ac|~4jL{4cLN+cqHP7p~K zWZFFKyBJ+d4PweqBxN*F19yU@PjvS5Sm$N|I&MhxuOa_Jeo^4-0V8DEYt-C6oO3sA z%!ugKBja%vwfiJ^+!E43AD?i}L-^(b>7ldrM zV@hkF_8A1pI>E^ZLZwVZz$jFG_fGa|AF}O}@Fz3DvO-vt7cHw0yPqs9BMLY@j81QX zh$JY|(JsHcqDq^H>~^h-cp7u|nfikuc8oOgH2`TwAYpk4Ql6Q>;G6JNDJv?Co~wyn z7Zr!wj|&B2NE9OASs;N5k=-u zfdIOa7wS&Ux$x#=zC#Vu#5!w8&+f>A$>4sUjl$9tk9?b5S|t{9Czel&+1!Kn7bF@=3nWo_iIhEzW* zyQ%@QK)irlAQqU>+|?8BXAsV$G}bZ$I;ap8M2CXQfxLQ*s#=Q7)gVN+gCJmmUdxO7 zTDkkPgW8)xH-rueRE0oA&i4l+iu2P4j51_>I`jxljI2J4Tsq9R*%(>U0B>nD^B@$t zL?Jy!m%htTQb-ZL)~H)Hi(DvkMHf0a z6_P_hJ8Ry#K(+WGN78mGYx!*5870zodHMp12eMFdcD8Ze;^n8ql$ z=M8d1NNl`~YzlZ(jv}G93+t$;s;Z7LA$js zy5#!%_$+B)h3JgDNKu8vRN_c#8^d`0(5Sv%`&{7i^~f6KaQjoAgA9JVSdTwd7nE}t zBN)mI?)L4%52P9kuO0jZ-vF|AjbZMN(YTLc)AtQQf&SvXo{a?9Ts?lzV{zbt%-krVz!)(gR?l;$4|tlK~sh1M$9*=MnLX$;7THW^q#J#PlJAWC1e0bb&Wf zGfPU}H8nZVkXx8s_1g({BPXf2}X9`vZ+97c7GSde~!o5UlOjT?dJI zZ1rKi$%WsXgbx!7@^w?97v2A!7I`jv2hZn^au%uLfTLWCN0iHx>x-G!%O79nkD=WT z7mIqiJ+e2;J?B8W0L(Aki#**+$T$P*&d`xq3?u5EL+pX4^$8*Hluurd@#LJZ>G1pR zc?$9Am5JrU0N^OqiiCQ<6b}CW#Se*>d3EunZmb`{c@r$)A9*kRvZgCU>XS1QE1Y$U zdU@SZ7Es5ym9D%AwQed7@rmEglPZ(F<2b`OmJ_O78!tJ;U8*D4wHs&`y%F6#&ov|6 zRHL2n^KRR`?*7SHjqXi_+WE$pwbhypTgU`hd{dPQ4Ny3O{yc$YGUBw+qkjRE>gqf1 z-c){BR1n{Oep)%m+fc~eCc5Z%1^2D1Z`aomtemgyJrAvHZakgujH~zSbM1PYOmN<8 zTz2mm)D6MAhfZQQBrf~&>xTHb`p;i42^c)y-1<#9rtz|IblGDTFrfS>ztQxl%7nkEqoWOLd)SyG(zqU;LtR{&(si)a>U!x-;(pAe-qB8+a-kd}(-f4vX6y zo4PQn2VMsfDRo`b*7ak3+?Z5_!2X3fc(=4Coe+(Aoq0{7$;rGnx$YuH5ed1=Kk88oR~dzHd4Ht-plC}63Sob2E~}9mT!Nw$wB*fGAp6vQwfXIX zBk9{{ZD!NNAa_f@K)%(nIljO%3>`!8<#4;iV7Z@DlUa4UqU-ml*`VwBjmYJTxQXok zSygZ()u|uHd?gKKo4o3pxtqk6b&bHwD{;|zTst3He_bgz!46jqrJt=GpzV4<{WT2ivQyD)hbcQ4xE; zc}h3tm$7SIlWVt~X?K%x?_LSXjQyO#2g&)htjShpV-EZ`QS(AN(~!cZsy-VmIf9I+ zL@|AV=RV?hyA(XdFdg|BBX-8iYO&wOsH}0Z^3lsK(`j!T)!V^XAlNU#ngIlz4{YIyg_sOBJ+ zq~m!*z-PGSUs{5uO{7(9XOxlMqtia1mGq*tiW1r>ATrFRu0{RVX>%KpGQ)Kvdkz!Zmc?mr!&-nG*?nt%)vM{^EZ{zo;TvKq#hm zT}Xwt&3`xZd|A|Rqn#~sR5)}f7%JxTrhRTFvUhkP1e|Lu-}lY1nlkmL3S$m}B>NZc zY}#WhYyQ?bMWbIvY|%)%vPw&JIb-Ry_x9=#2oxE1o6`+T zD?87r@GYygES}wNhIxG6L#&w?t!qCOVE(l?(4N%(gl)}GxmZh2{j6T_%aczdt3mM^ z5&IEao}sm{TnKR@<;4!E@ZZf`0>mTTFLjLgcl1^QrJ8E-DZwrOXC_iR zZlQylH2KM50bH8ufG;WOa$N4@1>?M zh=u6FLMu6ctgy8g6SXRH;KX8bOTj_B)odO~wg-0a+!bn@m{<+g?^j~P8AzzAkLijH z)l&QhD*C*Jy>|KO2`-x^NO9HhUhhRCk`ltNNLmU(x-$}A$(fQs2O7JGmZo0_+7W#f z-w{7!+W`(`lQ7PsT`2*R+ByVu{k+&BTKXIn(Hgwri4u#LcK#X`+PI_L@h_3&zQmDhD8(+(N7CVjb#TQH4Q96kc0jL6^;T7#gJbJN-!zlV8y{x7My@f%&$k`L z-VRdl=4Y55Mc14iqm?S;%)pmcM$um!{LVcRJXoxQR=Xa&RH94vRTeu}8f#bpbgHv0 zigamNgd+QUbBSc>dKY%T*)AIEUd!XT+UgXYxwxI9`>G2`@nPE(k&2>bDO_0)vLlH78z(=Dq0HfXGK%e85xMnJ8&A$9gavR z-yf#%+cV66Y=p^kNy1STNomZXM4jnhnxa7FmRG8}BMWmamHL>~-+a2CZ3__Q?Mn$7 z-V;Yoh9t(Q7w*mqoc?MflR$g3xBt=qFq}U+l|1~DA~_&#VNnl>+|@R;6wY)cYhp$e z*zZpK#AMY5o%03tDw3(7iYV|sCv1STL<_jZC{y9Xjx!c#Y3(d2& zF?M`i`e(U(lC!=3z`m>FZKAON(3{931ywyfdQh<{^I!qIWf#sn-e&4;QpVn2_sdQH zrVa5>@hG4J&kFwI9?ydQUE2~EgC+If($4Lz3#&)1{`l4JWD0xGPJ1aBZkhwFLox9C z$XPC;Oa_%{p6m3bv~S6}+)P!O7S=8oXjg5^&&rwz*z{48e$I5yNxLXOKk6y_9ucTB{hWZ%cD{DO^IA7`v++=tMV278;wuNE-*cuBq} z6G{X`lMA2mXd8nh`282i@4Tmtf7dwj_(%I{FpUWeUz@&5->4w^U0d)Hi?kVVZ1~k{ z!~UUgj{+X}_&2I2#D@Ei;hoM+HYnI6#KV~z}MZu?S!eH%#-`kGaFda zh*W)e{ZdE={upV*(mv#_|MCHg^&K6QO`l4n6-?w6!SYH0@*s%3GI;2hPXDGq z#X~6G#r#lh=DmIoP^R$c*^3T5(8_;>~-A!kW2jHh3Xg_X!u zUUzk9(P}>rr>#;E=JH1QQw#)=1wZv%o%WrO$Dq(BcxS(*@G1!N=fHj%ri4J(V=1yv z>Np^HmR$W9H53(9g_Sx2DU>B^PKrg+`B0=pO<5Ucm3BKsA@HKYO%#dkMq2uH+(&tQ zw5~qkH6eX2Ov`n=0d^3kRcpH?8s%T5&A zQZ$T=4dKxS$;Fnf?-4ki)7b8gMLZ_!FtIqM%2W@CGfjfNP)TJ*_nw}ELXrAvC^Ma5 z-w!$aUW8Sg209+^U|<1ANk6FYAf@mbmU7Nq>NWn_HS?WA@@^lttu;PPUsiC|`BEc) za3=xfl|qr@dfx>x7saxMN;Pcsyv&Z*Q4N1voahEq+gd>=uzJ2PDzmF~z7(~!hZeYC zV;n|Dv-@|6Yv)?2;8xw?j+vB=2#PP{WLpg6%?XItF+%xnUcV|u9s&1hiulZaH;<^A z+D-Dv27Z}9)MzfOsz{>iuGnQ_N=c^I<2D!GDomswQ*kSzE|uK#!+El^q~IqEAG9j7 z#WTt$YROxG$Va zAnJRgkaQr<$j2E)4)UWES-Zw4I&sVyBZe0~P>b!vg}V8YXu?Q3Pc`XfNdup8E(Nt5JDRE3GuPIHzrl)OkIj1)STxb20WI&H zFu4vy6%*w#s7+xGPb~~c@%H$2;#$;S$SFf6W3nB@Y$pg(q0Kbi75HVX%-!+6I&-VC zcy^Wdce9@i0=m5uuGwq!SbqrBmL1mu!Q~$Qf!Y_mz zveTIvL=oRA>L#OpnLHAoBph7KcZr-WXMLAnzN!(L9pD;7wG^&L^+c`^N{12jOx7vKw+4vsLK>T&VJ`DQ1AdW=0 z3LkBq;zq!f77wzBY3{`7SM4FmSFH{~K%b zqgRHl8l`(Sh#;3{Y3Z@)>F}=tm1Q#ZP3r(y#vkQyOGWCw=lswKFYAg+65BPNRw?Op zcvXi%AxPZej>0>MM4KF|NQ}`b)iF>jyhJ1JMhTv!DgxZK!oth-caAvUl*iKuzOkHQ zNe!=_W|`!LzL|e8VG|;R54o+yietSg!>z8XLA*`zm>(5%rau^{9V#P}@~5k6kJ|x$ zPrfNkLSWC@d_Q?c5Mjg8yhd5x6mPu56yvx~D8jIq8ut~6>tNHYwvxr)u)ZUz)SQo& zxMX|8R^($AW>pR?1YyizY9V7If!LBXcEIr3xTZfUszROlx*v18Z_^+yw=o1uD2Hg_ zZ~G=DXwu=$0~s@xkvkAw_a%_5qwLyf@M(gv`AwaalTo?P0Hj@f!!3g zj3bWn1D6bN!X5C-yFJ|2|B6iHN~WVjDbZcTe1oSm)#%6Re|UFj`bxf;$9~_evnLX<1fGwt98A{1G~cYGYPm_$ z{PiZ&iyC@p3umSve=oZ)Xc#-h%h9Trh#*ACc`G^h_fS-S$H(hC^)f*S$KiM;FBfKi z-9GjQ7~j{bJn8z(Twa3-%w~2`9!S<`;C*uR6Xj8dP#pdt&2XESDCWul7ZVBsy;CGDCTXqgUocPzyB-;u6lnZ<#xs0ND3e>BToon-R$DPoQ z_+};M6j1cpb>W;0%Gsew13%|i-;8GZj<0%nEEM%E^sEwAnTB`T z1|?Vn6kYPC^^g)8O)VV|G$*Eo1W$tD!NG3g@|4dJ=1=~b+05-0B22?bC-LOz5G}Zj z>Bb5qg41+pM&q-JZ83cvs3GKFr}3ZHm$NHgm--AQ(_qxHnWmE>H&1b=oY!O-uX55U z#(Y4X|2aU_vSUp>;q3OSDsHj_BN-#J*y+Q-VLLfn24cyioW|eJ{1cS~T$oZYpFWDv zqBm8vs8qIBF_s_v5->F0A^01oRu*GWb0}h(?qw1&XU{(wo0j<|eVeFxar>UZ=W62P z)O*@g2*h(hB;(EIw)sVltTTiCW#3z7EHW5}h@FpjT&+geRz#VgaJ*~bf?1US@c6Ga zElw+S4YMi&*Wur;k#6*N=y}(O$YwY04L;h6&R5~Sy=)OuFGF_)~V76=*)L#=al`ym~Z+}oq;otw$E570E zV2u5`l`7*WnM+!&r`$lUq0g=6ktf)t%&4DyVBE2%gDsbZ4BvA5G&9y-jH+5P$`6NO z3ddqEam|*cLZCkC+xafIn!sWrqpF;%_Yq+7)$^nkS8waC;&1(jhlIDt7|h9yOx5+7 z(l+OTc~vJ53q_S-|1fOt&ImjVaYM%{_&4-#In1*TbNVw29=+W9NwPM|C;z?KOCN(L zf<#Y+x2>qyUT$l@-!Z$~B($8Gyq-O4n2Wl>Jsd&!!ymYD(?G>To`6Je@AqY7#_0O% zp_mK(Hkw>|=4oukIClLdd5ujnpytOq&FXw&>;h)hhYvH!oQuStsF~hS&k*2yb{b!4 zXLWAfwk}f(=G+V}@qsB~9hyo%@E2qWc)C7eB1iGe$v*wzXJmZGqCI1ZQjZtTZG{LM z%_b_lEkDnGDD!5jHesl;l6wy`orA>UcY8=DzD^cwm1`bpp&w8727auH5|i~dT9-ro z3FAWe*R!%VO?Y^nC;1a%>%usq!`{$beO5$#sM=gz6*yn2nc%TkB|#RGG_(i915jtf zf)uOi!A~#NN)zVqeEw!F&`rH(DX|qpzl!E(We+BWk>#iYOZkH}l1tvDZ^G#Flh*ko zak}4J(4V_lP_kglyiK;ud3Jw?{-XrNW975)^_Kb9f)sY~@1OCx5(YZ&cpV%>(4&}< z(Bo%AYw~)-mU+W51on0T!G65EDl1p1`MgoJ^lB$~8Tla<$-Zh4Y}g@DnYF${-uzZ% zA(r}oo$a;h)Dtdwxyc(Ft;G@fR&GnzlCd*%>!LZ!X_84YMj(J2PL`U>rid_hIFP|09qW5U zU9`KiLaDX?ylvJ!zqT_^#sL+i3amAuvP+Q`pi;b^Bk-{GQvKodc#t32T)i{%%6VO! z{oO^?9LKUw)TAPl!`rig9#qO-OD7};?%|$sG~FxBCv&fr-IiBZFJgbL_eN8AKK>K; zn!1Iz^VW^)eOUllTQoWaD%@QKeTu-wl@eEe>9yfg2tw8rtGQ7+5 zEcUj?F$eTS0wSXX)5%%zhRad{dYOkw127MNtQ!Jl(;!v@>O)B;RH7gQ+Y(16BeAy_ zq&h}~h#yjX99jWIi2zfZ0@H#e=2dm`4h1v)3;I3%1VTIc91X%XxB;aijnQ&JCT3nL zX=(xDs%G*wD(Wt1>yWk3-{q|#Ne)Q%aK|8rT4XLVAowr|qGJ>`rxsza5B%Bqpu0bu}!uisVZMaa{{b zvvUmyW7yC&>%l3hQjj2L+o$tZ#VR4oXmLMLwBO;vqI`t4x|&e|no%}xbyllBQaz^i z!86XltZ~uqk=@QPT9vC~YMk?1Wwz`1DRgs{DKn?tpwp>m$toFK4}C4Vsz)8IKCrl{ z=REIB-(5Q`B{mM=8zFZ-JL)3s{R?iUDIsmLsbsNFFG|9N`!tM@oN|8q#G4{+7O+H< z`D2v(yZFcHv$>7N9^64N&jfjnyjFuKXSd*jx|sUiLfo`yft;9P;KRJ+^e5AC1OFGH z6<9+wV8u2k@a>x8Xji@*o_krFuY^>$j=3-~&buw&4A!@aeors&c7h|nm&y~Za(vzr z+ni+Hi-Vh%NyoqP0f(MYl(g2g{lK|^h>1Fp6GP`n<&(0UFP)!5FSB{h%_42R||0?zG@w`_G{_>O{^z$EjJI$lB zaWm)AuC9J9Lb8%~Z75MaO%xwGzos?W-}k7_$;3gnKu%P(!g8P1YFsOTPku4kiWzz; z&aG-t>Y!GPmrn~`W!Tq6%|k5=z$TyQOX?hgQK#8`)@374@WO zJL1wLE(iDDOaWJHh9h}vg7nWgSFXDq4kiqpZJ2(GeDvhj=tab{$#227cp;E*21V_n zLP0yS#~5bjL1=O{tC$*JR14Byfh0^Xp9?Gf!Ou(0flD0bMxwE1z%vg2v=}Q~>f`1& z4zhV1LiDq{*vcOVneal6q`C;4Fe>!m`LQInMrh}TMhO%x?QQ239f(G=1|!V`O>c_H z2xgr=AI!BkX{Z|W9fn*J)J9l>DytWkRB99yzW(8_extzAvUrxKTNiJrz+F=9K$L3Y zVlVlV9OL}ic1@zYCW)mOjOg6lpK5E{`hjC9_+KUAQof@_U~5sVerqaZgV0nBn;?UN z9f&95C|0|G8)-sB=E{I6`wskuoX;!fQF_>uUfwpcJhr++Ji2K>#%Nk4O@!fbLVH7j zCsj=^rI2o1qDt4)AXm@$%BsHgz?Mm_kb{`gXG{+3a3;6ZdEmw9L)d*0hEAkl&DU;w z3u&TVCuBxhY}vbJyX53#URje>c)PuEgoK*=-l?9rJ31%PRGi0GWv24Q3I#ry@)+EM z)NPY873mO+uuPpToq2X{FOe}9AWEsB{wTA{-9%Ds2Vr#X;RrroRD1PeesCCCJeVCf zW4|Q>Jt2C8V+0!%cAzJ;`59))vY2j>S~M7?B@?T)=cWu!C+l(S_~g~JbfJAfH`kmf zdelS`O}z6LNXnDc;i-`vT%lNTIC;yi>fS?O8h5cU7&nitA?7j1DHrt)axRd__j;yX z#EAWKj0$TYKZ{iB7<;5%6y(;XR31HCW76_$D&KP2egZ$I_2Edil2 zt0~bUW(FG37{TAQPFnFIa8Ox2lcub4UJj^qVcv(ynU_21BP}`GL7G4u{y|5M#VTL- z>TGrkNLa|PqOylB;uEH5=qlN1Eg0J-gxZ4Y^Jv57FfG0)W3H%yn}5Dj-(?MpP2>6;;>JjG7a= zTFU8S?vYEb-fFO0MyP!qwuG>q^s?~Sx}szNb5;XP?~;vo8+r_Fe#up2f25w`i!f-| z7WAdo=pNawLb0l%NlVOl$Rqlu1+p31NPNit9Bc%4r<>*iI3x~D$rNzlo5x~=lTpiK z6&I>g0XVzi(d)C?+`(JeA!gnEBXQJ2qljp0+^Fp?Bqw!fU!RHaam~h`V?;J{Zn|x@urLX_|c7v+r69A z!V(eGu-zc=ghmud0igg?8{@=muGda5rW`AjS1kJSA>%@E*f6(*nqCbX+i}j6Y55i2 zT2Xf&-o8oX;3kC(ZAd23Q;3GQIu_%Wy=D~%+q&0`7K>_zi|0iM5>kP6VDwF9nkgYh zJ2f~X{$H~nT;ZD_)NhrftQr}DFYG+bFh>2Q49cs?kKaz0TgkgK-aLN zEQ6`>fW>KECbJlkTQPj65V3U-eIDhB9t|y8N!W!J6ka5f525`MR&q0zP?^*h5TT5j zHKSbc`_jT~XLuJSCApo@pDy~N=BPT%T2{K~d@d4Ek_^&{mTiEXPgFuwUG_R+ut`#2 zY1_yx4o?*=YQxHAl(ok{6YAbaG2~fYNl*oD7{qmqf@(qV$701ewKqbm%IeYR|KMeM zngE-&RdekHzC+zKufq4^%N#{E=xd5v9B7-wktgmcDc;2(22^8(h{0|}S8XQJy5eu# z8}4B%-lc`zhXB;SD3zKPa_M97S>gV4h7>dgV~4vU1ZEmWAcTKI`>QI=yS8Q=hhFg` zZYm=j>}dJCmR5XaA5pN3-NNPgSmVL>R`ny#U$hEDjEV4=a#v(-oHfbkM55W`l58BW2I{wB?s$t z{13U6BZ1t9k=nZJ5}8xBRW9v&GU7CmyNp+jOIBrNuEWQfZp^MU4D$L%Bvp)(e5c|A z;jYX|p-hW$tz?&Z**MYU>UkU$K9r_FRyFp`GzH@F0eskoBA;FOQ9s2`I>(mh&DgaV z!ZXw=vk856BO?QXr?_ohjy&OMhF>>;@g*mpt&yBzwIGS;m4p3eAiT7@j^a1Bw$Bb~ zM4Op5TOqA>jfN9u@ZW-uT#Gik5#B`dJj|S-x5}x1iVQHp&PGG_VcD_NH9YyulFWIL z%9V}%3c5#H^*y_qK}?210NMYGy}Jr(>jB_B4>Y(1cZ$0NE!yJlP#lU=w9o=YTil)C zf#Mn=M{`irF=XAdomvDo+NG0?=qrTF%@@bC{&kzJ7Bbl7Q;+2(9~j`PjKh5 z*TF>X+oB-#dlE97xv3k;sJQL{uYpN)}YU%C~SSx*lnU{#bN z(x*oqDP{iVfZt&AY^e=w-!ona4*ICp>~9V7(ne{lTqPN_mOR`St?J@-lZf*BHV9 z5%?BKPnRgmQ%Pi`e-g#h_pDjCXG?#JM1+6artXOxvQeSU`ob{cKBI)R40u3leu)al zFvrb(s$+Dvtg)cNPnk7p0>P3Qz6Y%}r0lc4re;#1mHbtx)N_EN`|iDOq?pOeTsN#T ziwhc?dQYU)H5K_|klD1_b_i|E4c}@M%DXkz+(p$PodWD*?7SBlTWMU`y?Li3ta0-D z+O+k%KUf*53~7gvrZB~HG(G|Lvt^Us90x=_!w+XA{0PMQ?4C9H zdkjkFQ$v4@ieQ;=yM8iK-HCU>R)JzB`fJMs+yhA`%W(`KTL!)RPrUf;~Kjy+v;1Hj-s% zvY@**5#3As{nZ2`(I5IEeN$9^A`D9H6g)gDdg3QlhNJV7Qwp1h3F!z>t@l{};=XP1 zl4-yMyiWNLk@Xq9*pnZI(3tercOkKwrkVi`Nk|arY~GE7zyt3jhLf>@hrY5xw-2=!~x_Z85kxa6DGpo^LZFvB=Z#J z@O8F_N6mUk#8y7+r9vO^ZHPagkGePFousH0rjMj?%X6;T@!m%&S=n;PCyCN0XS~_ve%mwnShj|V36FWc5dB2hA`~{}2@hg;Ki?@OP<6fud1?GAJivNq?UC0I_7u_GCg8@s$7g z0P$4z_W$^RSMARSib6YByB!5fJYD-P&9Ob>LwlOCc;;8}EVH}xfcB&$@$@Laq@=ry zT=Cpi@$AgITp>T1{}UJ3`G3U)A|oQ>BI4uz^92%89Ac`LhlwyL?mwYlwU%XWK9`;e4!M++6fH0}Y7TCd9;Z^A8!=sT~*@ z8W=4a+-@J7t{GZs8J-vz8P6ZxEg4-X8C`1{o$nl-gO07$j4d^ct#^&BmW=Ph$LGh# z$7?2b;SNZm)4}r)zEpF}F50zxqr7z!nzj z7mf!OcAFM|EH5s@mM-R(mYbLN>X5&>k^AGwjRoX<%jywgb$4v_czktxW_5jTb!T;T zt#xg!Y5k^o{l0VkxO4pqzJAoPaSQ)(z3}6F?Z@sj3NW|%V`+1*Z|kgQ`}w%+-@Y8% z-ksk*Uftds+qs$8IeVr7)^?A(_x>XG?)LW%7xu4K_OA~24@Z994IJJej{fZ&oeUnI zj2-`;J3d`MzBxWV9{UdnxS2nB*g3i0JH36T0oKm`9-cow(*P4!kBe8w$5+4RuK%sx z{9C{Ivvc!r@8W^ao4?Y1<3z~3kXiZod0jQfZ_j-3;c%*h+B*48Tyf= z8!l2#W|;dN?qym&v*Y$GYhL`q%6`r z7S5WzLHdjfMEVpT6vc}k9TX=kaaF!rr*w8K_=-kNkUfVLhRfFw&ZW*>lHpv%RZ&)T zR8^IAbW~jfdty3i>hSQQv!Z?+?N0WzVJ{xQ(dLj#`hlB>{!*rwH|0pZ4z>nRz`iK~fM+SV8h-)?3#L}OcA%Dyqb z#43MPKYxi%Diob8heOk~*)VPubt*T&|C0y4EC}FjoOUJDY{I4WnEr+9uy%~}(3P2m}`q<|>)2?JB7 zPMvGs&5Suj(GW3R(?-Zt%n)C|} z6~IU?21z&nkX$Z#H9BoCm@Fo3oAlp5Q9qO6V~KUWp~QBG`XR<>203ijXxh*yT7#2b zIsBLAy^?!1`VXNK4r!>{ll!6gC000e%t~_y!rgP4FGws3WX~iRLU*x&fs~{#*K!;~ zS-lv6wZ0LcGV2853?NniFgn|B5C&%;16sy$FAgb&OrFKGNBk<1q#q^LJK@X%f0r=* zsVAjF1d4)2Z96~!8X0!rV6;46{)?9x0|*h38;97FLQwk)R}zu z2+zj<{xg)cZIhtcIA=qFT;T!llFY(N_Dt{Md#(sk7+*o}C0HlgN+pci1W;6P@0DQB zP)r(-+)sJ^8C7^P*pb3u=R_11!oK!=*EH*S9r*n>UPU;Ntxe_{Tru)yyTB(pjFmvm z3YFYz3plWxrr2+dZyH{YPK|q}!BKZ0T41*1Pfx=Q1oc_wI zl!x$h7^G$s+Y6{D&{a4b<9bLLl`IE}P#veTY)Bdcua9-Xu+T-Xvwvp~avw1~$zmCd zr^i<3$#iBnW@e)h)J8{&KvYvaXkQR%P6q>?b%rl@W1*L{3c^7)3c2eXd0bo`|02ZhuBTNyIO zF~|iB^!2sL#5&m#v23XfvgKI4u#yLy`!8Gi%RHAVqgE*VtJx)*HX z*V$W-gpjStk`6M=smOI=gH*s6lnk!;FT^@YT^WhxMMyoX)#y(yh2>GfOF1P#VX@vUu#|I|UJ(^Cv zA$emoj=%?dkc;xTooHi8J5;> z$cJ@GBSdf9Z8P7$qQIF(OSFzou0XJlG!cVs&)PyMV0?Gy_tqe1U9Lph*RJ&$M)yBVyR(2d`K|xhZ zF=`2R4&3p0Zf$?xo21-s6S92spswecV!X)O;QNut-_VPeeZGp`U?xOj0mLwb#?=-4 zQlt+}3@LokH2c8{eKsvW&$`Jv9@rMFX3Or)rezJpVOi&pBu;!cw>)@0PX%AS4HuXB zP-FLJ67@!4v1pkVLQlP)`-E6$Z z(@d5{!>!oGaelpF{^}CltisV&`YOSEnX&feMKINy36tHI}9IpC~$C-acVAG>KSRVej1Nrm=q+t!HfmVesg9MjPoI4}FP7 zH%J2+1f&t=e#DF4lmnN%xPK-5@6T6MF~Fzi9WM5-SjKb&-dL(AXoNsiJb6(fj*y7! zHy$W{#XEeRqy(eAScbi59Y6U6h6TqQ#h(7WkOczV4A6|Gv3f!HFGYelD?%49a6Dzu zetvdPR0$Kic%y@YDb1pWNl7r=i-kw|JW|guaI0mOC8T_S#vy}Bssr!<1}cbr)>on1 zy1*-DMI}h~kzbBPB7zjGFj8T{xTNgw8#sSh;T1expmR@4C>RSU$N+LFf;p{FSs5_$ zfX~D38oZfN!}YB5Alr&RC?R5D+|8O=!lDjV*xkLta5Of|5Q#P&EL|AdGw_n`8v|$- zVZ8vvUf|Bc482%lmvlc{O{1A)eG!63M5F7Qpph1L1)eJ;M z;0k2=Xsp42FPk{XWR>9qx~XJryXoL|<}fvdFsRDw{9WuWpoBOF`vwSq#!4{4Lxd|> z;S))sPHRx)wIFK&npXkNB!ge!a^l1#9yl2N3kNDrtB*OQ5ElsjGYks~j9cjyjwHq( z1mczear{xxxeBCddQq2!6Di7U_!(Z2KUtxfdtetL5=ost3?*Z`PNU(Y$Wy>R(5i+B zq@i(H0W484!*#IqsIWV2up&U17C>~}V3FE1U)xe8_N7=)TT~&GNPpJPBzI{O*7z_6 zOkNZ;;@~f%WWu9qrXtM3!`EgDg1kBfFSwI~KqxPmbTV^E5^Q%w=#nLcL6}8Ad>zU! z&h2yow>Z8Gsv?nQj=zPxos2)LhDY6{*1|zt$&nqc0d$+FOvyQ6?b+94LcDVzonA~{ zhxn9i*Y0pEHyKk>?=N5>apmmDC%v40amWh0e9E$fQ@P}*i8x#wjoAu9$ehD}2&yTL zV?#mZe~-qK46yUSs*`!%)Q)I=qOx1`z$**JvSLvEqbvoMhn$(@5byBUe9{9KLprW= zJAOiHNn)NpO4ZszI_6N9R&v#*(LFt|pJ%_E#Per}2o{p@V9D6NG8m}_FW_E5-v$U+v=qAvY{5D)COWZWJYKIU-2R|ow53!Eqr25$*KET>o^r&wShdRI30oIxobW(Jgc^BN?>M$4SJ$~{cWa|^J2tFXZZ*p(=_Jsyfn41(s! z(h+0!_$(ERBKAx{j@Tz;MVxPZxGBRXs1htu$*NlkrmoECsDvOZ^Y1GQsH=)3s!B|& z%KWP;a;mC2s-VcK+WRWl|HK8FOsiY`tJ`v_J36Ynkkyi@ z0tk4JE_Kkn-2#v>)IFE(N2b8jd%BgJT6+-grYYIB1S*LR#{LoTlK|c|7XbuR3z&gD zm+k@uD1e!|yAIfM=}vYGcrM)!Bx?N_V9%vHoqEGI2sg&6jyw*wItqO1sD+#2`&q$2 zPa*YxQ);&T8!2_`m;Eokr|U084cpiB;1`Y~!aCOaTz8vN}{G z0M;1X_?)`?fttv-nxtH)2Tg0u;%elr>z`Bi#!bL8%wb@!6rL^ z5vz62r91gpZFp{bCT=6drM;S_rDm)nt+O4ErW0Y>{%Ndf?!II3vX(@q*7W&JTbrW3O#M}gqPrA>~s6pU7 zZ*LG4y7cJA0S9Brd~iEX$FPs%IwEMguV^}PJG*gL+X`qpW>%p^X5Eni(6d$8bZ)Cs zTz8IH55FYEfb;kBIP!Jw??1Q+7S#GE`k+fLZ80uAf2v`PF72yTo%>^To9fLtn}B7r z{+AFsVaZylF>LhJPOZ&`sa!03lsXLVCJfnnY>&DlYQ%9>uO)7smJS?ytVaxjg%W_+ z^9S0yAOv(U-c`4qjA0*E!S&br$xoW!xgb!vNuHb$S{gkHakW^v1LE|Of99-2+e;Vi2?+s;Gh0l=BgVday0RXn28xM5`o+-P-RsA?!q zstbfWTn=f_co?QX=~{6f5z!cUCsk{Y0{z4@GAPw$*hMS6+KGzWZQuf%hc@G*cD*&5 zz|18ZJZd3Vp8&?elFjQd)LVx-TM@CfAEau>T>6a7C$-h#osh8|wTTbhT|TQ5Z)sj& z%d`^Zc9H#U@d~K3ItHqm)&DY|)Q1dcuTEj)j+{wNXiHAh$2Iuk*6*E6wLyuuW5-T% zo3{fe(Bo$2PwK74X1@OIBH~I8P=~`I6Gqi5Uc9w9!K*=T?ITZ`t=vlE3`#@4%vn@`I1~P()#iRB)+WPk?YoGshxy6lK zsjucd@F8lP%A-RhNG%BI~6%p)hn zT^`b0!P03}-e^$Z8*GG4js1iDQEL#|Xh0sdqpNQl^8QfH-R4`Jfc*m=+&Ae%pj^2V z8tPE0$x+hydj2)!ZqVK?7m3j8fv~5zeoQl4t#m%277=I z;8g3`7SNi0)1RNEcf8{cN50IN{@B1Y>!VB@0oAP> zQB- zAa9t>y}6tB9Lj&g*;U)@y2?p=mu=Pp=voS(If(qwC-c-C6AvFrYy{Ko(2gx_=KN}T z*Ym0Cp|ggJ&iy3&siy_~?38HZ0f!szsJS?kGzpnpJqr4rJl+OBYoXx&eR<#GTisIj z*rM_BTI>76q3P){0kCnDB@4tzSZ=*d%4fF>(#1p9B7W<_Q9B+^=|?>Iv4}ybD4a|& zc4yZvR3R2V$`LK5ZrvP*b7fG?1`O#-#*LDWAC6&Tj~0OJsu~Du)2HFE#oHn05A`c_ zOSMW(7r5s0(8t1|ewWMxK|-(df|StA0;oJR0z$hATuI48=sZjlkkbp zU>Xl~;(R0Zbf^z8UTVEYWa&gU4Lh^qzM_4e2Dre+k?|SG;^3Oj2M?+FbS`q2&raJ~ zIaUbz?GGm4N^J3Ev?`A@lFf2pnx%ZnJTbL<^BTZj6{rt>~D4pBvA-c)^8L+>sHM*wy2suLdF$ z8asHkEhkCXeGS?s;3yO}#gff8)|jambft+Ajro{k|7zr8)p!Y|InE?shOzmKa>T`$ zddFoIcVcS|*Us~OQJ>J^R``38*-mU2+(Qy-M_bc*8!6z*&Q-&6B^|N3MqE68#jMNo z#M7wJATMPLuWyoCFt8G=1mJwkU?<6%S8dzHt7&aO(`0FXwMufNvdClL{npUTLPTss zjC(>sntu)UJu_bZ{V@B;no5&kqC{0ikyy5(wom|b{n+|6vEg!2qP=kE@Bz+mj zpNu159)SuM5~`ME+uUvPK_D}UpbiJSK6aPYz(j`RgPpxm_0j(E#IjW05!rlX)(fB@ z-%o&7Ne;4Dc)DB0W_Xsv8=l$LedOrmx|VQafM~nyCUqqr=`h; zOcTNNoE)|UqQ}p|cAEM)&7&91Q(Z02>p5k=%C09s1-Rl#>3e=~nI?=ioes4Q`hvBS16 zT9>An-dIuRY35d8q9+5vS*>IUh2F~Dpi77N0)hu(7G1)xOU-5NLinlDpLFg?UU{LP zdSA-xs6-0j+OGV3&+EByWEWLYe>fuaJx$GXzk%tf3FQ)UD~ z(Z=+dOZcY2DT=YX%pWI;7tK*EDOE{02eBGg9jWKMpEdB0B_&Yp)Nz#fzH5N~X#-kqL@$sU#=t)9Lat&h z#>FOk6%FFpD)mt*Vw`WYX*(A#E7g+2i5vA7CXZp4FZHCsUSL@ouSW#`kWccB{J1nQ zs2~`v7-#x`(XjhZFpqXT$65z$OwGBO72#EE`RbEly@OF_y3N}3YxK7jkQ7!~#5aZL zYeUXF0gRl~Gco;H=xPLi1rXJym9K=Ew!y)I^fVd0&>;D;!JTD5K$U}no%914QLOR= ze`>th=BZN#55bBvFpVO!jV|_F-0IYS!6I%o7TMA@2SiNo(#sIZ~U-Qnndn#k(~rFqigaI2rA1 zes?B};aq&&gU@iRYy36Nl~@%>u~wy^#r~E2T;L7Z@Q2uMha#xBh!2}uYCSD~@kbM| z_zU-M{1y}q=LufpyZb=ZEVseY#9 zei7wd+UXfr{#Nc*(as^w@n7B0~UfSaR8c@ zC^z@fXe}3-h|f1g2@2IRW`S5~YwJ~VXRgeWD^EM}pSuPuPW@l*hokcQ!08@6aL8!4 z@s-DQC07mvJ`#5l{k$c{e0>=lV!q4F?l+=oN%s0z^p~xPU6}Uc$E+dqeW7x{2_mdn znqR5!zc%_!1wDQ$z_d7!Qm3TMytYjY@;*>^^qme;vI1Aj`tyAB^(JC+H1)dP3- z_fOi`kXP2(HGjODm}*}T!fcWa%E*$B=$Kc7Jblsy^<)$e*Nf#5_m!Z0NucaLIj*tqn=B5C%r%rY`5AVaQy0)sg-n=ofJv`QIcFsvWL97+`6#Y96{gS5E1wFC-qdt)H{s=}=TbUh%pQ48xYOp;97l7&O@` z#6Ci3Kp72g$~9~U90eJ6J4)?^6$w=(d^M`YV(34tHW`>J*`_E|dDM@$;}QuqXKdN8a)3&JvYUCWTEm#%VyUvg0~0uoqO6rDS2T z@*)`7ib?8XyOyJn4Inkn%Y()q0+*+zj2QmH&*rh4O z%0p^HOmw&}Mes`5xsL49{-}5$H32fG=2kKtySGZhhWiXCi_cj59j{-QsCu4sThq<;u+gjr}LomwERCX?VQm5U9V|{Lek+>?cyqs zc?^SQUt?Pik(6_(aSAlCSMys3dGc%qU<4~qk5Ak-)gu-^H04bOSADQkW*`+A0ELOQ zJ^xXq>^C^`_dShjJM`%`4}mC7lF;1~0-|GQ+TMXZ8^lcRfRyNpp8&W_WHZ^Jl>w-; zm*(u~BD0h>nNNblV{{gEz4s+kIx&~AIgONWFo_95Wo9l%GYg185==y#_^glS)N7Qv z=#mM4;DnFKDpVnr9cb)76mp!rfC!#>bfoy}gbJb?9cfjd&TI~y1a^!oWoVJXYlG6q z<#q@q*;GSsiw9&aIe%`us}VHz<*E@e@G@q8IPLSsCkd`6YTkbr$`1|_9S zSz>^t5SMz-l1I1aA*ixUboo}TDigWXFV`~OyRjW$@sL{U$59iGtgrzdV$QN5Do2bF zn}CG}`~%#@SI-TLUUa$+gNEQDKU4ab^&;WIg!oNW)MkcBCpxv}f+yGn%P*M)u_f!h zh3JmFC!3=ZuWT6ReM($vOb~OQYpE&RUxTJd)(h#e2_%>E&~?U6%IW& z@yeada9=_c5_oo7NIVv+=$-%aKH6S@_RA>t+Vqlnp>nF2v6w{i0cUDfvo10=ee$js zRh9f>sZo#2SbzdAl`T2_Z0==muV3E0zZ;UKvZW@p0QDh(u%5|_iB_bDxRe>mV8hM! z_S*rBxe9;0p*!J=yrN$bX>2OpvLK95Jn{Tv48=fi&c)#CYS9tKDOKJaJChuII$3t4 zSjI%5oSRAxj62l2I0apnZhniW&=New%E#jnIwq6e#AVSTXa(xIO!O#(Bnc zzwBxQ$jCgLH+ZR8Iph|x)4_*@imul2^+9!T6XBm>#Zfr}s|BksoaOW$n%Z^BFvpT+ zYnbWhY4CG22yleLmkZHRW5^NdZ7FXy8Q0E27ou{iQ_P1M{acr_o4l!Og>y5tBAQfO zRx4R2XJI;fV&%s5snRy}v)(Bs!$=#qd|J+T+tD-<^pUz~>ncP#v8qWXfqjB(43cb6p2(d1baU|)jtpRajb9>e1`Xn7m6!%0@5Ol(#tEPylnwb}Ab$b6~dI)!K|DV5psulP4Eh-_E1ZbC@E)gEeS?MsvqmD0qN&BuSMD(|(9Z{VunnO)IK$777k z_T8^aupC;Fr#Xz^K@rI?>uOy`PflP{bqQMi<40uP{o~dmZf$FK_hEO65&!gXhD4gi z&-A^$W!w}t(PSZCI(qF)7+Jo57AcuQ0`89hPb5&B+EQ;xdC~S#k@X!lCFGHdo0aBq zJ3VfcMToZ?;rVqgRDvM_Cj;$5PNwvx}(I=c}IZa3mKXe~M_po%hxQU^O zGVVWE+#rPG{gG~T_d3Ew*oe{Kq1E7}ZtoB1B85YXWrGW%!nmu<_sJ7jO}`l|>9&BE zEsOWE7WIp}zZxhw|IvV7pYg3_IZBWla+3%-uaJ@>wll`9W0n{@8lCKCID^&>+l`J?76|V_DB|9vN!F2HC zs%X8pVzUaY-)(b|pl{aX>$%<~{yQT1TTuK5lzgf6Rp5MH&!K zAIxb3c2Un>c$!!yFfYAg?piy+-mP|!w1l&wRAtJuy>qvp(N$=VeYJxW}4r!%tH{wp(Ht1b>@7-x;AAtXw` z@g=UXZiOj2t?gsIi{tVlwP&>FT1^vvwJzbQ$LeC0fHk|*VN6+0;r@9R{Q}HkAl$l1 zw`_5feHHe`e}V95i*ZFYKJ6P>%a^flUs9iv#}~&4N}>ZjlS)^j5`e1(J47G@gvv} zAw-TNtjlmb@35Y&N-$9n{R=)5Q9RFyniNy=v~LifGZ6_6ZNWI~`SYmsGG(&hc3I*v z`!#fp9Y@m=AH7dyyV2Kp7T$g7rZ=F-XQiO+IpcXhWkAX301%$nV@#K*aU?T z;)})~0JnLx@Ui7+Ge9YW3532`=Dyc#WqHqhZ%7@nIg zR|m6Zn}$0B9n`8Ev#<7CW_D$2a7OMG-ajq48)@On?z7@tbEsqs56FR?+P6)LjQ?uU ziC=s$$?#B4<8!+gKANvGYIK*Tu6OLI-Re)|3TPQamgFYVQt9%VX?2*SmBg=lo%S^4 zUcC-#u1Lcsfp|!}|MUN`6`aS--_;thw7+CA$(5$Ob9-~N)cE22vHSO*Dk5rL5_#Ep z!4G@a=T8#W^!6GB!6f~6pBX~2%U-GD35e-Nh7zfXF-DNli|H`^=7d>?T$qjXWr z=d=bRe3@d81=q9k#$nKaN^#8^^QxngWY zAYki!C0RaB#st)Dj%U`!600D?!vE>+S+1Cwr_6e3sOXUG^gAj&$F1X#E#t$LV-ds~ z>BpY$cht`QE$IG^y&wcff}=2k+MlB+hO2|4_I^;K= zD5{aN4`($vpBOOd+o+)$<1Pnt+X z9YOxrr8eSLD_I5)r}IhKHtfF2$PykCk4LEm@R$1GU{Se{(RWfPxsGrd9W(5%D$ET= z^E)urOrjYLq%hIk?_*@I#_yg(T(!^&!{Aty@=Us{4UEe|X;O>{;^JKmBgS=6Bxcm* zQRhMPM2-eCpMz>@S16a>Uk^GFtzWxa4t0Am%`|%_>+;~IFPf5@Dgx&c;i>edh*oxQyil(>W<^0S z`W?>?Y_x?_HfVrS@0oJ;ZZtMCcRL0Fza-|Q88-0M)%e|AxI2Fr?qyb`+BZA96v8W3 zo5>YW{>fG3%egHP{`TYmn~zMZp)7Am8ldMX(=JG66(rLj6LB|?%LP0ci7XeqiO}>r zbtztySrQLkSC(+a-Z!27-1#!cEBcsgRsqgAqgGa?dMo6#8$Q>P*6`j#zWy*su!`%S!Tm}Av)o_+{M&U(Doc77dtWXjke1ex@b$P-#g;6rQh5RF#6 z)1~Syl4p9j5PY-5yz5CDE9)8PUWreWtX+)uDi82U<|R)wiDawsU-3xqYi?~-nj4b} ze+|n#up3;D+E`(usb2aY5$)$sMu(ffon~l&YM9{QirALc#vrJVh7vN8)w`lrfzDIX z$rP4d|5-2{db3|8mhF}Zz4+*8r5rFnMex>IBhFl&L3yTyr}{JD4a8XbaJjd^Rif4l z8{~qin<2W`{zX~$W$WkBhh4!#No_L^B3D}F+ zfd4Wiw2O3ee<|ZkA&mpGLG^<>5;c@uM~r+UVl30@BRUE#5gy_Ms!2RuEdtljeAbEM zpE&y#o?7FbeAPs=JnAHcA^f| zb07QRim|dPrw<(&{Vj$jWqpx9^o^2Vi=&FjHj(cQ?E!L5)CCo+0?? z%isP58l+ctthq+imf|n#Dw$2PgU1LXzVnLnPIVR+o!MpV1PP`$ERT4NUEl1w3CTYp zzmpEO)}@RAV^w_E`%1lC7OC7{oQb;iT^1(DZs9>jq3jYV zxOE~mWGLSBw``R0tN!_Gxp%*VlJFoem{z`^Ft2_Ux_gy>C>Up8)N~a3M-ncp&x%qG z^7zQTYVJe#1|+Pv-2SsTxo&Z%yZFN@^JgLf-4vFul5NT#)+XyxUh&F5{aa9!U!RC> zTKw#g;y&wr=K?NW`=;4YzX!DGt*VDky|Iu0dM47OKKKnNdC?{5A=|}hG`QYQy;LB1 zOcs&oV~qIeP&>DDZ=}4Rk!d6n^LE>`_Ju>9gR7av^>QH*$#WySb?s1(^)Alv!(Sz6 zoANI#5}J2OXDFmhN^fYtIm(%OcEpLz#7kS|44pd2*z@iTgv(t}mHackO&L1^@NUu2?7-ZqHH#yr&e(*3KO=m@a`7}Xz%AmKRf{dY` zSyn_A(44PCj7Tj`L(PqvAU!Hek?*y!?sB#ZGtOkumGcU$O^~Jl`XRC5Inn`;Zsv!H zsS0rm8_E<+3Ejk|1P;Fl(aVBy>u3by;LZX$o>D~0iJ{4S0w$N1MT`Y^LcswR&F-N& z&UQK`UjfcSVKQ&Q!CurXOuP6n{#++3rG!+gbe@DaJ2L^@!`EDscO6e~^2mZD)VgSj zm(uKl6k$QIXHu93H79eJ-7sE(nJ`jFglFp-$U_D_BB%-ab)7xU*F6`h<;c0))h~W! zL@5^H_n9rFn~`V8z8+b{OEpk`wqm9?M9?C8I5W26=a&qg%;9f0OH~&v=n78iG5%F9 zN?8tUa1?KQSg1@Sjjki*HxUxCMSr8CXI6lbh59TZ2mo@3hv3JSo3?Ws3DFEO^9I6~ zih61WcUYXTl|}hqNuInlRcyjH*@PuZw>&a}BG{g?-d3~|3JC^2eDhQpf}QD_Y4OZK?yC_d9;JK^MQwCHB?sZnhjB`Pu3kn=5fiztFHyvU%*^N88GZ+1v#TAc zP%x(Sw$a&!$Y_L)2hkWyyee(Z*~9Kz#LCY-*|dL8IFY`2Z^I2jq%7ak{zjg*n)kfgWUB4>*mw-}6#BO^@63nyoBi3kAVX>^XXBS!)B&{y zs->36;JrFp$ZQ38=vC&h- zh37cT(=WSCd9Hs84_!UHTURir-8FIO@Fe}fl&O?qlx$&kDXrzcotd(pR7RH(5t{EP zI-%7&%q~uN}(Y}AiEi7*T+-$viuAu2V5s}dGov4 zY2S{k&!`xU`T`CaGWSh%ooE?9$C^@Am7NLTMycZiP=Pr^T4@ zYYal4T<)xU{5D%oEF^-nmqrjP`H}==4?c!i=4Zue}cP%OM z87|JyN#Y+`qEcX}Z77x&^H_ZIIW79ozNG@Lim-N5j3{uL;q~;}Ye%(quUN7?!)uvl zGDG2e3}k$#nqq>kqGNAhV1W)!Sp@#${$n@%A%rOxN97c&(u{4$#x3Wbe$Zkq-AHY| zN{MKQ5L6LOc%-b7-;85aDO z35M)EyS!%?`(d0;R)Q&)bIz4Q>%>H;(aEM%{B-C9FNx=*E?ro(n5p#nrAK~Vx^@l| z3&yD1d+81HD0F9eZfuU}l9qq&DYUh7C2(0X@A)6>-DOZ)VYujfBuH>~cXueoiWS!a z#VPJB-l8p9AXspBcL^HY-95NF#Yzjb&CT9>&YiR8ez<4u%>H&~*4M1etjw&HdDr`U z{s2}&MDSCNHT-7XY*5q^RZJ?JJ)lWEP>AE35GOf6OaM)oML|daRXFF4BkWGmSLj1j zllq*eD9fP0>3~3AleVRT;%TUW!YxsYC;Q?Zuf80nhAgQLJ(nB0a!wO(u_u>d7{AS+ zsNx*&>40c~5{J#bZ2O(8_uaP~l+bu|abdLA)ZzRelqKQtCe=Pq4ntI7fnmuv5bg_4 zAtOj25`=GaK*0N+|HB{`{-6xKuo)6WZq-YaL4<2I?<1?ckh>5&Gk|KhP?jAXpF$QH z2MJjtm;nd%Rd84>6hlnX+d2HsN&lXKQc-NtOF9`{tfooYfrx5I7Bi)vck`at%hSK> zVN3&}anUp#-=wA;t&@(f{(>R>1EPT{s{JNh{1xIay0(zGJe{~a|2GIP-#mK0;*@X&gZla=d?~%w2oD__8`!DN!xgN zTVr+GKu-HeS$i*nu9tQUS9U;ZI(l-U(>2iHlFliFRZs6)uI`%5>s~JWk7K>DyS=G< zxT$+Qw+B|)v(VTx-_bLK(Cg{FJ9)jkxqTb?eF&&FUEIG^+z)H-A8H-wZXFn@8Jw;e zTx=Pft{#Fxh8DVprVxO=d3X&vvM@L@g^1Qyjx9sRW~vcreR8pRa-(x{X>f9CaB`_` z3gJf&`=&<6{?n~@%0X3!BpmOM{D>Q;RcGi~k|k zyO+;;msh8k_l8yu7FM!J3!&5zBQ++rE|#|T zHn;cZcP^Ip4yX2yHujIF4lbq+o|X=-5D0zd@NVsJXXEg4@#q$Ie0O+!es*#`bNVoQ z_Ox{Nuz7a1bbh&X{<3*-e|T|)K3e^^HQ83b z(;JM6O{dY`us0Y*%xy8%-gqzyW>(MB=x92c%n)|jp6Y;{%oZrb&}l-O&lW56sx79W zEf=c|Hj{apovl|J?Oqq#)17TUcKX7w>9xArZx6?e-?dg8`b#pM8uie}8_vQEf#m;PRFJdkMI>&A>fXs0> z1e2{|Hxx(gbT^DZiDNIE0Em!z2x{v;WZXsurC3X-tHv@9d+& zsV1MF^inOqa~@~droFb8H}H2V&U9@(E6c_xr7X|l4ShY4>-(JuD=+ZT*e*Y~N0qH0 zJU+CP)5%lSAu`vMNR=f9M}CYxT%T&JG{_b{QC zkwY*_rEH}nj{jbkH4q}_A+A*2{JW#O7R2Y!aDcz<#C)pvU1Bi#rWYdIBe&E9} znPqSYDr>_{IOW&5nv>kf{hVEnY`|Say;{DzHxBpE?&op(u$sos^OczXP8!JH+gX|u zxTObnFow*}VcNF7K|JmDLd=?1F+rA`#o~8p1jJ^REsK7g)2+v37qqXiDR|=e8)Qqk zQ9EfiuRfjl7jORB2|<-8C>EO?#6B8fJ`^YCn0;dVZQq81Eh6Yj!Z-e6acDbq_7(gSu{Rs`H88>o(J6P zj~q7S1UYk&;nN9U|2F26X$c?~Q{rR5QFm{7M)bqs zn4&6sXmkQ0XSM_Y%5WSTx{HEmqsP{wAS;i%7e=g~Hkh2jKLEzX);M;jt<}-H0G-o8 zW`TL&Yw024T#9g#@B&5BvE6v;Sf=MPaq&2`Jy5LV9@&LLsaAm;8s#q1h)F}!RHCjM zQ+pqNfjc5GL3Xig_B7zk_p_GOvk}C5kEd^d;SqazhRIy4>S2XcUCK3B%(>Upz|XbAuWG(z)!2F?yP3-sjwTnwX6Exgh~3g^)m z(!yv_VH=l4#d0ht#@}KVvO#LMZQTV%@9K#QgYvXUP=E)6yUK|pD2c7R03n7@TBdnm zqOW}XPMFgKLzPUM&&@|NOnF+17RkIicHKnZFf2v)5n=&PuY@Iz#l1{U450fS%SotM=rEeI?_8W~NwcbRcGJJEd=@4>k{yN)m z_PiGO3A4sll{!zwTMoVQ?fE#xg$bB*nNX8An#I!CaQfZPF#otM96u!Vx8AAk;XdIc z!3-#PHSgPWmg(CeQV;m zG~HOw9Og)B2}u&eV9*z8@xStMz1%l$^gYzOcRIkdb454VLZe~uI0J6-=@5q&(<;!d zb$~41V^poc3h#@r6g{7O)D_n7aBDmoN`L~$(3MDg7ug(r#O>0W$0mM01IT)L6j!bf zl6xqqIXSwGGJdtspuMlf&N-YYD7pMc$heno1DT*mYLnB39X=|#a+$XAXu}`2&SI_P znf3vvUAVZz#@Sx@$7WrjIvg{)Z`B+ zhIsyDD!YurvLqyI!9DjSKWP?OZJ_RSm;B|WmuEM@MgU?RS6xV_;jDRVW}-|q`|0jJ zp0)pKY#mcvNJFI7Dr`jpFTalRYCQ=Td6#uE>Qjg)XuGZVI zyqfOYD`)rm^c~6#WRicDHoZk>agvb8MVJjLz?SE}t2sRl8OY9EN?Hl@3o1UDep&_r1pZG*9#-kZK z4qcyaft%d+aTP0UN}swOv42Ty*7Jto^%O+@UfH@{VvJz>cY{I%-VF%+)w-ko7;bNo z$0WhLL0=#s^Ove~D$nQH-v&vkbR?amghA>!T@UM>I7%Z6h5c#jpHC^c8hLRFr}^k1 zy}~BHe-^pDP&h$Dv2&1c!uu3|czt--l2ooc_U42?JxcjcDxD?dJS=*PMTp8L|rtxFMO} z`LIUlV?u@As}Fw0GBi*y3U}2*p&-z_% z3Y@dEeIde1wiJ^gR`PxfT~_*r^{C6}g(3iFKo8snx>3-1lA^KgA`@F$;JpnzFO5_s z23T5RfCPZ}uQ+T`rHs5SM`Xa+2{7S9?%|{k9xq;X0tysDMFx(QOGQ$)yX0#UN&I*xY+66!%5uK;BrHB^z zE}D!0N>jMLT;FHrG9fG9uTHz@cfZlI<>RcuXv(sHFC`*;iVo{hapD9zlwru^1*lFU zp-_r=ck%c@%XqpQuurq%=y%NqQNZW|x6C4+I`J!Q;Y5uQzSKp{Z?fK4K)O;eFi-&f zEfOl%jjH5|Et!sJ;iAYJBOy9Un=5$HccYX*)^*yP8%!?(bX8eYl?O0>CjX5Pe+5Ka zV?0HKl3#=}^{4!MCI*0RL%7t#H|f{3UdWhA`T%}{G=aV(wdjC*%JDU~R}lo|5iOhqI#9YlZ~ESm`ie~zZjD*zHAE;a+&yI?>jLP$Sly}3aRhz2wp z1BQw+7vurTmb@ymfOfy^`lsv#q8t?@G$$~+8yF+30jQ~hRUA!cPz21f#7rE(2-K1G z0_QG6a=#Q{_*>@gQs(W$U*{bf=N$v{wlnjV2N9o9GS1|f1?HNDa)iFiXK~DTEz+|i z%Kx*T|L-XuiK+laq5xo0fbL&_nN@%VEx>^l;5`=*P!$qM6q1+}lKB@>WEE0D3u$15 zbkBthR7L5DWEdba76chb272qD2P4S%d@8RRgI8mbu}4woe5#QgIYB=#c&jEA6LTb3foxRwcl?m4X#tV9V3 zQ_+M}35tYm2~b0jabzH07J;{W3BaTDA0r6?f{YWENj{e$$haQ}1wqC&{7Vci%MfHd z1XNK5N5Zr#DD|Hx^Ozv8c`jj}02&sQ3G|mg_ZKTcD=897BmJo?OiB@CT(7D;%!CdM zt^@|7M4gvn7gWidm(^k+V>eWBWL3IgVdhlP8+f3VI}h;IYwGD{Pc-*vlP$ZQq(%`;Yrhtmx^NM+B*^EB{YjqV5R|(1n0T>CB8!iE% z!Y-HKhDb;h3uQN+z=~hFlw)|1adMR?fQm#XA*6zh>Za9i)r;4$>bXFqI@OJ*&Jb^b zx(BRs+3IGCm@49pVri;UH;GC`Xwhrua?#1!Dj4J$)aZ~^WFpz($k=SE-mG>};TJ$? zJ`OpXs8jE33FK-^p(@9JsTIR6D|4^L3PzFcY<{oaI2}@{j8)|gE@O&8Nm7H@SpxK{ z%F3Jxe6x^D&r2#^O5CYy^g$>&8)Zl@9d@#1b=f7l0cf?@$Vv<~DKRw#G1XA@b_a>h z0T|Sdi`WJRZOLw~m?&|DmE^oYrJp9f zkK4JVptD!Z8FF_4J*;lS)@}K50WFa16IScOjBQG(>bcyg7@{T)lY~gYdUHBEhXYEK zWQ*2KyE`XaRzfP7Ov^+A(AujI?aVS<-KN(ygFM*fQ&r^>8s)BPMd;O~5a>{jI{CPI zxgV&+PN!j~x@^_I)_`h&KCncBr@SdL8pLG^O|wIF4|Sd)p&z}nGC zg2I~q%$NrE=ZeE@vf8Q+ChTEnn$E14k^PB^CFHtQP?NFAP+jK;QcPzNcRx?oP-D&j z7*^eg-4*)W$&}p?SW{|iR=Sx@8e}%8<=hpCQ?K#d%Y{?v<4<64Icxy!MAL05ih-)( z5R;fSL`Y24NsjlaPwnAMeGG*5x>R9Gj}%MIu~(BOKudpNS4_vY0+DO6ETLGMGyT|8 zPR$Uoy~C}bA)zq<_toq=6<=BPB6;Y=HV18Tkm$Es8_h-?g619qmw0PuF@tMsa7SAviuN`ano@k$V6IsM2K=R6HLK0axq~Ek$xCg+kb#)0w)0QcTvcan zgH%&ZP?IHe>sV?qm|(c>BdLHOp%iy-BY=cJ4nsp~G9_-J0~Z-{yWOaEeC%SaJ#Km5d0&ZZXHjF+ zWPXG>dnw|%buDIjG3$sLfyHk-ssgq?1&|(q$aFMEfH7N0{~G1!R*n8v#nBE6TGe(> z>`pmDRpbW0YLQ0;)e8UFQOjG>ft#;SQdKm#bWCcNaLaAjgUaFD4Y;46_!eUc8)Fke zdt5#9RG+GYueQMFwPk%fbzAM3SlcBVtx|dWauzGwTdUhx2YKCXGX8B{pb4tDS{Ai^ z>AcD}GlyHxvj(@lP>Hh8+)d%2ldha4l&K1S$s^2=HTk%rHQpt?zso8)uxty&^$GwDu-&;vpJv$pyxke6Hzv25nfC}6ewOf3!c8@rK>g!4sKyz4rseDC zG2Yxf*7nUyk8IEt4)V=09Is+eqvR_7HlVuohI+x6Z!L0aXU1e~5brXgbF%Mm?R%?p zIPU^(PuYV@kvph+9$Mb}wL`D7b~!n(!0k~OR+NBKh?X5%(~y;)$wdXSUxSJSMNsfm#fuO8)prRJuI7+1|L4wmYiWJg zX7{1#)rjC`DX{nO0bcd!u=jFGckh-!Hu&wTxxP#%tE#vDF4la{5881T(4lTdD-?Hh z_Oif~P>=Mc?|E}+4v)Z&fkyykoP>ddfP~L%&K(&*qBJ49uZR(fSQ*91+Q&Sd7)Aq< zis@(EU@^pV8pv}cyN95l;gCv|49+tRaZ_u0SObanO9DPeq7rAkDk+`tNndCq!x*Vd=cLgZS9C7lr8H*$=%(yO|@)a!~ zO;zXxCyt_iSIX^U$xLzG<2JCGp~?DPzlX-Y;W>fL=%C#m4sS)% zCmmKz0Pdb&!e4wH^vjiudzz^;O2!JX4e{A6Hh+5@j;HcFY;XDwhY(Bzmd32ypM%Uw z*=MwL4)n?#@!4X1hySDsolVXmD>nL@&F*RDzsc|U`?K7;N}k6p&qbvJKm@8N*CC$h z5+cw@kk0)_B)|-NgkVF;a0aSN?uh>I7uV8deJX9hgw}Kxnn>34_YO?rN{!2i;DmNR zhu*$Upfb7TBeAxwF8-Tyr>VH*89s*jOtKVJlrjaCFNypvFW6M4-+58f!T_wPV~@th ziNJ~Yb0fw`J?T-?p@CCdLlCV&ASVHHU3@Kmkm98!aUpfBOwkKn5cwnHqNMRr$4JGDp9`m6z^f9os{nJl)4wA=2w5W`0}}`c~*9iNKId_ z;!phOAeqn49%T$BVu^?eO#KmsFU}vwR3o|g7UfDedCMxF_iq@OtwVWqxGRMrtF;0k z66kmDxB3z!jD&YATI6x>H`Rld`JvQ4+;MX$r|qG_O=WL=MAKrCvN!m=uE0P3_E=~3NCzMm_)K`_m{K%-ve}u zhEQC@L_nc4pI<{ReH;zW9|C|8aR4<-TUAvmamD0-x@M~>;nhH|)OI{geK*z~uN@1& zcc~7|#fxb!w8Z2RF8!sbI6nfV_dQ2DhGse)`Yq}n1xX;>R1ZS2V2;UBJ|WHdHicHs z(Za>AIRaS`O*)3Rq$J?7#2WzwFeqa+a|EVae(^kVc;WNq02lvcsltu(itB zl`)5#hxXM(GuPN3kZENy;w8baBxKzZcWl|<%K|2rQrbwa_rPeSii3E%QQI9 zWyiBQZ;AZjZO--BvFzD6w#HaEvv0(Wzy%N+5w79c%jHn@5t&{s5|a9jJEZFMq?f!x zOp4dUt1M|V+X0AHl*c=A@ssN#3_?xBlu`De&cXeHsL1sBy77K^8AD$z&rr=`lU65E zKhpPAH#<&J`+!(9ZT41C^C^!_E6&ks6#+-$*s|4gB9gtSWIqCW`ysP#s<67tSXsb-en8@4ITa$!mjzw`CxJ=ldB+{MV!bO^m$F5 z2jDr*-crn}=(|4V61vED1+m!lm#4HHP>j9EDHBofBnsC>3we|;b2=QT4p>kZSh3C& zCJrNT$9iC*DY5v$11oVjMuf|!bDCyGh&=aW#ao5xLqhF!wn+5yfQfM^Lp^`+K=+V{E9-dUwv0Y1V=crQJ*9C4f80Kgb z0ke-4Y^tlQ-+uUc?XGueW)F@Y@ed(pX4S<~xc^DA*kLOyXk1+KcuxdR>T|HBii_rA zf0lA4y4I!(0^weymw5Tr3pKgU2~L{G-^}Z`RDX;&UKylKixO3X{9H`HqoY6BcO>NL}eZ6+Eo|y-=3%IMp&@uqfQ< z(sj3n`+7E)@7v^&$%$Zj_t6#2n*DpTjk_4K~X^zGDx)LZAJ%Cdwna0Cyhw#^_lvW@j!g zX59BmGS$oWl1{@o`u!A8DD7n7fH>@F@=fcl?b+i#VY%_Ni$!h5`X74@>9%+S`FOW? z3O2w6;4E-MI49`RK^DVgE{sh?)8kxgiE>oKo!h&Z_OGLgvdKa+StG`@gSz;2<@c0h z?{ewCPCAj$xlAIMqGJtjpZP`uNC+$B&a{szIDx1O<5dpZ`ppUK&rW+f_pAkbtKe|VnZXU3G>6i}s z4zj&i!7=F-Tb~t3NB`EO) zCTnVEq+ZoZ+EDj6hi~ldqS3=G!BXs*_SY4a<^In+4x&x1@iWdW&694%csWsQrH z$uSs1j|T3`A+vE;RforrfGm4i+q=;>HXJd7x;CT%%;je*Y@_(ehb(-OD1op-i&QuQRg+f@a7E0@f44$8Wj<2*I+PJmB+hBYhAh|Q;Xu`q|6ig&FnW7PSxH$E#$;%H+@1(??C9}aMK6Ex83)uEda6F2o9sno<1fhLIrzVw&D*($r56&e!9I!gB{2BSOnsep|t zgE3E%e8};u?sX`DXcH63HUXMO2BN{tM1PL~Ih5*?JKj|J!G$K;N`KsIU7`R&juyru zQ8UaIJ(8r2MBu<60G2xX94GQnpzV|jk^`oV#p;~brcKfw2#PvB4-U=YZxE5Rbfg>q z$=}=^mfVlt2V$9#u&P{Ej9V$>Sf+k5NfMS)x{0dVkyU*A%n<-oGF}=Iv(21ZY%|G> ztsYB9%ZkP~DfeQ#j4cqa9jVgsqEjJ=~)n8Jd8UZ-X$#EO>6`36tavI2LzRSTTq^VR%Qn$gE(%5@l>sc~3~gSyYS zN1PK_ePfBTh2mQ%AY#O5K&H_fAhZN`lyE739z&8g{NFQIxT(d+_ zY%-jwNB&^X&2B9?>5(-(9$QM-Si-zW%YB})Q~>T#Bpy2_w?uWNBMeSym_6rv5*R-QRC};I<7%J5)8bOBm9j<8+a(N2vB5% zG9yo;P%Mk2jyNIs9}60jjX7?nom}ZelzGk znc_%BW%gRV#-Se(>3kbT zTW3UuE1}0P+(lNKEx5!67paLulFlHE-8_x<9ZIS2#F8VdMG8$pLXLLn$eO#gHuTC(cB(x_4x%!l;<_aQ#Bq{tc1Tykyu=X1+S2l^kF!ab&diUg?<^ zLO(PpugOqxViCd87eG#$4rJ`X>_hPo+R>RAfjq&5FTLy{c4Zp z?`Ga6jL{^`jr5#@V^iioHpr$b(k(X1%{DBMy2{?l%@DEWR7;sDWX!r!Ri7@p5Qw3M z8sk6FJ~hvy_{GFN@g-dh;(8GNyX6vvCB}0yXT46Da~c;EPJQ&`4`?h-pjz6GctpHW4St-XbIo)gbpaR|p)L4^hLoWjV#TXWEsd+xr{@eqd3#&l`(Vd>J6pN)vS zLm94Z8>Joc#%(E+{B3^3xfJ$ySf-AVinFD!zcFSjY4?k6m*+q@= zX4?cDDVfMX%2#K#A->afyS49^wsS+Y?a_FT8tWvu-ATQ%1gg8K`cSRgh~%qbe($g3_;W%lB-$Q!_t6 zf5HWfo@3$Lw9C^<@$`}f241wmGz!vqJoXALfEjkGrwde_BgW42KjY9^>fj$d)N_r? z!t8Rh^>SdQSor~DKWX^sU}`l)agT*m4mhSE(`&Jz>@^Rv$6dBRay66a&OHTr4F4Q; z^i$*M4tL=(#&|dkKa$9bG7a5i7t7dR5anFE#&(a4KrJcjrcMqlLCc%d-p@ZWl-xd? zzo+KXD4x+tH_Q99U$MAJ+KJ0V?MDwiBb*!FDy8I<9hl>sAo*gFTmKidpPBa?OaQMe zM$aqAjn-&mJ+8jdyj`Cj=D1PiVrTbsmafF=mr^Sco#)o1CDhWI4CbD8BzhpA=X@7; zwL-Yek<)nA$UCq^Ff*ClW${6q(c` z{wcE(vnM6=&aJO_|s96#{R_waf2b>(j7yDk#`D& z1%y799>!KsYl1EFc|)Kj)2T@kmiw-%W&Q6>vc?1xq+%;4=sU2K9E_TXh9Wf7vKpB) zDF{?0a89opHE_G*79Tb^V2mOBL=wD(e@0o)Y|j0edv$4}R1@HiCYZ@*z~$-qmb2{P zjJNcM%Z!WyiRz{5%6$pqnq>`4tkHuqG_KfBl1h1eyysjYJ_dlpTg_%y=PowBad9X^ z3dktQKE4R!y`HhFuC)lzp@zKYHP#r(TIs4ql#Ztwi3$ToY`ZFsf=)>Nw0$$xc|cim!2S5m(jTZ;x3a3#vTwNtnWWbdFrQx1P443c(;f4 z++8HkYX1pS4LW&g0>7M7U=PF!m7vX64zCIzEy{|L1j5n%8Y8MnZn%5nQ3Hb=nm8t9 zqz9#kl9OeUg|aL2&W?oI9XjbDPNWKNs9X-dY?`Y|QnZ^kjJ6FdeGoj?&R8+(-*anr z;}L(Bm~wRxLx;>iyYi(PlNe7F{o{$12J6uz=?NeagDkiq z?c=0Cg-PqDlLb59N4u>q|6kD5$u>Ur-ftMhe6H}{0{cTCa^X*xzXcD+lGyd?T%UxF zr?OsoU0*&4pUxHi?>heKS@d$P$zieXKMufqXZFq z$SZ5I$cPh!amWfVz73|Z0({2yQzJ({km;;zqg^GgZ zDdozPF|e=-`ii5!jK5t>LLY&P?5c@V`MjsZ?uuejL}e@JBYj7usF#YRh!|!_ljj?O z@_s>(FpN?#lORkT^t5QKAg800V0Y+Oku855@h+8%P4y7v8%VJ<6PQH82zYP(`iK;d z3=mz2CN`01m}^04U}%`(7m?1Mm~~be4SQgc`?7GmB}-{;a+15Em`12`FaP>KUwbSoF>Q}+_6@ZkDIVy%;Ds7~F2}MJZ){;b$S_d!x^I+>JpT*GmYPmV>9vjX!F(!Ebr=J*~RoA zoa>VMrAU*7i(>6_i;%SUfB{orbG8cmLu0-FvGaoxooV2$iV4|a<7cO%fX^nK&g_OU z%+_bO^E8jXxhB!i(ez8f?SC!jozB9YO5f={^CwwK)V6M+7y5kY0=&j9HA!%pW;%$= z&wUKS^f*6T_dap(I(6JRF`O+cNWHH1+u>b1NPSt}SIhU8>9`vHgz+f1J%9UZW^eE4 zV*JYnr`RF3$F+ZBda~w1Gb#DY%MZIiI{+5R{ig|U1G{e#58h=D{ApheC-?nbBclGs zb`ovd*KL(gzWbg14gQm5xO2sOKF6uZF*(zn2`t-k`IV%aUam`s`AQF}%)ow7V%=N+(&F-^QMb($#C@Zc<4zsHhxVKlC-&8TT2m zmoeniIm7il)nQl;BJ`exm;pN*+qn4vZnW!KqmR`yKKc~`D^(N;?gcK|BOwp)PA;CwAgmLp41Vd3{a~OTGw&8*2#2^Y(3Z=WZ zhbCNS2ar<*PD#4Ex9CE)d8cprsp4YTUQrU#ogInP0MG&=yHp3uPKqQ#@AP=8(}zwo z#-4S6?5IyWZ{e3?${d`hA-F8tlyLy=kfHziZ3`w*rj8f5UNa`(KA#%pu5uHHBWX_ zUtubC=}}ar7^hP%tt`ouIStVv!qi{|5e8V>RZQX7lqoaD!f>WEJ??u@6xBRkzEI{+c4E4wP@AsNh5Y@#?+Xf z)@(Ir2h_(nFxX6fa%n}~Q`4@N=th-YSZeRhm@j6Ked?|btdUI7HgKxk4pE2vAe@k- zpJe)C;B2@@Q_XL6vEEvl6sf+PXJGt}+0!aUmD4!+^`iWSmoCVmA;=&u)KkCWR5;Fw z_&pu3UlWFIa=|X_%F#w$=lW`qH8+r5E?Pu&!`itfBEYV^>1Prqr!0g|)gXvbpe-dl zMj~VQRBKNnwVw`0{lS3qi_Djb^`b;o0kmA!9Rqz7`sm~a^M<55)1nLg=$fdbA2C(X zhF9>Sp(3R0%%JsDs}FeLy&6{rP@!jehjFqI{pkc9vQqsmHBeuHO`_3GHOugfX7~F3 zS-pOgvQe!{{sW3Sgu$}JZRR4&%aw`WEwoI3IYV!UrC!YsWEatnm8omth7u|NUMx!_ zApbl$F{9Kl&J(NSFL!b|;N86aqj2k*H@P!0$Bf#MRv$L3P%GzhENM$^Cj95Qz!#AZ z{6$2whWjN0&Z|lf&N2Ew?bf&@&Gr=eW5<`bKKR*n*5ha&eZB|Lh6y_UtXl=!LX^FpK?(v`Pj%ao!o;Rf3>B;pYJ{N%UZVMYEjHg%!LNV8 zLT6Gq6UJvp4YZX{MQhdQOT3=Vu=hM0!TI8qV#NPCLuMmZrw4iM84nf*-X9Q_j$qGt zM~LsvRbPktMc<|RykduaTm*5r!eS3$hCcMJOdc#X25*f@FwH%E( zrCKJLG;I8!WlM#WrK%9Lo^4A#?ei`#mu}Wi&-aLOR(idpdy(SI@KA9H%4>1GOB`#E zeb`L1^B42RAVRHS8Q!lQ{da9;Xg+W+lWqxC~YPB{c=l5J5=PqS4aO1>-_8%`z-jaHBDk+}seBf`I zty=0_ThpOnOwl0Yf?dlB-L#?z&@XYc-#R*TeN$-ux=w^T|D?^Wg3`O@qn9&GZHI}H zUk{-&;{47{l{?*~<1x8?kHEFqADR9;0}G-fdlRM>~#9%WXSgBBcY9*4HF7>ggBiBo^3 zyF#iyTN*dbpxsfpT~Csw(7q%3HU9Ul#X!sE=Ng;yhne4Ig>pGCs5pFYeJIh-Jj7o5 z-S^CiyP$|FGaI}##u%iziN9pFZ`Jlm$iD{D!*5htr@_5C?;E2(NRh1~sTLpDW`P89 z$wFwu_hzy;4Yq3c-b7HFrkKwoflGf!6)Y(~^&507<>Jdl3-1w9`yuub&v)x6SNNrI znnYW55b9@Y{4kGUo5nTjR-LHG3H7Dt5}j4}T@;dI!f~5!xQAy7j#Q`9sv97J$k`VSty&x7W5uTC$fmv(Um=nvpjsa5W?a=f zG^)*|9L?0W8KwlOMTLLLw&P4C{5ow+WdzqvQkHoS9EL|*tLm1UvDLEXecCH{dr1CU zBa%^m4_AiNgGshGaU&Vm&Z8*$*O9Kz-{nmwBJCM#(eFD!(qO*KBGV4rjY=&azqPu} z)JWFsX!Exwa#qyKtDQR9nhdhpRLnz%dHI2sHWR6t&&By{Ok=il;qN$f2GSE#mc})? zI(cy*(*<*lmNBXyUOzd}Ejvg?5K{e2uoKgFjbod9y;4Rtp77H~0nBdqamSyM3@I0T zaf$)=J6*>nNPqZU9B7sUnB+@1bwY!KE0YN>GK7m$#(#?InNEu=-S~;SJ*b%%BT9W# zYbq|dfnue<{qaMK=b2Wbs?A?@>EXq4i)D_zw7NSuxo0hD%>oPmGWh|}VecnRG1`TG zA$vguSU`y@$7@7mDwY#@QQtqHvUwGGRc5LPEMmXOy!s_P^Nm(^x5rQ^W%` z368Kb^Q?%{N#5^-pzPu zUD6e~#yRz?d3FP!p{K#akT-XXIc!2ZXXtJYS+l-|8(SYPNfEE_YE{n@T zF~I1HqIg=5gE4}P@%?WW4a08#h5QYU8+;0%cnB?0k;vvoj-}zBr#!3c6cL6139$f+ z3JT5-MRfX5Mp+a*n+A3xL9)mOdD|OOWkGhZ2T}kaQzw>X$?fmw2qF<&hCsnF{a|F0 zJ|u!ZlvrdIFiQVjI8L>P;^_~Cu7-OOMZ#YK3c)DI>Wv2+$N-UGLW%(r;zrsqMZ#WN z>{oYyNjg;OJ4UL^|)mP5qy?*+>7y~H69sac3by_dAQ*Z*zAL;gP*afA*>h;Re}uWlPE zYaeN9??K@2+RkBw_AcvMEbE@E>7HunhC#ZAYkC$TJyY#H6VRSv1oE!#U2p20Z||Ke z?^`MFTd(aKt?gg0>z}FXUux=Kg!Ip}^bdCrjC2i7L55%m;SC*zbq+7|4^Q@w%p;I@ z%h=M;*eG;-X=r@9dt$onKb$vgU~+L_avjkm@1NP5oLQWoS(=)K^~`M!&2J)j_w@YC z)WTBF;{M>`!PI}I$j4VM=T|n?R#p(CdwO+$Wc_e*eQOGKxC~offo=a+b$od9dV2GG zZToa%dw*f)9FZBH-Me1dKi=FwLP+lA!wcBa<=XMf`tj}V@y&lo?&Gu7)5oo|>y7jK zgY*B;+gq24Y{g)AU zI?i!Joy=8THR zy{V>1_*O?yi53is24|(nS47ff#`kmL@rhgvV9hCE^I|P1aVxZ}I{+C^btnVThWO)HDWn)MpBw^AS>ci;|$Zu%&1OmF)C6cyYI z%q3M1^kOUX+zw&mPs#PsNV!(wDk{zoQ-5xlJSzP$pk9#m?NIJJzSL>JO%DeN&P^{$ zxx2@dAbG6U4B;yp-eFmcIKdGv8Xh@x?%#8Yl#HfTtm8vjW|kAKX2?}ow6=5o!xZ@c z7jgIb4QKfH`(7`j4aVrbcalgDV)Wii)C58FAQC;%yF_QkD5Hpl{teH7_{c7d$pzyQq zwfP_c3Wy_0rN%-7ld#U}p~v1!;Ow%7S_S_t#~~mr5j#bGtxlB3r{N3y*z5M~qv)4Y|=sqae(1E&izaz z3sA(xt6=>I6AKO@cf}%P>cC}bSOChdQbaI5)03E;W5=VHHFFy5UWx>%HlD?o=sFT;mSSeGYN%R~{rNE{r!@r;Zu;M%kH z35h$=#8;;aW1W98db5urmR--K&-JOL0fmtItuv~g0wdY@W^frLR~|R+NI6ZMeBdrE z9{*D~fXP7T|dvENhZ4gq=? zS&Oct7&U11uJ^IYH@p!l)Y6X&huHug`*v#o)(LnQ&vBVOP|8IyQxp1U1@w%)%t`}& z$uL3>E7OoA-(e|`Q82y=q?cJOKk6gH*U!)A_Gu#iw2>6Dk$i}@{}JDoBNvV$WDee@ z;T;U+?x^L;HR3Vx@mCJ^{EauKg+t$GZdCV$m%?NnwH=H!esEIwDr}18YN3Qr@UTn5 zi(IS(4@Rv{*8v~)lV8ugC*%TYyIjF72t35_C5NcEyu5paIiF7s8>BlV!*Lk(J}!@A zVhPD}BvzZSOtI-LQ4Ksv1vCzMv%S;Qk(J}6BGoat(+P7;y9YK?>CHG;AM=Q8*oxK9 z#HKc1h%}%B9G(>UiPJoJS&tUhrQm-1)G_Hjz7ZXd2K*21PZrwXVdiy-4`KwD#Xd4_ zL-MF)i?s<)tS)AF3}d48kDQMp--=h?ea`*+`n&;!kK4rr{{6vPpn;tN;2;+8*ngx# zgce@_jZGJAZgY``-5dG-9jR2jHL$=A)h`PV>vge>e}Lpd?zO&XG2C7!-vRq$F^_jl z;Y>fS{dkHCyY-GkX$(z=z7vaKwp%y2dVPj@Jrz^9uh)7A#716B6sG-+wLi{d#}HZ& z{2Y@E#u4bY$>O6_3>v<(Tj01haxZv9cemnj+J_i^A5;x`VY%{kot^aeID^fvoxNda zK{P+hWg1Ckwj>dDjz8C1f;#%q6rvr1eqpkkycWU<`^P27$5Fb2@24l<@6c&< zS_yWu1=1(3muXhuXffK5h380oJUheNj=1%ss|f)up7pB)Oc$Te!fK)tUPI#6Ym^~Z z#c6KL2y{2@lt@FY-uaw_Ay#b{UyH$ zW#Vn{hf``pLU&hYI>8HVICWug4~Kkb!)6Syb6Z zUR(^L&f$G>xehl9dNnM1S=#qH{_jt%@%h{#Hne(o(j0+lx=n-5@<=rXEMw1jiS=SceZrCXXPjWSHV3 zn zzQ+}_#MM3@H2(EcEU^L4V8`!9mHBHrE~6MWHSoP)w-IPo!ucAXt(Q=M@6o43op)jc z=2&>b1ycX&q_iYle-nsP%xEy8ac%TG8BLi#ckA3JN+w=P?rw>4NBh+e;%Y$f%^~bzU=#2vJw7FdfLei zxH8?ik{(gQhAJqN$GH!4amo-W#b?{e5~*)=_Pv2Yd66#B1Ui^R-1YY^c8i*<5^7We3gPa98u5L(<@Nt|4fry5E zTw6;VUb+dT9yVh)j&v}d37R0N+o#Nw*(;pjB@pk?nb1^ETy1Gg8kwDc&7H{n>kGTIoa}L;7HgRq#Bu}nfRrdLetD!(=3eGQ7<)KKf<&LNki5(j03|2}8gYLwL6TmDRQt%Y4Xc zS7y?DYGsU!p`rK<9DI_Qz|S%mjvpTb%pk@kU&oSrFw%&(57BikJ?KLn8@!ICN(pV# zrvcYsmD5uyh{N!0VBabI3-}3OW;F0tED|i-yaV9-4T5ke&=d{DL%~Y?-~b4)iI_4N z2}kJDkmq56t-+Ltx7jziZDuS2`q^M~cJRYSfYupooEY9e3~Vuj5r+`Ut!Igy!*4yc z;Pkn48?aSBhI%ASjUB2u1z$8{aX-r;2IhQ@!56E+!qR~DNac~&U}4{8{JhDsWy`(Q zr;$VFg2l6H=&4IkvAJdl^i3}LI%0>N0Q|tDv2e}LvjJELj$2?wX5P0OJ@>@C95X}^ zf7Wwp${;hSoOx!j69OhxNHSHxKv{Sa1C|*nB-_Z)CnY1&xl8$Cm~sRmLw%@I*7h*oi{~{zmunCFv~WpEV_WO~X~2rj>nLvX7nZWw7!bhG zN(DqcWqXz0N-Uhe?s+*dhN0n~e>N5gWynFjdO-I2a_l3 z$Pztl5GsTE?>1*km5#z{VC8v-faXI#cyxLG$K@s>!CK<8{9*diIb^;lAWJf!G-?H2 z{h4P?nF!o^z(zB?_x8 z9_})Dp7lxtzQf<-B%aqvUp;h_r%G9KdfQ1NkTdI9AiCUCrQZ54_FF+&%{fEU^CQ?@ zT=T9vg6b~siA&wb+oGg)tlDzeLpXY0qXoYlHY*7CA7~YK$*CtHDjaQ-gd;i`s{h== zn9C|g%d$TT^!AtcP%u@CbhKYP*WI;tM=^Fh5~{_9wO&b;Spg99ur7Y*YU4W?u~;q1 zYL){#H9153(P8yh!Tf!J_MZZoeP$)()~LZt*i~zkekho>Hlrs#dusql+-Ha4VDf|iF_Nk;@nvcpNo zAa}5d7@*(s@FYLMZ`i;jyyWhAN8M_VlP6p}e(-NRmYBvE|7|m=zm~w*;2?3<+VI4l zUuME`OUvlkDGX(f7*G70YkLRuFU})h0J`53Cr%xQ{UW=!3xg+>bB ziz8~K$}sU=x&kmat+}q)E+|RC;&KtGCM{0(K(O?<)_6{)MfG?L{^;`HVMj%WUyXG| zo+m@80K>dM$h21Qd{F1`I&_gD1ix5wzLa=!Eq2m>t+KEK_6UU_OIRWSEWmGOrUg69 zYukOyhnH{4Z-q()&6hJO5T|9;XXl4Uk`EZD}f zrTXvkFO9sH^0bQj*(7@IT5kDK%oCh|94w0}`bwx^(m)$Vy;>(=u7wOyEVQ^BH)S&( zJIB9T7gO5TS^-^ICQO?BvRe6bY2uf8pQ`Z0x0A&)tM=@Gia)M1pDL%yr8{Y5M~e^V zzXVO^v<}3U_Zee%c~kmNz}LarV}0Y5pYEH=@0W>`B0M4g#U6UO1v z2m?Vl+;RkaCF`|JTVG|?_t0qqA_t~>7=A#st7e5&P!3kEE_$><W%(Rr$Xw*G??=@B|k#vP&E+>p@dL(qal0hbQEOC_ez^a>#Z@ z56e@va!F-(W|6z=+VyfPy~Rh{#@|~t;|qQZPt5$)`ztdhdNfD_D^VM(k!M_{D4T!8~P z?UPW;;nvkwKG@GMalMVhaEY8QBhof3x1&GaV ztfzrO41U{h=EBX~0# zd?R?h^UddlJ*P%*kt&VjPTjBbE9$i5nA`bGx2jN?8nud954p{A*PZ6qWjsG`+C+=g z-8Vs^dlsyh<2k^(!0v;9)1a^GFK^ME6hJw=f7U&Cag5J=v4p+DcB1eJ$-$Dro*o;@ z@$S|_re}(zDiAVmbL-Hvs6JMANEP0}E&`tpPngf6TZx@bM$19^Pv-mLh_7_#(MyZ^ z2+c3zP|_#S{ruqc|6Wi(G_Ejfbl+LNAXFtZb#IIRv&CclOxo!Y<%nHKXzbf_>!tl} zAvSR^PkKl6plD9GWX!2-yWZF^zF6PgJ)`NNULS<|cD%fsPp3JC_HDcnkJy`UM(2S= zEq?6jNno-CiRaH6-;Ri>Tq$9gliYrEQ2zv^lTmvrPeuI@a6d?Qm|O+tZAQqyZ`BKb z76o2&`%^OBRVwv;!phKoAe)8v84D}(GpiWTxB6L0aS@fMbQ;|~(=}&vIv{7dmG0Fa z1s*03a;^oTb~5CbP@I$MDhBT}`G!t zQd7J%ZX)}L*(3Y9d!Ash-Wp)>A(so(dik@C_}GOmAL*AzUTh6@k{tMthW>omU9Wg7 zSaC3T+t(LUOKkDsx3Q_!hsUVe%gy8-VISQ1hSY6qu1^HHrgk04u|>BdH6hI2V5V8o73AY)}bS;;SSi30)g`^_pxdtkx+z z&(&$w_vDvdR`v-oXiQm%YdN=~s4T!G)!@cqQGJQt%Dz`IG#>i3mi77;&Wu-ImV50K zO`E=ozh?{KV}1N3KMd;^D8w+xpSrx&F3jr<7cOb)FrG?K<_o_1?V7@G3ja3HrYR== zPQ@E5{Hv#I*&}k87{79g!PgNgV*|zB#p>FW*IYGq`d>e4R7)H8lhvwbJO3FU@jay7 zS0$5;DRwtw@TnBx{=HxEdg}uDg6Ftvv8te=GJ`!kB)NP#XD%Xr=(B!tG#k%TfOM(f z&eom#8tE+n8?Ua=u=(GUW3wz;>&PAn#Kxn7 z8%*w1m9<)>+MH2-gn>UEI3#b%Aoqgl7drEzB4toJvQyl6EmS3XlmUgd9duV(0 zE*_%1O1i(_Bw=itKq5mRw9_KVf>Bu`E91#qxpmw0N*z#7^W~(us;$X&jrWVj{b4gQ z%X!C5iROl2;)r+pkPXr>I@l0eV^tAKV3kA=8*$M0!34je~}<8hg1YV z{`yaM4PelthdJT7*yky+Nzq**oOfJ~hUUw_)J-G3jcwy!u5`*+o;|tg})GuqUrYqji?7xly znPMo0KU7)ByV_DOz8o~?R(1{&ve}587&9oZOH?j@J9KC~TWr!;u3hrh?C*Xj&_|MhrV*hG}!)n)O^&LjJG0pA!5f_oZkPmA6KodmqTbI+*lpwakr z|MxW(p=mcRk4Feupfw(^DT>6wBaHdZnn=~Ohq~A!LO9Td^sQ;{!#Q4*?41oT%CwJ@ z$1_Gd&=yo;+Arwf8E188OE+jb@VMAB!7cC&)1K+z^Igxcy_)8y18Lu^LXPd)owo;% zG0*Bw@URO=W4^fhiVMo%5MtFN39wnC9Hm0ayfHndI*iU@WhF< zGb-)5N(oA%sAEKyjJKq#3t^mJbT#U~3;RF%8gBVM;PI`Ir}R#Pk`B3B3CW&1KUsUA z(+}23wN&{}eiD&ZYIe!AuTFfY4TOZAq#W=M7o$!CbWK>C=kpJC=Z^!F-R3|(sS?Pb zUl05BcAsjtdJ~Yei~a+nn$bLa2Gq2#Y+WkLne2Be{u~B7&sRaRLtV#?84RsQm$5UpVOlh-kIHW4R_Q%+YCVv|?eagApN?ka_dExVu zXdS)elWcM7Rl{@qloV>^m^yY!&>CMXF6*E|7`m?zgL*u_)f%U?of983pAE4uw2E-= z^ogaF{r>#1ar!6S5R-kI$mFuwj8u+EzJ~oy?<~kaCHE#Q@}j0W^KipFWoI)*~Ke)Qx^w z8jWE2Uaxhf6mm}{2(4Lbf$2M$?U!JCIy?W!>A3L%HyrfnjA4-+8GdWLN&mV2lu;jO zVSq5>tdKy+)<^=4re8R|hZ4hyghHCaLOFIv^XGzNaAg{QDoQh*H!)?AyW`L$kEGh- z@Ki}b$`Gv9kFq~+aQ*8h)m#FNn#%L$v(i}7X|>bWKqN+nQQEbrn>S=XdP6^MP&qDV z7`1UE9%OT_X7mrUZG|ahiuIsuquWfYV3a+aOzAt63f3BhJFTSd79fn@0kf?lO_zF! zpj7opH{C%ntKSrq%$DU7BHfCy6Tsdip^m~VC04TMC)~)AOBb4tz(II%e~?w2m-4nV z^m~F$ilJOLzF!cK&e?ic;W~@_ZR2NDRw$b3`8F9o1R7}&w|hhGi)2m%bT-lFNH!$* zVrLX(BBp+UehzoUYi8_A_1~hhp32azI+C}T#$VMijnzU^YuOCrsY9oL&uo-KGa-Mm zGa@u7*a|aMI5IO$`8cLwmbKY&Q1Bvg(^hNzRrHgG{~_K)y=JP^KN4lzZEj>~ui;2XK{<;BQ+jx9T#ug`CTJGUZ4PLlOlO6p1!|=l zkEuzPQJY$p>S~o7AsH4ahn|AK8k{Mq2nA0u-6sE=*)anwmk%Lc;FzRJSBK2c(Gl}bzW9a*>;wt$ZO z_K1_cZLCP*nAg+L$ALx;Q%Ny#O*oN{(#vjTrhD_JfDtK}%;Y6gvMGy){o664!X$4q zo*>OJfBH;gI9Q7lnWjJLeLUJ}8OIuvtw%ic_MGJ9!=Z|_Iu24^@8D|`5H6>bY;dW; z17gQ&&8UUMLrF&Ik{Q}vQ}Rpe-{@mmEj2F1$70x)-FXwdfiK* zKsko@ge|#)XvmY!fgd3IJY5Jm@v1e(0hN+%UPN(7_X?-^bvt8cJ5@3VmEwrb)*>ot zDJ~DKnDRJn2LiZuBC;_167AHt9AC|Ln_mwke`7cD5rL|0|5kFK>eLEUdx$#JvTYp4 z0mM^2fV3ynC<1!<(2CSHWe8maS(zZIrcptD=D2ixenT=ioL<5#pZtJ`@h_vc1tR}P z9Q&v@;tMhC?_FB5exGCtTX>#K6S5CCG?l4M;TVtc=`9gvy|FC?IYO08^;==BrE&2< z^Rkaky|wb5Kf#JUU(;L_==4?jyc3WxiK!cdJvCxVA8ErJBZY8JLLq+_AiRbb!aHjZ{Jc(p)(vv+vWK-n6N;KtKppQ)PciU{cZ%T;*%Nddw zp!8{XfB4Pa=v@l<1HAN|D(a2J4K;r0Z=b0w%}8s=XDM4z@@aR??q?W&c%eno>~t}* z-U05GQMjj5RFQ{VSkV0FnAo3sf_ZVTx0;!->D@CBL%Gw#n{7ttY=lq`M{^jYycuVF ziL2?`nxOZ_WWSqJiQ%DS{8X?g&DJUda;X$Q!~|F1-hIwMxiL)n8%URiKJi9;0_BU+ z=UW!(PxVrAX~+=(lwD>(q^lIkg^9U;_WpS!}mD5Fck_W7&SL$s~}caq%I z<2W)7ZjPRaM+^8%{dsfJZQ9#<)o`*StkQ=clRzK5=}ZB+%w|^< zmdG)tIAvw6{u$)tfj&KKX7S=GBJVbR6;F#zcUn`KHN@m2MV+kvY+T&p3Cn={D%?Ua zX;gk&$>8n%@bDfRW9LE!le9_`i+dyeEk{G*~B=0yY zdpOC)yASh`(kMtLKJDpxf$N-Xm(r7VsH+m==U=MHY=cVav?~VGKk$wcxJ=92b9%Yr zDz$Rh@SLM~PV5}eQIWJAW_1xn^FlrXTElcX;Q>l*F()C$(ng zbt4%qwz3k?*NZn6N7-|-CHFhe@O9UOOq+=djELFQ1T6fiLQWSn9@4n)?O7`mQ&FImmTu_&>WBBH++wZ_|oO3uZB zOsuOdy)W_$Omat+Et7O*>QUaAHexIDt3A|M(h{B(l70t61Px1WmevTKK(907WjJ_ac`c3Es4%1k>nn&nX4#oQM4vH}2 zeyoM3sXX#E_EBNMLGqr=`}YE+y|>T5m^TZ2ETBu5b!jgjiY-;7^ojQ>h)I!7_viT~ z>~m=q)7Q6-q)H8A1V!;hduq1V0V?uQE;U|I3EJdn0Vb@&I$D+2))GF(ubyZb4GCym zV^S1-@~G?Z&4BEF6(Jeafw<5rMXfI|--@1V(5Y|0yX$A%<@Yd0|JRa5=GTvPOD1t1 zt!g}ieohqTtYizJHO>H5NyzW$w`e(}!Ad9*9`xqM4twT_j=h2jDM_*K9=;f0{$h59 zuK$J?a=0p))R1>?;CoqA+4)xQ{!72J@KPis zg5VJT420VoPmM{BK1tBqo=|I3K8z9O2%S?E*IUtarb zq-DFCe?jnZi;xKr+ zCUr(kmZ&$r*z`LLGVhVT_dOb0}7)cs%I?V@=MbORLA_Zdx@K%~^I>)mPo@^$=13yJr`$6BFSY&-b^pUm7y)&T5@@>m@$P% z;2;l2-JUi_HanbC+0qZ+p*YmtT(2zJpUX}snq0%S+){(Cv`kNU$IL?XJ8V0fY<{WS z5ZVJ-byd<(hvh{VH|-nc%Hx+e%p^%2%ahr9?w4h{Tg-XP-9sH~%5c=pE8Qd8c-v3F zLw(URZtcPygyw7BPAbA)ciI{@eQ;l8rW$tNh5vCfockhUHn(-$~2 z*aVCLJ-`h9r5U)rB%X>=%@W80(~gR?J|PLoO&wxZ-})II{7%+an*G;H`dTG{VhYd8 zkAIb!Z*2od(qHiNO#}JKevaTR*!>zAXNfOt4rX@zf}vQFaww$JuVZ4q_zdTC+LrBn#8hM(lDE%;kuN7dK03ee^CBC-u!LbkkH#_ zaRquKJRBVBWL2SHBT&Fo0wQ)A3f}Upgp9%q)=Xu09h{IfZ>~pNdCEGU&gj{RH5d5W zxF{T`H^$$dzHP_4tv08hLYP>mgR?Hl9s2YkINgMObm@m01q|#u?)&W$F@r(mg^7{J zPgxk#^}=44q5ab{l&!?=1IX`k2!jUG>c-rKb4cCe~HdD_?J)fUi#cRZU9HF_RwJD1A=e zL6{C_M&~Z9U+jhu+Xgw}hhd0_n6Pv3$54*$7#P46D;=I$-z1e#{b8PV(&Gp>TYM*t z3%*aX_punB=J(+*{k8v=?+iPh(FdO`0_X|tt;qjbW}9VkF)c)_#__USDl1!7_tPvY z<7?SR5mxRf32VfV&qaN((EO=L4W}^^jl`&}` z`jE-1kH2FmZ?*!SW~eytTxpZW9_> z$Lp^+HbifKp37rvQAAAWJmXty^u5=>NaDQyz6&^MMKL~aEXChFIPm4` z;XfkNnI{$)v9Gm5yA0B022&AJvhF8VIYaGf-lJ@n;w~vFhOMTo^M=+uREoC&lFiHk z!57s0$a-#?y&eJCdl~q+QM!s)8NWpCz=1E1rmWL2^rd^|!_E^=lWKe0*1`={X`?IW zQ-X?~x*ul7raP(izBaIE3p~2==^efnzpx(Ci;=7p}CclI^i#cK{>`t&sB;HxahWVkvb_@ zvT(0=D=FhnR*mS7J|=;kOn2O}FThLnq1OT~xPl;x)h4Ys*T4GNN8>&*T}y7$;Qpy2 z?Bq4VEZoM|RJ5YriFpYKNB`O+`4uU!H1WaAZ1Ofje7h26jMm>*mF)FyZ7McT6D)n_ z*HlNyd^|rpm8Xtoc#EVBM-LpjqYCf)`|fEtMOPO41}G0QaoWi z@R=#~mopoPl%d9d8u7dB$hnr38@-1H=vWl-0m-YwN3!NvkxCKw;9GB%f$?1LJRlUl zUSLPk9lSj3NN0eyN_Nx9g!esiqt(pT8QR7R3}H(X({SzonyL5NuE;q1hTh3B{;~s; z<9KXw3}M|JqyBBF6y3SBRXVA>Gv*~`&a6yQXryk1VrubDGn64OwaZwQNf@BBiN9lI z{DK#VmwmjWWI<|V^T){4RJ9+p44pN`bxs=UUb{{-@}!y6kYz7~4F4XFQZt^flxHB< zo~v>q@Fl}<G!e5!|nI-nGLAYjwvGa=(jgrC*i&`+?r>CP- z0M2%V%BmX8)8beaI%=ZIg8jbrG|Eh+r15uJi3;%=TK0KXP&7*&-q92%m$nww#!vV@F->3i&BiSI4L4+WNdMDKj37(871C(BLmBBk0XG|>Rp(MYz>D)R59~Jx z)gutoSCz0Dt!1*?%d=R57BoCW<%x6^i@8*gcr_+sgapu!^DfXaM&Pm8yNgH?EFtkD*gOM zZrH}c1FTAlx$7$j5AbTTc zV-=tl6&o_w#b+q77NzS=W~}qpm>^;V$$h4+;!>Dl6QZ+nkg?>Jh^w!3kqJ6Rt{B-R zZ_}xOd(bD4;sGQ#>6#wd^s7rpJjL&kl0CeilsWDivR9leY?t9|oxIK?b4rjY`U47G z{b-)0^l+)A4?8>WNtp?zXdX@lm6YKbN@*@mylVEO`$|Bqq{0oG(zj((U9#jh!j`9r z2r_;{D*Gt|8>%1?d-a604mOf%8y#}g{&eLR2Iq;CT80l37`kD%On?pR9W7Dt&sjC(P~>?-Lip0RX9$Jl=#3)T{(xDwF0)cPqg*<~p> z`6s^F%v=SXcpEYr+<+`#8cMW@U>(;Q1s(ZRu-3a{(k#SA`ZJGmy-5qA2k3P`{xPz#F~O@OFX_|}I)-?%Lk;A|A$Qt|eIw_WREHsSVQjj6c`j28 z_!r?i!^fk;l*h99lVL_AsGiXc(>OPSBWjpF@6zMVyjYwjSDF_Qp4pUNJPl!qk73M{XV{ll1q%NFE6;-Q(HhZo zz9F5?Za?bOHkXBM!`&40PG_lvS;nyA^lq!x9I9s82#ej0iRgYK|E!NMEG@??;1BVTOyeQXyt2sU0Yj;I*!vl?7EF+9~8JY6yTmo@mW z#R%Tk5WEv3^bsQ@!6J&PAtHg`eXSu15CfFd0DQ!Vs%uETc@SrLkUXm){VGQKxQ4Xc zgY2gm#iSV7-!lS2JS_GbJYqa7`~S_MBmcuib+EAXu_7WPBI6?B&*R{kN&cZ$llZ{^p*6=AQ8f&)nHR-qXL-JTUv zhdlMh=8uJ~leMk?Fy^(L!>yfzt=;p3y`vxdCtLe_KMpRo4*sK;w~sIOPHrCb^7+sG z2fci7_H*yz;`rk7UjFZN`Sj-I_s#FC`+xWMzcCN_;Qy~5LQF6&KKTk5tW=(X?;UuQ*%peTYE=m z*SBsfIVz$ss)+94kEnmsUEBiWk&KQyCX za}~E=Yku#IqsT@6y_&OV(lQe*l1;nT-yHmm>FRt)M(6H-_WJzo^S?j%e0d-(v8f!I z2kY7Im!7b(P8aXp907vdL2${$9x!&-y`(iMe=6rULEWa@&%ruQr}Ax zbL4({(OQ(jy?+ow=$*sHOJaLlqeSy6FJ_m0x5&@*tF13ei7XZDyoU_fb$Xi}^Y2E! zoQbWitRhClT%o}41p|LMt)x^Kg|^2zGkvzdKxUX7WFMbKnX6WTz~ z3Ut3bNN44+ay?Q|q{=^*7>`DZA#0J&^)?uXR3|xc4?dF*k#B9TJoJ#b zDrE~S<6g$3)r|sZm6n^*8e9g4=5j`la$^YiUGsV(Wbdr|C{_7v`Y5<&@)Q7?UNv@U zcaQiTyZso1evRQ?n}<>uxo&KQkz=?csU8<5@?~$h$B2{4@zt_O+ep$8NFVa+_X6~& zVtZ192?WH(E#r=OqqJN{-b@C?Xy6jk^)ZO#au(i+Kn>uAt{nSX?1jU8&xw0Rg{ql0 z=Uqz7Jr|mHks$<3m%;8FvdNVTATjH_vvoeu=?MS=sa2-UQlUBoflb<*^MWk=9LF{R zFC;h0UU|p^WVNPRw*s;C-FA@mWuc@Hv7`xZD?WML5jNnv-v>%z<^C6zyt*X>AHJ;P z(l-30DFX?vj$)rS=U~0bX615Iez=Z-_oEjeob~Vea2ufGyB?h{7CtezwSyn=^4W0b zg}?$NoF?Zil)BiV!?p9+epE9LC&dScvQL-Lru>Ih2c+ zZV2%=k_b8#<8Brl$`G?L&TJ(%9EyiKO!8# z9$l2N=jX;|Zzfh~&pY#J(i4lz*lnYoKLAa6`iJxjNSP*GP;m-%tq1 zYj&MXv7ba!4LRa5_kz|`15j_-GiP$l-a|%KKrl*8#IrvCV{UOk$HtJNO}WAA+?rUI z4xgHw6o=#II|tQQd1I+#*gvY&JM~OPz;OJ~r}kB_93$^jp^(sn`9PxT9#Fm!fvz37rhg!ivm=^3q z#cPb!IHt|lM&xp;s@Z^yroq!VeP)ix6c{eR=V+Qhq)U^Yi0hvuVlw_w{GEOFsaFC- zPul=R5iH|Y9WU?8ueMSxKHj7A-I`cCPa#yAp-fmWWL4M^McjO?J7n@_{4nzO=RGby zi!a8RzvpA!#39%x!lEWZe`u%&GLYII21$ULp%i+7FLzH(Heb1<)d};Kl81l5S0Q>c z@NF7j+P}lrVmn_{FfBZv){0pDk32h(|Ue(IyH&1EAfVIQdSyd|1IDy zAJHXYl151R%12&XkzWBe;MjT3i^U68V8W1Spdl5k!1uq;{F0KSq$p(`nIPzW=1*q4 z0>WEL$c(=9r;mK&FMkCvpaBq+&_P)s%l2gnRqnU{gBo1OM7_t5*+~Ta6-=!}8A8AO z=THCn)1U@F*nS5YS9|b><>UfaAWh%|1n2|>a)1YDfC#vNOrQh~_<#uLfDBk54_JXp zz<^7TflQErOHg!D@B}#{Ea2vUs4*TUXmTW&f-1OzEZBlB_<}GPgEBaSG+2W+c!M~Y z|ARWXgFM)SKKO$`7=%JNghW_`MtFosn1o8WgiP3kN~mijhz^oeHx{BaP}m6b;DF@x z7xQ2t*>Ht2k%ic>g;=PCU|3*^_l1ZMJU_4j4&VUtMuw801fjM8G;oG=Aq*1W0LLJQ zH&G1|umF7+3Br&hg@A`u5j=IM1Z!9gZnyvoumRcd2=lNsitqz(NCm zcnEc~i5^i6o+tt45D9enhAO~_WuXeE=!#?@Jc0O$l6Ve|pon%DM_r%-kO&K*7#G3g zhQNpkfY^#BQHXqq43szwpO}heQBw<$021Jeg}4CEXob00Qx32I&?t(&7>S)G{}|QA zjFxbX#b^?sBX8q~h0f>zgH{$wAOQ-X02`nUu&4mu*p7?5X-JZeFp^bBhNHM1pp!IF)P*Etkmu-tRoMvVK!qd&kz|mCT}g^3xsX(;jfVg_ zvjMg%D|yh(MKxNCw=f01~j3q}iDorvh(SjBVJBLMZ{a zD3&xJYO=YEhR}%#Ac(|AeCBwTD5(N_C;_xNi2`|>CX*z_DQ|DNc*W@e8ncp;u#UJX zl#)1(!?`iVxdF|jh{f5QYM7C9D2bs)o5$&Zx4DPXS(=ETcqX%lqGpH4X_||-eCNrB zaVU!S8JuU?pZxfq7c!vdDV}DzL-O`JT}YgKNSjdEl(*T9`iP3IxQ^fWoEw9Sy|yt0 z>YdLSq4W8milBI+W}F5(32=EK#wltSI+x2=qDWbi_sNgKlX>m>8w?c$A$+rQPTN36Q490HyW#rh@37{pgyX=%z#}YS>t( zkcf=@>6(zJrxZGxvH6CHnx-+T3T_yqqZy7_$_P*@l#a@zsA!IoT98D!3bOg86eYBx9ijJD5J*kXc`lcSbhKm=aUdpFzYLpUMkAxtLwknie>YXJe zt1a4wD!Cq8ii+`AQ;(RcV!EfJ8KIAwjj~7;1F4Tl35Zu}|D3*Rn#7r^Ci{a;iJi>JhnHH0DlnlvT8o-^2#be}v^t%KnX1IcrLeGx zia4hYI;s$hs`8o+r|Fxxxr`R;nuOY*dw7)Eu%&_+kEWTD-dLB3Fpmn*n;0922_T)( z`iSNr3*1oE*Mxvjwyh{Z^Uc{-aK0!Yg!Eexvc}a00`g!aMZ0iORl-Oulk6Mxmr`jFeyQj`7uw{A(B3qCIiV>)4G<$*QtxsA4$` z%V>pdh>fmF2AhkWW4Inqdx$~lq*JM~g2;|LYm3>it4Em*DqE_w7`Ay!w)WVHj);wf zK(K*0wTDoYVOv&8K&LM|xlWmlZ`r%liHTV2v%rf0`^dYth`Xjbyg^Ghm?(&@sIs=G zg`)e2#{jvv>8;xExl`(lcQ$fmeMG=qe;A->#s=*yNKDjBD;^FnUc~;{|`?2vLw3*pfjc`iIQ~si9aBm^Z2?Z ze4EbsmLiOr&2+qjc$P`LyR%4;DqyiGc?^*7171q3Kx?{oE0jTOnj0{orFo6f3&z=K z!){2xm0GCU;HN{WwX2wz?-|DS*v4FIj<;!teh9q!_@GiK!gacm>pQ`Vxd>Gpvn$)V z5)6;%V6yG|ob=e6$bh7hOb?i=kJh!w@u&*4ONbKOuxseXx$4ApYPSFBiQ4PIfb5Ml z>x-!AsodMdJDkYd3Yw7X#I+cZWbnY$S-bPQn+e;%Q(47@OUm^akmxYP`fI{wn9P>C zy?0BgyUfGC>x;`gwj}%r)i9yo_^_rs|HO*S!=Y)RvgnkciU^qNyE=6IsGYaT zxy)FI$LxwC485bAg^Go~4ZD!aJjG`0jXC@XpFC*!$jXOszvr;cs7bPlIE_;ayeRyi zdx*(Z@xh%7YHS>lBAm8w3BC@!$c%Wg$1tFq3&LhBo#Qyms7as8S&Qkojf-a?>nXXr ziKwHjqgC3e0~(>i{G>)X%I^xrI$fw*OPW0`vu!N7IsCwbCXLHX!@c~g-dfA=s>>2Q zvtUcY3i^;X%)fW&z^}Q|%&NirTaQzHsusL41p2~XT$C)kpOZk$`y|DNpt1uS!9?56 zbez$MImN>Wy%);34UGhn$-&G?o2UxV zcH68eE5G6Cv8OoDk$E8{YNDCw*=elH@jIqBo4~0$)tAVn-w23mx`soH&?uQCV(O^+ z+XY5xxuiU@txUw+Xu9r5k1-9&*(?m$c)$c%%vW66bYsoP%BTbx#GMGlir~%(Jlenb z#mW7r8dJ+98IDIxH+H?XJxK}R9M)L;)4~mj^3B`>J+w*;YN*Vw#`&6Enuxm%jX}xC zgecJ$3cTTa)YcG?^Z47m%CCo5(3AbY?3tTW68k~#g_c#F;4t;}Bx38%TjU<|Uq z1Foig&_({yO?ssOzTkNqwYZAnqdDB@UEf1V;y(@vP)eb6Sf{SN+uSX(u6?c8n2INy z;U@luiI}~<3yWOs$;zvsKwF!lxTFr=o%q?)nMvo_{ho*lhxnO!7vh$`n!r6;uJAj} zFsq;>PNW>l)^zy@q6*5to5r`z;sH63jLxA9`_^|Zkk4$Yd7d|1#cw(RvHGtayd#O4Ls5wjnLWvY^bKDv{U@*(rooL@1EU)DB>(tAZ_}-X0ny)P`mIT?ap8Kyk`|*|Fh!@U^^l+M{ zJk8#Xy{KHcCv2!NS;$Y(=AFjnv@Mo?3c-wd>MmaDs2iM*NtC@i&`V0(Cj66hBheCY z<9%$ZH1D2yyYRdin4r1wGs~Z0YsvC?qcm{LQN)ccE~`$@pFF(eLn@n4N%7Oz+_vrj zy9u;TZ_ZCX|Cb`VwFr&(h3(?Axsn8b@-%;sQ@9>)sd(*J!Ad-pG2hG5O1`B_-PPHK zIIGfHd(x?CxTT!KfiLvxUCRJ36;8R27F+6(!1DlY!q&X@Kn}&nJLi~-%s^}INL-~( z+p6QbwVMx)LBGNJSfBh^rGxH>di)3stj1?K`8n#0lMBc_ueR99>%E)P`DozrTcyDp z2|&A)lc?XqT;GwX@c>ESu6)6bOsC47?`z-Pg+20`4hUp|T`CI-4m4APN-7%;KY~h* zh>B!gG!6+08@f>SEE5{b!Oj2kLHO10eG-rwNi;^XAy=I67-hl!p_5(~)T(7+qpmdgt& zzMhv3yR!2Z?4t4G2c}#O6kU2ZZ67~(3XWwf_)eD!d$g=YgSUa;k3tA#L3E(R;UZOs zIx6{yYgEZ@N?OuzIAw#ymx3?_`;qLGKovArMnkBN%oKVUjUJSM(^fG}q&ju$LTrJi zQ9x;+Y-Vo?tYBS-!UOto6#{2YbvaPcsivrGG<@c&*VA9rSqs&6H2Ch=Ofu>YWn1ZJ ztW>;|VQ~VCDtpqLCK!eeY?R@r%Xj~QVc3niry0z=quw#e& z|KYFUpsIA`$pxFN>RN}%3gv5y+8;cBx+D~xqBA#MpOGaXcWDx_s_4=Mf*mI9uq9N5 z9XQA?ke7FUxMe+)&I|ZPwvmSV8;=~GNSU293appz=>m4(5F(yfg4rjh=yaTMxdav8bQsolQFVBwBFYBjt!0lphM6-@ zE*1X5TY?&9h>Kqs-58y5)X8S#kw_+aB#rHn_6{d3a>EELvG_vFcr?rc*@g^Cr%6Pg z`4W(Xc!4)xMBd_(U7QEl%AmSBu3V-$5Wod6{Xa50=dZ_{~0va zlOH4d9adVE@^pv|c?cakj3dt7BbIifnAlDu##zc-VFEQH-ZTnzNG3n06vqrgOgVH7 zfx2*15}xRxgiCUs0w!Ii<1hz{jQqIb4_h?d;@PQV0r-rooMQ8*lGIjf?X{nvLJ)Aw z1%+!yO3=^SGPv5h_O_c#)Zz`|N6mPW$br1B?=?;y|_u(68A(mF&XfUQY4GC$IeS%s20RwZhhitT^~U z`TX_RXRrPC+;{Ii_SS4g?B4VI_Wk+jr?39{?6<$XM!!-+4k|DU?Ed}u=db_%{GYFF zzUD9+@cKu<0vhmu2u$Gdp$JDv z!V;SBgeXj*3RlR&7P|0-FpQxLXGp^u+VF-r%%Ki<$ip7`@P|MQq7a8j#3CB;h)7JL z5|_xtCOYwnP{bhW+{Zv{Ax?A2!{Rrp(YbYXEPtmclh~q2M$0j5fa=po{TeuqaCz$) z8AIdO02Y@o!VzZYQd-OmNR>A#rCoU}qae9458mOAIW1|Jl3vjyMEQx0Mv9&=zL6OI zEW{-SbO$C8m5EKLXOId^*w(Ctie5mnPXn>z_Yi3jRko&lFzNRYdEZa(SW)xLy zvVU8WP`Q|vPOfo|b$7$n+aij&>reu7T@>7$+@>~lz;iMjRf-|#GR3jA^Py9rXiCkN z(eIFs7IT9e%R%@4VQ~N@~*5InZtnX%6UGnytUBfeR!OV{^eHk9dST7~83^XgNPPkGt3ZCpk89hsDM#^ed(4@;~ zwZdAl$<0>Q!xQl{Kx3QKyoEHS%zTp2aK}fyPrYXtv3a_9Bp8sXM9%`Di>3 z0~my~qZ~!r6h`dD27DhesN81D5$#cL!K9NWX9W#fk;z7~8e!h~wD%+Y9nW2E^VR&^ zLcDF2O8BgcB|hOpP_)VA%+!>Qq0uu}9r@5gqUn%SgxD2@I&Xv@LNlE4lPT-ciknCr zAYy2@P{M=;g=xGl1QQ9pt6eLRBvzP1Nupgi|AQusVzju_J=ct+(oTfh;-XsRf>(vz z)N!ti7OJGCP~w5lLbOw=8o?1IU^axAaapVDO0+6uCiAHtW6+1)#wy4VmS^BmDx|)( zmT|6?r5Ld*DW@2|ac*)!If5C=>{-s+qzp6q%(2^Cr<$Q?h9YWW7ny-19vQ*J_#BC& ziUn%Z2Z@Y7MB^MU+h-8MnWUFBRH}p0Ya@OBM~LdvCQ->a&V?dV_$D1^0!>mgBEdDE zC(Yq|*zd^?Ayh}i^`m&WIwf)0N|VADk!EBC7Es{~t~;f((>(~b?u}y8YB-cgd z0q)KMvzBZlCncM{PP4iFyHiv~F!r7c|IXyImq&qG65TeKtCG_ZP_6kZ)ucBz8o>;- z+^F6L*%ge9^^a%$L`;`<@K-E_mpbL<6011Iv>@^yUnJ(W;sSR*)Q#*&Tt}E=hWW4G z#8)bDgt5?>M$bgCO?=dQt>E0p%N1S`qIg{8IgvTjJtHA#YyjG23(YV4k$??_b{z^~ zRJha9bqPV_5HF#OT^be`=bRmh*YONAuc%c-?|Ya#5sI$=#hM#mhWWN6YeqFAoFEc4PHl3P zPW!0=^d8Z%;-8INlhaY|I^5heq|bI*OM*|)u)JreiCHLw6za%`Z>j(@z8?t~2j~67$=U-Z4gCHX- zpEgM`D0}ZFSHmzYe{puPB7n)Ef*;2r^WiMxlwUfLeOj^+7sU_E!7}wC97*^owY3dY zp;snxew8N>>UVZBGB;H6|9*;-6c_eZKEX@AXJ#=b3V%X>uvTiM@q~p%hF3*bgvMxa z;%A;v8oz`n`lb**!5t%3{I;|b!|UaD1#(?VBt189%X8w!{o#rHc!XojPxYy2R6 zB>`wucwhTrKWp=S(~~DU;S2#ma%7+x_TXy&kr{=i9QQ&V3CMp^abbC4P}Ue~1E?jw zGgJa7yY%Q01;5G{F@{QnR z3ijkx@6v`&*nF%KkK}THU>Fm0$RTEE3gWkn3BrE}GmY+r3iAO8wZu-KCxXUdRRO_X z;+0}x$WIH_8|`?2mBv?v(S;9Td(PL6yOv8f2Z2f`A$(yVarS;FK`uVIBisRf0U=Dj zq-bn2C2k@fP%$IY01%gk6HLMrr1xyIpcPtE97F~ed%}@9;%`kTARnnsE;nR(saLQF zXNm-whwx+M5n_bFRtC~a!$yMN0hxCw90`G9#+W#|5LiBu074lF!{T05XczW#Bm6-d z;^ByH5e(>;|0Y3FCnItyOLk&}Fc(b`5HJWBeOWYtc#hSGGaZ-+F|n2Y2!(`3fr{{Q zs#YJ9G!hNdn}|1v4hWKg=S$;he-&{Y4+0OlAZF6%m*SWw3OOZ22@WPEUlKzQ7g&-T z@K!bfm-p}$3)yMI*d!WxD);yx(y}vtS8{o|pb`@{RW=|A)`V4M5@ur)Brym9h;sJ{ zN5Bw@eG!|SWRtg68;*#Gn|Fs8fZBzNfBBb`AuXAP_lrYtCcsR*DeGRUadJNh4C<2 zN)xJ}{~X0JYTjUCJ~9}1d5@76pwYO0lxU7~QW{CPfn;H$yR}TuVw(_3ZrZRCT6i{q z_8&ItT`Bp7q63j#!J*5+g-L~!Xx9@Z8k-|wX9ARV_a`WUY9BrE6UpgODln8F11Mnz zG*#40eqj#45f)AdNXs4pta5VWk5J9hTS(z~K&l(H0ePY-YKR z&N4b?WhK%8s(M0fiJ<6J2IBs^_J;5 z|B3wv3&5wUSb{bIvuXY(kDmZgRR2p#apey{M|OP?o&GMa+j`eOY;fhcO0vjhQNxka2^` z;0WnfP@WMh^RgT2PSq2 zl9%BgE9cIp8U-K%bna1}s7Dhm=?vL|8m zsB~y{vEIOGdI1zoXKS0g4po{876CW{n<}R9YkN7M`_ZGMcp@IVfq(ZX`4Dq&k&FjS zFoxiHnlp@E|F@OYnuOC%SDOsbC!JDb1xA_Nv}9m5>W$Ra|r77jOf z&ndst(QH-WzwWCRe*tHc%C2LGubd|xCTa^&CS|=>K37&N?F92}u2hb{xGt!XN?tn&jtHVnB6?=p5^fmEYF2CM2~!M7 zNDXovFY*$j;+|wSWvW_n1M(t&B1@qfSea2^VQsSMFzjfCbL^s`;&1+=IJBX!Czm5LkX zgekxnUYx>X>SbW}h_*PDJ)LX+qT7B1dQ#xb4v2hcv-_l3^ zQrGlz)n{!wJj2wj=sGN=)kMWbG+jzNUDL&~QalA+l{3)K&<#(8bo*vQs>z zIh7qaH@SU5>OFVOOnal%o`ctsQ`*xsGLrp0m~AcP;=UdN|3d&naVT2bc1)bWO+!7w zx21O5uY=sJp_w12++-9J#xdN)Eh6pJ$so!`B&SJYB2*3C>vEgQ;(B&D?8M^fUqV^1i~ zHs;degtRoS#9G?|Hcq`oq_yId)m4=<;ng~_Nn&C;2pcma)9!>CZ|xe_;NeN45qiAg zedycV8KFB1r=li{=qP^oH7C)+ze{M6=3(W1nIk)VJOEBfGh zk>y5$c^fGk+O+2hJQN#uJd34B?*!yXf~zPSJNofaBEEw0RKMqK3xlC9&xv|)eQHy| zD5RO(qUU4dQFtH5RR}kJ=CG9h#c9Lg>;HN?P|fIU<5g2`-t3Gi z4dXHmc07SR>6t;GoE{sho4*zb;|cCEu}$B#GezG=>kA}LMO-?5130D|=GH`lgZv+O z6F2Ps4WFtI{|-08^Y3|~=FH^P5``OMRbrBSs`79gQ>tDdeN3eQ#W zYTtFPRFo5~W@M;D6+IjG@#``;CQn<>ev>Bu*R0i$Qd;m^V&-}N54wmjszuY{Fpb9L z*9qM7C_eI$9jK@7+OPetmxEgLo-Mq15x{uVL~q1#IOnPO>0UHCe{D~ul~N~uB3pL~ zOkWK-`bD3UqmzT)bkt~zYLH;+-he?c`*||kYGg}O9oi!5DbteLK*hiT8u%46m=kkg zsts!j?tsq9Kqe+4(r{o(u3l@H3@Y_M&mL-u8hb(YA~RN+wOCZM)3JDn_A(f_l7WAg zF$U>Z8fvJ2la>K?hY7>h^piE@y~{vI|FU)R>0u)>776b{QJhk5#EYfUkM*H-HMJq* zFZ&5Rn>92S@mQwh-8*`Rj3i#QG9DyzT)Eb*h|7OvsHCaLVHyDp8J!)=S*^teEM`(> zDFU3#lvkY6ty?l8oYK(B;u*tt>>0s@^Z^J94hjnrKT};~ic>!u5)KQIkrFghikDqK zkA#wiG)kCC8<8rOWJ)T73mZR)m#<`+5-OmvDvyv3kdu|KG>^1XsJjaa2@bSmQ!0h6 zil`EioPrxlu9?xRrm&Zdx*MjM8^np>6of99nGh;;}U3>Xcrh@j7lBwzDWPgSFynOGjftf&_)Q zO2YYUu~l6D&ho`bytwh>$dg+XD1oCh!vqZ_{v{HiCYBu!T}PmRCK;PQ0S{6gYU2VG zi8R_?^+So0U$zPHwo55-|4Kod_hDzH=Tw~+>zh9>p5*le^xa+Z5)&2orCvUvv*fC;fkkV4ClB3UEl zIL6@*^_;Yif`=$p&JO`GgIH+`rD9HO8x`mtgCf-u%S=V`*b-1;Ett}6=eYtTAuld- zp&`P6WQ+r~WH#C-CSt`Nlgia;=bd=wiOHC3-h*8w=`GgLB2k_fPGI3dchipJfyKxu zgSvUlbNw}k8+yv9iA-twAx2v40|1Ixk(;Kzq>5AzW(7)S3a%Dqs@#Z!9cEgJ zIOdj@1hpQfnc?PO|2jF6nWTy|Bx}@3FgAByKr@C4n6vf>q@;H_Hp3}QyurgtY1a*! z&b7nA!i+(Zsmb0Yap6WoS`rMKscjA*dF7iNrb6RpwQV_-d0KT*>;m?7*pZb(dT6Dd z3^(lX!wbQ)iYxm41uZ}J@+mJ;8w8__c`_FBQ)xj(6JCe3YGlj;@7_BpUNR}noPx|E z)ttY}skt$#FZPy8EBX}}4k~}r`ASgZHN_ff&WEa*+c4)`|B8eFiV1vSLTvfvm?tOjwPKna_SH_Sx+K>J#>}#)Shri2E6Lckv3#LeW_Iq zBjXA9vEofjvx?*oNgSToXd}|iOgr+^GWrMaISw+#yVtz)ydHj6v)YQ|G@T5p+#;sb zAKYal7(CJjlaSUDdo>MMFi907n$xFjov%EN30~$l$iWT<#C7)|UTLoOB)o7=gW}-` zlp+DWQ#c7zKw{5ul$0p35QQvdDUp&kMy$hN>Qtgo(FiNn!nFbKJ~w9E0qZ>~I0z1(hZpMX4;FF*idtIM1+_GVd%T(gKaR&PC$-Rnn9QW* zKr=V#!R%PD`Cb`On2ABKZbbi6+c-K_NSe_}Q8;O2IRp`!v3$Zmkf6{95A!~XOlBq{ z3|C=H^9^gjCpEOJPXDV#`B5LDy_(oobdudUA$9Xckkk0Jy zqA0oqw@iUhE{&8>jj07?z9C1Qun=`3D_14wX_F1S(k`>>Od(i`5Rt`|ja=)HcVc+H zixxE&Tmi?-=+~EY+Vr7_O{{Sw=Ad8VCwpl7mvdezFqj39H{d}>W#H${|*9p z8>PfzX0ci*DzRW=)9hBK)j(HBtrR4~#U~`{7&vm}s@hX)PWo2GwDx6ntw88wtR=En zMKGMdEYLe+^$b%!jdJLjnW0|6oW_80At+R=fDs$SC;EjF{EeZwRMs74#f_!42p6z2 zTOI|?H!||8(m?6UU)+{AtI8PDeghI3HBf?aQt$a!NCJ;Zr!z<&qR5xmG$Y@8c@0KrH^Z zoautl5H-|E^47Sxx&yCG2yDP`jfYoMFL;G$>iMZ1>yZKznC?%j7y^#eoBLNOVM5nOJF1!YdO@1rsSK!h;4Mz3R zV!>OK!6sy!eRwvox(VQznzUC@JK@6Q78`CqSOSOkOmy(Q4Mow;_nHxZ?xZN!fa101i zuwd89-nu_{Gf(7h5MZY&QXcc}x@QtqT&*|shS!pzT}Ke}=#kcGrqyV0M38XbvX({S z8f|Wdy*pV-%k`nJ$d`q$ry76)*}3buhu?G2}AI~}9dr8SBD5E?uYBv!=LNZ<4P^UvYiF&trdlYAr_ zH-vju6e6kLK%!J=EUBv&*LhVE{$i;YjiG`Ul%U%E{Tn3V|M8!xqU@M+k;N#(*0%Voh+t6<*{IgaueE!9xHR7@k5x5wa)z@OuuZO@5XU zol#bU;6-}@JKo@d|G*dTp&M&)6zV|T&9iv(8r$q5$|2sqm7rFBZLV-hExF_kvhZ)E< z>QEFe@)nb^B6>)Ny`)j0s6Lb7BhnO#*N{89^kDG<5P)Q7?h#0n$cvP?PM(-s_3>Y6 z!iaWwTkp^a<1h<-*d8y|2t{!g$kM&3f_IQu>xQ~kP1*L@rR$v8KfCc`jkM{@*^=Ml8xDX531y(Qx zPA~-r$q--gHcpU{pC}N3Ly+{ikW5ek46pzdAa~pVkhkRu{@9TJ2#{S+kze2ic=0w& z-~?VU5%?IBcu|meL65?t1Vq41522H#<&&3C|B=aoloolC{0NX(P+Cg)k6loZ5orZ4 z*)SLB1WYgmH))YxAdpjFl^@v<7a5jM*#%?ykH!%5%hSCyN=0 z4#AQ`8Idv8nTDB$o(U0%2{BV?l|#9im-z}jiI$~#91w{EDu4qNnUhWs0uWFLM6fkp z01^mL00A(Z#95rid7Q|ZoXWYJ%-NjI`JB)hozgj-)LEU@S)Brqo!Ysb0-&7Sxt-S; tp5i&4)|s8;d7kL$o!@Dm#<`x{nV!YD51!-cp7dFt?Af08Nu7ZJ06XEPhpGSo literal 0 HcmV?d00001 diff --git a/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/bootstrap-popovers.css b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/bootstrap-popovers.css new file mode 100755 index 00000000..0afc522e --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/bootstrap-popovers.css @@ -0,0 +1,2 @@ +.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.428571429;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px} +/*# sourceMappingURL=popover-dee30a8acd.css.map */ diff --git a/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/cmb2-fixes.css b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/cmb2-fixes.css new file mode 100755 index 00000000..becfc731 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/cmb2-fixes.css @@ -0,0 +1,3 @@ +.cmb2-wrap .iconpicker * { + box-sizing: content-box !important; +} diff --git a/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/font-awesome.min.css b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/font-awesome.min.css new file mode 100755 index 00000000..540440ce --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/fontawesome-iconpicker.min.css b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/fontawesome-iconpicker.min.css new file mode 100755 index 00000000..833fddba --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/css/fontawesome-iconpicker.min.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome Icon Picker + * https://itsjavi.com/fontawesome-iconpicker/ + * + * Originally written by (c) 2016 Javi Aguilar + * Licensed under the MIT License + * https://github.com/itsjavi/fontawesome-iconpicker/blob/master/LICENSE + * + */.iconpicker-popover.popover{position:absolute;top:0;left:0;display:none;max-width:none;padding:1px;text-align:left;width:216px;background:#f7f7f7}.iconpicker-popover.popover.top,.iconpicker-popover.popover.topLeftCorner,.iconpicker-popover.popover.topLeft,.iconpicker-popover.popover.topRight,.iconpicker-popover.popover.topRightCorner{margin-top:-10px}.iconpicker-popover.popover.right,.iconpicker-popover.popover.rightTop,.iconpicker-popover.popover.rightBottom{margin-left:10px}.iconpicker-popover.popover.bottom,.iconpicker-popover.popover.bottomRightCorner,.iconpicker-popover.popover.bottomRight,.iconpicker-popover.popover.bottomLeft,.iconpicker-popover.popover.bottomLeftCorner{margin-top:10px}.iconpicker-popover.popover.left,.iconpicker-popover.popover.leftBottom,.iconpicker-popover.popover.leftTop{margin-left:-10px}.iconpicker-popover.popover.inline{margin:0 0 12px 0;position:relative;display:inline-block;opacity:1;top:auto;left:auto;bottom:auto;right:auto;max-width:100%;box-shadow:none;z-index:auto;vertical-align:top}.iconpicker-popover.popover.inline>.arrow{display:none}.dropdown-menu .iconpicker-popover.inline{margin:0;border:none}.dropdown-menu.iconpicker-container{padding:0}.iconpicker-popover.popover .popover-title{padding:12px;font-size:13px;line-height:15px;border-bottom:1px solid #ebebeb;background-color:#f7f7f7}.iconpicker-popover.popover .popover-title input[type=search].iconpicker-search{margin:0 0 2px 0}.iconpicker-popover.popover .popover-title-text~input[type=search].iconpicker-search{margin-top:12px}.iconpicker-popover.popover .popover-content{padding:0px;text-align:center}.iconpicker-popover .popover-footer{float:none;clear:both;padding:12px;text-align:right;margin:0;border-top:1px solid #ebebeb;background-color:#f7f7f7}.iconpicker-popover .popover-footer:before,.iconpicker-popover .popover-footer:after{content:" ";display:table}.iconpicker-popover .popover-footer:after{clear:both}.iconpicker-popover .popover-footer .iconpicker-btn{margin-left:10px}.iconpicker-popover .popover-footer input[type=search].iconpicker-search{margin-bottom:12px}.iconpicker-popover.popover>.arrow,.iconpicker-popover.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.iconpicker-popover.popover>.arrow{border-width:11px}.iconpicker-popover.popover>.arrow:after{border-width:10px;content:""}.iconpicker-popover.popover.top>.arrow,.iconpicker-popover.popover.topLeft>.arrow,.iconpicker-popover.popover.topRight>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.iconpicker-popover.popover.top>.arrow:after,.iconpicker-popover.popover.topLeft>.arrow:after,.iconpicker-popover.popover.topRight>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.iconpicker-popover.popover.topLeft>.arrow{left:8px;margin-left:0}.iconpicker-popover.popover.topRight>.arrow{left:auto;right:8px;margin-left:0}.iconpicker-popover.popover.right>.arrow,.iconpicker-popover.popover.rightTop>.arrow,.iconpicker-popover.popover.rightBottom>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.iconpicker-popover.popover.right>.arrow:after,.iconpicker-popover.popover.rightTop>.arrow:after,.iconpicker-popover.popover.rightBottom>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.iconpicker-popover.popover.rightTop>.arrow{top:auto;bottom:8px;margin-top:0}.iconpicker-popover.popover.rightBottom>.arrow{top:8px;margin-top:0}.iconpicker-popover.popover.bottom>.arrow,.iconpicker-popover.popover.bottomRight>.arrow,.iconpicker-popover.popover.bottomLeft>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.iconpicker-popover.popover.bottom>.arrow:after,.iconpicker-popover.popover.bottomRight>.arrow:after,.iconpicker-popover.popover.bottomLeft>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.iconpicker-popover.popover.bottomLeft>.arrow{left:8px;margin-left:0}.iconpicker-popover.popover.bottomRight>.arrow{left:auto;right:8px;margin-left:0}.iconpicker-popover.popover.left>.arrow,.iconpicker-popover.popover.leftBottom>.arrow,.iconpicker-popover.popover.leftTop>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.iconpicker-popover.popover.left>.arrow:after,.iconpicker-popover.popover.leftBottom>.arrow:after,.iconpicker-popover.popover.leftTop>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.iconpicker-popover.popover.leftBottom>.arrow{top:8px;margin-top:0}.iconpicker-popover.popover.leftTop>.arrow{top:auto;bottom:8px;margin-top:0}.iconpicker{position:relative;text-align:left;text-shadow:none;line-height:0;display:block;margin:0;overflow:hidden}.iconpicker *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;position:relative}.iconpicker:before,.iconpicker:after{content:" ";display:table}.iconpicker:after{clear:both}.iconpicker .iconpicker-items{position:relative;clear:both;float:none;padding:12px 0 0 12px;background:#fff;margin:0;overflow:hidden;overflow-y:auto;min-height:49px;max-height:246px}.iconpicker .iconpicker-items:before,.iconpicker .iconpicker-items:after{content:" ";display:table}.iconpicker .iconpicker-items:after{clear:both}.iconpicker .iconpicker-item{float:left;width:14px;height:14px;padding:12px;margin:0 12px 12px 0;text-align:center;cursor:pointer;border-radius:3px;font-size:14px;box-shadow:0 0 0 1px #ddd;color:inherit}.iconpicker .iconpicker-item:hover:not(.iconpicker-selected){background-color:#eee}.iconpicker .iconpicker-item.iconpicker-selected{box-shadow:none;color:#fff}.iconpicker-component{cursor:pointer} \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/js/fontawesome-iconpicker.min.js b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/js/fontawesome-iconpicker.min.js new file mode 100755 index 00000000..2d3eb89d --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/js/fontawesome-iconpicker.min.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a(jQuery)}(function(a){a.ui=a.ui||{};a.ui.version="1.12.1";!function(){function b(a,b,c){return[parseFloat(a[0])*(l.test(a[0])?b/100:1),parseFloat(a[1])*(l.test(a[1])?c/100:1)]}function c(b,c){return parseInt(a.css(b,c),10)||0}function d(b){var c=b[0];return 9===c.nodeType?{width:b.width(),height:b.height(),offset:{top:0,left:0}}:a.isWindow(c)?{width:b.width(),height:b.height(),offset:{top:b.scrollTop(),left:b.scrollLeft()}}:c.preventDefault?{width:0,height:0,offset:{top:c.pageY,left:c.pageX}}:{width:b.outerWidth(),height:b.outerHeight(),offset:b.offset()}}var e,f=Math.max,g=Math.abs,h=/left|center|right/,i=/top|center|bottom/,j=/[\+\-]\d+(\.[\d]+)?%?/,k=/^\w+/,l=/%$/,m=a.fn.pos;a.pos={scrollbarWidth:function(){if(void 0!==e)return e;var b,c,d=a("
              "),f=d.children()[0];return a("body").append(d),b=f.offsetWidth,d.css("overflow","scroll"),c=f.offsetWidth,b===c&&(c=d[0].clientWidth),d.remove(),e=b-c},getScrollInfo:function(b){var c=b.isWindow||b.isDocument?"":b.element.css("overflow-x"),d=b.isWindow||b.isDocument?"":b.element.css("overflow-y"),e="scroll"===c||"auto"===c&&b.width0?"right":"center",vertical:h<0?"top":d>0?"bottom":"middle"};nf(g(d),g(h))?l.important="horizontal":l.important="vertical",e.using.call(this,a,l)}),i.offset(a.extend(z,{using:h}))})},a.ui.pos={_trigger:function(a,b,c,d){b.elem&&b.elem.trigger({type:c,position:a,positionData:b,triggered:d})},fit:{left:function(b,c){a.ui.pos._trigger(b,c,"posCollide","fitLeft");var d,e=c.within,g=e.isWindow?e.scrollLeft:e.offset.left,h=e.width,i=b.left-c.collisionPosition.marginLeft,j=g-i,k=i+c.collisionWidth-h-g;c.collisionWidth>h?j>0&&k<=0?(d=b.left+j+c.collisionWidth-h-g,b.left+=j-d):b.left=k>0&&j<=0?g:j>k?g+h-c.collisionWidth:g:j>0?b.left+=j:k>0?b.left-=k:b.left=f(b.left-i,b.left),a.ui.pos._trigger(b,c,"posCollided","fitLeft")},top:function(b,c){a.ui.pos._trigger(b,c,"posCollide","fitTop");var d,e=c.within,g=e.isWindow?e.scrollTop:e.offset.top,h=c.within.height,i=b.top-c.collisionPosition.marginTop,j=g-i,k=i+c.collisionHeight-h-g;c.collisionHeight>h?j>0&&k<=0?(d=b.top+j+c.collisionHeight-h-g,b.top+=j-d):b.top=k>0&&j<=0?g:j>k?g+h-c.collisionHeight:g:j>0?b.top+=j:k>0?b.top-=k:b.top=f(b.top-i,b.top),a.ui.pos._trigger(b,c,"posCollided","fitTop")}},flip:{left:function(b,c){a.ui.pos._trigger(b,c,"posCollide","flipLeft");var d,e,f=c.within,h=f.offset.left+f.scrollLeft,i=f.width,j=f.isWindow?f.scrollLeft:f.offset.left,k=b.left-c.collisionPosition.marginLeft,l=k-j,m=k+c.collisionWidth-i-j,n="left"===c.my[0]?-c.elemWidth:"right"===c.my[0]?c.elemWidth:0,o="left"===c.at[0]?c.targetWidth:"right"===c.at[0]?-c.targetWidth:0,p=-2*c.offset[0];l<0?((d=b.left+n+o+p+c.collisionWidth-i-h)<0||d0&&((e=b.left-c.collisionPosition.marginLeft+n+o+p-j)>0||g(e)0&&((d=b.top-c.collisionPosition.marginTop+o+p+q-j)>0||g(d)10&&e<11,b.innerHTML="",c.removeChild(b)}()}();a.ui.position}),function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):window.jQuery&&!window.jQuery.fn.iconpicker&&a(window.jQuery)}(function(a){"use strict";var b={isEmpty:function(a){return!1===a||""===a||null===a||void 0===a},isEmptyObject:function(a){return!0===this.isEmpty(a)||0===a.length},isElement:function(b){return a(b).length>0},isString:function(a){return"string"==typeof a||a instanceof String},isArray:function(b){return a.isArray(b)},inArray:function(b,c){return-1!==a.inArray(b,c)},throwError:function(a){throw"Font Awesome Icon Picker Exception: "+a}},c=function(d,e){this._id=c._idCounter++,this.element=a(d).addClass("iconpicker-element"),this._trigger("iconpickerCreate"),this.options=a.extend({},c.defaultOptions,this.element.data(),e),this.options.templates=a.extend({},c.defaultOptions.templates,this.options.templates),this.options.originalPlacement=this.options.placement,this.container=!!b.isElement(this.options.container)&&a(this.options.container),!1===this.container&&(this.element.is(".dropdown-toggle")?this.container=a("~ .dropdown-menu:first",this.element):this.container=this.element.is("input,textarea,button,.btn")?this.element.parent():this.element),this.container.addClass("iconpicker-container"),this.isDropdownMenu()&&(this.options.templates.search=!1,this.options.templates.buttons=!1,this.options.placement="inline"),this.input=!!this.element.is("input,textarea")&&this.element.addClass("iconpicker-input"),!1===this.input&&(this.input=this.container.find(this.options.input),this.input.is("input,textarea")||(this.input=!1)),this.component=this.isDropdownMenu()?this.container.parent().find(this.options.component):this.container.find(this.options.component),0===this.component.length?this.component=!1:this.component.find("i").addClass("iconpicker-component"),this._createPopover(),this._createIconpicker(),0===this.getAcceptButton().length&&(this.options.mustAccept=!1),this.isInputGroup()?this.container.parent().append(this.popover):this.container.append(this.popover),this._bindElementEvents(),this._bindWindowEvents(),this.update(this.options.selected),this.isInline()&&this.show(),this._trigger("iconpickerCreated")};c._idCounter=0,c.defaultOptions={title:!1,selected:!1,defaultValue:!1,placement:"bottom",collision:"none",animation:!0,hideOnSelect:!1,showFooter:!1,searchInFooter:!1,mustAccept:!1,selectedCustomClass:"bg-primary",icons:[],fullClassFormatter:function(a){return"fa "+a},input:"input,.iconpicker-input",inputSearch:!1,container:!1,component:".input-group-addon,.iconpicker-component",templates:{popover:'
              ',footer:'',buttons:' ',search:'',iconpicker:'
              ',iconpickerItem:'
              '}},c.batch=function(b,c){var d=Array.prototype.slice.call(arguments,2);return a(b).each(function(){var b=a(this).data("iconpicker");b&&b[c].apply(b,d)})},c.prototype={constructor:c,options:{},_id:0,_trigger:function(b,c){c=c||{},this.element.trigger(a.extend({type:b,iconpickerInstance:this},c))},_createPopover:function(){this.popover=a(this.options.templates.popover);var c=this.popover.find(".popover-title");if(this.options.title&&c.append(a('
              '+this.options.title+"
              ")),this.hasSeparatedSearchInput()&&!this.options.searchInFooter?c.append(this.options.templates.search):this.options.title||c.remove(),this.options.showFooter&&!b.isEmpty(this.options.templates.footer)){var d=a(this.options.templates.footer);this.hasSeparatedSearchInput()&&this.options.searchInFooter&&d.append(a(this.options.templates.search)),b.isEmpty(this.options.templates.buttons)||d.append(a(this.options.templates.buttons)),this.popover.append(d)}return!0===this.options.animation&&this.popover.addClass("fade"),this.popover},_createIconpicker:function(){var b=this;this.iconpicker=a(this.options.templates.iconpicker);var c=function(c){var d=a(this);return d.is("i")&&(d=d.parent()),b._trigger("iconpickerSelect",{iconpickerItem:d,iconpickerValue:b.iconpickerValue}),!1===b.options.mustAccept?(b.update(d.data("iconpickerValue")),b._trigger("iconpickerSelected",{iconpickerItem:this,iconpickerValue:b.iconpickerValue})):b.update(d.data("iconpickerValue"),!0),b.options.hideOnSelect&&!1===b.options.mustAccept&&b.hide(),c.preventDefault(),!1};for(var d in this.options.icons)if("string"==typeof this.options.icons[d]){var e=a(this.options.templates.iconpickerItem);e.find("i").addClass(this.options.fullClassFormatter(this.options.icons[d])),e.data("iconpickerValue",this.options.icons[d]).on("click.iconpicker",c),this.iconpicker.find(".iconpicker-items").append(e.attr("title","."+this.options.icons[d]))}return this.popover.find(".popover-content").append(this.iconpicker),this.iconpicker},_isEventInsideIconpicker:function(b){var c=a(b.target);return!((!c.hasClass("iconpicker-element")||c.hasClass("iconpicker-element")&&!c.is(this.element))&&0===c.parents(".iconpicker-popover").length)},_bindElementEvents:function(){var c=this;this.getSearchInput().on("keyup.iconpicker",function(){c.filter(a(this).val().toLowerCase())}),this.getAcceptButton().on("click.iconpicker",function(){var a=c.iconpicker.find(".iconpicker-selected").get(0);c.update(c.iconpickerValue),c._trigger("iconpickerSelected",{iconpickerItem:a,iconpickerValue:c.iconpickerValue}),c.isInline()||c.hide()}),this.getCancelButton().on("click.iconpicker",function(){c.isInline()||c.hide()}),this.element.on("focus.iconpicker",function(a){c.show(),a.stopPropagation()}),this.hasComponent()&&this.component.on("click.iconpicker",function(){c.toggle()}),this.hasInput()&&this.input.on("keyup.iconpicker",function(d){b.inArray(d.keyCode,[38,40,37,39,16,17,18,9,8,91,93,20,46,186,190,46,78,188,44,86])?c._updateFormGroupStatus(!1!==c.getValid(this.value)):c.update(),!0===c.options.inputSearch&&c.filter(a(this).val().toLowerCase())})},_bindWindowEvents:function(){var b=a(window.document),c=this,d=".iconpicker.inst"+this._id;return a(window).on("resize.iconpicker"+d+" orientationchange.iconpicker"+d,function(a){c.popover.hasClass("in")&&c.updatePlacement()}),c.isInline()||b.on("mouseup"+d,function(a){return c._isEventInsideIconpicker(a)||c.isInline()||c.hide(),a.stopPropagation(),a.preventDefault(),!1}),!1},_unbindElementEvents:function(){this.popover.off(".iconpicker"),this.element.off(".iconpicker"),this.hasInput()&&this.input.off(".iconpicker"),this.hasComponent()&&this.component.off(".iconpicker"),this.hasContainer()&&this.container.off(".iconpicker")},_unbindWindowEvents:function(){a(window).off(".iconpicker.inst"+this._id),a(window.document).off(".iconpicker.inst"+this._id)},updatePlacement:function(b,c){b=b||this.options.placement,this.options.placement=b,c=c||this.options.collision,c=!0===c?"flip":c;var d={at:"right bottom",my:"right top",of:this.hasInput()&&!this.isInputGroup()?this.input:this.container,collision:!0===c?"flip":c,within:window};if(this.popover.removeClass("inline topLeftCorner topLeft top topRight topRightCorner rightTop right rightBottom bottomRight bottomRightCorner bottom bottomLeft bottomLeftCorner leftBottom left leftTop"),"object"==typeof b)return this.popover.pos(a.extend({},d,b));switch(b){case"inline":d=!1;break;case"topLeftCorner":d.my="right bottom",d.at="left top";break;case"topLeft":d.my="left bottom",d.at="left top";break;case"top":d.my="center bottom",d.at="center top";break;case"topRight":d.my="right bottom",d.at="right top";break;case"topRightCorner":d.my="left bottom",d.at="right top";break;case"rightTop":d.my="left bottom",d.at="right center";break;case"right":d.my="left center",d.at="right center";break;case"rightBottom":d.my="left top",d.at="right center";break;case"bottomRightCorner":d.my="left top",d.at="right bottom";break;case"bottomRight":d.my="right top",d.at="right bottom";break;case"bottom":d.my="center top",d.at="center bottom";break;case"bottomLeft":d.my="left top",d.at="left bottom";break;case"bottomLeftCorner":d.my="right top",d.at="left bottom";break;case"leftBottom":d.my="right top",d.at="left center";break;case"left":d.my="right center",d.at="left center";break;case"leftTop":d.my="right bottom",d.at="left center";break;default:return!1}return this.popover.css({display:"inline"===this.options.placement?"":"block"}),!1!==d?this.popover.pos(d).css("maxWidth",a(window).width()-this.container.offset().left-5):this.popover.css({top:"auto",right:"auto",bottom:"auto",left:"auto",maxWidth:"none"}),this.popover.addClass(this.options.placement),!0},_updateComponents:function(){if(this.iconpicker.find(".iconpicker-item.iconpicker-selected").removeClass("iconpicker-selected "+this.options.selectedCustomClass),this.iconpickerValue&&this.iconpicker.find("."+this.options.fullClassFormatter(this.iconpickerValue).replace(/ /g,".")).parent().addClass("iconpicker-selected "+this.options.selectedCustomClass),this.hasComponent()){var a=this.component.find("i");a.length>0?a.attr("class",this.options.fullClassFormatter(this.iconpickerValue)):this.component.html(this.getHtml())}},_updateFormGroupStatus:function(a){return!!this.hasInput()&&(!1!==a?this.input.parents(".form-group:first").removeClass("has-error"):this.input.parents(".form-group:first").addClass("has-error"),!0)},getValid:function(c){b.isString(c)||(c="");var d=""===c;return c=a.trim(c),!(!b.inArray(c,this.options.icons)&&!d)&&c},setValue:function(a){var b=this.getValid(a);return!1!==b?(this.iconpickerValue=b,this._trigger("iconpickerSetValue",{iconpickerValue:b}),this.iconpickerValue):(this._trigger("iconpickerInvalid",{iconpickerValue:a}),!1)},getHtml:function(){return''},setSourceValue:function(a){return a=this.setValue(a),!1!==a&&""!==a&&(this.hasInput()?this.input.val(this.iconpickerValue):this.element.data("iconpickerValue",this.iconpickerValue),this._trigger("iconpickerSetSourceValue",{iconpickerValue:a})),a},getSourceValue:function(a){a=a||this.options.defaultValue;var b=a;return b=this.hasInput()?this.input.val():this.element.data("iconpickerValue"),void 0!==b&&""!==b&&null!==b&&!1!==b||(b=a),b},hasInput:function(){return!1!==this.input},isInputSearch:function(){return this.hasInput()&&!0===this.options.inputSearch},isInputGroup:function(){return this.container.is(".input-group")},isDropdownMenu:function(){return this.container.is(".dropdown-menu")},hasSeparatedSearchInput:function(){return!1!==this.options.templates.search&&!this.isInputSearch()},hasComponent:function(){return!1!==this.component},hasContainer:function(){return!1!==this.container},getAcceptButton:function(){return this.popover.find(".iconpicker-btn-accept")},getCancelButton:function(){return this.popover.find(".iconpicker-btn-cancel")},getSearchInput:function(){return this.popover.find(".iconpicker-search")},filter:function(c){if(b.isEmpty(c))return this.iconpicker.find(".iconpicker-item").show(),a(!1);var d=[];return this.iconpicker.find(".iconpicker-item").each(function(){var b=a(this),e=b.attr("title").toLowerCase(),f=!1;try{f=new RegExp(c,"g")}catch(a){f=!1}!1!==f&&e.match(f)?(d.push(b),b.show()):b.hide()}),d},show:function(){if(this.popover.hasClass("in"))return!1;a.iconpicker.batch(a(".iconpicker-popover.in:not(.inline)").not(this.popover),"hide"),this._trigger("iconpickerShow"),this.updatePlacement(),this.popover.addClass("in"),setTimeout(a.proxy(function(){this.popover.css("display",this.isInline()?"":"block"),this._trigger("iconpickerShown")},this),this.options.animation?300:1)},hide:function(){if(!this.popover.hasClass("in"))return!1;this._trigger("iconpickerHide"),this.popover.removeClass("in"),setTimeout(a.proxy(function(){this.popover.css("display","none"),this.getSearchInput().val(""),this.filter(""),this._trigger("iconpickerHidden")},this),this.options.animation?300:1)},toggle:function(){this.popover.is(":visible")?this.hide():this.show(!0)},update:function(a,b){return a=a||this.getSourceValue(this.iconpickerValue),this._trigger("iconpickerUpdate"),!0===b?a=this.setValue(a):(a=this.setSourceValue(a),this._updateFormGroupStatus(!1!==a)),!1!==a&&this._updateComponents(),this._trigger("iconpickerUpdated"),a},destroy:function(){this._trigger("iconpickerDestroy"),this.element.removeData("iconpicker").removeData("iconpickerValue").removeClass("iconpicker-element"),this._unbindElementEvents(),this._unbindWindowEvents(),a(this.popover).remove(),this._trigger("iconpickerDestroyed")},disable:function(){return!!this.hasInput()&&(this.input.prop("disabled",!0),!0)},enable:function(){return!!this.hasInput()&&(this.input.prop("disabled",!1),!0)},isDisabled:function(){return!!this.hasInput()&&!0===this.input.prop("disabled")},isInline:function(){return"inline"===this.options.placement||this.popover.hasClass("inline")}},a.iconpicker=c,a.fn.iconpicker=function(b){return this.each(function(){var d=a(this);d.data("iconpicker")||d.data("iconpicker",new c(this,"object"==typeof b?b:{}))})},c.defaultOptions.icons=["fa-500px","fa-address-book","fa-address-book-o","fa-address-card","fa-address-card-o","fa-adjust","fa-adn","fa-align-center","fa-align-justify","fa-align-left","fa-align-right","fa-amazon","fa-ambulance","fa-american-sign-language-interpreting","fa-anchor","fa-android","fa-angellist","fa-angle-double-down","fa-angle-double-left","fa-angle-double-right","fa-angle-double-up","fa-angle-down","fa-angle-left","fa-angle-right","fa-angle-up","fa-apple","fa-archive","fa-area-chart","fa-arrow-circle-down","fa-arrow-circle-left","fa-arrow-circle-o-down","fa-arrow-circle-o-left","fa-arrow-circle-o-right","fa-arrow-circle-o-up","fa-arrow-circle-right","fa-arrow-circle-up","fa-arrow-down","fa-arrow-left","fa-arrow-right","fa-arrow-up","fa-arrows","fa-arrows-alt","fa-arrows-h","fa-arrows-v","fa-asl-interpreting","fa-assistive-listening-systems","fa-asterisk","fa-at","fa-audio-description","fa-automobile","fa-backward","fa-balance-scale","fa-ban","fa-bandcamp","fa-bank","fa-bar-chart","fa-bar-chart-o","fa-barcode","fa-bars","fa-bath","fa-bathtub","fa-battery","fa-battery-0","fa-battery-1","fa-battery-2","fa-battery-3","fa-battery-4","fa-battery-empty","fa-battery-full","fa-battery-half","fa-battery-quarter","fa-battery-three-quarters","fa-bed","fa-beer","fa-behance","fa-behance-square","fa-bell","fa-bell-o","fa-bell-slash","fa-bell-slash-o","fa-bicycle","fa-binoculars","fa-birthday-cake","fa-bitbucket","fa-bitbucket-square","fa-bitcoin","fa-black-tie","fa-blind","fa-bluetooth","fa-bluetooth-b","fa-bold","fa-bolt","fa-bomb","fa-book","fa-bookmark","fa-bookmark-o","fa-braille","fa-briefcase","fa-btc","fa-bug","fa-building","fa-building-o","fa-bullhorn","fa-bullseye","fa-bus","fa-buysellads","fa-cab","fa-calculator","fa-calendar","fa-calendar-check-o","fa-calendar-minus-o","fa-calendar-o","fa-calendar-plus-o","fa-calendar-times-o","fa-camera","fa-camera-retro","fa-car","fa-caret-down","fa-caret-left","fa-caret-right","fa-caret-square-o-down","fa-caret-square-o-left","fa-caret-square-o-right","fa-caret-square-o-up","fa-caret-up","fa-cart-arrow-down","fa-cart-plus","fa-cc","fa-cc-amex","fa-cc-diners-club","fa-cc-discover","fa-cc-jcb","fa-cc-mastercard","fa-cc-paypal","fa-cc-stripe","fa-cc-visa","fa-certificate","fa-chain","fa-chain-broken","fa-check","fa-check-circle","fa-check-circle-o","fa-check-square","fa-check-square-o","fa-chevron-circle-down","fa-chevron-circle-left","fa-chevron-circle-right","fa-chevron-circle-up","fa-chevron-down","fa-chevron-left","fa-chevron-right","fa-chevron-up","fa-child","fa-chrome","fa-circle","fa-circle-o","fa-circle-o-notch","fa-circle-thin","fa-clipboard","fa-clock-o","fa-clone","fa-close","fa-cloud","fa-cloud-download","fa-cloud-upload","fa-cny","fa-code","fa-code-fork","fa-codepen","fa-codiepie","fa-coffee","fa-cog","fa-cogs","fa-columns","fa-comment","fa-comment-o","fa-commenting","fa-commenting-o","fa-comments","fa-comments-o","fa-compass","fa-compress","fa-connectdevelop","fa-contao","fa-copy","fa-copyright","fa-creative-commons","fa-credit-card","fa-credit-card-alt","fa-crop","fa-crosshairs","fa-css3","fa-cube","fa-cubes","fa-cut","fa-cutlery","fa-dashboard","fa-dashcube","fa-database","fa-deaf","fa-deafness","fa-dedent","fa-delicious","fa-desktop","fa-deviantart","fa-diamond","fa-digg","fa-dollar","fa-dot-circle-o","fa-download","fa-dribbble","fa-drivers-license","fa-drivers-license-o","fa-dropbox","fa-drupal","fa-edge","fa-edit","fa-eercast","fa-eject","fa-ellipsis-h","fa-ellipsis-v","fa-empire","fa-envelope","fa-envelope-o","fa-envelope-open","fa-envelope-open-o","fa-envelope-square","fa-envira","fa-eraser","fa-etsy","fa-eur","fa-euro","fa-exchange","fa-exclamation","fa-exclamation-circle","fa-exclamation-triangle","fa-expand","fa-expeditedssl","fa-external-link","fa-external-link-square","fa-eye","fa-eye-slash","fa-eyedropper","fa-fa","fa-facebook","fa-facebook-f","fa-facebook-official","fa-facebook-square","fa-fast-backward","fa-fast-forward","fa-fax","fa-feed","fa-female","fa-fighter-jet","fa-file","fa-file-archive-o","fa-file-audio-o","fa-file-code-o","fa-file-excel-o","fa-file-image-o","fa-file-movie-o","fa-file-o","fa-file-pdf-o","fa-file-photo-o","fa-file-picture-o","fa-file-powerpoint-o","fa-file-sound-o","fa-file-text","fa-file-text-o","fa-file-video-o","fa-file-word-o","fa-file-zip-o","fa-files-o","fa-film","fa-filter","fa-fire","fa-fire-extinguisher","fa-firefox","fa-first-order","fa-flag","fa-flag-checkered","fa-flag-o","fa-flash","fa-flask","fa-flickr","fa-floppy-o","fa-folder","fa-folder-o","fa-folder-open","fa-folder-open-o","fa-font","fa-font-awesome","fa-fonticons","fa-fort-awesome","fa-forumbee","fa-forward","fa-foursquare","fa-free-code-camp","fa-frown-o","fa-futbol-o","fa-gamepad","fa-gavel","fa-gbp","fa-ge","fa-gear","fa-gears","fa-genderless","fa-get-pocket","fa-gg","fa-gg-circle","fa-gift","fa-git","fa-git-square","fa-github","fa-github-alt","fa-github-square","fa-gitlab","fa-gittip","fa-glass","fa-glide","fa-glide-g","fa-globe","fa-google","fa-google-plus","fa-google-plus-circle","fa-google-plus-official","fa-google-plus-square","fa-google-wallet","fa-graduation-cap","fa-gratipay","fa-grav","fa-group","fa-h-square","fa-hacker-news","fa-hand-grab-o","fa-hand-lizard-o","fa-hand-o-down","fa-hand-o-left","fa-hand-o-right","fa-hand-o-up","fa-hand-paper-o","fa-hand-peace-o","fa-hand-pointer-o","fa-hand-rock-o","fa-hand-scissors-o","fa-hand-spock-o","fa-hand-stop-o","fa-handshake-o","fa-hard-of-hearing","fa-hashtag","fa-hdd-o","fa-header","fa-headphones","fa-heart","fa-heart-o","fa-heartbeat","fa-history","fa-home","fa-hospital-o","fa-hotel","fa-hourglass","fa-hourglass-1","fa-hourglass-2","fa-hourglass-3","fa-hourglass-end","fa-hourglass-half","fa-hourglass-o","fa-hourglass-start","fa-houzz","fa-html5","fa-i-cursor","fa-id-badge","fa-id-card","fa-id-card-o","fa-ils","fa-image","fa-imdb","fa-inbox","fa-indent","fa-industry","fa-info","fa-info-circle","fa-inr","fa-instagram","fa-institution","fa-internet-explorer","fa-intersex","fa-ioxhost","fa-italic","fa-joomla","fa-jpy","fa-jsfiddle","fa-key","fa-keyboard-o","fa-krw","fa-language","fa-laptop","fa-lastfm","fa-lastfm-square","fa-leaf","fa-leanpub","fa-legal","fa-lemon-o","fa-level-down","fa-level-up","fa-life-bouy","fa-life-buoy","fa-life-ring","fa-life-saver","fa-lightbulb-o","fa-line-chart","fa-link","fa-linkedin","fa-linkedin-square","fa-linode","fa-linux","fa-list","fa-list-alt","fa-list-ol","fa-list-ul","fa-location-arrow","fa-lock","fa-long-arrow-down","fa-long-arrow-left","fa-long-arrow-right","fa-long-arrow-up","fa-low-vision","fa-magic","fa-magnet","fa-mail-forward","fa-mail-reply","fa-mail-reply-all","fa-male","fa-map","fa-map-marker","fa-map-o","fa-map-pin","fa-map-signs","fa-mars","fa-mars-double","fa-mars-stroke","fa-mars-stroke-h","fa-mars-stroke-v","fa-maxcdn","fa-meanpath","fa-medium","fa-medkit","fa-meetup","fa-meh-o","fa-mercury","fa-microchip","fa-microphone","fa-microphone-slash","fa-minus","fa-minus-circle","fa-minus-square","fa-minus-square-o","fa-mixcloud","fa-mobile","fa-mobile-phone","fa-modx","fa-money","fa-moon-o","fa-mortar-board","fa-motorcycle","fa-mouse-pointer","fa-music","fa-navicon","fa-neuter","fa-newspaper-o","fa-object-group","fa-object-ungroup","fa-odnoklassniki","fa-odnoklassniki-square","fa-opencart","fa-openid","fa-opera","fa-optin-monster","fa-outdent","fa-pagelines","fa-paint-brush","fa-paper-plane","fa-paper-plane-o","fa-paperclip","fa-paragraph","fa-paste","fa-pause","fa-pause-circle","fa-pause-circle-o","fa-paw","fa-paypal","fa-pencil","fa-pencil-square","fa-pencil-square-o","fa-percent","fa-phone","fa-phone-square","fa-photo","fa-picture-o","fa-pie-chart","fa-pied-piper","fa-pied-piper-alt","fa-pied-piper-pp","fa-pinterest","fa-pinterest-p","fa-pinterest-square","fa-plane","fa-play","fa-play-circle","fa-play-circle-o","fa-plug","fa-plus","fa-plus-circle","fa-plus-square","fa-plus-square-o","fa-podcast","fa-power-off","fa-print","fa-product-hunt","fa-puzzle-piece","fa-qq","fa-qrcode","fa-question","fa-question-circle","fa-question-circle-o","fa-quora","fa-quote-left","fa-quote-right","fa-ra","fa-random","fa-ravelry","fa-rebel","fa-recycle","fa-reddit","fa-reddit-alien","fa-reddit-square","fa-refresh","fa-registered","fa-remove","fa-renren","fa-reorder","fa-repeat","fa-reply","fa-reply-all","fa-resistance","fa-retweet","fa-rmb","fa-road","fa-rocket","fa-rotate-left","fa-rotate-right","fa-rouble","fa-rss","fa-rss-square","fa-rub","fa-ruble","fa-rupee","fa-s15","fa-safari","fa-save","fa-scissors","fa-scribd","fa-search","fa-search-minus","fa-search-plus","fa-sellsy","fa-send","fa-send-o","fa-server","fa-share","fa-share-alt","fa-share-alt-square","fa-share-square","fa-share-square-o","fa-shekel","fa-sheqel","fa-shield","fa-ship","fa-shirtsinbulk","fa-shopping-bag","fa-shopping-basket","fa-shopping-cart","fa-shower","fa-sign-in","fa-sign-language","fa-sign-out","fa-signal","fa-signing","fa-simplybuilt","fa-sitemap","fa-skyatlas","fa-skype","fa-slack","fa-sliders","fa-slideshare","fa-smile-o","fa-snapchat","fa-snapchat-ghost","fa-snapchat-square","fa-snowflake-o","fa-soccer-ball-o","fa-sort","fa-sort-alpha-asc","fa-sort-alpha-desc","fa-sort-amount-asc","fa-sort-amount-desc","fa-sort-asc","fa-sort-desc","fa-sort-down","fa-sort-numeric-asc","fa-sort-numeric-desc","fa-sort-up","fa-soundcloud","fa-space-shuttle","fa-spinner","fa-spoon","fa-spotify","fa-square","fa-square-o","fa-stack-exchange","fa-stack-overflow","fa-star","fa-star-half","fa-star-half-empty","fa-star-half-full","fa-star-half-o","fa-star-o","fa-steam","fa-steam-square","fa-step-backward","fa-step-forward","fa-stethoscope","fa-sticky-note","fa-sticky-note-o","fa-stop","fa-stop-circle","fa-stop-circle-o","fa-street-view","fa-strikethrough","fa-stumbleupon","fa-stumbleupon-circle","fa-subscript","fa-subway","fa-suitcase","fa-sun-o","fa-superpowers","fa-superscript","fa-support","fa-table","fa-tablet","fa-tachometer","fa-tag","fa-tags","fa-tasks","fa-taxi","fa-telegram","fa-television","fa-tencent-weibo","fa-terminal","fa-text-height","fa-text-width","fa-th","fa-th-large","fa-th-list","fa-themeisle","fa-thermometer","fa-thermometer-0","fa-thermometer-1","fa-thermometer-2","fa-thermometer-3","fa-thermometer-4","fa-thermometer-empty","fa-thermometer-full","fa-thermometer-half","fa-thermometer-quarter","fa-thermometer-three-quarters","fa-thumb-tack","fa-thumbs-down","fa-thumbs-o-down","fa-thumbs-o-up","fa-thumbs-up","fa-ticket","fa-times","fa-times-circle","fa-times-circle-o","fa-times-rectangle","fa-times-rectangle-o","fa-tint","fa-toggle-down","fa-toggle-left","fa-toggle-off","fa-toggle-on","fa-toggle-right","fa-toggle-up","fa-trademark","fa-train","fa-transgender","fa-transgender-alt","fa-trash","fa-trash-o","fa-tree","fa-trello","fa-tripadvisor","fa-trophy","fa-truck","fa-try","fa-tty","fa-tumblr","fa-tumblr-square","fa-turkish-lira","fa-tv","fa-twitch","fa-twitter","fa-twitter-square","fa-umbrella","fa-underline","fa-undo","fa-universal-access","fa-university","fa-unlink","fa-unlock","fa-unlock-alt","fa-unsorted","fa-upload","fa-usb","fa-usd","fa-user","fa-user-circle","fa-user-circle-o","fa-user-md","fa-user-o","fa-user-plus","fa-user-secret","fa-user-times","fa-users","fa-vcard","fa-vcard-o","fa-venus","fa-venus-double","fa-venus-mars","fa-viacoin","fa-viadeo","fa-viadeo-square","fa-video-camera","fa-vimeo","fa-vimeo-square","fa-vine","fa-vk","fa-volume-control-phone","fa-volume-down","fa-volume-off","fa-volume-up","fa-warning","fa-wechat","fa-weibo","fa-weixin","fa-whatsapp","fa-wheelchair","fa-wheelchair-alt","fa-wifi","fa-wikipedia-w","fa-window-close","fa-window-close-o","fa-window-maximize","fa-window-minimize","fa-window-restore","fa-windows","fa-won","fa-wordpress","fa-wpbeginner","fa-wpexplorer","fa-wpforms","fa-wrench","fa-xing","fa-xing-square","fa-y-combinator","fa-y-combinator-square","fa-yahoo","fa-yc","fa-yc-square","fa-yelp","fa-yen","fa-yoast","fa-youtube","fa-youtube-play","fa-youtube-square"]}); \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/js/fontawesome-picker-init.js b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/js/fontawesome-picker-init.js new file mode 100755 index 00000000..cfb97e89 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/assets/js/fontawesome-picker-init.js @@ -0,0 +1,7 @@ + +jQuery(document).ready(function($) { + 'use strict'; + $('.fontawesome-icon-select').iconpicker({ + hideOnSelect: true + }); +}); // End Ready diff --git a/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/cmb2-fontawesome-picker.php b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/cmb2-fontawesome-picker.php new file mode 100755 index 00000000..12fc96ce --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/cmb2-fontawesome-picker.php @@ -0,0 +1,73 @@ +setup_admin_scripts(); + + echo $field_type->input( array( 'type' => 'text', 'class' => 'fontawesome-icon-select regular-text' ) ); + } + + /** + * Sanitize icon class name + */ + public function sanitize( $sanitized_val, $val ) { + if ( ! empty( $val ) ) { + return sanitize_html_class( $val ); + } + return $sanitized_val; + } + + /** + * Enqueue admin scripts for our font-awesome picker field type + */ + protected function setup_admin_scripts() { + $dir = trailingslashit( dirname( __FILE__ ) ); + + if ( 'WIN' === strtoupper( substr( PHP_OS, 0, 3 ) ) ) { + // Windows + $content_dir = str_replace( '/', DIRECTORY_SEPARATOR, WP_CONTENT_DIR ); + $content_url = str_replace( $content_dir, WP_CONTENT_URL, $dir ); + $url = str_replace( DIRECTORY_SEPARATOR, '/', $content_url ); + } + else { + $url = str_replace( + array( WP_CONTENT_DIR, WP_PLUGIN_DIR ), + array( WP_CONTENT_URL, WP_PLUGIN_URL ), + $dir + ); + } + + $url = set_url_scheme( $url ); + + $requirements = array( + 'jquery', + ); + + wp_enqueue_script( 'cmb2-fontawesome-picker', $url . 'assets/js/fontawesome-iconpicker.min.js', array('jquery'), self::VERSION, true ); + wp_enqueue_script( 'cmb2-fontawesome-picker-init', $url . 'assets/js/fontawesome-picker-init.js', array('cmb2-fontawesome-picker'), self::VERSION, true ); + + wp_enqueue_style( 'bootstrap-popovers', $url . 'assets/css/bootstrap-popovers.css', array('cmb2-fontawesome-css'), self::VERSION ); + wp_enqueue_style( 'cmb2-fontawesome-picker', $url . 'assets/css/fontawesome-iconpicker.min.css', array('bootstrap-popovers'), self::VERSION ); + wp_enqueue_style( 'cmb2-fontawesome-picker-fixes', $url . 'assets/css/cmb2-fixes.css', array('cmb2-fontawesome-picker'), self::VERSION ); + } +} +new KS_FontAwesome_IconPicker(); diff --git a/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/resources/bootstrap-popovers.scss b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/resources/bootstrap-popovers.scss new file mode 100755 index 00000000..159ae939 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2-fontawesome-icon-picker/resources/bootstrap-popovers.scss @@ -0,0 +1,18 @@ +@import '../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_variables.scss'; +@import '../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_mixins.scss'; + +// Contextual backgrounds +// For now we'll leave these alongside the text classes until v4 when we can +// safely shift things around (per SemVer rules). +.bg-primary { + // Given the contrast here, this is the only class to have its color inverted + // automatically. + color: #fff; +} +@include bg-variant('.bg-primary', $brand-primary); +@include bg-variant('.bg-success', $state-success-bg); +@include bg-variant('.bg-info', $state-info-bg); +@include bg-variant('.bg-warning', $state-warning-bg); +@include bg-variant('.bg-danger', $state-danger-bg); + +@import '../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_popovers.scss'; diff --git a/inc/vendors/cmb2-plugins/cmb2-tabs/assets/css/cmb2-tabs.css b/inc/vendors/cmb2-plugins/cmb2-tabs/assets/css/cmb2-tabs.css new file mode 100755 index 00000000..0fd2f1c4 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2-tabs/assets/css/cmb2-tabs.css @@ -0,0 +1,207 @@ +.ui-tabs .inside:after, .ui-tabs .ui-tabs-nav:after, .ui-tabs:after { + clear: both +} + +.ui-tabs .inside:after, .ui-tabs .ui-tabs-nav:after, .ui-tabs-vertical .cmb2-wrap .cmb-row:after, .ui-tabs:after { + content: ' '; + display: block +} + +div.cmb-type-tabs { + padding: 0 !important; + margin: -6px -12px -12px !important +} + +.ui-tabs { + position: relative; + background-color: #FFF; + padding-top: 10px; + padding-bottom: 20px; +} + +.cmb2-options-page div.cmb-type-tabs { + padding: 0 !important; + margin: 0 !important +} + +.cmb2-options-page .ui-tabs { + margin: 0 -10px; + border: 1px solid #e5e5e5; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .04); + box-shadow: 0 1px 1px rgba(0, 0, 0, .04) +} + +.ui-tabs h2.hndle { + background: #fff +} + +.ui-tabs .ui-tabs-nav { + margin: 6px 0 0 10px +} + +.ui-tabs .ui-tabs-nav li { + list-style: none; + float: left; + position: relative; + top: 0; + margin: 1px .2em 0 0; + border-bottom-width: 0; + padding: 0; + white-space: nowrap +} + +.ui-tabs .ui-tabs-nav li a { + display: block; + text-decoration: none; + font-size: 14px; + line-height: 18px; + padding: 10px 20px !important; + margin: 0 0 -1px; + border: 1px solid transparent; + border-top: 2px solid #f7f7f7; +} + +.ui-tabs .ui-tabs-nav li a:focus { + -webkit-box-shadow: none; + box-shadow: none +} + +.ui-tabs.ui-tabs-vertical .ui-tabs-nav .ui-tabs-anchor { + float: left; + /*padding: .5em 1em;*/ + text-decoration: none; + width: 153px; + padding: 10px 0 10px 10px !important; +} + +.ui-tabs.ui-tabs-horizontal .ui-tabs-nav .ui-tabs-anchor { + float: left; + padding: .5em 1em; + text-decoration: none; +} + +.ui-tabs .ui-tabs-nav li.ui-tabs-active { + margin-bottom: -1px; + padding-bottom: 1px; + border-bottom-width: 1px +} + +.ui-tabs .ui-tabs-nav li.ui-tabs-active a { + z-index: 50 !important; + background-color: #FFF; + border: 1px solid #E1E1E1; + border-bottom-color: #FFF; + border-top: 2px solid #2EA2CC; + margin: 0 0 -1px +} + +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { + cursor: default; +} + +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { + cursor: pointer +} + +.ui-tabs .ui-tabs-panel { + display: block; + border: none; + border-top: 1px solid #E1E1E1; + margin: 0; + padding: 20px; + background: #fff +} + +.ui-tabs .ui-tabs-panel h3 { + border-bottom: 1px solid #e9e9e9; + /*padding-bottom: 20px;*/ + /*margin-bottom: 20px*/ +} + +.ui-tabs .inside { + margin: 0 !important; + padding: 0 +} + +.ui-tabs-vertical { + padding-top: 0 +} + +.ui-tabs-vertical .ui-tabs-nav { + float: left; + width: 165px; + margin: 10px 0 0; + position: relative; + z-index: 10; + border-right: 1px solid #E1E1E1 +} + +.ui-tabs-vertical .ui-tabs-nav li { + clear: left; + width: 100%; + border-bottom-width: 1px !important; + border-right-width: 0 !important; + margin: 0 -1px .2em 0 +} + +.ui-tabs-vertical .ui-tabs-nav li.ui-tabs-active { + padding-bottom: 0; + padding-right: .1em; + border-right-width: 1px +} + +.ui-tabs-vertical .ui-tabs-nav li a { + padding: 10px 0 10px 10px !important; + border-top: none; + font-weight: bold; + color: #000; + font-size: 93% +} + +.ui-tabs-vertical .ui-tabs-nav li.ui-tabs-active a { + z-index: 50 !important; + background-color: #FFF; + border: 1px solid #E1E1E1; + border-right-color: #FFF; + border-left: 2px solid #2EA2CC; + margin: 0 -1px 0 0; + width: 153px; + padding: 10px 0 10px 10px !important +} + +.ui-tabs-vertical .ui-tabs-panel { + min-height: 200px; + border: none; + float: left; + width: calc(100% - 207px) +} + +.ui-tabs-vertical .cmb2-wrap .cmb-row { + margin: 6px 0 +} + +.ui-tabs-vertical .cmb2-wrap .cmb-row:after { + clear: both +} + +.ui-tabs-vertical .cmb2-wrap .cmb-th { + float: left; + width: 14%; + min-height: 32px; + line-height: 32px; + margin-right: 1% +} + +.ui-tabs-vertical .cmb2-wrap .cmb-td { + float: left; + width: 85% +} + +.ui-tabs-vertical .cmb2-wrap .cmb-td span.after_field { + display: inline-block; + width: 90px; + font-size: 13px; + padding: 0 5px +} \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2-tabs/assets/js/cmb2-tabs.js b/inc/vendors/cmb2-plugins/cmb2-tabs/assets/js/cmb2-tabs.js new file mode 100755 index 00000000..9f12b2e9 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2-tabs/assets/js/cmb2-tabs.js @@ -0,0 +1,10 @@ +(function ($) { + $(document).ready(function () { + // init jQuery UI Tabs + setTimeout(function () { + $( ".dtheme-cmb2-tabs" ).tabs(); + }); + }); +})(jQuery); + +jQuery.noConflict(); \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2-tabs/autoloader.php b/inc/vendors/cmb2-plugins/cmb2-tabs/autoloader.php new file mode 100755 index 00000000..20715641 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2-tabs/autoloader.php @@ -0,0 +1,11 @@ +setting = $field_object->args( 'tabs' ); + $this->object_id = $object_id; + + // Set layout + $layout = empty( $this->setting['layout'] ) ? 'ui-tabs-horizontal' : "ui-tabs-{$this->setting['layout']}"; + $default_data = version_compare( CMB2_VERSION, '2.2.2', '>=' ) ? array( + 'class' => "dtheme-cmb2-tabs $layout", + ) : $field_type_object->parse_args( $field_object->data_args(), 'tabs', array( + 'class' => "dtheme-cmb2-tabs $layout", + ) ); + + // Render field + echo sprintf( '
              %s
              ', $field_type_object->concat_attrs( $default_data, array( + 'value', + 'name', + 'type' + ) ), $this->get_tabs() ); + } + + + /** + * Render tabs + * + * @return string + */ + public function get_tabs() { + ob_start(); + ?> + +
                + setting['tabs'] as $key => $tab ): ?> +
              • + + + +
              • + +
              + + setting['tabs'] as $key => $tab ): ?> +
              + render_fields( $this->setting['config'], $tab['fields'], $this->object_id ); + ?> +
              + $fields ) ); + $CMB2 = new \CMB2( $setting_fields, $object_id ); + + foreach ( $fields as $key_field => $field ) { + if ( $CMB2->is_options_page_mb() ) { + $CMB2->object_type( $args['object_type'] ); + } + // Cmb2 render field + $CMB2->render_field( $field ); + } + } + + + /** + * Hook: Save field values + * + * @param $override_value + * @param $value + * @param $post_id + * @param $data + */ + public static function save( $override_value, $value, $post_id, $data ) { + foreach ( $data['tabs']['tabs'] as $tab ) { + $setting_fields = array_merge( $data['tabs']['config'], array( 'fields' => $tab['fields'] ) ); + $CMB2 = new \CMB2( $setting_fields, $post_id ); + + if ( $CMB2->is_options_page_mb() ) { + $cmb2_options = cmb2_options( $post_id ); + $id_fields = array_map( function( $field ) { + return $field['id']; + }, $tab['fields'] ); + + foreach ( $_POST as $key => $value ) { + if ( array_search( $key, $id_fields ) !== false ) { + $cmb2_options->update( $key, $value ); + } + } + } else { + $CMB2->save_fields(); + } + } + } + +} \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2-tabs/plugin.php b/inc/vendors/cmb2-plugins/cmb2-tabs/plugin.php new file mode 100755 index 00000000..9e336f41 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2-tabs/plugin.php @@ -0,0 +1,22 @@ +cmb_id, is the box id. + * + * @since 2.2.6 + * + * @param array $cmb The CMB2 object to hookup. + */ + do_action( "cmb2_init_hookup_{$cmb->cmb_id}", $cmb ); + } + + /** + * Fires after CMB2 initiation process has been completed + */ + do_action( 'cmb2_after_init' ); +} + +/* End. That's it, folks! */ diff --git a/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display-rtl.css b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display-rtl.css new file mode 100755 index 00000000..52882879 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display-rtl.css @@ -0,0 +1,45 @@ +/*! + * CMB2 - v2.6.0 - 2019-01-18 + * https://cmb2.io + * Copyright (c) 2019 + * Licensed GPLv2+ + */ + +/*-------------------------------------------------------------- + * CMB2 Display Styling +--------------------------------------------------------------*/ +/* line 6, sass/partials/_display.scss */ +.cmb2-colorpicker-swatch span { + display: inline-block; + width: 1em; + height: 1em; + border-radius: 1em; + float: right; + margin-top: 3px; + margin-left: 2px; +} + +/* line 17, sass/partials/_display.scss */ +.cmb2-code { + overflow: scroll; +} + +/* line 21, sass/partials/_display.scss */ +.cmb-image-display { + max-width: 100%; + height: auto; +} + +/* line 26, sass/partials/_display.scss */ +.cmb2-display-file-list li { + display: inline; + margin: 0 0 .5em .5em; +} + +/* line 31, sass/partials/_display.scss */ +.cmb2-oembed * { + max-width: 100%; + height: auto; +} + +/*# sourceMappingURL=cmb2-display.css.map */ diff --git a/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display-rtl.min.css b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display-rtl.min.css new file mode 100755 index 00000000..145926e6 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display-rtl.min.css @@ -0,0 +1,2 @@ +/*! CMB2 - v2.6.0 - 2019-01-18 | https://cmb2.io | Copyright (c) 2019 CMB2 team | Licensed GPLv2 */ +.cmb2-colorpicker-swatch span{display:inline-block;width:1em;height:1em;border-radius:1em;float:right;margin-top:3px;margin-left:2px}.cmb2-code{overflow:scroll}.cmb-image-display{max-width:100%;height:auto}.cmb2-display-file-list li{display:inline;margin:0 0 .5em .5em}.cmb2-oembed *{max-width:100%;height:auto} \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display.css b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display.css new file mode 100755 index 00000000..b44058b6 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display.css @@ -0,0 +1,45 @@ +/*! + * CMB2 - v2.6.0 - 2019-01-18 + * https://cmb2.io + * Copyright (c) 2019 + * Licensed GPLv2+ + */ + +/*-------------------------------------------------------------- + * CMB2 Display Styling +--------------------------------------------------------------*/ +/* line 6, sass/partials/_display.scss */ +.cmb2-colorpicker-swatch span { + display: inline-block; + width: 1em; + height: 1em; + border-radius: 1em; + float: left; + margin-top: 3px; + margin-right: 2px; +} + +/* line 17, sass/partials/_display.scss */ +.cmb2-code { + overflow: scroll; +} + +/* line 21, sass/partials/_display.scss */ +.cmb-image-display { + max-width: 100%; + height: auto; +} + +/* line 26, sass/partials/_display.scss */ +.cmb2-display-file-list li { + display: inline; + margin: 0 .5em .5em 0; +} + +/* line 31, sass/partials/_display.scss */ +.cmb2-oembed * { + max-width: 100%; + height: auto; +} + +/*# sourceMappingURL=cmb2-display.css.map */ diff --git a/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display.css.map b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display.css.map new file mode 100755 index 00000000..d7100806 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAAA;;gEAEgE;;AAG/D,6BAAK;EACJ,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,aAAa,EAAE,GAAG;EAClB,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,GAAG;EACf,YAAY,EAAE,GAAG;;;;AAInB,UAAW;EACV,QAAQ,EAAE,MAAM;;;;AAGjB,kBAAmB;EAClB,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,IAAI;;;;AAGb,0BAA2B;EAC1B,OAAO,EAAE,MAAM;EACf,MAAM,EAAE,aAAa;;;;AAGtB,cAAe;EACd,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,IAAI", +"sources": ["sass/partials/_display.scss"], +"names": [], +"file": "cmb2-display.css" +} diff --git a/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display.min.css b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display.min.css new file mode 100755 index 00000000..83b21690 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-display.min.css @@ -0,0 +1,2 @@ +/*! CMB2 - v2.6.0 - 2019-01-18 | https://cmb2.io | Copyright (c) 2019 CMB2 team | Licensed GPLv2 */ +.cmb2-colorpicker-swatch span{display:inline-block;width:1em;height:1em;border-radius:1em;float:left;margin-top:3px;margin-right:2px}.cmb2-code{overflow:scroll}.cmb-image-display{max-width:100%;height:auto}.cmb2-display-file-list li{display:inline;margin:0 .5em .5em 0}.cmb2-oembed *{max-width:100%;height:auto} \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2/css/cmb2-front-rtl.css b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-front-rtl.css new file mode 100755 index 00000000..286ed3d9 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-front-rtl.css @@ -0,0 +1,1331 @@ +/*! + * CMB2 - v2.6.0 - 2019-01-18 + * https://cmb2.io + * Copyright (c) 2019 + * Licensed GPLv2+ + */ + +@charset "UTF-8"; +/*-------------------------------------------------------------- + * Main Wrap +--------------------------------------------------------------*/ +/* line 5, sass/partials/_main_wrap.scss */ +.cmb2-wrap { + margin: 0; +} +/* line 8, sass/partials/_main_wrap.scss */ +.cmb2-wrap input, +.cmb2-wrap textarea { + font-size: 14px; + max-width: 100%; + padding: 5px; +} +/* line 18, sass/partials/_main_wrap.scss */ +.cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} +/* line 23, sass/partials/_main_wrap.scss */ +.cmb2-wrap textarea { + width: 500px; +} +/* line 26, sass/partials/_main_wrap.scss */ +.cmb2-wrap textarea.cmb2-textarea-code { + font-family: "Courier 10 Pitch", Courier, monospace; + line-height: 16px; +} +/* line 34, sass/partials/_main_wrap.scss */ +.cmb2-wrap input.cmb2-text-small, .cmb2-wrap input.cmb2-timepicker { + width: 100px; +} +/* line 40, sass/partials/_main_wrap.scss */ +.cmb2-wrap input.cmb2-text-money { + width: 90px; +} +/* line 45, sass/partials/_main_wrap.scss */ +.cmb2-wrap input.cmb2-text-medium { + width: 230px; +} +/* line 50, sass/partials/_main_wrap.scss */ +.cmb2-wrap input.cmb2-upload-file { + width: 65%; +} +/* line 54, sass/partials/_main_wrap.scss */ +.cmb2-wrap input.ed_button { + padding: 2px 4px; +} +/* line 59, sass/partials/_main_wrap.scss */ +.cmb2-wrap input:not([type="hidden"]) + input, +.cmb2-wrap input:not([type="hidden"]) + .button-secondary, +.cmb2-wrap input:not([type="hidden"]) + select { + margin-right: 20px; +} +/* line 67, sass/partials/_main_wrap.scss */ +.cmb2-wrap ul { + margin: 0; +} +/* line 71, sass/partials/_main_wrap.scss */ +.cmb2-wrap li { + font-size: 14px; + line-height: 16px; + margin: 1px 0 5px 0; +} +/* line 82, sass/partials/_main_wrap.scss */ +.cmb2-wrap select { + font-size: 14px; + margin-top: 3px; +} +/* line 87, sass/partials/_main_wrap.scss */ +.cmb2-wrap input:focus, +.cmb2-wrap textarea:focus { + background: #fffff8; +} +/* line 92, sass/partials/_main_wrap.scss */ +.cmb2-wrap input[type="radio"] { + margin: 0 0 0 5px; + padding: 0; +} +/* line 97, sass/partials/_main_wrap.scss */ +.cmb2-wrap input[type="checkbox"] { + margin: 0 0 0 5px; + padding: 0; +} +/* line 102, sass/partials/_main_wrap.scss */ +.cmb2-wrap button, +.cmb2-wrap .button-secondary { + white-space: nowrap; +} +/* line 107, sass/partials/_main_wrap.scss */ +.cmb2-wrap .mceLayout { + border: 1px solid #e9e9e9 !important; +} +/* line 111, sass/partials/_main_wrap.scss */ +.cmb2-wrap .mceIframeContainer { + background: #ffffff; +} +/* line 115, sass/partials/_main_wrap.scss */ +.cmb2-wrap .meta_mce { + width: 97%; +} +/* line 118, sass/partials/_main_wrap.scss */ +.cmb2-wrap .meta_mce textarea { + width: 100%; +} +/* line 124, sass/partials/_main_wrap.scss */ +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-input-wrap { + vertical-align: middle; +} +/* line 129, sass/partials/_main_wrap.scss */ +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-container { + margin: 0 0 0 10px; +} +/* line 134, sass/partials/_main_wrap.scss */ +.cmb2-wrap .cmb-row { + margin: 0; +} +/* line 137, sass/partials/_main_wrap.scss */ +.cmb2-wrap .cmb-row:after { + content: ''; + clear: both; + display: block; + width: 100%; +} +/* line 144, sass/partials/_main_wrap.scss */ +.cmb2-wrap .cmb-row.cmb-repeat .cmb2-metabox-description { + padding-top: 0; + padding-bottom: 1em; +} + +/* line 152, sass/partials/_main_wrap.scss */ +.cmb2-metabox { + clear: both; + margin: 0; +} +/* line 158, sass/partials/_main_wrap.scss */ +.cmb2-metabox > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox > .cmb-row:first-of-type > .cmb-th, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-th { + border: 0; +} + +/* line 165, sass/partials/_main_wrap.scss */ +.cmb-add-row { + margin: 1.8em 0 0; +} + +/* line 169, sass/partials/_main_wrap.scss */ +.cmb-nested .cmb-td, +.cmb-repeatable-group .cmb-th, +.cmb-repeatable-group:first-of-type { + border: 0; +} + +/* line 175, sass/partials/_main_wrap.scss */ +.cmb-row:last-of-type, +.cmb2-wrap .cmb-row:last-of-type, +.cmb-repeatable-group:last-of-type { + border-bottom: 0; +} + +/* line 181, sass/partials/_main_wrap.scss */ +.cmb-repeatable-grouping { + border: 1px solid #e9e9e9; + padding: 0 1em; +} +/* line 185, sass/partials/_main_wrap.scss */ +.cmb-repeatable-grouping.cmb-row { + margin: 0 0 0.8em; +} + +/* line 193, sass/partials/_main_wrap.scss */ +.cmb-th { + color: #222222; + float: right; + font-weight: 600; + line-height: 1.3; + padding: 20px 0 20px 10px; + vertical-align: top; + width: 200px; +} +@media (max-width: 450px) { + /* line 193, sass/partials/_main_wrap.scss */ + .cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: right; + width: 100%; + } + /* line 27, sass/partials/_mixins.scss */ + .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; + } +} + +/* line 207, sass/partials/_main_wrap.scss */ +.cmb-td { + line-height: 1.3; + max-width: 100%; + padding: 15px 10px; + vertical-align: middle; +} + +/* line 216, sass/partials/_main_wrap.scss */ +.cmb-type-title .cmb-td { + padding: 0; +} + +/* line 221, sass/partials/_main_wrap.scss */ +.cmb-th label { + display: block; + padding: 5px 0; +} + +/* line 226, sass/partials/_main_wrap.scss */ +.cmb-th + .cmb-td { + float: right; +} + +/* line 230, sass/partials/_main_wrap.scss */ +.cmb-td .cmb-td { + padding-bottom: 1em; +} + +/* line 234, sass/partials/_main_wrap.scss */ +.cmb-remove-row { + text-align: left; +} + +/* line 238, sass/partials/_main_wrap.scss */ +.empty-row.hidden { + display: none; +} + +/* line 243, sass/partials/_main_wrap.scss */ +.cmb-repeat-table { + background-color: #fafafa; + border: 1px solid #e1e1e1; +} +/* line 247, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-row.cmb-repeat-row { + position: relative; + counter-increment: el; + margin: 0; + padding: 10px 50px 10px 10px; + border-bottom: none !important; +} +/* line 255, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-row.cmb-repeat-row + .cmb-repeat-row { + border-top: solid 1px #e9e9e9; +} +/* line 259, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-row.cmb-repeat-row.ui-sortable-helper { + outline: dashed 2px #e9e9e9 !important; +} +/* line 263, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-row.cmb-repeat-row:before { + content: counter(el); + display: block; + top: 0; + right: 0; + position: absolute; + width: 35px; + height: 100%; + line-height: 35px; + cursor: move; + color: #757575; + text-align: center; + border-left: solid 1px #e9e9e9; +} +/* line 280, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-row.cmb-repeat-row .cmb-td { + margin: 0; + padding: 0; +} +/* line 287, sass/partials/_main_wrap.scss */ +.cmb-repeat-table + .cmb-add-row { + margin: 0; +} +/* line 290, sass/partials/_main_wrap.scss */ +.cmb-repeat-table + .cmb-add-row:before { + content: ''; + width: 1px; + height: 1.6em; + display: block; + margin-right: 17px; + background-color: gainsboro; +} +/* line 300, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-remove-row { + top: 7px; + left: 7px; + position: absolute; + width: auto; + margin-right: 0; + padding: 0 !important; + display: none; +} +/* line 311, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button { + font-size: 20px; + text-indent: -1000px; + overflow: hidden; + position: relative; + height: auto; + line-height: 1; + padding: 0 10px 0; +} +/* line 322, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button:before { + content: ""; + font-family: 'Dashicons'; + speak: none; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + margin: 0; + text-indent: 0; + position: absolute; + top: 0; + right: 0; + width: 100%; + height: 100%; + text-align: center; +} +/* line 328, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-repeat-row:hover .cmb-remove-row { + display: block; +} + +/* line 336, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-th { + padding: 5px; +} +/* line 340, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-group-title { + background-color: #e9e9e9; + padding: 8px 2.2em 8px 12px; + margin: 0 -1em; + min-height: 1.5em; + font-size: 14px; + line-height: 1.4; +} +/* line 348, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-group-title h4 { + border: 0; + margin: 0; + font-size: 1.2em; + font-weight: 500; + padding: 0.5em 0.75em; +} +/* line 356, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-group-title .cmb-th { + display: block; + width: 100%; +} +/* line 362, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-group-description .cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: right; + width: 100%; +} +/* line 27, sass/partials/_mixins.scss */ +.cmb-repeatable-group .cmb-group-description .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; +} +/* line 366, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-shift-rows { + font-size: 1em; + margin-left: 1em; + text-decoration: none; +} +/* line 371, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-shift-rows .dashicons { + font-size: 1.5em; + height: 1.5em; + line-height: 1.2em; + width: 1em; +} +/* line 377, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-shift-rows .dashicons.dashicons-arrow-down-alt2 { + line-height: 1.3em; +} +/* line 384, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb2-upload-button { + float: left; +} + +/* line 390, sass/partials/_main_wrap.scss */ +p.cmb2-metabox-description { + color: #757575; + font-style: italic; + margin: 0; + padding-top: .5em; +} + +/* line 397, sass/partials/_main_wrap.scss */ +span.cmb2-metabox-description { + color: #757575; + font-style: italic; +} + +/* line 402, sass/partials/_main_wrap.scss */ +.cmb2-metabox-title { + margin: 0 0 5px 0; + padding: 5px 0 0 0; + font-size: 14px; +} + +/* line 408, sass/partials/_main_wrap.scss */ +.cmb-inline ul { + padding: 4px 0 0 0; +} + +/* line 412, sass/partials/_main_wrap.scss */ +.cmb-inline li { + display: inline-block; + padding-left: 18px; +} + +/* line 417, sass/partials/_main_wrap.scss */ +.cmb-type-textarea-code pre { + margin: 0; +} + +/* line 423, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status { + clear: none; + display: inline-block; + vertical-align: middle; + margin-left: 10px; + width: auto; +} +/* line 430, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status img { + max-width: 350px; + height: auto; +} +/* line 436, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status img, +.cmb2-media-status .embed-status { + background: #eee; + border: 5px solid #ffffff; + outline: 1px solid #e9e9e9; + box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.05); + background-image: linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0), linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0); + background-position: 0 0, 10px 10px; + background-size: 20px 20px; + border-radius: 2px; + -moz-border-radius: 2px; + margin: 15px 0 0 0; +} +/* line 450, sass/partials/_main_wrap.scss */ +.cmb2-media-status .embed-status { + float: right; + max-width: 800px; +} +/* line 455, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status, .cmb2-media-status .embed-status { + position: relative; +} +/* line 458, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status .cmb2-remove-file-button, .cmb2-media-status .embed-status .cmb2-remove-file-button { + background: url(../images/ico-delete.png); + height: 16px; + right: -5px; + position: absolute; + text-indent: -9999px; + top: -5px; + width: 16px; +} +/* line 472, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status .cmb2-remove-file-button { + top: 10px; +} +/* line 477, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status img, .cmb2-media-status .file-status > span { + cursor: pointer; +} +/* line 482, sass/partials/_main_wrap.scss */ +.cmb2-media-status.cmb-attach-list .img-status img, .cmb2-media-status.cmb-attach-list .file-status > span { + cursor: move; +} + +/* line 489, sass/partials/_main_wrap.scss */ +.cmb-type-file-list .cmb2-media-status .img-status { + clear: none; + vertical-align: middle; + width: auto; + margin-left: 10px; + margin-bottom: 10px; + margin-top: 0; +} + +/* line 498, sass/partials/_main_wrap.scss */ +.cmb-attach-list li { + clear: both; + display: inline-block; + width: 100%; + margin-top: 5px; + margin-bottom: 10px; +} +/* line 504, sass/partials/_main_wrap.scss */ +.cmb-attach-list li img { + float: right; + margin-left: 10px; +} + +/* line 510, sass/partials/_main_wrap.scss */ +.cmb2-remove-wrapper { + margin: 0; +} + +/* line 514, sass/partials/_main_wrap.scss */ +.child-cmb2 .cmb-th { + text-align: right; +} + +/* line 518, sass/partials/_main_wrap.scss */ +.cmb2-indented-hierarchy { + padding-right: 1.5em; +} + +@media (max-width: 450px) { + /* line 523, sass/partials/_main_wrap.scss */ + .cmb-th, + .cmb-td, + .cmb-th + .cmb-td { + display: block; + float: none; + width: 100%; + } +} +/*-------------------------------------------------------------- + * Post Metaboxes +--------------------------------------------------------------*/ +/* line 5, sass/partials/_post_metaboxes.scss */ +#poststuff .cmb-group-title { + margin-right: -1em; + margin-left: -1em; + min-height: 1.5em; +} + +/* line 11, sass/partials/_post_metaboxes.scss */ +#poststuff .repeatable .cmb-group-title { + padding-right: 2.2em; +} + +/* line 17, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb2-wrap, .cmb-type-group .cmb2-wrap { + margin: 0; +} +/* line 20, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb2-wrap > .cmb-field-list > .cmb-row, .cmb-type-group .cmb2-wrap > .cmb-field-list > .cmb-row { + padding: 1.8em 0; +} +/* line 26, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb2-wrap input[type=text].cmb2-oembed, .cmb-type-group .cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} +/* line 32, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-row, .cmb-type-group .cmb-row { + padding: 0 0 1.8em; + margin: 0 0 0.8em; +} +/* line 36, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-row .cmbhandle, .cmb-type-group .cmb-row .cmbhandle { + left: -1em; + position: relative; + color: #222222; +} +/* line 43, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-repeatable-grouping, .cmb-type-group .cmb-repeatable-grouping { + padding: 0 1em; + max-width: 100%; + min-width: 1px !important; +} +/* line 49, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-repeatable-group > .cmb-row, .cmb-type-group .cmb-repeatable-group > .cmb-row { + padding-bottom: 0; +} +/* line 53, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-th, .cmb-type-group .cmb-th { + width: 18%; + padding: 0 0 0 2%; +} +/* line 59, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-td, .cmb-type-group .cmb-td { + margin-bottom: 0; + padding: 0; + line-height: 1.3; +} +/* line 65, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-th + .cmb-td, .cmb-type-group .cmb-th + .cmb-td { + width: 80%; + float: left; +} +/* line 70, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-row:not(:last-of-type), +.cmb2-postbox .cmb-repeatable-group:not(:last-of-type), .cmb-type-group .cmb-row:not(:last-of-type), +.cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 1px solid #e9e9e9; +} +@media (max-width: 450px) { + /* line 70, sass/partials/_post_metaboxes.scss */ + .cmb2-postbox .cmb-row:not(:last-of-type), + .cmb2-postbox .cmb-repeatable-group:not(:last-of-type), .cmb-type-group .cmb-row:not(:last-of-type), + .cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 0; + } +} +/* line 79, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-repeat-group-field, +.cmb2-postbox .cmb-remove-field-row, .cmb-type-group .cmb-repeat-group-field, +.cmb-type-group .cmb-remove-field-row { + padding-top: 1.8em; +} + +/*-------------------------------------------------------------- + * Context Metaboxes +--------------------------------------------------------------*/ +/* Metabox collapse arrow indicators */ +/* line 9, sass/partials/_context_metaboxes.scss */ +.js .cmb2-postbox.context-box .toggle-indicator:before { + content: "\f142"; + display: inline-block; + font: normal 20px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} +/* line 22, sass/partials/_context_metaboxes.scss */ +.js .cmb2-postbox.context-box.closed .toggle-indicator:before { + content: "\f140"; +} + +/* line 30, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box { + margin-bottom: 10px; +} +/* line 34, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box.context-before_permalink-box { + margin-top: 10px; +} +/* line 38, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box.context-after_title-box { + margin-top: 10px; +} +/* line 42, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box.context-after_editor-box { + margin-top: 20px; + margin-bottom: 0; +} +/* line 47, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box.context-form_top-box { + margin-top: 10px; +} +/* line 51, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box.context-form_top-box .hndle { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} +/* line 59, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box .hndle { + cursor: auto; +} + +/* line 64, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap { + margin-top: 10px; +} +/* line 68, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-left: 300px; + width: auto; +} +/* line 75, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap.cmb2-context-wrap-no-title .cmb2-metabox { + padding: 10px; +} +/* line 80, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap .cmb-th { + padding: 0 0 0 2%; + width: 18%; +} +/* line 85, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap .cmb-td { + width: 80%; + padding: 0; +} +/* line 90, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap .cmb-row { + margin-bottom: 10px; +} +/* line 93, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap .cmb-row:last-of-type { + margin-bottom: 0; +} + +/* one column on the post write/edit screen */ +@media only screen and (max-width: 850px) { + /* line 103, sass/partials/_context_metaboxes.scss */ + .cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-left: 0; + } +} +/*-------------------------------------------------------------- + * Misc. +--------------------------------------------------------------*/ +/* line 5, sass/partials/_misc.scss */ +#poststuff .cmb-repeatable-group h2 { + margin: 0; +} + +/* line 12, sass/partials/_misc.scss */ +.edit-tags-php .cmb2-metabox-title, +.profile-php .cmb2-metabox-title, +.user-edit-php .cmb2-metabox-title { + font-size: 1.4em; +} + +/* line 18, sass/partials/_misc.scss */ +.cmb2-postbox .cmb-spinner, .cmb2-no-box-wrap .cmb-spinner { + float: right; + display: none; +} + +/* line 24, sass/partials/_misc.scss */ +.cmb-spinner { + display: none; +} +/* line 26, sass/partials/_misc.scss */ +.cmb-spinner.is-active { + display: block; +} + +/*-------------------------------------------------------------- + * Collapsible UI +--------------------------------------------------------------*/ +/* line 6, sass/partials/_collapsible_ui.scss */ +.cmb2-metabox .cmbhandle { + color: #757575; + float: left; + width: 27px; + height: 30px; + cursor: pointer; + left: -1em; + position: relative; +} +/* line 14, sass/partials/_collapsible_ui.scss */ +.cmb2-metabox .cmbhandle:before { + content: '\f142'; + left: 12px; + font: normal 20px/1 'dashicons'; + speak: none; + display: inline-block; + padding: 8px 10px; + top: 0; + position: relative; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} +/* line 31, sass/partials/_collapsible_ui.scss */ +.cmb2-metabox .postbox.closed .cmbhandle:before { + content: '\f140'; +} +/* line 37, sass/partials/_collapsible_ui.scss */ +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row { + -webkit-appearance: none !important; + background: none !important; + border: none !important; + position: absolute; + right: 0; + top: .5em; + line-height: 1em; + padding: 2px 6px 3px; + opacity: .5; +} +/* line 47, sass/partials/_collapsible_ui.scss */ +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]) { + cursor: pointer; + color: #a00; + opacity: 1; +} +/* line 51, sass/partials/_collapsible_ui.scss */ +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]):hover { + color: #f00; +} + +/* + * jQuery UI CSS Framework 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * WordPress Styles adopted from "jQuery UI Datepicker CSS for WordPress" + * https://github.com/stuttter/wp-datepicker-styling + * + */ +/* line 15, sass/partials/_jquery_ui.scss */ +* html .cmb2-element.ui-helper-clearfix { + height: 1%; +} + +/* line 24, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker, .cmb2-element .ui-datepicker { + padding: 0; + margin: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + background-color: #fff; + border: 1px solid #dfdfdf; + border-top: none; + -webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + min-width: 17em; + width: auto; + /* Default Color Scheme */ +} +/* line 38, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker *, .cmb2-element .ui-datepicker * { + padding: 0; + font-family: "Open Sans", sans-serif; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +/* line 46, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker table, .cmb2-element .ui-datepicker table { + font-size: 13px; + margin: 0; + border: none; + border-collapse: collapse; +} +/* line 53, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, .cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background-image: none; + border: none; + color: #fff; + font-weight: normal; +} +/* line 61, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: transparent; + border-color: transparent; + cursor: pointer; +} +/* line 67, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-title, .cmb2-element .ui-datepicker .ui-datepicker-title { + margin: 0; + padding: 10px 0; + color: #fff; + font-size: 14px; + line-height: 14px; + text-align: center; +} +/* line 75, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-title select, .cmb2-element .ui-datepicker .ui-datepicker-title select { + margin-top: -8px; + margin-bottom: -8px; +} +/* line 81, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-next, .cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-next { + position: relative; + top: 0; + height: 34px; + width: 34px; +} +/* line 89, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-next, .cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-next { + border: none; +} +/* line 94, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover, .cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-prev-hover { + right: 0; +} +/* line 99, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-next, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover, .cmb2-element .ui-datepicker .ui-datepicker-next, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover { + left: 0; +} +/* line 104, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-next span, +.cmb2-element.ui-datepicker .ui-datepicker-prev span, .cmb2-element .ui-datepicker .ui-datepicker-next span, +.cmb2-element .ui-datepicker .ui-datepicker-prev span { + display: none; +} +/* line 109, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-prev, .cmb2-element .ui-datepicker .ui-datepicker-prev { + float: right; +} +/* line 113, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-next, .cmb2-element .ui-datepicker .ui-datepicker-next { + float: left; +} +/* line 117, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.cmb2-element.ui-datepicker .ui-datepicker-next:before, .cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.cmb2-element .ui-datepicker .ui-datepicker-next:before { + font: normal 20px/34px 'dashicons'; + padding-right: 7px; + color: #fff; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: 34px; + height: 34px; +} +/* line 129, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, .cmb2-element .ui-datepicker .ui-datepicker-prev:before { + content: '\f341'; +} +/* line 133, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-next:before, .cmb2-element .ui-datepicker .ui-datepicker-next:before { + content: '\f345'; +} +/* line 137, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover:before, .cmb2-element .ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover:before { + opacity: 0.7; +} +/* line 142, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker select.ui-datepicker-month, +.cmb2-element.ui-datepicker select.ui-datepicker-year, .cmb2-element .ui-datepicker select.ui-datepicker-month, +.cmb2-element .ui-datepicker select.ui-datepicker-year { + width: 33%; + background: transparent; + border-color: transparent; + box-shadow: none; + color: #fff; +} +/* line 149, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker select.ui-datepicker-month option, +.cmb2-element.ui-datepicker select.ui-datepicker-year option, .cmb2-element .ui-datepicker select.ui-datepicker-month option, +.cmb2-element .ui-datepicker select.ui-datepicker-year option { + color: #333; +} +/* line 154, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker thead, .cmb2-element .ui-datepicker thead { + color: #fff; + font-weight: 600; +} +/* line 157, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker thead th, .cmb2-element .ui-datepicker thead th { + font-weight: normal; +} +/* line 162, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker th, .cmb2-element .ui-datepicker th { + padding: 10px; +} +/* line 166, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td, .cmb2-element .ui-datepicker td { + padding: 0; + border: 1px solid #f4f4f4; +} +/* line 171, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td.ui-datepicker-other-month, .cmb2-element .ui-datepicker td.ui-datepicker-other-month { + border: transparent; +} +/* line 175, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td.ui-datepicker-week-end, .cmb2-element .ui-datepicker td.ui-datepicker-week-end { + background-color: #f4f4f4; + border: 1px solid #f4f4f4; +} +/* line 178, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today, .cmb2-element .ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today { + -webkit-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); +} +/* line 185, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td.ui-datepicker-today, .cmb2-element .ui-datepicker td.ui-datepicker-today { + background-color: #f0f0c0; +} +/* line 189, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td.ui-datepicker-current-day, .cmb2-element .ui-datepicker td.ui-datepicker-current-day { + background: #bbdd88; +} +/* line 193, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td .ui-state-default, .cmb2-element .ui-datepicker td .ui-state-default { + background: transparent; + border: none; + text-align: center; + text-decoration: none; + width: auto; + display: block; + padding: 5px 10px; + font-weight: normal; + color: #444; +} +/* line 205, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td.ui-state-disabled .ui-state-default, .cmb2-element .ui-datepicker td.ui-state-disabled .ui-state-default { + opacity: 0.5; +} +/* line 210, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, .cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} +/* line 215, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker thead, .cmb2-element .ui-datepicker thead { + background: #32373c; +} +/* line 219, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td .ui-state-hover, .cmb2-element.ui-datepicker td .ui-state-active, .cmb2-element .ui-datepicker td .ui-state-hover, .cmb2-element .ui-datepicker td .ui-state-active { + background: #0073aa; + color: #fff; +} +/* line 224, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div, .cmb2-element .ui-datepicker .ui-timepicker-div { + font-size: 14px; +} +/* line 226, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div dl, .cmb2-element .ui-datepicker .ui-timepicker-div dl { + text-align: right; + padding: 0 .6em; +} +/* line 229, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div dl dt, .cmb2-element .ui-datepicker .ui-timepicker-div dl dt { + float: right; + clear: right; + padding: 0 5px 0 0; +} +/* line 234, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd, .cmb2-element .ui-datepicker .ui-timepicker-div dl dd { + margin: 0 40% 10px 10px; +} +/* line 236, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd select, .cmb2-element .ui-datepicker .ui-timepicker-div dl dd select { + width: 100%; +} +/* line 242, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane { + padding: .6em; + text-align: right; +} +/* line 246, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, .cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary { + padding: 0 10px 1px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + margin: 0 .4em .4em .6em; +} + +/* line 260, sass/partials/_jquery_ui.scss */ +.admin-color-fresh .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-fresh .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} +/* line 265, sass/partials/_jquery_ui.scss */ +.admin-color-fresh .cmb2-element.ui-datepicker thead, .admin-color-fresh .cmb2-element .ui-datepicker thead { + background: #32373c; +} +/* line 269, sass/partials/_jquery_ui.scss */ +.admin-color-fresh .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-fresh .cmb2-element .ui-datepicker td .ui-state-hover { + background: #0073aa; + color: #fff; +} + +/* line 277, sass/partials/_jquery_ui.scss */ +.admin-color-blue .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-blue .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #52accc; +} +/* line 282, sass/partials/_jquery_ui.scss */ +.admin-color-blue .cmb2-element.ui-datepicker thead, .admin-color-blue .cmb2-element .ui-datepicker thead { + background: #4796b3; +} +/* line 291, sass/partials/_jquery_ui.scss */ +.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-blue .cmb2-element.ui-datepicker td .ui-state-active, .admin-color-blue .cmb2-element .ui-datepicker td .ui-state-hover, .admin-color-blue .cmb2-element .ui-datepicker td .ui-state-active { + background: #096484; + color: #fff; +} +/* line 296, sass/partials/_jquery_ui.scss */ +.admin-color-blue .cmb2-element.ui-datepicker td.ui-datepicker-today, .admin-color-blue .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +/* line 305, sass/partials/_jquery_ui.scss */ +.admin-color-coffee .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-coffee .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #59524c; +} +/* line 310, sass/partials/_jquery_ui.scss */ +.admin-color-coffee .cmb2-element.ui-datepicker thead, .admin-color-coffee .cmb2-element .ui-datepicker thead { + background: #46403c; +} +/* line 314, sass/partials/_jquery_ui.scss */ +.admin-color-coffee .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-coffee .cmb2-element .ui-datepicker td .ui-state-hover { + background: #c7a589; + color: #fff; +} + +/* line 322, sass/partials/_jquery_ui.scss */ +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #523f6d; +} +/* line 327, sass/partials/_jquery_ui.scss */ +.admin-color-ectoplasm .cmb2-element.ui-datepicker thead, .admin-color-ectoplasm .cmb2-element .ui-datepicker thead { + background: #413256; +} +/* line 331, sass/partials/_jquery_ui.scss */ +.admin-color-ectoplasm .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-ectoplasm .cmb2-element .ui-datepicker td .ui-state-hover { + background: #a3b745; + color: #fff; +} + +/* line 339, sass/partials/_jquery_ui.scss */ +.admin-color-midnight .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-midnight .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #363b3f; +} +/* line 344, sass/partials/_jquery_ui.scss */ +.admin-color-midnight .cmb2-element.ui-datepicker thead, .admin-color-midnight .cmb2-element .ui-datepicker thead { + background: #26292c; +} +/* line 348, sass/partials/_jquery_ui.scss */ +.admin-color-midnight .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-midnight .cmb2-element .ui-datepicker td .ui-state-hover { + background: #e14d43; + color: #fff; +} + +/* line 356, sass/partials/_jquery_ui.scss */ +.admin-color-ocean .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-ocean .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #738e96; +} +/* line 361, sass/partials/_jquery_ui.scss */ +.admin-color-ocean .cmb2-element.ui-datepicker thead, .admin-color-ocean .cmb2-element .ui-datepicker thead { + background: #627c83; +} +/* line 365, sass/partials/_jquery_ui.scss */ +.admin-color-ocean .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-ocean .cmb2-element .ui-datepicker td .ui-state-hover { + background: #9ebaa0; + color: #fff; +} + +/* line 373, sass/partials/_jquery_ui.scss */ +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, .admin-color-sunrise .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: #cf4944; +} +/* line 379, sass/partials/_jquery_ui.scss */ +.admin-color-sunrise .cmb2-element.ui-datepicker th, .admin-color-sunrise .cmb2-element .ui-datepicker th { + border-color: #be3631; + background: #be3631; +} +/* line 384, sass/partials/_jquery_ui.scss */ +.admin-color-sunrise .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-sunrise .cmb2-element .ui-datepicker td .ui-state-hover { + background: #dd823b; + color: #fff; +} + +/* line 392, sass/partials/_jquery_ui.scss */ +.admin-color-light .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-light .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #e5e5e5; +} +/* line 397, sass/partials/_jquery_ui.scss */ +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-year, .admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-year { + color: #555; +} +/* line 402, sass/partials/_jquery_ui.scss */ +.admin-color-light .cmb2-element.ui-datepicker thead, .admin-color-light .cmb2-element .ui-datepicker thead { + background: #888; +} +/* line 406, sass/partials/_jquery_ui.scss */ +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-next:before, .admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element .ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-next:before { + color: #555; +} +/* line 414, sass/partials/_jquery_ui.scss */ +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-light .cmb2-element.ui-datepicker td .ui-state-active, .admin-color-light .cmb2-element .ui-datepicker td .ui-state-hover, .admin-color-light .cmb2-element .ui-datepicker td .ui-state-active { + background: #ccc; +} +/* line 418, sass/partials/_jquery_ui.scss */ +.admin-color-light .cmb2-element.ui-datepicker td.ui-datepicker-today, .admin-color-light .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +/* line 426, sass/partials/_jquery_ui.scss */ +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #56b274; +} +/* line 431, sass/partials/_jquery_ui.scss */ +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker thead, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker thead { + background: #36533f; +} +/* line 435, sass/partials/_jquery_ui.scss */ +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker td .ui-state-hover { + background: #446950; + color: #fff; +} + +/* line 443, sass/partials/_jquery_ui.scss */ +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #4ca26a; +} +/* line 448, sass/partials/_jquery_ui.scss */ +.admin-color-bbp-mint .cmb2-element.ui-datepicker thead, .admin-color-bbp-mint .cmb2-element .ui-datepicker thead { + background: #4f6d59; +} +/* line 452, sass/partials/_jquery_ui.scss */ +.admin-color-bbp-mint .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-bbp-mint .cmb2-element .ui-datepicker td .ui-state-hover { + background: #5fb37c; + color: #fff; +} + +/** + * CMB2 Frontend + */ +/*-------------------------------------------------------------- + * CMB2 Frontend +--------------------------------------------------------------*/ +/* line 5, sass/partials/_front.scss */ +.closed .inside { + display: none; +} + +/* line 9, sass/partials/_front.scss */ +.cmb-repeatable-grouping { + position: relative; +} +/* line 12, sass/partials/_front.scss */ +.cmb-repeatable-grouping .cmb-group-title { + margin-right: -1em; + margin-left: -1em; + min-height: 1.5em; +} +/* line 18, sass/partials/_front.scss */ +.cmb-repeatable-grouping h3 { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} + +/* line 29, sass/partials/_front.scss */ +.cmb-repeatable-group.repeatable .cmb-group-title { + padding-right: 2.2em; +} +/* line 33, sass/partials/_front.scss */ +.cmb-repeatable-group.non-repeatable .cmb-group-title { + padding-right: 12px; +} + +/* line 39, sass/partials/_front.scss */ +.cmb-type-group .cmb-row .cmbhandle { + left: 0; + position: absolute; +} + +/* line 44, sass/partials/_front.scss */ +.cmb-spinner { + background: url(/wp-admin/images/spinner.gif) no-repeat; + -webkit-background-size: 20px 20px; + background-size: 20px 20px; + display: none; + float: left; + vertical-align: middle; + opacity: 0.7; + filter: alpha(opacity=70); + width: 20px; + height: 20px; + margin: 4px 10px 0; +} + +/*# sourceMappingURL=cmb2-front.css.map */ diff --git a/inc/vendors/cmb2-plugins/cmb2/css/cmb2-front-rtl.min.css b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-front-rtl.min.css new file mode 100755 index 00000000..6bd8b69a --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-front-rtl.min.css @@ -0,0 +1,2 @@ +/*! CMB2 - v2.6.0 - 2019-01-18 | https://cmb2.io | Copyright (c) 2019 CMB2 team | Licensed GPLv2 */ +@charset "UTF-8";.cmb2-wrap{margin:0}.cmb2-wrap input,.cmb2-wrap textarea{font-size:14px;max-width:100%;padding:5px}.cmb2-wrap input[type=text].cmb2-oembed{width:100%}.cmb2-wrap textarea{width:500px}.cmb2-wrap textarea.cmb2-textarea-code{font-family:"Courier 10 Pitch",Courier,monospace;line-height:16px}.cmb2-wrap input.cmb2-text-small,.cmb2-wrap input.cmb2-timepicker{width:100px}.cmb2-wrap input.cmb2-text-money{width:90px}.cmb2-wrap input.cmb2-text-medium{width:230px}.cmb2-wrap input.cmb2-upload-file{width:65%}.cmb2-wrap input.ed_button{padding:2px 4px}.cmb2-wrap input:not([type=hidden])+.button-secondary,.cmb2-wrap input:not([type=hidden])+input,.cmb2-wrap input:not([type=hidden])+select{margin-right:20px}.cmb2-wrap ul{margin:0}.cmb2-wrap li{font-size:14px;line-height:16px;margin:1px 0 5px}.cmb2-wrap select{font-size:14px;margin-top:3px}.cmb2-wrap input:focus,.cmb2-wrap textarea:focus{background:#fffff8}.cmb2-wrap input[type=checkbox],.cmb2-wrap input[type=radio]{margin:0 0 0 5px;padding:0}.cmb2-wrap .button-secondary,.cmb2-wrap button{white-space:nowrap}.cmb2-wrap .mceLayout{border:1px solid #e9e9e9!important}.cmb2-wrap .mceIframeContainer{background:#fff}.cmb2-wrap .meta_mce{width:97%}.cmb2-wrap .meta_mce textarea{width:100%}.cmb2-wrap .wp-color-result,.cmb2-wrap .wp-picker-input-wrap{vertical-align:middle}.cmb2-wrap .wp-color-result,.cmb2-wrap .wp-picker-container{margin:0 0 0 10px}.cmb2-wrap .cmb-row{margin:0}.cmb2-wrap .cmb-row:after{content:'';clear:both;display:block;width:100%}.cmb2-wrap .cmb-row.cmb-repeat .cmb2-metabox-description{padding-top:0;padding-bottom:1em}.cmb2-metabox{clear:both;margin:0}.cmb2-metabox .cmb-field-list>.cmb-row:first-of-type>.cmb-td,.cmb2-metabox .cmb-field-list>.cmb-row:first-of-type>.cmb-th,.cmb2-metabox>.cmb-row:first-of-type>.cmb-td,.cmb2-metabox>.cmb-row:first-of-type>.cmb-th{border:0}.cmb-add-row{margin:1.8em 0 0}.cmb-nested .cmb-td,.cmb-repeatable-group .cmb-th,.cmb-repeatable-group:first-of-type{border:0}.cmb-repeatable-group:last-of-type,.cmb-row:last-of-type,.cmb2-wrap .cmb-row:last-of-type{border-bottom:0}.cmb-repeatable-grouping{border:1px solid #e9e9e9;padding:0 1em}.cmb-repeatable-grouping.cmb-row{margin:0 0 .8em}.cmb-th{color:#222;float:right;font-weight:600;line-height:1.3;padding:20px 0 20px 10px;vertical-align:top;width:200px}@media (max-width:450px){.cmb-th{font-size:1.2em;display:block;float:none;padding-bottom:1em;text-align:right;width:100%}.cmb-th label{display:block;margin-top:0;margin-bottom:.5em}}.cmb-td{line-height:1.3;max-width:100%;padding:15px 10px;vertical-align:middle}.cmb-type-title .cmb-td{padding:0}.cmb-th label{display:block;padding:5px 0}.cmb-th+.cmb-td{float:right}.cmb-td .cmb-td{padding-bottom:1em}.cmb-remove-row{text-align:left}.empty-row.hidden{display:none}.cmb-repeat-table{background-color:#fafafa;border:1px solid #e1e1e1}.cmb-repeat-table .cmb-row.cmb-repeat-row{position:relative;counter-increment:el;margin:0;padding:10px 50px 10px 10px;border-bottom:none!important}.cmb-repeat-table .cmb-row.cmb-repeat-row+.cmb-repeat-row{border-top:solid 1px #e9e9e9}.cmb-repeat-table .cmb-row.cmb-repeat-row.ui-sortable-helper{outline:dashed 2px #e9e9e9!important}.cmb-repeat-table .cmb-row.cmb-repeat-row:before{content:counter(el);display:block;top:0;right:0;position:absolute;width:35px;height:100%;line-height:35px;cursor:move;color:#757575;text-align:center;border-left:solid 1px #e9e9e9}.cmb-repeat-table .cmb-row.cmb-repeat-row .cmb-td{margin:0;padding:0}.cmb-repeat-table+.cmb-add-row{margin:0}.cmb-repeat-table+.cmb-add-row:before{content:'';width:1px;height:1.6em;display:block;margin-right:17px;background-color:#dcdcdc}.cmb-repeat-table .cmb-remove-row{top:7px;left:7px;position:absolute;width:auto;margin-right:0;padding:0!important;display:none}.cmb-repeat-table .cmb-remove-row>.cmb-remove-row-button{font-size:20px;text-indent:-1000px;overflow:hidden;position:relative;height:auto;line-height:1;padding:0 10px}.cmb-repeat-table .cmb-remove-row>.cmb-remove-row-button:before{content:"";font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center}.cmb-repeat-table .cmb-repeat-row:hover .cmb-remove-row{display:block}.cmb-repeatable-group .cmb-th{padding:5px}.cmb-repeatable-group .cmb-group-title{background-color:#e9e9e9;padding:8px 2.2em 8px 12px;margin:0 -1em;min-height:1.5em;font-size:14px;line-height:1.4}.cmb-repeatable-group .cmb-group-title h4{border:0;margin:0;font-size:1.2em;font-weight:500;padding:.5em .75em}.cmb-repeatable-group .cmb-group-title .cmb-th{display:block;width:100%}.cmb-repeatable-group .cmb-group-description .cmb-th{font-size:1.2em;display:block;float:none;padding-bottom:1em;text-align:right;width:100%}.cmb-repeatable-group .cmb-group-description .cmb-th label{display:block;margin-top:0;margin-bottom:.5em}.cmb-repeatable-group .cmb-shift-rows{font-size:1em;margin-left:1em;text-decoration:none}.cmb-repeatable-group .cmb-shift-rows .dashicons{font-size:1.5em;height:1.5em;line-height:1.2em;width:1em}.cmb-repeatable-group .cmb-shift-rows .dashicons.dashicons-arrow-down-alt2{line-height:1.3em}.cmb-repeatable-group .cmb2-upload-button{float:left}p.cmb2-metabox-description{color:#757575;font-style:italic;margin:0;padding-top:.5em}span.cmb2-metabox-description{color:#757575;font-style:italic}.cmb2-metabox-title{margin:0 0 5px;padding:5px 0 0;font-size:14px}.cmb-inline ul{padding:4px 0 0}.cmb-inline li{display:inline-block;padding-left:18px}.cmb-type-textarea-code pre{margin:0}.cmb2-media-status .img-status{clear:none;display:inline-block;vertical-align:middle;margin-left:10px;width:auto}.cmb2-media-status .img-status img{max-width:350px;height:auto}.cmb2-media-status .embed-status,.cmb2-media-status .img-status img{background:#eee;border:5px solid #fff;outline:1px solid #e9e9e9;box-shadow:inset 0 0 15px rgba(0,0,0,.3),inset 0 0 0 1px rgba(0,0,0,.05);background-image:linear-gradient(45deg,#d0d0d0 25%,transparent 25%,transparent 75%,#d0d0d0 75%,#d0d0d0),linear-gradient(45deg,#d0d0d0 25%,transparent 25%,transparent 75%,#d0d0d0 75%,#d0d0d0);background-position:0 0,10px 10px;background-size:20px 20px;border-radius:2px;-moz-border-radius:2px;margin:15px 0 0}.cmb2-media-status .embed-status{float:right;max-width:800px}.cmb2-media-status .embed-status,.cmb2-media-status .img-status{position:relative}.cmb2-media-status .embed-status .cmb2-remove-file-button,.cmb2-media-status .img-status .cmb2-remove-file-button{background:url(../images/ico-delete.png);height:16px;right:-5px;position:absolute;text-indent:-9999px;top:-5px;width:16px}.cmb2-media-status .img-status .cmb2-remove-file-button{top:10px}.cmb2-media-status .file-status>span,.cmb2-media-status .img-status img{cursor:pointer}.cmb2-media-status.cmb-attach-list .file-status>span,.cmb2-media-status.cmb-attach-list .img-status img{cursor:move}.cmb-type-file-list .cmb2-media-status .img-status{clear:none;vertical-align:middle;width:auto;margin-left:10px;margin-bottom:10px;margin-top:0}.cmb-attach-list li{clear:both;display:inline-block;width:100%;margin-top:5px;margin-bottom:10px}.cmb-attach-list li img{float:right;margin-left:10px}.cmb2-remove-wrapper{margin:0}.child-cmb2 .cmb-th{text-align:right}.cmb2-indented-hierarchy{padding-right:1.5em}@media (max-width:450px){.cmb-td,.cmb-th,.cmb-th+.cmb-td{display:block;float:none;width:100%}}#poststuff .cmb-group-title{margin-right:-1em;margin-left:-1em;min-height:1.5em}#poststuff .repeatable .cmb-group-title{padding-right:2.2em}.cmb-type-group .cmb2-wrap,.cmb2-postbox .cmb2-wrap{margin:0}.cmb-type-group .cmb2-wrap>.cmb-field-list>.cmb-row,.cmb2-postbox .cmb2-wrap>.cmb-field-list>.cmb-row{padding:1.8em 0}.cmb-type-group .cmb2-wrap input[type=text].cmb2-oembed,.cmb2-postbox .cmb2-wrap input[type=text].cmb2-oembed{width:100%}.cmb-type-group .cmb-row,.cmb2-postbox .cmb-row{padding:0 0 1.8em;margin:0 0 .8em}.cmb-type-group .cmb-row .cmbhandle,.cmb2-postbox .cmb-row .cmbhandle{left:-1em;position:relative;color:#222}.cmb-type-group .cmb-repeatable-grouping,.cmb2-postbox .cmb-repeatable-grouping{padding:0 1em;max-width:100%;min-width:1px!important}.cmb-type-group .cmb-repeatable-group>.cmb-row,.cmb2-postbox .cmb-repeatable-group>.cmb-row{padding-bottom:0}.cmb-type-group .cmb-th,.cmb2-postbox .cmb-th{width:18%;padding:0 0 0 2%}.cmb-type-group .cmb-td,.cmb2-postbox .cmb-td{margin-bottom:0;padding:0;line-height:1.3}.cmb-type-group .cmb-th+.cmb-td,.cmb2-postbox .cmb-th+.cmb-td{width:80%;float:left}.cmb-type-group .cmb-repeatable-group:not(:last-of-type),.cmb-type-group .cmb-row:not(:last-of-type),.cmb2-postbox .cmb-repeatable-group:not(:last-of-type),.cmb2-postbox .cmb-row:not(:last-of-type){border-bottom:1px solid #e9e9e9}@media (max-width:450px){.cmb-type-group .cmb-repeatable-group:not(:last-of-type),.cmb-type-group .cmb-row:not(:last-of-type),.cmb2-postbox .cmb-repeatable-group:not(:last-of-type),.cmb2-postbox .cmb-row:not(:last-of-type){border-bottom:0}}.cmb-type-group .cmb-remove-field-row,.cmb-type-group .cmb-repeat-group-field,.cmb2-postbox .cmb-remove-field-row,.cmb2-postbox .cmb-repeat-group-field{padding-top:1.8em}.js .cmb2-postbox.context-box .toggle-indicator:before{content:"\f142";display:inline-block;font:400 20px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.js .cmb2-postbox.context-box.closed .toggle-indicator:before{content:"\f140"}.cmb2-postbox.context-box{margin-bottom:10px}.cmb2-postbox.context-box.context-after_title-box,.cmb2-postbox.context-box.context-before_permalink-box{margin-top:10px}.cmb2-postbox.context-box.context-after_editor-box{margin-top:20px;margin-bottom:0}.cmb2-postbox.context-box.context-form_top-box{margin-top:10px}.cmb2-postbox.context-box.context-form_top-box .hndle{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}.cmb2-postbox.context-box .hndle{cursor:auto}.cmb2-context-wrap{margin-top:10px}.cmb2-context-wrap.cmb2-context-wrap-form_top{margin-left:300px;width:auto}.cmb2-context-wrap.cmb2-context-wrap-no-title .cmb2-metabox{padding:10px}.cmb2-context-wrap .cmb-th{padding:0 0 0 2%;width:18%}.cmb2-context-wrap .cmb-td{width:80%;padding:0}.cmb2-context-wrap .cmb-row{margin-bottom:10px}.cmb2-context-wrap .cmb-row:last-of-type{margin-bottom:0}@media only screen and (max-width:850px){.cmb2-context-wrap.cmb2-context-wrap-form_top{margin-left:0}}#poststuff .cmb-repeatable-group h2{margin:0}.edit-tags-php .cmb2-metabox-title,.profile-php .cmb2-metabox-title,.user-edit-php .cmb2-metabox-title{font-size:1.4em}.cmb2-no-box-wrap .cmb-spinner,.cmb2-postbox .cmb-spinner{float:right;display:none}.cmb-spinner.is-active{display:block}.cmb2-metabox .cmbhandle{color:#757575;float:left;width:27px;height:30px;cursor:pointer;left:-1em;position:relative}.cmb2-metabox .cmbhandle:before{content:'\f142';left:12px;font:400 20px/1 dashicons;speak:none;display:inline-block;padding:8px 10px;top:0;position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.cmb2-metabox .postbox.closed .cmbhandle:before{content:'\f140'}.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row{-webkit-appearance:none!important;background:none!important;border:none!important;position:absolute;right:0;top:.5em;line-height:1em;padding:2px 6px 3px;opacity:.5}.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]){cursor:pointer;color:#a00;opacity:1}.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]):hover{color:red}* html .cmb2-element.ui-helper-clearfix{height:1%}.cmb2-element .ui-datepicker,.cmb2-element.ui-datepicker{padding:0;margin:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background-color:#fff;border:1px solid #dfdfdf;border-top:none;-webkit-box-shadow:0 3px 6px rgba(0,0,0,.075);box-shadow:0 3px 6px rgba(0,0,0,.075);min-width:17em;width:auto}.cmb2-element .ui-datepicker *,.cmb2-element.ui-datepicker *{padding:0;font-family:"Open Sans",sans-serif;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.cmb2-element .ui-datepicker table,.cmb2-element.ui-datepicker table{font-size:13px;margin:0;border:none;border-collapse:collapse}.cmb2-element .ui-datepicker .ui-datepicker-header,.cmb2-element .ui-datepicker .ui-widget-header,.cmb2-element.ui-datepicker .ui-datepicker-header,.cmb2-element.ui-datepicker .ui-widget-header{border:none;color:#fff;font-weight:400}.cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover,.cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover{background:0 0;border-color:transparent;cursor:pointer}.cmb2-element .ui-datepicker .ui-datepicker-title,.cmb2-element.ui-datepicker .ui-datepicker-title{margin:0;padding:10px 0;color:#fff;font-size:14px;line-height:14px;text-align:center}.cmb2-element .ui-datepicker .ui-datepicker-title select,.cmb2-element.ui-datepicker .ui-datepicker-title select{margin-top:-8px;margin-bottom:-8px}.cmb2-element .ui-datepicker .ui-datepicker-next,.cmb2-element .ui-datepicker .ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-datepicker-next,.cmb2-element.ui-datepicker .ui-datepicker-prev{position:relative;top:0;height:34px;width:34px}.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-next,.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-next,.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-prev{border:none}.cmb2-element .ui-datepicker .ui-datepicker-prev,.cmb2-element .ui-datepicker .ui-datepicker-prev-hover,.cmb2-element.ui-datepicker .ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-datepicker-prev-hover{right:0}.cmb2-element .ui-datepicker .ui-datepicker-next,.cmb2-element .ui-datepicker .ui-datepicker-next-hover,.cmb2-element.ui-datepicker .ui-datepicker-next,.cmb2-element.ui-datepicker .ui-datepicker-next-hover{left:0}.cmb2-element .ui-datepicker .ui-datepicker-next span,.cmb2-element .ui-datepicker .ui-datepicker-prev span,.cmb2-element.ui-datepicker .ui-datepicker-next span,.cmb2-element.ui-datepicker .ui-datepicker-prev span{display:none}.cmb2-element .ui-datepicker .ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-datepicker-prev{float:right}.cmb2-element .ui-datepicker .ui-datepicker-next,.cmb2-element.ui-datepicker .ui-datepicker-next{float:left}.cmb2-element .ui-datepicker .ui-datepicker-next:before,.cmb2-element .ui-datepicker .ui-datepicker-prev:before,.cmb2-element.ui-datepicker .ui-datepicker-next:before,.cmb2-element.ui-datepicker .ui-datepicker-prev:before{font:400 20px/34px dashicons;padding-right:7px;color:#fff;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:34px;height:34px}.cmb2-element .ui-datepicker .ui-datepicker-prev:before,.cmb2-element.ui-datepicker .ui-datepicker-prev:before{content:'\f341'}.cmb2-element .ui-datepicker .ui-datepicker-next:before,.cmb2-element.ui-datepicker .ui-datepicker-next:before{content:'\f345'}.cmb2-element .ui-datepicker .ui-datepicker-next-hover:before,.cmb2-element .ui-datepicker .ui-datepicker-prev-hover:before,.cmb2-element.ui-datepicker .ui-datepicker-next-hover:before,.cmb2-element.ui-datepicker .ui-datepicker-prev-hover:before{opacity:.7}.cmb2-element .ui-datepicker select.ui-datepicker-month,.cmb2-element .ui-datepicker select.ui-datepicker-year,.cmb2-element.ui-datepicker select.ui-datepicker-month,.cmb2-element.ui-datepicker select.ui-datepicker-year{width:33%;background:0 0;border-color:transparent;box-shadow:none;color:#fff}.cmb2-element .ui-datepicker select.ui-datepicker-month option,.cmb2-element .ui-datepicker select.ui-datepicker-year option,.cmb2-element.ui-datepicker select.ui-datepicker-month option,.cmb2-element.ui-datepicker select.ui-datepicker-year option{color:#333}.cmb2-element .ui-datepicker thead,.cmb2-element.ui-datepicker thead{color:#fff;font-weight:600}.cmb2-element .ui-datepicker thead th,.cmb2-element.ui-datepicker thead th{font-weight:400}.cmb2-element .ui-datepicker th,.cmb2-element.ui-datepicker th{padding:10px}.cmb2-element .ui-datepicker td,.cmb2-element.ui-datepicker td{padding:0;border:1px solid #f4f4f4}.cmb2-element .ui-datepicker td.ui-datepicker-other-month,.cmb2-element.ui-datepicker td.ui-datepicker-other-month{border:transparent}.cmb2-element .ui-datepicker td.ui-datepicker-week-end,.cmb2-element.ui-datepicker td.ui-datepicker-week-end{background-color:#f4f4f4;border:1px solid #f4f4f4}.cmb2-element .ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today,.cmb2-element.ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today{-webkit-box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1);-moz-box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1);box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1)}.cmb2-element .ui-datepicker td.ui-datepicker-today,.cmb2-element.ui-datepicker td.ui-datepicker-today{background-color:#f0f0c0}.cmb2-element .ui-datepicker td.ui-datepicker-current-day,.cmb2-element.ui-datepicker td.ui-datepicker-current-day{background:#bd8}.cmb2-element .ui-datepicker td .ui-state-default,.cmb2-element.ui-datepicker td .ui-state-default{background:0 0;border:none;text-align:center;text-decoration:none;width:auto;display:block;padding:5px 10px;font-weight:400;color:#444}.cmb2-element .ui-datepicker td.ui-state-disabled .ui-state-default,.cmb2-element.ui-datepicker td.ui-state-disabled .ui-state-default{opacity:.5}.cmb2-element .ui-datepicker .ui-datepicker-header,.cmb2-element .ui-datepicker .ui-widget-header,.cmb2-element.ui-datepicker .ui-datepicker-header,.cmb2-element.ui-datepicker .ui-widget-header{background:#00a0d2}.cmb2-element .ui-datepicker thead,.cmb2-element.ui-datepicker thead{background:#32373c}.cmb2-element .ui-datepicker td .ui-state-active,.cmb2-element .ui-datepicker td .ui-state-hover,.cmb2-element.ui-datepicker td .ui-state-active,.cmb2-element.ui-datepicker td .ui-state-hover{background:#0073aa;color:#fff}.cmb2-element .ui-datepicker .ui-timepicker-div,.cmb2-element.ui-datepicker .ui-timepicker-div{font-size:14px}.cmb2-element .ui-datepicker .ui-timepicker-div dl,.cmb2-element.ui-datepicker .ui-timepicker-div dl{text-align:right;padding:0 .6em}.cmb2-element .ui-datepicker .ui-timepicker-div dl dt,.cmb2-element.ui-datepicker .ui-timepicker-div dl dt{float:right;clear:right;padding:0 5px 0 0}.cmb2-element .ui-datepicker .ui-timepicker-div dl dd,.cmb2-element.ui-datepicker .ui-timepicker-div dl dd{margin:0 40% 10px 10px}.cmb2-element .ui-datepicker .ui-timepicker-div dl dd select,.cmb2-element.ui-datepicker .ui-timepicker-div dl dd select{width:100%}.cmb2-element .ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane,.cmb2-element.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane{padding:.6em;text-align:right}.cmb2-element .ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-primary,.cmb2-element .ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-secondary,.cmb2-element.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-primary,.cmb2-element.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-secondary{padding:0 10px 1px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;margin:0 .4em .4em .6em}.admin-color-fresh .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-fresh .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-fresh .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-fresh .cmb2-element.ui-datepicker .ui-widget-header{background:#00a0d2}.admin-color-fresh .cmb2-element .ui-datepicker thead,.admin-color-fresh .cmb2-element.ui-datepicker thead{background:#32373c}.admin-color-fresh .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-fresh .cmb2-element.ui-datepicker td .ui-state-hover{background:#0073aa;color:#fff}.admin-color-blue .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-blue .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-blue .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-blue .cmb2-element.ui-datepicker .ui-widget-header{background:#52accc}.admin-color-blue .cmb2-element .ui-datepicker thead,.admin-color-blue .cmb2-element.ui-datepicker thead{background:#4796b3}.admin-color-blue .cmb2-element .ui-datepicker td .ui-state-active,.admin-color-blue .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-active,.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-hover{background:#096484;color:#fff}.admin-color-blue .cmb2-element .ui-datepicker td.ui-datepicker-today,.admin-color-blue .cmb2-element.ui-datepicker td.ui-datepicker-today{background:#eee}.admin-color-coffee .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-coffee .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-coffee .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-coffee .cmb2-element.ui-datepicker .ui-widget-header{background:#59524c}.admin-color-coffee .cmb2-element .ui-datepicker thead,.admin-color-coffee .cmb2-element.ui-datepicker thead{background:#46403c}.admin-color-coffee .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-coffee .cmb2-element.ui-datepicker td .ui-state-hover{background:#c7a589;color:#fff}.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-widget-header{background:#523f6d}.admin-color-ectoplasm .cmb2-element .ui-datepicker thead,.admin-color-ectoplasm .cmb2-element.ui-datepicker thead{background:#413256}.admin-color-ectoplasm .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-ectoplasm .cmb2-element.ui-datepicker td .ui-state-hover{background:#a3b745;color:#fff}.admin-color-midnight .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-midnight .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-midnight .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-midnight .cmb2-element.ui-datepicker .ui-widget-header{background:#363b3f}.admin-color-midnight .cmb2-element .ui-datepicker thead,.admin-color-midnight .cmb2-element.ui-datepicker thead{background:#26292c}.admin-color-midnight .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-midnight .cmb2-element.ui-datepicker td .ui-state-hover{background:#e14d43;color:#fff}.admin-color-ocean .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-ocean .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-ocean .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-ocean .cmb2-element.ui-datepicker .ui-widget-header{background:#738e96}.admin-color-ocean .cmb2-element .ui-datepicker thead,.admin-color-ocean .cmb2-element.ui-datepicker thead{background:#627c83}.admin-color-ocean .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-ocean .cmb2-element.ui-datepicker td .ui-state-hover{background:#9ebaa0;color:#fff}.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover,.admin-color-sunrise .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover,.admin-color-sunrise .cmb2-element.ui-datepicker .ui-widget-header{background:#cf4944}.admin-color-sunrise .cmb2-element .ui-datepicker th,.admin-color-sunrise .cmb2-element.ui-datepicker th{border-color:#be3631;background:#be3631}.admin-color-sunrise .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-sunrise .cmb2-element.ui-datepicker td .ui-state-hover{background:#dd823b;color:#fff}.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-light .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-light .cmb2-element.ui-datepicker .ui-widget-header{background:#e5e5e5}.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-month,.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-year,.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-month,.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-year{color:#555}.admin-color-light .cmb2-element .ui-datepicker thead,.admin-color-light .cmb2-element.ui-datepicker thead{background:#888}.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-next:before,.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-prev:before,.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-title,.admin-color-light .cmb2-element .ui-datepicker td .ui-state-default,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-next:before,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-prev:before,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-title,.admin-color-light .cmb2-element.ui-datepicker td .ui-state-default{color:#555}.admin-color-light .cmb2-element .ui-datepicker td .ui-state-active,.admin-color-light .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-light .cmb2-element.ui-datepicker td .ui-state-active,.admin-color-light .cmb2-element.ui-datepicker td .ui-state-hover{background:#ccc}.admin-color-light .cmb2-element .ui-datepicker td.ui-datepicker-today,.admin-color-light .cmb2-element.ui-datepicker td.ui-datepicker-today{background:#eee}.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-widget-header{background:#56b274}.admin-color-bbp-evergreen .cmb2-element .ui-datepicker thead,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker thead{background:#36533f}.admin-color-bbp-evergreen .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker td .ui-state-hover{background:#446950;color:#fff}.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-widget-header{background:#4ca26a}.admin-color-bbp-mint .cmb2-element .ui-datepicker thead,.admin-color-bbp-mint .cmb2-element.ui-datepicker thead{background:#4f6d59}.admin-color-bbp-mint .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-bbp-mint .cmb2-element.ui-datepicker td .ui-state-hover{background:#5fb37c;color:#fff}.closed .inside{display:none}.cmb-repeatable-grouping{position:relative}.cmb-repeatable-grouping .cmb-group-title{margin-right:-1em;margin-left:-1em;min-height:1.5em}.cmb-repeatable-grouping h3{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}.cmb-repeatable-group.repeatable .cmb-group-title{padding-right:2.2em}.cmb-repeatable-group.non-repeatable .cmb-group-title{padding-right:12px}.cmb-type-group .cmb-row .cmbhandle{left:0;position:absolute}.cmb-spinner{background:url(/wp-admin/images/spinner.gif) no-repeat;-webkit-background-size:20px 20px;background-size:20px 20px;display:none;float:left;vertical-align:middle;opacity:.7;filter:alpha(opacity=70);width:20px;height:20px;margin:4px 10px 0} \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2/css/cmb2-front.css b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-front.css new file mode 100755 index 00000000..de538086 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-front.css @@ -0,0 +1,1331 @@ +/*! + * CMB2 - v2.6.0 - 2019-01-18 + * https://cmb2.io + * Copyright (c) 2019 + * Licensed GPLv2+ + */ + +@charset "UTF-8"; +/*-------------------------------------------------------------- + * Main Wrap +--------------------------------------------------------------*/ +/* line 5, sass/partials/_main_wrap.scss */ +.cmb2-wrap { + margin: 0; +} +/* line 8, sass/partials/_main_wrap.scss */ +.cmb2-wrap input, +.cmb2-wrap textarea { + font-size: 14px; + max-width: 100%; + padding: 5px; +} +/* line 18, sass/partials/_main_wrap.scss */ +.cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} +/* line 23, sass/partials/_main_wrap.scss */ +.cmb2-wrap textarea { + width: 500px; +} +/* line 26, sass/partials/_main_wrap.scss */ +.cmb2-wrap textarea.cmb2-textarea-code { + font-family: "Courier 10 Pitch", Courier, monospace; + line-height: 16px; +} +/* line 34, sass/partials/_main_wrap.scss */ +.cmb2-wrap input.cmb2-text-small, .cmb2-wrap input.cmb2-timepicker { + width: 100px; +} +/* line 40, sass/partials/_main_wrap.scss */ +.cmb2-wrap input.cmb2-text-money { + width: 90px; +} +/* line 45, sass/partials/_main_wrap.scss */ +.cmb2-wrap input.cmb2-text-medium { + width: 230px; +} +/* line 50, sass/partials/_main_wrap.scss */ +.cmb2-wrap input.cmb2-upload-file { + width: 65%; +} +/* line 54, sass/partials/_main_wrap.scss */ +.cmb2-wrap input.ed_button { + padding: 2px 4px; +} +/* line 59, sass/partials/_main_wrap.scss */ +.cmb2-wrap input:not([type="hidden"]) + input, +.cmb2-wrap input:not([type="hidden"]) + .button-secondary, +.cmb2-wrap input:not([type="hidden"]) + select { + margin-left: 20px; +} +/* line 67, sass/partials/_main_wrap.scss */ +.cmb2-wrap ul { + margin: 0; +} +/* line 71, sass/partials/_main_wrap.scss */ +.cmb2-wrap li { + font-size: 14px; + line-height: 16px; + margin: 1px 0 5px 0; +} +/* line 82, sass/partials/_main_wrap.scss */ +.cmb2-wrap select { + font-size: 14px; + margin-top: 3px; +} +/* line 87, sass/partials/_main_wrap.scss */ +.cmb2-wrap input:focus, +.cmb2-wrap textarea:focus { + background: #fffff8; +} +/* line 92, sass/partials/_main_wrap.scss */ +.cmb2-wrap input[type="radio"] { + margin: 0 5px 0 0; + padding: 0; +} +/* line 97, sass/partials/_main_wrap.scss */ +.cmb2-wrap input[type="checkbox"] { + margin: 0 5px 0 0; + padding: 0; +} +/* line 102, sass/partials/_main_wrap.scss */ +.cmb2-wrap button, +.cmb2-wrap .button-secondary { + white-space: nowrap; +} +/* line 107, sass/partials/_main_wrap.scss */ +.cmb2-wrap .mceLayout { + border: 1px solid #e9e9e9 !important; +} +/* line 111, sass/partials/_main_wrap.scss */ +.cmb2-wrap .mceIframeContainer { + background: #ffffff; +} +/* line 115, sass/partials/_main_wrap.scss */ +.cmb2-wrap .meta_mce { + width: 97%; +} +/* line 118, sass/partials/_main_wrap.scss */ +.cmb2-wrap .meta_mce textarea { + width: 100%; +} +/* line 124, sass/partials/_main_wrap.scss */ +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-input-wrap { + vertical-align: middle; +} +/* line 129, sass/partials/_main_wrap.scss */ +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-container { + margin: 0 10px 0 0; +} +/* line 134, sass/partials/_main_wrap.scss */ +.cmb2-wrap .cmb-row { + margin: 0; +} +/* line 137, sass/partials/_main_wrap.scss */ +.cmb2-wrap .cmb-row:after { + content: ''; + clear: both; + display: block; + width: 100%; +} +/* line 144, sass/partials/_main_wrap.scss */ +.cmb2-wrap .cmb-row.cmb-repeat .cmb2-metabox-description { + padding-top: 0; + padding-bottom: 1em; +} + +/* line 152, sass/partials/_main_wrap.scss */ +.cmb2-metabox { + clear: both; + margin: 0; +} +/* line 158, sass/partials/_main_wrap.scss */ +.cmb2-metabox > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox > .cmb-row:first-of-type > .cmb-th, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-th { + border: 0; +} + +/* line 165, sass/partials/_main_wrap.scss */ +.cmb-add-row { + margin: 1.8em 0 0; +} + +/* line 169, sass/partials/_main_wrap.scss */ +.cmb-nested .cmb-td, +.cmb-repeatable-group .cmb-th, +.cmb-repeatable-group:first-of-type { + border: 0; +} + +/* line 175, sass/partials/_main_wrap.scss */ +.cmb-row:last-of-type, +.cmb2-wrap .cmb-row:last-of-type, +.cmb-repeatable-group:last-of-type { + border-bottom: 0; +} + +/* line 181, sass/partials/_main_wrap.scss */ +.cmb-repeatable-grouping { + border: 1px solid #e9e9e9; + padding: 0 1em; +} +/* line 185, sass/partials/_main_wrap.scss */ +.cmb-repeatable-grouping.cmb-row { + margin: 0 0 0.8em; +} + +/* line 193, sass/partials/_main_wrap.scss */ +.cmb-th { + color: #222222; + float: left; + font-weight: 600; + line-height: 1.3; + padding: 20px 10px 20px 0; + vertical-align: top; + width: 200px; +} +@media (max-width: 450px) { + /* line 193, sass/partials/_main_wrap.scss */ + .cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: left; + width: 100%; + } + /* line 27, sass/partials/_mixins.scss */ + .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; + } +} + +/* line 207, sass/partials/_main_wrap.scss */ +.cmb-td { + line-height: 1.3; + max-width: 100%; + padding: 15px 10px; + vertical-align: middle; +} + +/* line 216, sass/partials/_main_wrap.scss */ +.cmb-type-title .cmb-td { + padding: 0; +} + +/* line 221, sass/partials/_main_wrap.scss */ +.cmb-th label { + display: block; + padding: 5px 0; +} + +/* line 226, sass/partials/_main_wrap.scss */ +.cmb-th + .cmb-td { + float: left; +} + +/* line 230, sass/partials/_main_wrap.scss */ +.cmb-td .cmb-td { + padding-bottom: 1em; +} + +/* line 234, sass/partials/_main_wrap.scss */ +.cmb-remove-row { + text-align: right; +} + +/* line 238, sass/partials/_main_wrap.scss */ +.empty-row.hidden { + display: none; +} + +/* line 243, sass/partials/_main_wrap.scss */ +.cmb-repeat-table { + background-color: #fafafa; + border: 1px solid #e1e1e1; +} +/* line 247, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-row.cmb-repeat-row { + position: relative; + counter-increment: el; + margin: 0; + padding: 10px 10px 10px 50px; + border-bottom: none !important; +} +/* line 255, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-row.cmb-repeat-row + .cmb-repeat-row { + border-top: solid 1px #e9e9e9; +} +/* line 259, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-row.cmb-repeat-row.ui-sortable-helper { + outline: dashed 2px #e9e9e9 !important; +} +/* line 263, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-row.cmb-repeat-row:before { + content: counter(el); + display: block; + top: 0; + left: 0; + position: absolute; + width: 35px; + height: 100%; + line-height: 35px; + cursor: move; + color: #757575; + text-align: center; + border-right: solid 1px #e9e9e9; +} +/* line 280, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-row.cmb-repeat-row .cmb-td { + margin: 0; + padding: 0; +} +/* line 287, sass/partials/_main_wrap.scss */ +.cmb-repeat-table + .cmb-add-row { + margin: 0; +} +/* line 290, sass/partials/_main_wrap.scss */ +.cmb-repeat-table + .cmb-add-row:before { + content: ''; + width: 1px; + height: 1.6em; + display: block; + margin-left: 17px; + background-color: gainsboro; +} +/* line 300, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-remove-row { + top: 7px; + right: 7px; + position: absolute; + width: auto; + margin-left: 0; + padding: 0 !important; + display: none; +} +/* line 311, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button { + font-size: 20px; + text-indent: -1000px; + overflow: hidden; + position: relative; + height: auto; + line-height: 1; + padding: 0 10px 0; +} +/* line 322, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button:before { + content: ""; + font-family: 'Dashicons'; + speak: none; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + margin: 0; + text-indent: 0; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + text-align: center; +} +/* line 328, sass/partials/_main_wrap.scss */ +.cmb-repeat-table .cmb-repeat-row:hover .cmb-remove-row { + display: block; +} + +/* line 336, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-th { + padding: 5px; +} +/* line 340, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-group-title { + background-color: #e9e9e9; + padding: 8px 12px 8px 2.2em; + margin: 0 -1em; + min-height: 1.5em; + font-size: 14px; + line-height: 1.4; +} +/* line 348, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-group-title h4 { + border: 0; + margin: 0; + font-size: 1.2em; + font-weight: 500; + padding: 0.5em 0.75em; +} +/* line 356, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-group-title .cmb-th { + display: block; + width: 100%; +} +/* line 362, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-group-description .cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: left; + width: 100%; +} +/* line 27, sass/partials/_mixins.scss */ +.cmb-repeatable-group .cmb-group-description .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; +} +/* line 366, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-shift-rows { + font-size: 1em; + margin-right: 1em; + text-decoration: none; +} +/* line 371, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-shift-rows .dashicons { + font-size: 1.5em; + height: 1.5em; + line-height: 1.2em; + width: 1em; +} +/* line 377, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb-shift-rows .dashicons.dashicons-arrow-down-alt2 { + line-height: 1.3em; +} +/* line 384, sass/partials/_main_wrap.scss */ +.cmb-repeatable-group .cmb2-upload-button { + float: right; +} + +/* line 390, sass/partials/_main_wrap.scss */ +p.cmb2-metabox-description { + color: #757575; + font-style: italic; + margin: 0; + padding-top: .5em; +} + +/* line 397, sass/partials/_main_wrap.scss */ +span.cmb2-metabox-description { + color: #757575; + font-style: italic; +} + +/* line 402, sass/partials/_main_wrap.scss */ +.cmb2-metabox-title { + margin: 0 0 5px 0; + padding: 5px 0 0 0; + font-size: 14px; +} + +/* line 408, sass/partials/_main_wrap.scss */ +.cmb-inline ul { + padding: 4px 0 0 0; +} + +/* line 412, sass/partials/_main_wrap.scss */ +.cmb-inline li { + display: inline-block; + padding-right: 18px; +} + +/* line 417, sass/partials/_main_wrap.scss */ +.cmb-type-textarea-code pre { + margin: 0; +} + +/* line 423, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status { + clear: none; + display: inline-block; + vertical-align: middle; + margin-right: 10px; + width: auto; +} +/* line 430, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status img { + max-width: 350px; + height: auto; +} +/* line 436, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status img, +.cmb2-media-status .embed-status { + background: #eee; + border: 5px solid #ffffff; + outline: 1px solid #e9e9e9; + box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.05); + background-image: linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0), linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0); + background-position: 0 0, 10px 10px; + background-size: 20px 20px; + border-radius: 2px; + -moz-border-radius: 2px; + margin: 15px 0 0 0; +} +/* line 450, sass/partials/_main_wrap.scss */ +.cmb2-media-status .embed-status { + float: left; + max-width: 800px; +} +/* line 455, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status, .cmb2-media-status .embed-status { + position: relative; +} +/* line 458, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status .cmb2-remove-file-button, .cmb2-media-status .embed-status .cmb2-remove-file-button { + background: url(../images/ico-delete.png); + height: 16px; + left: -5px; + position: absolute; + text-indent: -9999px; + top: -5px; + width: 16px; +} +/* line 472, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status .cmb2-remove-file-button { + top: 10px; +} +/* line 477, sass/partials/_main_wrap.scss */ +.cmb2-media-status .img-status img, .cmb2-media-status .file-status > span { + cursor: pointer; +} +/* line 482, sass/partials/_main_wrap.scss */ +.cmb2-media-status.cmb-attach-list .img-status img, .cmb2-media-status.cmb-attach-list .file-status > span { + cursor: move; +} + +/* line 489, sass/partials/_main_wrap.scss */ +.cmb-type-file-list .cmb2-media-status .img-status { + clear: none; + vertical-align: middle; + width: auto; + margin-right: 10px; + margin-bottom: 10px; + margin-top: 0; +} + +/* line 498, sass/partials/_main_wrap.scss */ +.cmb-attach-list li { + clear: both; + display: inline-block; + width: 100%; + margin-top: 5px; + margin-bottom: 10px; +} +/* line 504, sass/partials/_main_wrap.scss */ +.cmb-attach-list li img { + float: left; + margin-right: 10px; +} + +/* line 510, sass/partials/_main_wrap.scss */ +.cmb2-remove-wrapper { + margin: 0; +} + +/* line 514, sass/partials/_main_wrap.scss */ +.child-cmb2 .cmb-th { + text-align: left; +} + +/* line 518, sass/partials/_main_wrap.scss */ +.cmb2-indented-hierarchy { + padding-left: 1.5em; +} + +@media (max-width: 450px) { + /* line 523, sass/partials/_main_wrap.scss */ + .cmb-th, + .cmb-td, + .cmb-th + .cmb-td { + display: block; + float: none; + width: 100%; + } +} +/*-------------------------------------------------------------- + * Post Metaboxes +--------------------------------------------------------------*/ +/* line 5, sass/partials/_post_metaboxes.scss */ +#poststuff .cmb-group-title { + margin-left: -1em; + margin-right: -1em; + min-height: 1.5em; +} + +/* line 11, sass/partials/_post_metaboxes.scss */ +#poststuff .repeatable .cmb-group-title { + padding-left: 2.2em; +} + +/* line 17, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb2-wrap, .cmb-type-group .cmb2-wrap { + margin: 0; +} +/* line 20, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb2-wrap > .cmb-field-list > .cmb-row, .cmb-type-group .cmb2-wrap > .cmb-field-list > .cmb-row { + padding: 1.8em 0; +} +/* line 26, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb2-wrap input[type=text].cmb2-oembed, .cmb-type-group .cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} +/* line 32, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-row, .cmb-type-group .cmb-row { + padding: 0 0 1.8em; + margin: 0 0 0.8em; +} +/* line 36, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-row .cmbhandle, .cmb-type-group .cmb-row .cmbhandle { + right: -1em; + position: relative; + color: #222222; +} +/* line 43, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-repeatable-grouping, .cmb-type-group .cmb-repeatable-grouping { + padding: 0 1em; + max-width: 100%; + min-width: 1px !important; +} +/* line 49, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-repeatable-group > .cmb-row, .cmb-type-group .cmb-repeatable-group > .cmb-row { + padding-bottom: 0; +} +/* line 53, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-th, .cmb-type-group .cmb-th { + width: 18%; + padding: 0 2% 0 0; +} +/* line 59, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-td, .cmb-type-group .cmb-td { + margin-bottom: 0; + padding: 0; + line-height: 1.3; +} +/* line 65, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-th + .cmb-td, .cmb-type-group .cmb-th + .cmb-td { + width: 80%; + float: right; +} +/* line 70, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-row:not(:last-of-type), +.cmb2-postbox .cmb-repeatable-group:not(:last-of-type), .cmb-type-group .cmb-row:not(:last-of-type), +.cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 1px solid #e9e9e9; +} +@media (max-width: 450px) { + /* line 70, sass/partials/_post_metaboxes.scss */ + .cmb2-postbox .cmb-row:not(:last-of-type), + .cmb2-postbox .cmb-repeatable-group:not(:last-of-type), .cmb-type-group .cmb-row:not(:last-of-type), + .cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 0; + } +} +/* line 79, sass/partials/_post_metaboxes.scss */ +.cmb2-postbox .cmb-repeat-group-field, +.cmb2-postbox .cmb-remove-field-row, .cmb-type-group .cmb-repeat-group-field, +.cmb-type-group .cmb-remove-field-row { + padding-top: 1.8em; +} + +/*-------------------------------------------------------------- + * Context Metaboxes +--------------------------------------------------------------*/ +/* Metabox collapse arrow indicators */ +/* line 9, sass/partials/_context_metaboxes.scss */ +.js .cmb2-postbox.context-box .toggle-indicator:before { + content: "\f142"; + display: inline-block; + font: normal 20px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} +/* line 22, sass/partials/_context_metaboxes.scss */ +.js .cmb2-postbox.context-box.closed .toggle-indicator:before { + content: "\f140"; +} + +/* line 30, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box { + margin-bottom: 10px; +} +/* line 34, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box.context-before_permalink-box { + margin-top: 10px; +} +/* line 38, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box.context-after_title-box { + margin-top: 10px; +} +/* line 42, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box.context-after_editor-box { + margin-top: 20px; + margin-bottom: 0; +} +/* line 47, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box.context-form_top-box { + margin-top: 10px; +} +/* line 51, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box.context-form_top-box .hndle { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} +/* line 59, sass/partials/_context_metaboxes.scss */ +.cmb2-postbox.context-box .hndle { + cursor: auto; +} + +/* line 64, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap { + margin-top: 10px; +} +/* line 68, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-right: 300px; + width: auto; +} +/* line 75, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap.cmb2-context-wrap-no-title .cmb2-metabox { + padding: 10px; +} +/* line 80, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap .cmb-th { + padding: 0 2% 0 0; + width: 18%; +} +/* line 85, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap .cmb-td { + width: 80%; + padding: 0; +} +/* line 90, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap .cmb-row { + margin-bottom: 10px; +} +/* line 93, sass/partials/_context_metaboxes.scss */ +.cmb2-context-wrap .cmb-row:last-of-type { + margin-bottom: 0; +} + +/* one column on the post write/edit screen */ +@media only screen and (max-width: 850px) { + /* line 103, sass/partials/_context_metaboxes.scss */ + .cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-right: 0; + } +} +/*-------------------------------------------------------------- + * Misc. +--------------------------------------------------------------*/ +/* line 5, sass/partials/_misc.scss */ +#poststuff .cmb-repeatable-group h2 { + margin: 0; +} + +/* line 12, sass/partials/_misc.scss */ +.edit-tags-php .cmb2-metabox-title, +.profile-php .cmb2-metabox-title, +.user-edit-php .cmb2-metabox-title { + font-size: 1.4em; +} + +/* line 18, sass/partials/_misc.scss */ +.cmb2-postbox .cmb-spinner, .cmb2-no-box-wrap .cmb-spinner { + float: left; + display: none; +} + +/* line 24, sass/partials/_misc.scss */ +.cmb-spinner { + display: none; +} +/* line 26, sass/partials/_misc.scss */ +.cmb-spinner.is-active { + display: block; +} + +/*-------------------------------------------------------------- + * Collapsible UI +--------------------------------------------------------------*/ +/* line 6, sass/partials/_collapsible_ui.scss */ +.cmb2-metabox .cmbhandle { + color: #757575; + float: right; + width: 27px; + height: 30px; + cursor: pointer; + right: -1em; + position: relative; +} +/* line 14, sass/partials/_collapsible_ui.scss */ +.cmb2-metabox .cmbhandle:before { + content: '\f142'; + right: 12px; + font: normal 20px/1 'dashicons'; + speak: none; + display: inline-block; + padding: 8px 10px; + top: 0; + position: relative; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} +/* line 31, sass/partials/_collapsible_ui.scss */ +.cmb2-metabox .postbox.closed .cmbhandle:before { + content: '\f140'; +} +/* line 37, sass/partials/_collapsible_ui.scss */ +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row { + -webkit-appearance: none !important; + background: none !important; + border: none !important; + position: absolute; + left: 0; + top: .5em; + line-height: 1em; + padding: 2px 6px 3px; + opacity: .5; +} +/* line 47, sass/partials/_collapsible_ui.scss */ +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]) { + cursor: pointer; + color: #a00; + opacity: 1; +} +/* line 51, sass/partials/_collapsible_ui.scss */ +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]):hover { + color: #f00; +} + +/* + * jQuery UI CSS Framework 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * WordPress Styles adopted from "jQuery UI Datepicker CSS for WordPress" + * https://github.com/stuttter/wp-datepicker-styling + * + */ +/* line 15, sass/partials/_jquery_ui.scss */ +* html .cmb2-element.ui-helper-clearfix { + height: 1%; +} + +/* line 24, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker, .cmb2-element .ui-datepicker { + padding: 0; + margin: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + background-color: #fff; + border: 1px solid #dfdfdf; + border-top: none; + -webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + min-width: 17em; + width: auto; + /* Default Color Scheme */ +} +/* line 38, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker *, .cmb2-element .ui-datepicker * { + padding: 0; + font-family: "Open Sans", sans-serif; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +/* line 46, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker table, .cmb2-element .ui-datepicker table { + font-size: 13px; + margin: 0; + border: none; + border-collapse: collapse; +} +/* line 53, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, .cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background-image: none; + border: none; + color: #fff; + font-weight: normal; +} +/* line 61, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: transparent; + border-color: transparent; + cursor: pointer; +} +/* line 67, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-title, .cmb2-element .ui-datepicker .ui-datepicker-title { + margin: 0; + padding: 10px 0; + color: #fff; + font-size: 14px; + line-height: 14px; + text-align: center; +} +/* line 75, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-title select, .cmb2-element .ui-datepicker .ui-datepicker-title select { + margin-top: -8px; + margin-bottom: -8px; +} +/* line 81, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-next, .cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-next { + position: relative; + top: 0; + height: 34px; + width: 34px; +} +/* line 89, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-next, .cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-next { + border: none; +} +/* line 94, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover, .cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-prev-hover { + left: 0; +} +/* line 99, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-next, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover, .cmb2-element .ui-datepicker .ui-datepicker-next, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover { + right: 0; +} +/* line 104, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-next span, +.cmb2-element.ui-datepicker .ui-datepicker-prev span, .cmb2-element .ui-datepicker .ui-datepicker-next span, +.cmb2-element .ui-datepicker .ui-datepicker-prev span { + display: none; +} +/* line 109, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-prev, .cmb2-element .ui-datepicker .ui-datepicker-prev { + float: left; +} +/* line 113, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-next, .cmb2-element .ui-datepicker .ui-datepicker-next { + float: right; +} +/* line 117, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.cmb2-element.ui-datepicker .ui-datepicker-next:before, .cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.cmb2-element .ui-datepicker .ui-datepicker-next:before { + font: normal 20px/34px 'dashicons'; + padding-left: 7px; + color: #fff; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: 34px; + height: 34px; +} +/* line 129, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, .cmb2-element .ui-datepicker .ui-datepicker-prev:before { + content: '\f341'; +} +/* line 133, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-next:before, .cmb2-element .ui-datepicker .ui-datepicker-next:before { + content: '\f345'; +} +/* line 137, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover:before, .cmb2-element .ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover:before { + opacity: 0.7; +} +/* line 142, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker select.ui-datepicker-month, +.cmb2-element.ui-datepicker select.ui-datepicker-year, .cmb2-element .ui-datepicker select.ui-datepicker-month, +.cmb2-element .ui-datepicker select.ui-datepicker-year { + width: 33%; + background: transparent; + border-color: transparent; + box-shadow: none; + color: #fff; +} +/* line 149, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker select.ui-datepicker-month option, +.cmb2-element.ui-datepicker select.ui-datepicker-year option, .cmb2-element .ui-datepicker select.ui-datepicker-month option, +.cmb2-element .ui-datepicker select.ui-datepicker-year option { + color: #333; +} +/* line 154, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker thead, .cmb2-element .ui-datepicker thead { + color: #fff; + font-weight: 600; +} +/* line 157, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker thead th, .cmb2-element .ui-datepicker thead th { + font-weight: normal; +} +/* line 162, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker th, .cmb2-element .ui-datepicker th { + padding: 10px; +} +/* line 166, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td, .cmb2-element .ui-datepicker td { + padding: 0; + border: 1px solid #f4f4f4; +} +/* line 171, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td.ui-datepicker-other-month, .cmb2-element .ui-datepicker td.ui-datepicker-other-month { + border: transparent; +} +/* line 175, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td.ui-datepicker-week-end, .cmb2-element .ui-datepicker td.ui-datepicker-week-end { + background-color: #f4f4f4; + border: 1px solid #f4f4f4; +} +/* line 178, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today, .cmb2-element .ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today { + -webkit-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); +} +/* line 185, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td.ui-datepicker-today, .cmb2-element .ui-datepicker td.ui-datepicker-today { + background-color: #f0f0c0; +} +/* line 189, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td.ui-datepicker-current-day, .cmb2-element .ui-datepicker td.ui-datepicker-current-day { + background: #bbdd88; +} +/* line 193, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td .ui-state-default, .cmb2-element .ui-datepicker td .ui-state-default { + background: transparent; + border: none; + text-align: center; + text-decoration: none; + width: auto; + display: block; + padding: 5px 10px; + font-weight: normal; + color: #444; +} +/* line 205, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td.ui-state-disabled .ui-state-default, .cmb2-element .ui-datepicker td.ui-state-disabled .ui-state-default { + opacity: 0.5; +} +/* line 210, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, .cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} +/* line 215, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker thead, .cmb2-element .ui-datepicker thead { + background: #32373c; +} +/* line 219, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker td .ui-state-hover, .cmb2-element.ui-datepicker td .ui-state-active, .cmb2-element .ui-datepicker td .ui-state-hover, .cmb2-element .ui-datepicker td .ui-state-active { + background: #0073aa; + color: #fff; +} +/* line 224, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div, .cmb2-element .ui-datepicker .ui-timepicker-div { + font-size: 14px; +} +/* line 226, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div dl, .cmb2-element .ui-datepicker .ui-timepicker-div dl { + text-align: left; + padding: 0 .6em; +} +/* line 229, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div dl dt, .cmb2-element .ui-datepicker .ui-timepicker-div dl dt { + float: left; + clear: left; + padding: 0 0 0 5px; +} +/* line 234, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd, .cmb2-element .ui-datepicker .ui-timepicker-div dl dd { + margin: 0 10px 10px 40%; +} +/* line 236, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd select, .cmb2-element .ui-datepicker .ui-timepicker-div dl dd select { + width: 100%; +} +/* line 242, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane { + padding: .6em; + text-align: left; +} +/* line 246, sass/partials/_jquery_ui.scss */ +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, .cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, .cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary { + padding: 0 10px 1px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + margin: 0 .6em .4em .4em; +} + +/* line 260, sass/partials/_jquery_ui.scss */ +.admin-color-fresh .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-fresh .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} +/* line 265, sass/partials/_jquery_ui.scss */ +.admin-color-fresh .cmb2-element.ui-datepicker thead, .admin-color-fresh .cmb2-element .ui-datepicker thead { + background: #32373c; +} +/* line 269, sass/partials/_jquery_ui.scss */ +.admin-color-fresh .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-fresh .cmb2-element .ui-datepicker td .ui-state-hover { + background: #0073aa; + color: #fff; +} + +/* line 277, sass/partials/_jquery_ui.scss */ +.admin-color-blue .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-blue .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #52accc; +} +/* line 282, sass/partials/_jquery_ui.scss */ +.admin-color-blue .cmb2-element.ui-datepicker thead, .admin-color-blue .cmb2-element .ui-datepicker thead { + background: #4796b3; +} +/* line 291, sass/partials/_jquery_ui.scss */ +.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-blue .cmb2-element.ui-datepicker td .ui-state-active, .admin-color-blue .cmb2-element .ui-datepicker td .ui-state-hover, .admin-color-blue .cmb2-element .ui-datepicker td .ui-state-active { + background: #096484; + color: #fff; +} +/* line 296, sass/partials/_jquery_ui.scss */ +.admin-color-blue .cmb2-element.ui-datepicker td.ui-datepicker-today, .admin-color-blue .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +/* line 305, sass/partials/_jquery_ui.scss */ +.admin-color-coffee .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-coffee .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #59524c; +} +/* line 310, sass/partials/_jquery_ui.scss */ +.admin-color-coffee .cmb2-element.ui-datepicker thead, .admin-color-coffee .cmb2-element .ui-datepicker thead { + background: #46403c; +} +/* line 314, sass/partials/_jquery_ui.scss */ +.admin-color-coffee .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-coffee .cmb2-element .ui-datepicker td .ui-state-hover { + background: #c7a589; + color: #fff; +} + +/* line 322, sass/partials/_jquery_ui.scss */ +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #523f6d; +} +/* line 327, sass/partials/_jquery_ui.scss */ +.admin-color-ectoplasm .cmb2-element.ui-datepicker thead, .admin-color-ectoplasm .cmb2-element .ui-datepicker thead { + background: #413256; +} +/* line 331, sass/partials/_jquery_ui.scss */ +.admin-color-ectoplasm .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-ectoplasm .cmb2-element .ui-datepicker td .ui-state-hover { + background: #a3b745; + color: #fff; +} + +/* line 339, sass/partials/_jquery_ui.scss */ +.admin-color-midnight .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-midnight .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #363b3f; +} +/* line 344, sass/partials/_jquery_ui.scss */ +.admin-color-midnight .cmb2-element.ui-datepicker thead, .admin-color-midnight .cmb2-element .ui-datepicker thead { + background: #26292c; +} +/* line 348, sass/partials/_jquery_ui.scss */ +.admin-color-midnight .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-midnight .cmb2-element .ui-datepicker td .ui-state-hover { + background: #e14d43; + color: #fff; +} + +/* line 356, sass/partials/_jquery_ui.scss */ +.admin-color-ocean .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-ocean .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #738e96; +} +/* line 361, sass/partials/_jquery_ui.scss */ +.admin-color-ocean .cmb2-element.ui-datepicker thead, .admin-color-ocean .cmb2-element .ui-datepicker thead { + background: #627c83; +} +/* line 365, sass/partials/_jquery_ui.scss */ +.admin-color-ocean .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-ocean .cmb2-element .ui-datepicker td .ui-state-hover { + background: #9ebaa0; + color: #fff; +} + +/* line 373, sass/partials/_jquery_ui.scss */ +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, .admin-color-sunrise .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: #cf4944; +} +/* line 379, sass/partials/_jquery_ui.scss */ +.admin-color-sunrise .cmb2-element.ui-datepicker th, .admin-color-sunrise .cmb2-element .ui-datepicker th { + border-color: #be3631; + background: #be3631; +} +/* line 384, sass/partials/_jquery_ui.scss */ +.admin-color-sunrise .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-sunrise .cmb2-element .ui-datepicker td .ui-state-hover { + background: #dd823b; + color: #fff; +} + +/* line 392, sass/partials/_jquery_ui.scss */ +.admin-color-light .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-light .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #e5e5e5; +} +/* line 397, sass/partials/_jquery_ui.scss */ +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-year, .admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-year { + color: #555; +} +/* line 402, sass/partials/_jquery_ui.scss */ +.admin-color-light .cmb2-element.ui-datepicker thead, .admin-color-light .cmb2-element .ui-datepicker thead { + background: #888; +} +/* line 406, sass/partials/_jquery_ui.scss */ +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-next:before, .admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element .ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-next:before { + color: #555; +} +/* line 414, sass/partials/_jquery_ui.scss */ +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-light .cmb2-element.ui-datepicker td .ui-state-active, .admin-color-light .cmb2-element .ui-datepicker td .ui-state-hover, .admin-color-light .cmb2-element .ui-datepicker td .ui-state-active { + background: #ccc; +} +/* line 418, sass/partials/_jquery_ui.scss */ +.admin-color-light .cmb2-element.ui-datepicker td.ui-datepicker-today, .admin-color-light .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +/* line 426, sass/partials/_jquery_ui.scss */ +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #56b274; +} +/* line 431, sass/partials/_jquery_ui.scss */ +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker thead, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker thead { + background: #36533f; +} +/* line 435, sass/partials/_jquery_ui.scss */ +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-bbp-evergreen .cmb2-element .ui-datepicker td .ui-state-hover { + background: #446950; + color: #fff; +} + +/* line 443, sass/partials/_jquery_ui.scss */ +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-datepicker-header, .admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #4ca26a; +} +/* line 448, sass/partials/_jquery_ui.scss */ +.admin-color-bbp-mint .cmb2-element.ui-datepicker thead, .admin-color-bbp-mint .cmb2-element .ui-datepicker thead { + background: #4f6d59; +} +/* line 452, sass/partials/_jquery_ui.scss */ +.admin-color-bbp-mint .cmb2-element.ui-datepicker td .ui-state-hover, .admin-color-bbp-mint .cmb2-element .ui-datepicker td .ui-state-hover { + background: #5fb37c; + color: #fff; +} + +/** + * CMB2 Frontend + */ +/*-------------------------------------------------------------- + * CMB2 Frontend +--------------------------------------------------------------*/ +/* line 5, sass/partials/_front.scss */ +.closed .inside { + display: none; +} + +/* line 9, sass/partials/_front.scss */ +.cmb-repeatable-grouping { + position: relative; +} +/* line 12, sass/partials/_front.scss */ +.cmb-repeatable-grouping .cmb-group-title { + margin-left: -1em; + margin-right: -1em; + min-height: 1.5em; +} +/* line 18, sass/partials/_front.scss */ +.cmb-repeatable-grouping h3 { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} + +/* line 29, sass/partials/_front.scss */ +.cmb-repeatable-group.repeatable .cmb-group-title { + padding-left: 2.2em; +} +/* line 33, sass/partials/_front.scss */ +.cmb-repeatable-group.non-repeatable .cmb-group-title { + padding-left: 12px; +} + +/* line 39, sass/partials/_front.scss */ +.cmb-type-group .cmb-row .cmbhandle { + right: 0; + position: absolute; +} + +/* line 44, sass/partials/_front.scss */ +.cmb-spinner { + background: url(/wp-admin/images/spinner.gif) no-repeat; + -webkit-background-size: 20px 20px; + background-size: 20px 20px; + display: none; + float: right; + vertical-align: middle; + opacity: 0.7; + filter: alpha(opacity=70); + width: 20px; + height: 20px; + margin: 4px 10px 0; +} + +/*# sourceMappingURL=cmb2-front.css.map */ diff --git a/inc/vendors/cmb2-plugins/cmb2/css/cmb2-front.min.css b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-front.min.css new file mode 100755 index 00000000..a3b7fce5 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-front.min.css @@ -0,0 +1,2 @@ +/*! CMB2 - v2.6.0 - 2019-01-18 | https://cmb2.io | Copyright (c) 2019 CMB2 team | Licensed GPLv2 */ +@charset "UTF-8";.cmb2-wrap{margin:0}.cmb2-wrap input,.cmb2-wrap textarea{font-size:14px;max-width:100%;padding:5px}.cmb2-wrap input[type=text].cmb2-oembed{width:100%}.cmb2-wrap textarea{width:500px}.cmb2-wrap textarea.cmb2-textarea-code{font-family:"Courier 10 Pitch",Courier,monospace;line-height:16px}.cmb2-wrap input.cmb2-text-small,.cmb2-wrap input.cmb2-timepicker{width:100px}.cmb2-wrap input.cmb2-text-money{width:90px}.cmb2-wrap input.cmb2-text-medium{width:230px}.cmb2-wrap input.cmb2-upload-file{width:65%}.cmb2-wrap input.ed_button{padding:2px 4px}.cmb2-wrap input:not([type=hidden])+.button-secondary,.cmb2-wrap input:not([type=hidden])+input,.cmb2-wrap input:not([type=hidden])+select{margin-left:20px}.cmb2-wrap ul{margin:0}.cmb2-wrap li{font-size:14px;line-height:16px;margin:1px 0 5px}.cmb2-wrap select{font-size:14px;margin-top:3px}.cmb2-wrap input:focus,.cmb2-wrap textarea:focus{background:#fffff8}.cmb2-wrap input[type=checkbox],.cmb2-wrap input[type=radio]{margin:0 5px 0 0;padding:0}.cmb2-wrap .button-secondary,.cmb2-wrap button{white-space:nowrap}.cmb2-wrap .mceLayout{border:1px solid #e9e9e9!important}.cmb2-wrap .mceIframeContainer{background:#fff}.cmb2-wrap .meta_mce{width:97%}.cmb2-wrap .meta_mce textarea{width:100%}.cmb2-wrap .wp-color-result,.cmb2-wrap .wp-picker-input-wrap{vertical-align:middle}.cmb2-wrap .wp-color-result,.cmb2-wrap .wp-picker-container{margin:0 10px 0 0}.cmb2-wrap .cmb-row{margin:0}.cmb2-wrap .cmb-row:after{content:'';clear:both;display:block;width:100%}.cmb2-wrap .cmb-row.cmb-repeat .cmb2-metabox-description{padding-top:0;padding-bottom:1em}.cmb2-metabox{clear:both;margin:0}.cmb2-metabox .cmb-field-list>.cmb-row:first-of-type>.cmb-td,.cmb2-metabox .cmb-field-list>.cmb-row:first-of-type>.cmb-th,.cmb2-metabox>.cmb-row:first-of-type>.cmb-td,.cmb2-metabox>.cmb-row:first-of-type>.cmb-th{border:0}.cmb-add-row{margin:1.8em 0 0}.cmb-nested .cmb-td,.cmb-repeatable-group .cmb-th,.cmb-repeatable-group:first-of-type{border:0}.cmb-repeatable-group:last-of-type,.cmb-row:last-of-type,.cmb2-wrap .cmb-row:last-of-type{border-bottom:0}.cmb-repeatable-grouping{border:1px solid #e9e9e9;padding:0 1em}.cmb-repeatable-grouping.cmb-row{margin:0 0 .8em}.cmb-th{color:#222;float:left;font-weight:600;line-height:1.3;padding:20px 10px 20px 0;vertical-align:top;width:200px}@media (max-width:450px){.cmb-th{font-size:1.2em;display:block;float:none;padding-bottom:1em;text-align:left;width:100%}.cmb-th label{display:block;margin-top:0;margin-bottom:.5em}}.cmb-td{line-height:1.3;max-width:100%;padding:15px 10px;vertical-align:middle}.cmb-type-title .cmb-td{padding:0}.cmb-th label{display:block;padding:5px 0}.cmb-th+.cmb-td{float:left}.cmb-td .cmb-td{padding-bottom:1em}.cmb-remove-row{text-align:right}.empty-row.hidden{display:none}.cmb-repeat-table{background-color:#fafafa;border:1px solid #e1e1e1}.cmb-repeat-table .cmb-row.cmb-repeat-row{position:relative;counter-increment:el;margin:0;padding:10px 10px 10px 50px;border-bottom:none!important}.cmb-repeat-table .cmb-row.cmb-repeat-row+.cmb-repeat-row{border-top:solid 1px #e9e9e9}.cmb-repeat-table .cmb-row.cmb-repeat-row.ui-sortable-helper{outline:dashed 2px #e9e9e9!important}.cmb-repeat-table .cmb-row.cmb-repeat-row:before{content:counter(el);display:block;top:0;left:0;position:absolute;width:35px;height:100%;line-height:35px;cursor:move;color:#757575;text-align:center;border-right:solid 1px #e9e9e9}.cmb-repeat-table .cmb-row.cmb-repeat-row .cmb-td{margin:0;padding:0}.cmb-repeat-table+.cmb-add-row{margin:0}.cmb-repeat-table+.cmb-add-row:before{content:'';width:1px;height:1.6em;display:block;margin-left:17px;background-color:#dcdcdc}.cmb-repeat-table .cmb-remove-row{top:7px;right:7px;position:absolute;width:auto;margin-left:0;padding:0!important;display:none}.cmb-repeat-table .cmb-remove-row>.cmb-remove-row-button{font-size:20px;text-indent:-1000px;overflow:hidden;position:relative;height:auto;line-height:1;padding:0 10px}.cmb-repeat-table .cmb-remove-row>.cmb-remove-row-button:before{content:"";font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center}.cmb-repeat-table .cmb-repeat-row:hover .cmb-remove-row{display:block}.cmb-repeatable-group .cmb-th{padding:5px}.cmb-repeatable-group .cmb-group-title{background-color:#e9e9e9;padding:8px 12px 8px 2.2em;margin:0 -1em;min-height:1.5em;font-size:14px;line-height:1.4}.cmb-repeatable-group .cmb-group-title h4{border:0;margin:0;font-size:1.2em;font-weight:500;padding:.5em .75em}.cmb-repeatable-group .cmb-group-title .cmb-th{display:block;width:100%}.cmb-repeatable-group .cmb-group-description .cmb-th{font-size:1.2em;display:block;float:none;padding-bottom:1em;text-align:left;width:100%}.cmb-repeatable-group .cmb-group-description .cmb-th label{display:block;margin-top:0;margin-bottom:.5em}.cmb-repeatable-group .cmb-shift-rows{font-size:1em;margin-right:1em;text-decoration:none}.cmb-repeatable-group .cmb-shift-rows .dashicons{font-size:1.5em;height:1.5em;line-height:1.2em;width:1em}.cmb-repeatable-group .cmb-shift-rows .dashicons.dashicons-arrow-down-alt2{line-height:1.3em}.cmb-repeatable-group .cmb2-upload-button{float:right}p.cmb2-metabox-description{color:#757575;font-style:italic;margin:0;padding-top:.5em}span.cmb2-metabox-description{color:#757575;font-style:italic}.cmb2-metabox-title{margin:0 0 5px;padding:5px 0 0;font-size:14px}.cmb-inline ul{padding:4px 0 0}.cmb-inline li{display:inline-block;padding-right:18px}.cmb-type-textarea-code pre{margin:0}.cmb2-media-status .img-status{clear:none;display:inline-block;vertical-align:middle;margin-right:10px;width:auto}.cmb2-media-status .img-status img{max-width:350px;height:auto}.cmb2-media-status .embed-status,.cmb2-media-status .img-status img{background:#eee;border:5px solid #fff;outline:1px solid #e9e9e9;box-shadow:inset 0 0 15px rgba(0,0,0,.3),inset 0 0 0 1px rgba(0,0,0,.05);background-image:linear-gradient(45deg,#d0d0d0 25%,transparent 25%,transparent 75%,#d0d0d0 75%,#d0d0d0),linear-gradient(45deg,#d0d0d0 25%,transparent 25%,transparent 75%,#d0d0d0 75%,#d0d0d0);background-position:0 0,10px 10px;background-size:20px 20px;border-radius:2px;-moz-border-radius:2px;margin:15px 0 0}.cmb2-media-status .embed-status{float:left;max-width:800px}.cmb2-media-status .embed-status,.cmb2-media-status .img-status{position:relative}.cmb2-media-status .embed-status .cmb2-remove-file-button,.cmb2-media-status .img-status .cmb2-remove-file-button{background:url(../images/ico-delete.png);height:16px;left:-5px;position:absolute;text-indent:-9999px;top:-5px;width:16px}.cmb2-media-status .img-status .cmb2-remove-file-button{top:10px}.cmb2-media-status .file-status>span,.cmb2-media-status .img-status img{cursor:pointer}.cmb2-media-status.cmb-attach-list .file-status>span,.cmb2-media-status.cmb-attach-list .img-status img{cursor:move}.cmb-type-file-list .cmb2-media-status .img-status{clear:none;vertical-align:middle;width:auto;margin-right:10px;margin-bottom:10px;margin-top:0}.cmb-attach-list li{clear:both;display:inline-block;width:100%;margin-top:5px;margin-bottom:10px}.cmb-attach-list li img{float:left;margin-right:10px}.cmb2-remove-wrapper{margin:0}.child-cmb2 .cmb-th{text-align:left}.cmb2-indented-hierarchy{padding-left:1.5em}@media (max-width:450px){.cmb-td,.cmb-th,.cmb-th+.cmb-td{display:block;float:none;width:100%}}#poststuff .cmb-group-title{margin-left:-1em;margin-right:-1em;min-height:1.5em}#poststuff .repeatable .cmb-group-title{padding-left:2.2em}.cmb-type-group .cmb2-wrap,.cmb2-postbox .cmb2-wrap{margin:0}.cmb-type-group .cmb2-wrap>.cmb-field-list>.cmb-row,.cmb2-postbox .cmb2-wrap>.cmb-field-list>.cmb-row{padding:1.8em 0}.cmb-type-group .cmb2-wrap input[type=text].cmb2-oembed,.cmb2-postbox .cmb2-wrap input[type=text].cmb2-oembed{width:100%}.cmb-type-group .cmb-row,.cmb2-postbox .cmb-row{padding:0 0 1.8em;margin:0 0 .8em}.cmb-type-group .cmb-row .cmbhandle,.cmb2-postbox .cmb-row .cmbhandle{right:-1em;position:relative;color:#222}.cmb-type-group .cmb-repeatable-grouping,.cmb2-postbox .cmb-repeatable-grouping{padding:0 1em;max-width:100%;min-width:1px!important}.cmb-type-group .cmb-repeatable-group>.cmb-row,.cmb2-postbox .cmb-repeatable-group>.cmb-row{padding-bottom:0}.cmb-type-group .cmb-th,.cmb2-postbox .cmb-th{width:18%;padding:0 2% 0 0}.cmb-type-group .cmb-td,.cmb2-postbox .cmb-td{margin-bottom:0;padding:0;line-height:1.3}.cmb-type-group .cmb-th+.cmb-td,.cmb2-postbox .cmb-th+.cmb-td{width:80%;float:right}.cmb-type-group .cmb-repeatable-group:not(:last-of-type),.cmb-type-group .cmb-row:not(:last-of-type),.cmb2-postbox .cmb-repeatable-group:not(:last-of-type),.cmb2-postbox .cmb-row:not(:last-of-type){border-bottom:1px solid #e9e9e9}@media (max-width:450px){.cmb-type-group .cmb-repeatable-group:not(:last-of-type),.cmb-type-group .cmb-row:not(:last-of-type),.cmb2-postbox .cmb-repeatable-group:not(:last-of-type),.cmb2-postbox .cmb-row:not(:last-of-type){border-bottom:0}}.cmb-type-group .cmb-remove-field-row,.cmb-type-group .cmb-repeat-group-field,.cmb2-postbox .cmb-remove-field-row,.cmb2-postbox .cmb-repeat-group-field{padding-top:1.8em}.js .cmb2-postbox.context-box .toggle-indicator:before{content:"\f142";display:inline-block;font:400 20px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.js .cmb2-postbox.context-box.closed .toggle-indicator:before{content:"\f140"}.cmb2-postbox.context-box{margin-bottom:10px}.cmb2-postbox.context-box.context-after_title-box,.cmb2-postbox.context-box.context-before_permalink-box{margin-top:10px}.cmb2-postbox.context-box.context-after_editor-box{margin-top:20px;margin-bottom:0}.cmb2-postbox.context-box.context-form_top-box{margin-top:10px}.cmb2-postbox.context-box.context-form_top-box .hndle{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}.cmb2-postbox.context-box .hndle{cursor:auto}.cmb2-context-wrap{margin-top:10px}.cmb2-context-wrap.cmb2-context-wrap-form_top{margin-right:300px;width:auto}.cmb2-context-wrap.cmb2-context-wrap-no-title .cmb2-metabox{padding:10px}.cmb2-context-wrap .cmb-th{padding:0 2% 0 0;width:18%}.cmb2-context-wrap .cmb-td{width:80%;padding:0}.cmb2-context-wrap .cmb-row{margin-bottom:10px}.cmb2-context-wrap .cmb-row:last-of-type{margin-bottom:0}@media only screen and (max-width:850px){.cmb2-context-wrap.cmb2-context-wrap-form_top{margin-right:0}}#poststuff .cmb-repeatable-group h2{margin:0}.edit-tags-php .cmb2-metabox-title,.profile-php .cmb2-metabox-title,.user-edit-php .cmb2-metabox-title{font-size:1.4em}.cmb2-no-box-wrap .cmb-spinner,.cmb2-postbox .cmb-spinner{float:left;display:none}.cmb-spinner.is-active{display:block}.cmb2-metabox .cmbhandle{color:#757575;float:right;width:27px;height:30px;cursor:pointer;right:-1em;position:relative}.cmb2-metabox .cmbhandle:before{content:'\f142';right:12px;font:400 20px/1 dashicons;speak:none;display:inline-block;padding:8px 10px;top:0;position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.cmb2-metabox .postbox.closed .cmbhandle:before{content:'\f140'}.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row{-webkit-appearance:none!important;background:none!important;border:none!important;position:absolute;left:0;top:.5em;line-height:1em;padding:2px 6px 3px;opacity:.5}.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]){cursor:pointer;color:#a00;opacity:1}.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]):hover{color:red}* html .cmb2-element.ui-helper-clearfix{height:1%}.cmb2-element .ui-datepicker,.cmb2-element.ui-datepicker{padding:0;margin:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background-color:#fff;border:1px solid #dfdfdf;border-top:none;-webkit-box-shadow:0 3px 6px rgba(0,0,0,.075);box-shadow:0 3px 6px rgba(0,0,0,.075);min-width:17em;width:auto}.cmb2-element .ui-datepicker *,.cmb2-element.ui-datepicker *{padding:0;font-family:"Open Sans",sans-serif;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.cmb2-element .ui-datepicker table,.cmb2-element.ui-datepicker table{font-size:13px;margin:0;border:none;border-collapse:collapse}.cmb2-element .ui-datepicker .ui-datepicker-header,.cmb2-element .ui-datepicker .ui-widget-header,.cmb2-element.ui-datepicker .ui-datepicker-header,.cmb2-element.ui-datepicker .ui-widget-header{border:none;color:#fff;font-weight:400}.cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover,.cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover{background:0 0;border-color:transparent;cursor:pointer}.cmb2-element .ui-datepicker .ui-datepicker-title,.cmb2-element.ui-datepicker .ui-datepicker-title{margin:0;padding:10px 0;color:#fff;font-size:14px;line-height:14px;text-align:center}.cmb2-element .ui-datepicker .ui-datepicker-title select,.cmb2-element.ui-datepicker .ui-datepicker-title select{margin-top:-8px;margin-bottom:-8px}.cmb2-element .ui-datepicker .ui-datepicker-next,.cmb2-element .ui-datepicker .ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-datepicker-next,.cmb2-element.ui-datepicker .ui-datepicker-prev{position:relative;top:0;height:34px;width:34px}.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-next,.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-next,.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-prev{border:none}.cmb2-element .ui-datepicker .ui-datepicker-prev,.cmb2-element .ui-datepicker .ui-datepicker-prev-hover,.cmb2-element.ui-datepicker .ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-datepicker-prev-hover{left:0}.cmb2-element .ui-datepicker .ui-datepicker-next,.cmb2-element .ui-datepicker .ui-datepicker-next-hover,.cmb2-element.ui-datepicker .ui-datepicker-next,.cmb2-element.ui-datepicker .ui-datepicker-next-hover{right:0}.cmb2-element .ui-datepicker .ui-datepicker-next span,.cmb2-element .ui-datepicker .ui-datepicker-prev span,.cmb2-element.ui-datepicker .ui-datepicker-next span,.cmb2-element.ui-datepicker .ui-datepicker-prev span{display:none}.cmb2-element .ui-datepicker .ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-datepicker-prev{float:left}.cmb2-element .ui-datepicker .ui-datepicker-next,.cmb2-element.ui-datepicker .ui-datepicker-next{float:right}.cmb2-element .ui-datepicker .ui-datepicker-next:before,.cmb2-element .ui-datepicker .ui-datepicker-prev:before,.cmb2-element.ui-datepicker .ui-datepicker-next:before,.cmb2-element.ui-datepicker .ui-datepicker-prev:before{font:400 20px/34px dashicons;padding-left:7px;color:#fff;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:34px;height:34px}.cmb2-element .ui-datepicker .ui-datepicker-prev:before,.cmb2-element.ui-datepicker .ui-datepicker-prev:before{content:'\f341'}.cmb2-element .ui-datepicker .ui-datepicker-next:before,.cmb2-element.ui-datepicker .ui-datepicker-next:before{content:'\f345'}.cmb2-element .ui-datepicker .ui-datepicker-next-hover:before,.cmb2-element .ui-datepicker .ui-datepicker-prev-hover:before,.cmb2-element.ui-datepicker .ui-datepicker-next-hover:before,.cmb2-element.ui-datepicker .ui-datepicker-prev-hover:before{opacity:.7}.cmb2-element .ui-datepicker select.ui-datepicker-month,.cmb2-element .ui-datepicker select.ui-datepicker-year,.cmb2-element.ui-datepicker select.ui-datepicker-month,.cmb2-element.ui-datepicker select.ui-datepicker-year{width:33%;background:0 0;border-color:transparent;box-shadow:none;color:#fff}.cmb2-element .ui-datepicker select.ui-datepicker-month option,.cmb2-element .ui-datepicker select.ui-datepicker-year option,.cmb2-element.ui-datepicker select.ui-datepicker-month option,.cmb2-element.ui-datepicker select.ui-datepicker-year option{color:#333}.cmb2-element .ui-datepicker thead,.cmb2-element.ui-datepicker thead{color:#fff;font-weight:600}.cmb2-element .ui-datepicker thead th,.cmb2-element.ui-datepicker thead th{font-weight:400}.cmb2-element .ui-datepicker th,.cmb2-element.ui-datepicker th{padding:10px}.cmb2-element .ui-datepicker td,.cmb2-element.ui-datepicker td{padding:0;border:1px solid #f4f4f4}.cmb2-element .ui-datepicker td.ui-datepicker-other-month,.cmb2-element.ui-datepicker td.ui-datepicker-other-month{border:transparent}.cmb2-element .ui-datepicker td.ui-datepicker-week-end,.cmb2-element.ui-datepicker td.ui-datepicker-week-end{background-color:#f4f4f4;border:1px solid #f4f4f4}.cmb2-element .ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today,.cmb2-element.ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today{-webkit-box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1);-moz-box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1);box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1)}.cmb2-element .ui-datepicker td.ui-datepicker-today,.cmb2-element.ui-datepicker td.ui-datepicker-today{background-color:#f0f0c0}.cmb2-element .ui-datepicker td.ui-datepicker-current-day,.cmb2-element.ui-datepicker td.ui-datepicker-current-day{background:#bd8}.cmb2-element .ui-datepicker td .ui-state-default,.cmb2-element.ui-datepicker td .ui-state-default{background:0 0;border:none;text-align:center;text-decoration:none;width:auto;display:block;padding:5px 10px;font-weight:400;color:#444}.cmb2-element .ui-datepicker td.ui-state-disabled .ui-state-default,.cmb2-element.ui-datepicker td.ui-state-disabled .ui-state-default{opacity:.5}.cmb2-element .ui-datepicker .ui-datepicker-header,.cmb2-element .ui-datepicker .ui-widget-header,.cmb2-element.ui-datepicker .ui-datepicker-header,.cmb2-element.ui-datepicker .ui-widget-header{background:#00a0d2}.cmb2-element .ui-datepicker thead,.cmb2-element.ui-datepicker thead{background:#32373c}.cmb2-element .ui-datepicker td .ui-state-active,.cmb2-element .ui-datepicker td .ui-state-hover,.cmb2-element.ui-datepicker td .ui-state-active,.cmb2-element.ui-datepicker td .ui-state-hover{background:#0073aa;color:#fff}.cmb2-element .ui-datepicker .ui-timepicker-div,.cmb2-element.ui-datepicker .ui-timepicker-div{font-size:14px}.cmb2-element .ui-datepicker .ui-timepicker-div dl,.cmb2-element.ui-datepicker .ui-timepicker-div dl{text-align:left;padding:0 .6em}.cmb2-element .ui-datepicker .ui-timepicker-div dl dt,.cmb2-element.ui-datepicker .ui-timepicker-div dl dt{float:left;clear:left;padding:0 0 0 5px}.cmb2-element .ui-datepicker .ui-timepicker-div dl dd,.cmb2-element.ui-datepicker .ui-timepicker-div dl dd{margin:0 10px 10px 40%}.cmb2-element .ui-datepicker .ui-timepicker-div dl dd select,.cmb2-element.ui-datepicker .ui-timepicker-div dl dd select{width:100%}.cmb2-element .ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane,.cmb2-element.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane{padding:.6em;text-align:left}.cmb2-element .ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-primary,.cmb2-element .ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-secondary,.cmb2-element.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-primary,.cmb2-element.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-secondary{padding:0 10px 1px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;margin:0 .6em .4em .4em}.admin-color-fresh .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-fresh .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-fresh .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-fresh .cmb2-element.ui-datepicker .ui-widget-header{background:#00a0d2}.admin-color-fresh .cmb2-element .ui-datepicker thead,.admin-color-fresh .cmb2-element.ui-datepicker thead{background:#32373c}.admin-color-fresh .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-fresh .cmb2-element.ui-datepicker td .ui-state-hover{background:#0073aa;color:#fff}.admin-color-blue .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-blue .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-blue .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-blue .cmb2-element.ui-datepicker .ui-widget-header{background:#52accc}.admin-color-blue .cmb2-element .ui-datepicker thead,.admin-color-blue .cmb2-element.ui-datepicker thead{background:#4796b3}.admin-color-blue .cmb2-element .ui-datepicker td .ui-state-active,.admin-color-blue .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-active,.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-hover{background:#096484;color:#fff}.admin-color-blue .cmb2-element .ui-datepicker td.ui-datepicker-today,.admin-color-blue .cmb2-element.ui-datepicker td.ui-datepicker-today{background:#eee}.admin-color-coffee .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-coffee .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-coffee .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-coffee .cmb2-element.ui-datepicker .ui-widget-header{background:#59524c}.admin-color-coffee .cmb2-element .ui-datepicker thead,.admin-color-coffee .cmb2-element.ui-datepicker thead{background:#46403c}.admin-color-coffee .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-coffee .cmb2-element.ui-datepicker td .ui-state-hover{background:#c7a589;color:#fff}.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-widget-header{background:#523f6d}.admin-color-ectoplasm .cmb2-element .ui-datepicker thead,.admin-color-ectoplasm .cmb2-element.ui-datepicker thead{background:#413256}.admin-color-ectoplasm .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-ectoplasm .cmb2-element.ui-datepicker td .ui-state-hover{background:#a3b745;color:#fff}.admin-color-midnight .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-midnight .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-midnight .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-midnight .cmb2-element.ui-datepicker .ui-widget-header{background:#363b3f}.admin-color-midnight .cmb2-element .ui-datepicker thead,.admin-color-midnight .cmb2-element.ui-datepicker thead{background:#26292c}.admin-color-midnight .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-midnight .cmb2-element.ui-datepicker td .ui-state-hover{background:#e14d43;color:#fff}.admin-color-ocean .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-ocean .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-ocean .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-ocean .cmb2-element.ui-datepicker .ui-widget-header{background:#738e96}.admin-color-ocean .cmb2-element .ui-datepicker thead,.admin-color-ocean .cmb2-element.ui-datepicker thead{background:#627c83}.admin-color-ocean .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-ocean .cmb2-element.ui-datepicker td .ui-state-hover{background:#9ebaa0;color:#fff}.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover,.admin-color-sunrise .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover,.admin-color-sunrise .cmb2-element.ui-datepicker .ui-widget-header{background:#cf4944}.admin-color-sunrise .cmb2-element .ui-datepicker th,.admin-color-sunrise .cmb2-element.ui-datepicker th{border-color:#be3631;background:#be3631}.admin-color-sunrise .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-sunrise .cmb2-element.ui-datepicker td .ui-state-hover{background:#dd823b;color:#fff}.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-light .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-light .cmb2-element.ui-datepicker .ui-widget-header{background:#e5e5e5}.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-month,.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-year,.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-month,.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-year{color:#555}.admin-color-light .cmb2-element .ui-datepicker thead,.admin-color-light .cmb2-element.ui-datepicker thead{background:#888}.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-next:before,.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-prev:before,.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-title,.admin-color-light .cmb2-element .ui-datepicker td .ui-state-default,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-next:before,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-prev:before,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-title,.admin-color-light .cmb2-element.ui-datepicker td .ui-state-default{color:#555}.admin-color-light .cmb2-element .ui-datepicker td .ui-state-active,.admin-color-light .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-light .cmb2-element.ui-datepicker td .ui-state-active,.admin-color-light .cmb2-element.ui-datepicker td .ui-state-hover{background:#ccc}.admin-color-light .cmb2-element .ui-datepicker td.ui-datepicker-today,.admin-color-light .cmb2-element.ui-datepicker td.ui-datepicker-today{background:#eee}.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-widget-header{background:#56b274}.admin-color-bbp-evergreen .cmb2-element .ui-datepicker thead,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker thead{background:#36533f}.admin-color-bbp-evergreen .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker td .ui-state-hover{background:#446950;color:#fff}.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-widget-header{background:#4ca26a}.admin-color-bbp-mint .cmb2-element .ui-datepicker thead,.admin-color-bbp-mint .cmb2-element.ui-datepicker thead{background:#4f6d59}.admin-color-bbp-mint .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-bbp-mint .cmb2-element.ui-datepicker td .ui-state-hover{background:#5fb37c;color:#fff}.closed .inside{display:none}.cmb-repeatable-grouping{position:relative}.cmb-repeatable-grouping .cmb-group-title{margin-left:-1em;margin-right:-1em;min-height:1.5em}.cmb-repeatable-grouping h3{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}.cmb-repeatable-group.repeatable .cmb-group-title{padding-left:2.2em}.cmb-repeatable-group.non-repeatable .cmb-group-title{padding-left:12px}.cmb-type-group .cmb-row .cmbhandle{right:0;position:absolute}.cmb-spinner{background:url(/wp-admin/images/spinner.gif) no-repeat;-webkit-background-size:20px 20px;background-size:20px 20px;display:none;float:right;vertical-align:middle;opacity:.7;filter:alpha(opacity=70);width:20px;height:20px;margin:4px 10px 0} \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2/css/cmb2-rtl.css b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-rtl.css new file mode 100755 index 00000000..070499e1 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-rtl.css @@ -0,0 +1,2098 @@ +/*! + * CMB2 - v2.6.0 - 2019-01-18 + * https://cmb2.io + * Copyright (c) 2019 + * Licensed GPLv2+ + */ + +/*-------------------------------------------------------------- + * Main Wrap +--------------------------------------------------------------*/ + +/* line 5, sass/partials/_main_wrap.scss */ + +.cmb2-wrap { + margin: 0; +} + +/* line 8, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input, +.cmb2-wrap textarea { + font-size: 14px; + max-width: 100%; + padding: 5px; +} + +/* line 18, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} + +/* line 23, sass/partials/_main_wrap.scss */ + +.cmb2-wrap textarea { + width: 500px; +} + +/* line 26, sass/partials/_main_wrap.scss */ + +.cmb2-wrap textarea.cmb2-textarea-code { + font-family: "Courier 10 Pitch", Courier, monospace; + line-height: 16px; +} + +/* line 34, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input.cmb2-text-small, +.cmb2-wrap input.cmb2-timepicker { + width: 100px; +} + +/* line 40, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input.cmb2-text-money { + width: 90px; +} + +/* line 45, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input.cmb2-text-medium { + width: 230px; +} + +/* line 50, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input.cmb2-upload-file { + width: 65%; +} + +/* line 54, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input.ed_button { + padding: 2px 4px; +} + +/* line 59, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input:not([type="hidden"]) + input, +.cmb2-wrap input:not([type="hidden"]) + .button-secondary, +.cmb2-wrap input:not([type="hidden"]) + select { + margin-right: 20px; +} + +/* line 67, sass/partials/_main_wrap.scss */ + +.cmb2-wrap ul { + margin: 0; +} + +/* line 71, sass/partials/_main_wrap.scss */ + +.cmb2-wrap li { + font-size: 14px; + line-height: 16px; + margin: 1px 0 5px 0; +} + +/* line 82, sass/partials/_main_wrap.scss */ + +.cmb2-wrap select { + font-size: 14px; + margin-top: 3px; +} + +/* line 87, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input:focus, +.cmb2-wrap textarea:focus { + background: #fffff8; +} + +/* line 92, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input[type="radio"] { + margin: 0 0 0 5px; + padding: 0; +} + +/* line 97, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input[type="checkbox"] { + margin: 0 0 0 5px; + padding: 0; +} + +/* line 102, sass/partials/_main_wrap.scss */ + +.cmb2-wrap button, +.cmb2-wrap .button-secondary { + white-space: nowrap; +} + +/* line 107, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .mceLayout { + border: 1px solid #e9e9e9 !important; +} + +/* line 111, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .mceIframeContainer { + background: #ffffff; +} + +/* line 115, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .meta_mce { + width: 97%; +} + +/* line 118, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .meta_mce textarea { + width: 100%; +} + +/* line 124, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-input-wrap { + vertical-align: middle; +} + +/* line 129, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-container { + margin: 0 0 0 10px; +} + +/* line 134, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .cmb-row { + margin: 0; +} + +/* line 137, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .cmb-row:after { + content: ''; + clear: both; + display: block; + width: 100%; +} + +/* line 144, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .cmb-row.cmb-repeat .cmb2-metabox-description { + padding-top: 0; + padding-bottom: 1em; +} + +/* line 152, sass/partials/_main_wrap.scss */ + +.cmb2-metabox { + clear: both; + margin: 0; +} + +/* line 158, sass/partials/_main_wrap.scss */ + +.cmb2-metabox > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox > .cmb-row:first-of-type > .cmb-th, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-th { + border: 0; +} + +/* line 165, sass/partials/_main_wrap.scss */ + +.cmb-add-row { + margin: 1.8em 0 0; +} + +/* line 169, sass/partials/_main_wrap.scss */ + +.cmb-nested .cmb-td, +.cmb-repeatable-group .cmb-th, +.cmb-repeatable-group:first-of-type { + border: 0; +} + +/* line 175, sass/partials/_main_wrap.scss */ + +.cmb-row:last-of-type, +.cmb2-wrap .cmb-row:last-of-type, +.cmb-repeatable-group:last-of-type { + border-bottom: 0; +} + +/* line 181, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-grouping { + border: 1px solid #e9e9e9; + padding: 0 1em; +} + +/* line 185, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-grouping.cmb-row { + margin: 0 0 0.8em; +} + +/* line 193, sass/partials/_main_wrap.scss */ + +.cmb-th { + color: #222222; + float: right; + font-weight: 600; + line-height: 1.3; + padding: 20px 0 20px 10px; + vertical-align: top; + width: 200px; +} + +/* line 207, sass/partials/_main_wrap.scss */ + +.cmb-td { + line-height: 1.3; + max-width: 100%; + padding: 15px 10px; + vertical-align: middle; +} + +/* line 216, sass/partials/_main_wrap.scss */ + +.cmb-type-title .cmb-td { + padding: 0; +} + +/* line 221, sass/partials/_main_wrap.scss */ + +.cmb-th label { + display: block; + padding: 5px 0; +} + +/* line 226, sass/partials/_main_wrap.scss */ + +.cmb-th + .cmb-td { + float: right; +} + +/* line 230, sass/partials/_main_wrap.scss */ + +.cmb-td .cmb-td { + padding-bottom: 1em; +} + +/* line 234, sass/partials/_main_wrap.scss */ + +.cmb-remove-row { + text-align: left; +} + +/* line 238, sass/partials/_main_wrap.scss */ + +.empty-row.hidden { + display: none; +} + +/* line 243, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table { + background-color: #fafafa; + border: 1px solid #e1e1e1; +} + +/* line 247, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-row.cmb-repeat-row { + position: relative; + counter-increment: el; + margin: 0; + padding: 10px 50px 10px 10px; + border-bottom: none !important; +} + +/* line 255, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-row.cmb-repeat-row + .cmb-repeat-row { + border-top: solid 1px #e9e9e9; +} + +/* line 259, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-row.cmb-repeat-row.ui-sortable-helper { + outline: dashed 2px #e9e9e9 !important; +} + +/* line 263, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-row.cmb-repeat-row:before { + content: counter(el); + display: block; + top: 0; + right: 0; + position: absolute; + width: 35px; + height: 100%; + line-height: 35px; + cursor: move; + color: #757575; + text-align: center; + border-left: solid 1px #e9e9e9; +} + +/* line 280, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-row.cmb-repeat-row .cmb-td { + margin: 0; + padding: 0; +} + +/* line 287, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table + .cmb-add-row { + margin: 0; +} + +/* line 290, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table + .cmb-add-row:before { + content: ''; + width: 1px; + height: 1.6em; + display: block; + margin-right: 17px; + background-color: gainsboro; +} + +/* line 300, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-remove-row { + top: 7px; + left: 7px; + position: absolute; + width: auto; + margin-right: 0; + padding: 0 !important; + display: none; +} + +/* line 311, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button { + font-size: 20px; + text-indent: -1000px; + overflow: hidden; + position: relative; + height: auto; + line-height: 1; + padding: 0 10px 0; +} + +/* line 322, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button:before { + content: ""; + font-family: 'Dashicons'; + speak: none; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + margin: 0; + text-indent: 0; + position: absolute; + top: 0; + right: 0; + width: 100%; + height: 100%; + text-align: center; +} + +/* line 328, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-repeat-row:hover .cmb-remove-row { + display: block; +} + +/* line 336, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-th { + padding: 5px; +} + +/* line 340, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-group-title { + background-color: #e9e9e9; + padding: 8px 2.2em 8px 12px; + margin: 0 -1em; + min-height: 1.5em; + font-size: 14px; + line-height: 1.4; +} + +/* line 348, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-group-title h4 { + border: 0; + margin: 0; + font-size: 1.2em; + font-weight: 500; + padding: 0.5em 0.75em; +} + +/* line 356, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-group-title .cmb-th { + display: block; + width: 100%; +} + +/* line 362, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-group-description .cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: right; + width: 100%; +} + +/* line 27, sass/partials/_mixins.scss */ + +.cmb-repeatable-group .cmb-group-description .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; +} + +/* line 366, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-shift-rows { + font-size: 1em; + margin-left: 1em; + text-decoration: none; +} + +/* line 371, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-shift-rows .dashicons { + font-size: 1.5em; + height: 1.5em; + line-height: 1.2em; + width: 1em; +} + +/* line 377, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-shift-rows .dashicons.dashicons-arrow-down-alt2 { + line-height: 1.3em; +} + +/* line 384, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb2-upload-button { + float: left; +} + +/* line 390, sass/partials/_main_wrap.scss */ + +p.cmb2-metabox-description { + color: #757575; + font-style: italic; + margin: 0; + padding-top: .5em; +} + +/* line 397, sass/partials/_main_wrap.scss */ + +span.cmb2-metabox-description { + color: #757575; + font-style: italic; +} + +/* line 402, sass/partials/_main_wrap.scss */ + +.cmb2-metabox-title { + margin: 0 0 5px 0; + padding: 5px 0 0 0; + font-size: 14px; +} + +/* line 408, sass/partials/_main_wrap.scss */ + +.cmb-inline ul { + padding: 4px 0 0 0; +} + +/* line 412, sass/partials/_main_wrap.scss */ + +.cmb-inline li { + display: inline-block; + padding-left: 18px; +} + +/* line 417, sass/partials/_main_wrap.scss */ + +.cmb-type-textarea-code pre { + margin: 0; +} + +/* line 423, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status { + clear: none; + display: inline-block; + vertical-align: middle; + margin-left: 10px; + width: auto; +} + +/* line 430, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status img { + max-width: 350px; + height: auto; +} + +/* line 436, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status img, +.cmb2-media-status .embed-status { + background: #eee; + border: 5px solid #ffffff; + outline: 1px solid #e9e9e9; + box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.05); + background-image: linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0), linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0); + background-position: 0 0, 10px 10px; + background-size: 20px 20px; + border-radius: 2px; + -moz-border-radius: 2px; + margin: 15px 0 0 0; +} + +/* line 450, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .embed-status { + float: right; + max-width: 800px; +} + +/* line 455, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status, +.cmb2-media-status .embed-status { + position: relative; +} + +/* line 458, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status .cmb2-remove-file-button, +.cmb2-media-status .embed-status .cmb2-remove-file-button { + background: url(../images/ico-delete.png); + height: 16px; + right: -5px; + position: absolute; + text-indent: -9999px; + top: -5px; + width: 16px; +} + +/* line 472, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status .cmb2-remove-file-button { + top: 10px; +} + +/* line 477, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status img, +.cmb2-media-status .file-status > span { + cursor: pointer; +} + +/* line 482, sass/partials/_main_wrap.scss */ + +.cmb2-media-status.cmb-attach-list .img-status img, +.cmb2-media-status.cmb-attach-list .file-status > span { + cursor: move; +} + +/* line 489, sass/partials/_main_wrap.scss */ + +.cmb-type-file-list .cmb2-media-status .img-status { + clear: none; + vertical-align: middle; + width: auto; + margin-left: 10px; + margin-bottom: 10px; + margin-top: 0; +} + +/* line 498, sass/partials/_main_wrap.scss */ + +.cmb-attach-list li { + clear: both; + display: inline-block; + width: 100%; + margin-top: 5px; + margin-bottom: 10px; +} + +/* line 504, sass/partials/_main_wrap.scss */ + +.cmb-attach-list li img { + float: right; + margin-left: 10px; +} + +/* line 510, sass/partials/_main_wrap.scss */ + +.cmb2-remove-wrapper { + margin: 0; +} + +/* line 514, sass/partials/_main_wrap.scss */ + +.child-cmb2 .cmb-th { + text-align: right; +} + +/* line 518, sass/partials/_main_wrap.scss */ + +.cmb2-indented-hierarchy { + padding-right: 1.5em; +} + +/*-------------------------------------------------------------- + * Post Metaboxes +--------------------------------------------------------------*/ + +/* line 5, sass/partials/_post_metaboxes.scss */ + +#poststuff .cmb-group-title { + margin-right: -1em; + margin-left: -1em; + min-height: 1.5em; +} + +/* line 11, sass/partials/_post_metaboxes.scss */ + +#poststuff .repeatable .cmb-group-title { + padding-right: 2.2em; +} + +/* line 17, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb2-wrap, +.cmb-type-group .cmb2-wrap { + margin: 0; +} + +/* line 20, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb2-wrap > .cmb-field-list > .cmb-row, +.cmb-type-group .cmb2-wrap > .cmb-field-list > .cmb-row { + padding: 1.8em 0; +} + +/* line 26, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb2-wrap input[type=text].cmb2-oembed, +.cmb-type-group .cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} + +/* line 32, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-row, +.cmb-type-group .cmb-row { + padding: 0 0 1.8em; + margin: 0 0 0.8em; +} + +/* line 36, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-row .cmbhandle, +.cmb-type-group .cmb-row .cmbhandle { + left: -1em; + position: relative; + color: #222222; +} + +/* line 43, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-repeatable-grouping, +.cmb-type-group .cmb-repeatable-grouping { + padding: 0 1em; + max-width: 100%; + min-width: 1px !important; +} + +/* line 49, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-repeatable-group > .cmb-row, +.cmb-type-group .cmb-repeatable-group > .cmb-row { + padding-bottom: 0; +} + +/* line 53, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-th, +.cmb-type-group .cmb-th { + width: 18%; + padding: 0 0 0 2%; +} + +/* line 59, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-td, +.cmb-type-group .cmb-td { + margin-bottom: 0; + padding: 0; + line-height: 1.3; +} + +/* line 65, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-th + .cmb-td, +.cmb-type-group .cmb-th + .cmb-td { + width: 80%; + float: left; +} + +/* line 70, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-row:not(:last-of-type), +.cmb2-postbox .cmb-repeatable-group:not(:last-of-type), +.cmb-type-group .cmb-row:not(:last-of-type), +.cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 1px solid #e9e9e9; +} + +/* line 79, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-repeat-group-field, +.cmb2-postbox .cmb-remove-field-row, +.cmb-type-group .cmb-repeat-group-field, +.cmb-type-group .cmb-remove-field-row { + padding-top: 1.8em; +} + +/*-------------------------------------------------------------- + * Context Metaboxes +--------------------------------------------------------------*/ + +/* Metabox collapse arrow indicators */ + +/* line 9, sass/partials/_context_metaboxes.scss */ + +.js .cmb2-postbox.context-box .toggle-indicator:before { + content: "\f142"; + display: inline-block; + font: normal 20px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} + +/* line 22, sass/partials/_context_metaboxes.scss */ + +.js .cmb2-postbox.context-box.closed .toggle-indicator:before { + content: "\f140"; +} + +/* line 30, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box { + margin-bottom: 10px; +} + +/* line 34, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box.context-before_permalink-box { + margin-top: 10px; +} + +/* line 38, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box.context-after_title-box { + margin-top: 10px; +} + +/* line 42, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box.context-after_editor-box { + margin-top: 20px; + margin-bottom: 0; +} + +/* line 47, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box.context-form_top-box { + margin-top: 10px; +} + +/* line 51, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box.context-form_top-box .hndle { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} + +/* line 59, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box .hndle { + cursor: auto; +} + +/* line 64, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap { + margin-top: 10px; +} + +/* line 68, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-left: 300px; + width: auto; +} + +/* line 75, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap.cmb2-context-wrap-no-title .cmb2-metabox { + padding: 10px; +} + +/* line 80, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap .cmb-th { + padding: 0 0 0 2%; + width: 18%; +} + +/* line 85, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap .cmb-td { + width: 80%; + padding: 0; +} + +/* line 90, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap .cmb-row { + margin-bottom: 10px; +} + +/* line 93, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap .cmb-row:last-of-type { + margin-bottom: 0; +} + +/* one column on the post write/edit screen */ + +/*-------------------------------------------------------------- + * Options page +--------------------------------------------------------------*/ + +/* line 5, sass/partials/_options-page.scss */ + +.cmb2-options-page { + max-width: 1200px; +} + +/* line 8, sass/partials/_options-page.scss */ + +.cmb2-options-page.wrap > h2 { + margin-bottom: 1em; +} + +/* line 12, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-metabox > .cmb-row { + padding: 1em; + margin-top: -1px; + background: #ffffff; + border: 1px solid #e9e9e9; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} + +/* line 19, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-metabox > .cmb-row > .cmb-th { + padding: 0; + font-weight: initial; +} + +/* line 24, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-metabox > .cmb-row > .cmb-th + .cmb-td { + float: none; + padding: 0 1em 0 0; + margin-right: 200px; +} + +/* line 37, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-wrap .cmb-type-title { + margin-top: 1em; + padding: 0.6em 1em; + background-color: #fafafa; +} + +/* line 42, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-wrap .cmb-type-title .cmb2-metabox-title { + font-size: 12px; + margin-top: 0; + margin-bottom: 0; + text-transform: uppercase; +} + +/* line 49, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-wrap .cmb-type-title .cmb2-metabox-description { + padding-top: 0.25em; +} + +/* line 55, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb-repeatable-group .cmb-group-description .cmb-th { + padding: 0 0 0.8em 0; +} + +/* line 59, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb-repeatable-group .cmb-group-name { + font-size: 16px; + margin-top: 0; + margin-bottom: 0; +} + +/* line 65, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb-repeatable-group .cmb-th > .cmb2-metabox-description { + font-weight: 400; + padding-bottom: 0 !important; +} + +/*-------------------------------------------------------------- + * New-Term Page +--------------------------------------------------------------*/ + +/* line 6, sass/partials/_new_term.scss */ + +#addtag .cmb-th { + float: none; + width: auto; + padding: 20px 0 0; +} + +/* line 12, sass/partials/_new_term.scss */ + +#addtag .cmb-td { + padding: 0; +} + +/* line 16, sass/partials/_new_term.scss */ + +#addtag .cmb-th + .cmb-td { + float: none; +} + +/* line 20, sass/partials/_new_term.scss */ + +#addtag select { + max-width: 100%; +} + +/* line 24, sass/partials/_new_term.scss */ + +#addtag .cmb2-metabox { + padding-bottom: 20px; +} + +/* line 28, sass/partials/_new_term.scss */ + +#addtag .cmb-row li label { + display: inline; +} + +/*-------------------------------------------------------------- + * Misc. +--------------------------------------------------------------*/ + +/* line 5, sass/partials/_misc.scss */ + +#poststuff .cmb-repeatable-group h2 { + margin: 0; +} + +/* line 12, sass/partials/_misc.scss */ + +.edit-tags-php .cmb2-metabox-title, +.profile-php .cmb2-metabox-title, +.user-edit-php .cmb2-metabox-title { + font-size: 1.4em; +} + +/* line 18, sass/partials/_misc.scss */ + +.cmb2-postbox .cmb-spinner, +.cmb2-no-box-wrap .cmb-spinner { + float: right; + display: none; +} + +/* line 24, sass/partials/_misc.scss */ + +.cmb-spinner { + display: none; +} + +/* line 26, sass/partials/_misc.scss */ + +.cmb-spinner.is-active { + display: block; +} + +/*-------------------------------------------------------------- + * Sidebar Placement Adjustments +--------------------------------------------------------------*/ + +/* line 10, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-wrap > .cmb-field-list > .cmb-row, +#side-sortables .cmb2-wrap > .cmb-field-list > .cmb-row { + padding: 1.4em 0; +} + +/* line 16, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-wrap input[type=text]:not(.wp-color-picker), +#side-sortables .cmb2-wrap input[type=text]:not(.wp-color-picker) { + width: 100%; +} + +/* line 20, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-wrap input + input:not(.wp-picker-clear), +.inner-sidebar .cmb2-wrap input + select, +#side-sortables .cmb2-wrap input + input:not(.wp-picker-clear), +#side-sortables .cmb2-wrap input + select { + margin-right: 0; + margin-top: 1em; + display: block; +} + +/* line 26, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-wrap input.cmb2-text-money, +#side-sortables .cmb2-wrap input.cmb2-text-money { + max-width: 70%; +} + +/* line 28, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-wrap input.cmb2-text-money + .cmb2-metabox-description, +#side-sortables .cmb2-wrap input.cmb2-text-money + .cmb2-metabox-description { + display: block; +} + +/* line 34, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-wrap label, +#side-sortables .cmb2-wrap label { + display: block; + font-weight: 700; + padding: 0 0 5px; +} + +/* line 42, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar textarea, +#side-sortables textarea { + max-width: 99%; +} + +/* line 46, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-repeatable-group, +#side-sortables .cmb-repeatable-group { + border-bottom: 1px solid #e9e9e9; +} + +/* line 50, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-type-group > .cmb-td > .cmb-repeatable-group, +#side-sortables .cmb-type-group > .cmb-td > .cmb-repeatable-group { + border-bottom: 0; + margin-bottom: -1.4em; +} + +/* line 55, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-th, +.inner-sidebar .cmb-td:not(.cmb-remove-row), +.inner-sidebar .cmb-th + .cmb-td, +#side-sortables .cmb-th, +#side-sortables .cmb-td:not(.cmb-remove-row), +#side-sortables .cmb-th + .cmb-td { + width: 100%; + display: block; + float: none; +} + +/* line 63, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .closed .inside, +#side-sortables .closed .inside { + display: none; +} + +/* line 67, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-th, +#side-sortables .cmb-th { + display: block; + float: none; + padding-bottom: 1em; + text-align: right; + width: 100%; + padding-right: 0; + padding-left: 0; +} + +/* line 27, sass/partials/_mixins.scss */ + +.inner-sidebar .cmb-th label, +#side-sortables .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; +} + +/* line 14, sass/partials/_mixins.scss */ + +.inner-sidebar .cmb-th label, +#side-sortables .cmb-th label { + font-size: 14px; + line-height: 1.4em; +} + +/* line 74, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-group-description .cmb-th, +#side-sortables .cmb-group-description .cmb-th { + padding-top: 0; +} + +/* line 77, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-group-description .cmb2-metabox-description, +#side-sortables .cmb-group-description .cmb2-metabox-description { + padding: 0; +} + +/* line 84, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-group-title .cmb-th, +#side-sortables .cmb-group-title .cmb-th { + padding: 0; +} + +/* line 90, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-repeatable-grouping + .cmb-repeatable-grouping, +#side-sortables .cmb-repeatable-grouping + .cmb-repeatable-grouping { + margin-top: 1em; +} + +/* line 99, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-media-status .img-status img, +.inner-sidebar .cmb2-media-status .embed-status img, +#side-sortables .cmb2-media-status .img-status img, +#side-sortables .cmb2-media-status .embed-status img { + max-width: 90%; + height: auto; +} + +/* line 107, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-list label, +#side-sortables .cmb2-list label { + display: inline; + font-weight: normal; +} + +/* line 112, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-metabox-description, +#side-sortables .cmb2-metabox-description { + display: block; + padding: 7px 0 0; +} + +/* line 119, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-type-checkbox .cmb-td label, +.inner-sidebar .cmb-type-checkbox .cmb2-metabox-description, +#side-sortables .cmb-type-checkbox .cmb-td label, +#side-sortables .cmb-type-checkbox .cmb2-metabox-description { + font-weight: normal; + display: inline; +} + +/* line 126, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-row .cmb2-metabox-description, +#side-sortables .cmb-row .cmb2-metabox-description { + padding-bottom: 1.8em; +} + +/* line 130, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-metabox-title, +#side-sortables .cmb2-metabox-title { + font-size: 1.2em; + font-style: italic; +} + +/* line 135, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-remove-row, +#side-sortables .cmb-remove-row { + clear: both; + padding-top: 12px; + padding-bottom: 0; +} + +/* line 141, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-upload-button, +#side-sortables .cmb2-upload-button { + clear: both; + margin-top: 12px; +} + +/*-------------------------------------------------------------- + * Collapsible UI +--------------------------------------------------------------*/ + +/* line 6, sass/partials/_collapsible_ui.scss */ + +.cmb2-metabox .cmbhandle { + color: #757575; + float: left; + width: 27px; + height: 30px; + cursor: pointer; + left: -1em; + position: relative; +} + +/* line 14, sass/partials/_collapsible_ui.scss */ + +.cmb2-metabox .cmbhandle:before { + content: '\f142'; + left: 12px; + font: normal 20px/1 'dashicons'; + speak: none; + display: inline-block; + padding: 8px 10px; + top: 0; + position: relative; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} + +/* line 31, sass/partials/_collapsible_ui.scss */ + +.cmb2-metabox .postbox.closed .cmbhandle:before { + content: '\f140'; +} + +/* line 37, sass/partials/_collapsible_ui.scss */ + +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row { + -webkit-appearance: none !important; + background: none !important; + border: none !important; + position: absolute; + right: 0; + top: .5em; + line-height: 1em; + padding: 2px 6px 3px; + opacity: .5; +} + +/* line 47, sass/partials/_collapsible_ui.scss */ + +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]) { + cursor: pointer; + color: #a00; + opacity: 1; +} + +/* line 51, sass/partials/_collapsible_ui.scss */ + +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]):hover { + color: #f00; +} + +/* + * jQuery UI CSS Framework 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * WordPress Styles adopted from "jQuery UI Datepicker CSS for WordPress" + * https://github.com/stuttter/wp-datepicker-styling + * + */ + +/* line 15, sass/partials/_jquery_ui.scss */ + +* html .cmb2-element.ui-helper-clearfix { + height: 1%; +} + +/* line 24, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker, +.cmb2-element .ui-datepicker { + padding: 0; + margin: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + background-color: #fff; + border: 1px solid #dfdfdf; + border-top: none; + -webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + min-width: 17em; + width: auto; /* Default Color Scheme */ +} + +/* line 38, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker *, +.cmb2-element .ui-datepicker * { + padding: 0; + font-family: "Open Sans", sans-serif; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* line 46, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker table, +.cmb2-element .ui-datepicker table { + font-size: 13px; + margin: 0; + border: none; + border-collapse: collapse; +} + +/* line 53, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, +.cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background-image: none; + border: none; + color: #fff; + font-weight: normal; +} + +/* line 61, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, +.cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: transparent; + border-color: transparent; + cursor: pointer; +} + +/* line 67, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-title, +.cmb2-element .ui-datepicker .ui-datepicker-title { + margin: 0; + padding: 10px 0; + color: #fff; + font-size: 14px; + line-height: 14px; + text-align: center; +} + +/* line 75, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-title select, +.cmb2-element .ui-datepicker .ui-datepicker-title select { + margin-top: -8px; + margin-bottom: -8px; +} + +/* line 81, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-next, +.cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-next { + position: relative; + top: 0; + height: 34px; + width: 34px; +} + +/* line 89, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-next, +.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-next { + border: none; +} + +/* line 94, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover, +.cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-prev-hover { + right: 0; +} + +/* line 99, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-next, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover, +.cmb2-element .ui-datepicker .ui-datepicker-next, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover { + left: 0; +} + +/* line 104, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-next span, +.cmb2-element.ui-datepicker .ui-datepicker-prev span, +.cmb2-element .ui-datepicker .ui-datepicker-next span, +.cmb2-element .ui-datepicker .ui-datepicker-prev span { + display: none; +} + +/* line 109, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-prev { + float: right; +} + +/* line 113, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-next, +.cmb2-element .ui-datepicker .ui-datepicker-next { + float: left; +} + +/* line 117, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.cmb2-element.ui-datepicker .ui-datepicker-next:before, +.cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.cmb2-element .ui-datepicker .ui-datepicker-next:before { + font: normal 20px/34px 'dashicons'; + padding-right: 7px; + color: #fff; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: 34px; + height: 34px; +} + +/* line 129, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.cmb2-element .ui-datepicker .ui-datepicker-prev:before { + content: '\f341'; +} + +/* line 133, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-next:before, +.cmb2-element .ui-datepicker .ui-datepicker-next:before { + content: '\f345'; +} + +/* line 137, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover:before, +.cmb2-element .ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover:before { + opacity: 0.7; +} + +/* line 142, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker select.ui-datepicker-month, +.cmb2-element.ui-datepicker select.ui-datepicker-year, +.cmb2-element .ui-datepicker select.ui-datepicker-month, +.cmb2-element .ui-datepicker select.ui-datepicker-year { + width: 33%; + background: transparent; + border-color: transparent; + box-shadow: none; + color: #fff; +} + +/* line 149, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker select.ui-datepicker-month option, +.cmb2-element.ui-datepicker select.ui-datepicker-year option, +.cmb2-element .ui-datepicker select.ui-datepicker-month option, +.cmb2-element .ui-datepicker select.ui-datepicker-year option { + color: #333; +} + +/* line 154, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker thead, +.cmb2-element .ui-datepicker thead { + color: #fff; + font-weight: 600; +} + +/* line 157, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker thead th, +.cmb2-element .ui-datepicker thead th { + font-weight: normal; +} + +/* line 162, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker th, +.cmb2-element .ui-datepicker th { + padding: 10px; +} + +/* line 166, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td, +.cmb2-element .ui-datepicker td { + padding: 0; + border: 1px solid #f4f4f4; +} + +/* line 171, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td.ui-datepicker-other-month, +.cmb2-element .ui-datepicker td.ui-datepicker-other-month { + border: transparent; +} + +/* line 175, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td.ui-datepicker-week-end, +.cmb2-element .ui-datepicker td.ui-datepicker-week-end { + background-color: #f4f4f4; + border: 1px solid #f4f4f4; +} + +/* line 178, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today, +.cmb2-element .ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today { + -webkit-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); +} + +/* line 185, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td.ui-datepicker-today, +.cmb2-element .ui-datepicker td.ui-datepicker-today { + background-color: #f0f0c0; +} + +/* line 189, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td.ui-datepicker-current-day, +.cmb2-element .ui-datepicker td.ui-datepicker-current-day { + background: #bbdd88; +} + +/* line 193, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td .ui-state-default, +.cmb2-element .ui-datepicker td .ui-state-default { + background: transparent; + border: none; + text-align: center; + text-decoration: none; + width: auto; + display: block; + padding: 5px 10px; + font-weight: normal; + color: #444; +} + +/* line 205, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td.ui-state-disabled .ui-state-default, +.cmb2-element .ui-datepicker td.ui-state-disabled .ui-state-default { + opacity: 0.5; +} + +/* line 210, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, +.cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} + +/* line 215, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker thead, +.cmb2-element .ui-datepicker thead { + background: #32373c; +} + +/* line 219, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td .ui-state-hover, +.cmb2-element.ui-datepicker td .ui-state-active, +.cmb2-element .ui-datepicker td .ui-state-hover, +.cmb2-element .ui-datepicker td .ui-state-active { + background: #0073aa; + color: #fff; +} + +/* line 224, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div, +.cmb2-element .ui-datepicker .ui-timepicker-div { + font-size: 14px; +} + +/* line 226, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div dl, +.cmb2-element .ui-datepicker .ui-timepicker-div dl { + text-align: right; + padding: 0 .6em; +} + +/* line 229, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div dl dt, +.cmb2-element .ui-datepicker .ui-timepicker-div dl dt { + float: right; + clear: right; + padding: 0 5px 0 0; +} + +/* line 234, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd, +.cmb2-element .ui-datepicker .ui-timepicker-div dl dd { + margin: 0 40% 10px 10px; +} + +/* line 236, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd select, +.cmb2-element .ui-datepicker .ui-timepicker-div dl dd select { + width: 100%; +} + +/* line 242, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane, +.cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane { + padding: .6em; + text-align: right; +} + +/* line 246, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary, +.cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, +.cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary { + padding: 0 10px 1px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + margin: 0 .4em .4em .6em; +} + +/* line 260, sass/partials/_jquery_ui.scss */ + +.admin-color-fresh .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-fresh .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} + +/* line 265, sass/partials/_jquery_ui.scss */ + +.admin-color-fresh .cmb2-element.ui-datepicker thead, +.admin-color-fresh .cmb2-element .ui-datepicker thead { + background: #32373c; +} + +/* line 269, sass/partials/_jquery_ui.scss */ + +.admin-color-fresh .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-fresh .cmb2-element .ui-datepicker td .ui-state-hover { + background: #0073aa; + color: #fff; +} + +/* line 277, sass/partials/_jquery_ui.scss */ + +.admin-color-blue .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-blue .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #52accc; +} + +/* line 282, sass/partials/_jquery_ui.scss */ + +.admin-color-blue .cmb2-element.ui-datepicker thead, +.admin-color-blue .cmb2-element .ui-datepicker thead { + background: #4796b3; +} + +/* line 291, sass/partials/_jquery_ui.scss */ + +.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-active, +.admin-color-blue .cmb2-element .ui-datepicker td .ui-state-hover, +.admin-color-blue .cmb2-element .ui-datepicker td .ui-state-active { + background: #096484; + color: #fff; +} + +/* line 296, sass/partials/_jquery_ui.scss */ + +.admin-color-blue .cmb2-element.ui-datepicker td.ui-datepicker-today, +.admin-color-blue .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +/* line 305, sass/partials/_jquery_ui.scss */ + +.admin-color-coffee .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-coffee .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #59524c; +} + +/* line 310, sass/partials/_jquery_ui.scss */ + +.admin-color-coffee .cmb2-element.ui-datepicker thead, +.admin-color-coffee .cmb2-element .ui-datepicker thead { + background: #46403c; +} + +/* line 314, sass/partials/_jquery_ui.scss */ + +.admin-color-coffee .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-coffee .cmb2-element .ui-datepicker td .ui-state-hover { + background: #c7a589; + color: #fff; +} + +/* line 322, sass/partials/_jquery_ui.scss */ + +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #523f6d; +} + +/* line 327, sass/partials/_jquery_ui.scss */ + +.admin-color-ectoplasm .cmb2-element.ui-datepicker thead, +.admin-color-ectoplasm .cmb2-element .ui-datepicker thead { + background: #413256; +} + +/* line 331, sass/partials/_jquery_ui.scss */ + +.admin-color-ectoplasm .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-ectoplasm .cmb2-element .ui-datepicker td .ui-state-hover { + background: #a3b745; + color: #fff; +} + +/* line 339, sass/partials/_jquery_ui.scss */ + +.admin-color-midnight .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-midnight .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #363b3f; +} + +/* line 344, sass/partials/_jquery_ui.scss */ + +.admin-color-midnight .cmb2-element.ui-datepicker thead, +.admin-color-midnight .cmb2-element .ui-datepicker thead { + background: #26292c; +} + +/* line 348, sass/partials/_jquery_ui.scss */ + +.admin-color-midnight .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-midnight .cmb2-element .ui-datepicker td .ui-state-hover { + background: #e14d43; + color: #fff; +} + +/* line 356, sass/partials/_jquery_ui.scss */ + +.admin-color-ocean .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-ocean .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #738e96; +} + +/* line 361, sass/partials/_jquery_ui.scss */ + +.admin-color-ocean .cmb2-element.ui-datepicker thead, +.admin-color-ocean .cmb2-element .ui-datepicker thead { + background: #627c83; +} + +/* line 365, sass/partials/_jquery_ui.scss */ + +.admin-color-ocean .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-ocean .cmb2-element .ui-datepicker td .ui-state-hover { + background: #9ebaa0; + color: #fff; +} + +/* line 373, sass/partials/_jquery_ui.scss */ + +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: #cf4944; +} + +/* line 379, sass/partials/_jquery_ui.scss */ + +.admin-color-sunrise .cmb2-element.ui-datepicker th, +.admin-color-sunrise .cmb2-element .ui-datepicker th { + border-color: #be3631; + background: #be3631; +} + +/* line 384, sass/partials/_jquery_ui.scss */ + +.admin-color-sunrise .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-sunrise .cmb2-element .ui-datepicker td .ui-state-hover { + background: #dd823b; + color: #fff; +} + +/* line 392, sass/partials/_jquery_ui.scss */ + +.admin-color-light .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-light .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #e5e5e5; +} + +/* line 397, sass/partials/_jquery_ui.scss */ + +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-year, +.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-year { + color: #555; +} + +/* line 402, sass/partials/_jquery_ui.scss */ + +.admin-color-light .cmb2-element.ui-datepicker thead, +.admin-color-light .cmb2-element .ui-datepicker thead { + background: #888; +} + +/* line 406, sass/partials/_jquery_ui.scss */ + +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-next:before, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element .ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-next:before { + color: #555; +} + +/* line 414, sass/partials/_jquery_ui.scss */ + +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-active, +.admin-color-light .cmb2-element .ui-datepicker td .ui-state-hover, +.admin-color-light .cmb2-element .ui-datepicker td .ui-state-active { + background: #ccc; +} + +/* line 418, sass/partials/_jquery_ui.scss */ + +.admin-color-light .cmb2-element.ui-datepicker td.ui-datepicker-today, +.admin-color-light .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +/* line 426, sass/partials/_jquery_ui.scss */ + +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #56b274; +} + +/* line 431, sass/partials/_jquery_ui.scss */ + +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker thead, +.admin-color-bbp-evergreen .cmb2-element .ui-datepicker thead { + background: #36533f; +} + +/* line 435, sass/partials/_jquery_ui.scss */ + +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-bbp-evergreen .cmb2-element .ui-datepicker td .ui-state-hover { + background: #446950; + color: #fff; +} + +/* line 443, sass/partials/_jquery_ui.scss */ + +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #4ca26a; +} + +/* line 448, sass/partials/_jquery_ui.scss */ + +.admin-color-bbp-mint .cmb2-element.ui-datepicker thead, +.admin-color-bbp-mint .cmb2-element .ui-datepicker thead { + background: #4f6d59; +} + +/* line 452, sass/partials/_jquery_ui.scss */ + +.admin-color-bbp-mint .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-bbp-mint .cmb2-element .ui-datepicker td .ui-state-hover { + background: #5fb37c; + color: #fff; +} + +/*# sourceMappingURL=cmb2.css.map */ + +@media only screen and (max-width: 850px) { + +/* line 103, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-left: 0; +} + +} + +@media (max-width: 450px) { + +/* line 193, sass/partials/_main_wrap.scss */ + +.cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: right; + width: 100%; +} + +/* line 27, sass/partials/_mixins.scss */ + +.cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; +} + +/* line 523, sass/partials/_main_wrap.scss */ + +.cmb-th, +.cmb-td, +.cmb-th + .cmb-td { + display: block; + float: none; + width: 100%; +} + +/* line 70, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-row:not(:last-of-type), +.cmb2-postbox .cmb-repeatable-group:not(:last-of-type), +.cmb-type-group .cmb-row:not(:last-of-type), +.cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 0; +} + +/* line 24, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-metabox > .cmb-row > .cmb-th + .cmb-td { + padding: 0; + margin-right: 0; +} + +} + diff --git a/inc/vendors/cmb2-plugins/cmb2/css/cmb2-rtl.min.css b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-rtl.min.css new file mode 100755 index 00000000..df2fa0f0 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/cmb2-rtl.min.css @@ -0,0 +1,2 @@ +/*! CMB2 - v2.6.0 - 2019-01-18 | https://cmb2.io | Copyright (c) 2019 CMB2 team | Licensed GPLv2 */ +.cmb2-wrap{margin:0}.cmb2-wrap input,.cmb2-wrap textarea{font-size:14px;max-width:100%;padding:5px}.cmb2-wrap input[type=text].cmb2-oembed{width:100%}.cmb2-wrap textarea{width:500px}.cmb2-wrap textarea.cmb2-textarea-code{font-family:"Courier 10 Pitch",Courier,monospace;line-height:16px}.cmb2-wrap input.cmb2-text-small,.cmb2-wrap input.cmb2-timepicker{width:100px}.cmb2-wrap input.cmb2-text-money{width:90px}.cmb2-wrap input.cmb2-text-medium{width:230px}.cmb2-wrap input.cmb2-upload-file{width:65%}.cmb2-wrap input.ed_button{padding:2px 4px}.cmb2-wrap input:not([type=hidden])+.button-secondary,.cmb2-wrap input:not([type=hidden])+input,.cmb2-wrap input:not([type=hidden])+select{margin-right:20px}.cmb2-wrap ul{margin:0}.cmb2-wrap li{font-size:14px;line-height:16px;margin:1px 0 5px}.cmb2-wrap select{font-size:14px;margin-top:3px}.cmb2-wrap input:focus,.cmb2-wrap textarea:focus{background:#fffff8}.cmb2-wrap input[type=checkbox],.cmb2-wrap input[type=radio]{margin:0 0 0 5px;padding:0}.cmb2-wrap .button-secondary,.cmb2-wrap button{white-space:nowrap}.cmb2-wrap .mceLayout{border:1px solid #e9e9e9!important}.cmb2-wrap .mceIframeContainer{background:#fff}.cmb2-wrap .meta_mce{width:97%}.cmb2-wrap .meta_mce textarea{width:100%}.cmb2-wrap .wp-color-result,.cmb2-wrap .wp-picker-input-wrap{vertical-align:middle}.cmb2-wrap .wp-color-result,.cmb2-wrap .wp-picker-container{margin:0 0 0 10px}.cmb2-wrap .cmb-row{margin:0}.cmb2-wrap .cmb-row:after{content:'';clear:both;display:block;width:100%}.cmb2-wrap .cmb-row.cmb-repeat .cmb2-metabox-description{padding-top:0;padding-bottom:1em}.cmb2-metabox{clear:both;margin:0}.cmb2-metabox .cmb-field-list>.cmb-row:first-of-type>.cmb-td,.cmb2-metabox .cmb-field-list>.cmb-row:first-of-type>.cmb-th,.cmb2-metabox>.cmb-row:first-of-type>.cmb-td,.cmb2-metabox>.cmb-row:first-of-type>.cmb-th{border:0}.cmb-add-row{margin:1.8em 0 0}.cmb-nested .cmb-td,.cmb-repeatable-group .cmb-th,.cmb-repeatable-group:first-of-type{border:0}.cmb-repeatable-group:last-of-type,.cmb-row:last-of-type,.cmb2-wrap .cmb-row:last-of-type{border-bottom:0}.cmb-repeatable-grouping{border:1px solid #e9e9e9;padding:0 1em}.cmb-repeatable-grouping.cmb-row{margin:0 0 .8em}.cmb-th{color:#222;float:right;font-weight:600;line-height:1.3;padding:20px 0 20px 10px;vertical-align:top;width:200px}.cmb-td{line-height:1.3;max-width:100%;padding:15px 10px;vertical-align:middle}.cmb-type-title .cmb-td{padding:0}.cmb-th label{display:block;padding:5px 0}.cmb-th+.cmb-td{float:right}.cmb-td .cmb-td{padding-bottom:1em}.cmb-remove-row{text-align:left}.empty-row.hidden{display:none}.cmb-repeat-table{background-color:#fafafa;border:1px solid #e1e1e1}.cmb-repeat-table .cmb-row.cmb-repeat-row{position:relative;counter-increment:el;margin:0;padding:10px 50px 10px 10px;border-bottom:none!important}.cmb-repeat-table .cmb-row.cmb-repeat-row+.cmb-repeat-row{border-top:solid 1px #e9e9e9}.cmb-repeat-table .cmb-row.cmb-repeat-row.ui-sortable-helper{outline:dashed 2px #e9e9e9!important}.cmb-repeat-table .cmb-row.cmb-repeat-row:before{content:counter(el);display:block;top:0;right:0;position:absolute;width:35px;height:100%;line-height:35px;cursor:move;color:#757575;text-align:center;border-left:solid 1px #e9e9e9}.cmb-repeat-table .cmb-row.cmb-repeat-row .cmb-td{margin:0;padding:0}.cmb-repeat-table+.cmb-add-row{margin:0}.cmb-repeat-table+.cmb-add-row:before{content:'';width:1px;height:1.6em;display:block;margin-right:17px;background-color:#dcdcdc}.cmb-repeat-table .cmb-remove-row{top:7px;left:7px;position:absolute;width:auto;margin-right:0;padding:0!important;display:none}.cmb-repeat-table .cmb-remove-row>.cmb-remove-row-button{font-size:20px;text-indent:-1000px;overflow:hidden;position:relative;height:auto;line-height:1;padding:0 10px}.cmb-repeat-table .cmb-remove-row>.cmb-remove-row-button:before{content:"";font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center}.cmb-repeat-table .cmb-repeat-row:hover .cmb-remove-row{display:block}.cmb-repeatable-group .cmb-th{padding:5px}.cmb-repeatable-group .cmb-group-title{background-color:#e9e9e9;padding:8px 2.2em 8px 12px;margin:0 -1em;min-height:1.5em;font-size:14px;line-height:1.4}.cmb-repeatable-group .cmb-group-title h4{border:0;margin:0;font-size:1.2em;font-weight:500;padding:.5em .75em}.cmb-repeatable-group .cmb-group-title .cmb-th{display:block;width:100%}.cmb-repeatable-group .cmb-group-description .cmb-th{font-size:1.2em;display:block;float:none;padding-bottom:1em;text-align:right;width:100%}.cmb-repeatable-group .cmb-group-description .cmb-th label{display:block;margin-top:0;margin-bottom:.5em}.cmb-repeatable-group .cmb-shift-rows{font-size:1em;margin-left:1em;text-decoration:none}.cmb-repeatable-group .cmb-shift-rows .dashicons{font-size:1.5em;height:1.5em;line-height:1.2em;width:1em}.cmb-repeatable-group .cmb-shift-rows .dashicons.dashicons-arrow-down-alt2{line-height:1.3em}.cmb-repeatable-group .cmb2-upload-button{float:left}p.cmb2-metabox-description{color:#757575;font-style:italic;margin:0;padding-top:.5em}span.cmb2-metabox-description{color:#757575;font-style:italic}.cmb2-metabox-title{margin:0 0 5px;padding:5px 0 0;font-size:14px}.cmb-inline ul{padding:4px 0 0}.cmb-inline li{display:inline-block;padding-left:18px}.cmb-type-textarea-code pre{margin:0}.cmb2-media-status .img-status{clear:none;display:inline-block;vertical-align:middle;margin-left:10px;width:auto}.cmb2-media-status .img-status img{max-width:350px;height:auto}.cmb2-media-status .embed-status,.cmb2-media-status .img-status img{background:#eee;border:5px solid #fff;outline:1px solid #e9e9e9;box-shadow:inset 0 0 15px rgba(0,0,0,.3),inset 0 0 0 1px rgba(0,0,0,.05);background-image:linear-gradient(45deg,#d0d0d0 25%,transparent 25%,transparent 75%,#d0d0d0 75%,#d0d0d0),linear-gradient(45deg,#d0d0d0 25%,transparent 25%,transparent 75%,#d0d0d0 75%,#d0d0d0);background-position:0 0,10px 10px;background-size:20px 20px;border-radius:2px;-moz-border-radius:2px;margin:15px 0 0}.cmb2-media-status .embed-status{float:right;max-width:800px}.cmb2-media-status .embed-status,.cmb2-media-status .img-status{position:relative}.cmb2-media-status .embed-status .cmb2-remove-file-button,.cmb2-media-status .img-status .cmb2-remove-file-button{background:url(../images/ico-delete.png);height:16px;right:-5px;position:absolute;text-indent:-9999px;top:-5px;width:16px}.cmb2-media-status .img-status .cmb2-remove-file-button{top:10px}.cmb2-media-status .file-status>span,.cmb2-media-status .img-status img{cursor:pointer}.cmb2-media-status.cmb-attach-list .file-status>span,.cmb2-media-status.cmb-attach-list .img-status img{cursor:move}.cmb-type-file-list .cmb2-media-status .img-status{clear:none;vertical-align:middle;width:auto;margin-left:10px;margin-bottom:10px;margin-top:0}.cmb-attach-list li{clear:both;display:inline-block;width:100%;margin-top:5px;margin-bottom:10px}.cmb-attach-list li img{float:right;margin-left:10px}.cmb2-remove-wrapper{margin:0}.child-cmb2 .cmb-th{text-align:right}.cmb2-indented-hierarchy{padding-right:1.5em}#poststuff .cmb-group-title{margin-right:-1em;margin-left:-1em;min-height:1.5em}#poststuff .repeatable .cmb-group-title{padding-right:2.2em}.cmb-type-group .cmb2-wrap,.cmb2-postbox .cmb2-wrap{margin:0}.cmb-type-group .cmb2-wrap>.cmb-field-list>.cmb-row,.cmb2-postbox .cmb2-wrap>.cmb-field-list>.cmb-row{padding:1.8em 0}.cmb-type-group .cmb2-wrap input[type=text].cmb2-oembed,.cmb2-postbox .cmb2-wrap input[type=text].cmb2-oembed{width:100%}.cmb-type-group .cmb-row,.cmb2-postbox .cmb-row{padding:0 0 1.8em;margin:0 0 .8em}.cmb-type-group .cmb-row .cmbhandle,.cmb2-postbox .cmb-row .cmbhandle{left:-1em;position:relative;color:#222}.cmb-type-group .cmb-repeatable-grouping,.cmb2-postbox .cmb-repeatable-grouping{padding:0 1em;max-width:100%;min-width:1px!important}.cmb-type-group .cmb-repeatable-group>.cmb-row,.cmb2-postbox .cmb-repeatable-group>.cmb-row{padding-bottom:0}.cmb-type-group .cmb-th,.cmb2-postbox .cmb-th{width:18%;padding:0 0 0 2%}.cmb-type-group .cmb-td,.cmb2-postbox .cmb-td{margin-bottom:0;padding:0;line-height:1.3}.cmb-type-group .cmb-th+.cmb-td,.cmb2-postbox .cmb-th+.cmb-td{width:80%;float:left}.cmb-type-group .cmb-repeatable-group:not(:last-of-type),.cmb-type-group .cmb-row:not(:last-of-type),.cmb2-postbox .cmb-repeatable-group:not(:last-of-type),.cmb2-postbox .cmb-row:not(:last-of-type){border-bottom:1px solid #e9e9e9}.cmb-type-group .cmb-remove-field-row,.cmb-type-group .cmb-repeat-group-field,.cmb2-postbox .cmb-remove-field-row,.cmb2-postbox .cmb-repeat-group-field{padding-top:1.8em}.js .cmb2-postbox.context-box .toggle-indicator:before{content:"\f142";display:inline-block;font:400 20px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.js .cmb2-postbox.context-box.closed .toggle-indicator:before{content:"\f140"}.cmb2-postbox.context-box{margin-bottom:10px}.cmb2-postbox.context-box.context-after_title-box,.cmb2-postbox.context-box.context-before_permalink-box{margin-top:10px}.cmb2-postbox.context-box.context-after_editor-box{margin-top:20px;margin-bottom:0}.cmb2-postbox.context-box.context-form_top-box{margin-top:10px}.cmb2-postbox.context-box.context-form_top-box .hndle{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}.cmb2-postbox.context-box .hndle{cursor:auto}.cmb2-context-wrap{margin-top:10px}.cmb2-context-wrap.cmb2-context-wrap-form_top{margin-left:300px;width:auto}.cmb2-context-wrap.cmb2-context-wrap-no-title .cmb2-metabox{padding:10px}.cmb2-context-wrap .cmb-th{padding:0 0 0 2%;width:18%}.cmb2-context-wrap .cmb-td{width:80%;padding:0}.cmb2-context-wrap .cmb-row{margin-bottom:10px}.cmb2-context-wrap .cmb-row:last-of-type{margin-bottom:0}.cmb2-options-page{max-width:1200px}.cmb2-options-page.wrap>h2{margin-bottom:1em}.cmb2-options-page .cmb2-metabox>.cmb-row{padding:1em;margin-top:-1px;background:#fff;border:1px solid #e9e9e9;box-shadow:0 1px 1px rgba(0,0,0,.05)}.cmb2-options-page .cmb2-metabox>.cmb-row>.cmb-th{padding:0;font-weight:initial}.cmb2-options-page .cmb2-metabox>.cmb-row>.cmb-th+.cmb-td{float:none;padding:0 1em 0 0;margin-right:200px}.cmb2-options-page .cmb2-wrap .cmb-type-title{margin-top:1em;padding:.6em 1em;background-color:#fafafa}.cmb2-options-page .cmb2-wrap .cmb-type-title .cmb2-metabox-title{font-size:12px;margin-top:0;margin-bottom:0;text-transform:uppercase}.cmb2-options-page .cmb2-wrap .cmb-type-title .cmb2-metabox-description{padding-top:.25em}.cmb2-options-page .cmb-repeatable-group .cmb-group-description .cmb-th{padding:0 0 .8em}.cmb2-options-page .cmb-repeatable-group .cmb-group-name{font-size:16px;margin-top:0;margin-bottom:0}.cmb2-options-page .cmb-repeatable-group .cmb-th>.cmb2-metabox-description{font-weight:400;padding-bottom:0!important}#addtag .cmb-th{float:none;width:auto;padding:20px 0 0}#addtag .cmb-td{padding:0}#addtag .cmb-th+.cmb-td{float:none}#addtag select{max-width:100%}#addtag .cmb2-metabox{padding-bottom:20px}#addtag .cmb-row li label{display:inline}#poststuff .cmb-repeatable-group h2{margin:0}.edit-tags-php .cmb2-metabox-title,.profile-php .cmb2-metabox-title,.user-edit-php .cmb2-metabox-title{font-size:1.4em}.cmb2-no-box-wrap .cmb-spinner,.cmb2-postbox .cmb-spinner{float:right;display:none}.cmb-spinner{display:none}.cmb-spinner.is-active{display:block}#side-sortables .cmb2-wrap>.cmb-field-list>.cmb-row,.inner-sidebar .cmb2-wrap>.cmb-field-list>.cmb-row{padding:1.4em 0}#side-sortables .cmb2-wrap input[type=text]:not(.wp-color-picker),.inner-sidebar .cmb2-wrap input[type=text]:not(.wp-color-picker){width:100%}#side-sortables .cmb2-wrap input+input:not(.wp-picker-clear),#side-sortables .cmb2-wrap input+select,.inner-sidebar .cmb2-wrap input+input:not(.wp-picker-clear),.inner-sidebar .cmb2-wrap input+select{margin-right:0;margin-top:1em;display:block}#side-sortables .cmb2-wrap input.cmb2-text-money,.inner-sidebar .cmb2-wrap input.cmb2-text-money{max-width:70%}#side-sortables .cmb2-wrap input.cmb2-text-money+.cmb2-metabox-description,.inner-sidebar .cmb2-wrap input.cmb2-text-money+.cmb2-metabox-description{display:block}#side-sortables .cmb2-wrap label,.inner-sidebar .cmb2-wrap label{display:block;font-weight:700;padding:0 0 5px}#side-sortables textarea,.inner-sidebar textarea{max-width:99%}#side-sortables .cmb-repeatable-group,.inner-sidebar .cmb-repeatable-group{border-bottom:1px solid #e9e9e9}#side-sortables .cmb-type-group>.cmb-td>.cmb-repeatable-group,.inner-sidebar .cmb-type-group>.cmb-td>.cmb-repeatable-group{border-bottom:0;margin-bottom:-1.4em}#side-sortables .cmb-td:not(.cmb-remove-row),#side-sortables .cmb-th,#side-sortables .cmb-th+.cmb-td,.inner-sidebar .cmb-td:not(.cmb-remove-row),.inner-sidebar .cmb-th,.inner-sidebar .cmb-th+.cmb-td{width:100%;display:block;float:none}#side-sortables .closed .inside,.inner-sidebar .closed .inside{display:none}#side-sortables .cmb-th,.inner-sidebar .cmb-th{display:block;float:none;padding-bottom:1em;text-align:right;width:100%;padding-right:0;padding-left:0}#side-sortables .cmb-th label,.inner-sidebar .cmb-th label{display:block;margin-top:0;margin-bottom:.5em;font-size:14px;line-height:1.4em}#side-sortables .cmb-group-description .cmb-th,.inner-sidebar .cmb-group-description .cmb-th{padding-top:0}#side-sortables .cmb-group-description .cmb2-metabox-description,#side-sortables .cmb-group-title .cmb-th,.inner-sidebar .cmb-group-description .cmb2-metabox-description,.inner-sidebar .cmb-group-title .cmb-th{padding:0}#side-sortables .cmb-repeatable-grouping+.cmb-repeatable-grouping,.inner-sidebar .cmb-repeatable-grouping+.cmb-repeatable-grouping{margin-top:1em}#side-sortables .cmb2-media-status .embed-status img,#side-sortables .cmb2-media-status .img-status img,.inner-sidebar .cmb2-media-status .embed-status img,.inner-sidebar .cmb2-media-status .img-status img{max-width:90%;height:auto}#side-sortables .cmb2-list label,.inner-sidebar .cmb2-list label{display:inline;font-weight:400}#side-sortables .cmb2-metabox-description,.inner-sidebar .cmb2-metabox-description{display:block;padding:7px 0 0}#side-sortables .cmb-type-checkbox .cmb-td label,#side-sortables .cmb-type-checkbox .cmb2-metabox-description,.inner-sidebar .cmb-type-checkbox .cmb-td label,.inner-sidebar .cmb-type-checkbox .cmb2-metabox-description{font-weight:400;display:inline}#side-sortables .cmb-row .cmb2-metabox-description,.inner-sidebar .cmb-row .cmb2-metabox-description{padding-bottom:1.8em}#side-sortables .cmb2-metabox-title,.inner-sidebar .cmb2-metabox-title{font-size:1.2em;font-style:italic}#side-sortables .cmb-remove-row,.inner-sidebar .cmb-remove-row{clear:both;padding-top:12px;padding-bottom:0}#side-sortables .cmb2-upload-button,.inner-sidebar .cmb2-upload-button{clear:both;margin-top:12px}.cmb2-metabox .cmbhandle{color:#757575;float:left;width:27px;height:30px;cursor:pointer;left:-1em;position:relative}.cmb2-metabox .cmbhandle:before{content:'\f142';left:12px;font:400 20px/1 dashicons;speak:none;display:inline-block;padding:8px 10px;top:0;position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.cmb2-metabox .postbox.closed .cmbhandle:before{content:'\f140'}.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row{-webkit-appearance:none!important;background:none!important;border:none!important;position:absolute;right:0;top:.5em;line-height:1em;padding:2px 6px 3px;opacity:.5}.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]){cursor:pointer;color:#a00;opacity:1}.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]):hover{color:red}* html .cmb2-element.ui-helper-clearfix{height:1%}.cmb2-element .ui-datepicker,.cmb2-element.ui-datepicker{padding:0;margin:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background-color:#fff;border:1px solid #dfdfdf;border-top:none;-webkit-box-shadow:0 3px 6px rgba(0,0,0,.075);box-shadow:0 3px 6px rgba(0,0,0,.075);min-width:17em;width:auto}.cmb2-element .ui-datepicker *,.cmb2-element.ui-datepicker *{padding:0;font-family:"Open Sans",sans-serif;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.cmb2-element .ui-datepicker table,.cmb2-element.ui-datepicker table{font-size:13px;margin:0;border:none;border-collapse:collapse}.cmb2-element .ui-datepicker .ui-datepicker-header,.cmb2-element .ui-datepicker .ui-widget-header,.cmb2-element.ui-datepicker .ui-datepicker-header,.cmb2-element.ui-datepicker .ui-widget-header{border:none;color:#fff;font-weight:400}.cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover,.cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover{background:0 0;border-color:transparent;cursor:pointer}.cmb2-element .ui-datepicker .ui-datepicker-title,.cmb2-element.ui-datepicker .ui-datepicker-title{margin:0;padding:10px 0;color:#fff;font-size:14px;line-height:14px;text-align:center}.cmb2-element .ui-datepicker .ui-datepicker-title select,.cmb2-element.ui-datepicker .ui-datepicker-title select{margin-top:-8px;margin-bottom:-8px}.cmb2-element .ui-datepicker .ui-datepicker-next,.cmb2-element .ui-datepicker .ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-datepicker-next,.cmb2-element.ui-datepicker .ui-datepicker-prev{position:relative;top:0;height:34px;width:34px}.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-next,.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-next,.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-prev{border:none}.cmb2-element .ui-datepicker .ui-datepicker-prev,.cmb2-element .ui-datepicker .ui-datepicker-prev-hover,.cmb2-element.ui-datepicker .ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-datepicker-prev-hover{right:0}.cmb2-element .ui-datepicker .ui-datepicker-next,.cmb2-element .ui-datepicker .ui-datepicker-next-hover,.cmb2-element.ui-datepicker .ui-datepicker-next,.cmb2-element.ui-datepicker .ui-datepicker-next-hover{left:0}.cmb2-element .ui-datepicker .ui-datepicker-next span,.cmb2-element .ui-datepicker .ui-datepicker-prev span,.cmb2-element.ui-datepicker .ui-datepicker-next span,.cmb2-element.ui-datepicker .ui-datepicker-prev span{display:none}.cmb2-element .ui-datepicker .ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-datepicker-prev{float:right}.cmb2-element .ui-datepicker .ui-datepicker-next,.cmb2-element.ui-datepicker .ui-datepicker-next{float:left}.cmb2-element .ui-datepicker .ui-datepicker-next:before,.cmb2-element .ui-datepicker .ui-datepicker-prev:before,.cmb2-element.ui-datepicker .ui-datepicker-next:before,.cmb2-element.ui-datepicker .ui-datepicker-prev:before{font:400 20px/34px dashicons;padding-right:7px;color:#fff;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:34px;height:34px}.cmb2-element .ui-datepicker .ui-datepicker-prev:before,.cmb2-element.ui-datepicker .ui-datepicker-prev:before{content:'\f341'}.cmb2-element .ui-datepicker .ui-datepicker-next:before,.cmb2-element.ui-datepicker .ui-datepicker-next:before{content:'\f345'}.cmb2-element .ui-datepicker .ui-datepicker-next-hover:before,.cmb2-element .ui-datepicker .ui-datepicker-prev-hover:before,.cmb2-element.ui-datepicker .ui-datepicker-next-hover:before,.cmb2-element.ui-datepicker .ui-datepicker-prev-hover:before{opacity:.7}.cmb2-element .ui-datepicker select.ui-datepicker-month,.cmb2-element .ui-datepicker select.ui-datepicker-year,.cmb2-element.ui-datepicker select.ui-datepicker-month,.cmb2-element.ui-datepicker select.ui-datepicker-year{width:33%;background:0 0;border-color:transparent;box-shadow:none;color:#fff}.cmb2-element .ui-datepicker select.ui-datepicker-month option,.cmb2-element .ui-datepicker select.ui-datepicker-year option,.cmb2-element.ui-datepicker select.ui-datepicker-month option,.cmb2-element.ui-datepicker select.ui-datepicker-year option{color:#333}.cmb2-element .ui-datepicker thead,.cmb2-element.ui-datepicker thead{color:#fff;font-weight:600}.cmb2-element .ui-datepicker thead th,.cmb2-element.ui-datepicker thead th{font-weight:400}.cmb2-element .ui-datepicker th,.cmb2-element.ui-datepicker th{padding:10px}.cmb2-element .ui-datepicker td,.cmb2-element.ui-datepicker td{padding:0;border:1px solid #f4f4f4}.cmb2-element .ui-datepicker td.ui-datepicker-other-month,.cmb2-element.ui-datepicker td.ui-datepicker-other-month{border:transparent}.cmb2-element .ui-datepicker td.ui-datepicker-week-end,.cmb2-element.ui-datepicker td.ui-datepicker-week-end{background-color:#f4f4f4;border:1px solid #f4f4f4}.cmb2-element .ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today,.cmb2-element.ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today{-webkit-box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1);-moz-box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1);box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1)}.cmb2-element .ui-datepicker td.ui-datepicker-today,.cmb2-element.ui-datepicker td.ui-datepicker-today{background-color:#f0f0c0}.cmb2-element .ui-datepicker td.ui-datepicker-current-day,.cmb2-element.ui-datepicker td.ui-datepicker-current-day{background:#bd8}.cmb2-element .ui-datepicker td .ui-state-default,.cmb2-element.ui-datepicker td .ui-state-default{background:0 0;border:none;text-align:center;text-decoration:none;width:auto;display:block;padding:5px 10px;font-weight:400;color:#444}.cmb2-element .ui-datepicker td.ui-state-disabled .ui-state-default,.cmb2-element.ui-datepicker td.ui-state-disabled .ui-state-default{opacity:.5}.cmb2-element .ui-datepicker .ui-datepicker-header,.cmb2-element .ui-datepicker .ui-widget-header,.cmb2-element.ui-datepicker .ui-datepicker-header,.cmb2-element.ui-datepicker .ui-widget-header{background:#00a0d2}.cmb2-element .ui-datepicker thead,.cmb2-element.ui-datepicker thead{background:#32373c}.cmb2-element .ui-datepicker td .ui-state-active,.cmb2-element .ui-datepicker td .ui-state-hover,.cmb2-element.ui-datepicker td .ui-state-active,.cmb2-element.ui-datepicker td .ui-state-hover{background:#0073aa;color:#fff}.cmb2-element .ui-datepicker .ui-timepicker-div,.cmb2-element.ui-datepicker .ui-timepicker-div{font-size:14px}.cmb2-element .ui-datepicker .ui-timepicker-div dl,.cmb2-element.ui-datepicker .ui-timepicker-div dl{text-align:right;padding:0 .6em}.cmb2-element .ui-datepicker .ui-timepicker-div dl dt,.cmb2-element.ui-datepicker .ui-timepicker-div dl dt{float:right;clear:right;padding:0 5px 0 0}.cmb2-element .ui-datepicker .ui-timepicker-div dl dd,.cmb2-element.ui-datepicker .ui-timepicker-div dl dd{margin:0 40% 10px 10px}.cmb2-element .ui-datepicker .ui-timepicker-div dl dd select,.cmb2-element.ui-datepicker .ui-timepicker-div dl dd select{width:100%}.cmb2-element .ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane,.cmb2-element.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane{padding:.6em;text-align:right}.cmb2-element .ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-primary,.cmb2-element .ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-secondary,.cmb2-element.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-primary,.cmb2-element.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-secondary{padding:0 10px 1px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;margin:0 .4em .4em .6em}.admin-color-fresh .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-fresh .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-fresh .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-fresh .cmb2-element.ui-datepicker .ui-widget-header{background:#00a0d2}.admin-color-fresh .cmb2-element .ui-datepicker thead,.admin-color-fresh .cmb2-element.ui-datepicker thead{background:#32373c}.admin-color-fresh .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-fresh .cmb2-element.ui-datepicker td .ui-state-hover{background:#0073aa;color:#fff}.admin-color-blue .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-blue .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-blue .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-blue .cmb2-element.ui-datepicker .ui-widget-header{background:#52accc}.admin-color-blue .cmb2-element .ui-datepicker thead,.admin-color-blue .cmb2-element.ui-datepicker thead{background:#4796b3}.admin-color-blue .cmb2-element .ui-datepicker td .ui-state-active,.admin-color-blue .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-active,.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-hover{background:#096484;color:#fff}.admin-color-blue .cmb2-element .ui-datepicker td.ui-datepicker-today,.admin-color-blue .cmb2-element.ui-datepicker td.ui-datepicker-today{background:#eee}.admin-color-coffee .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-coffee .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-coffee .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-coffee .cmb2-element.ui-datepicker .ui-widget-header{background:#59524c}.admin-color-coffee .cmb2-element .ui-datepicker thead,.admin-color-coffee .cmb2-element.ui-datepicker thead{background:#46403c}.admin-color-coffee .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-coffee .cmb2-element.ui-datepicker td .ui-state-hover{background:#c7a589;color:#fff}.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-widget-header{background:#523f6d}.admin-color-ectoplasm .cmb2-element .ui-datepicker thead,.admin-color-ectoplasm .cmb2-element.ui-datepicker thead{background:#413256}.admin-color-ectoplasm .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-ectoplasm .cmb2-element.ui-datepicker td .ui-state-hover{background:#a3b745;color:#fff}.admin-color-midnight .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-midnight .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-midnight .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-midnight .cmb2-element.ui-datepicker .ui-widget-header{background:#363b3f}.admin-color-midnight .cmb2-element .ui-datepicker thead,.admin-color-midnight .cmb2-element.ui-datepicker thead{background:#26292c}.admin-color-midnight .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-midnight .cmb2-element.ui-datepicker td .ui-state-hover{background:#e14d43;color:#fff}.admin-color-ocean .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-ocean .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-ocean .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-ocean .cmb2-element.ui-datepicker .ui-widget-header{background:#738e96}.admin-color-ocean .cmb2-element .ui-datepicker thead,.admin-color-ocean .cmb2-element.ui-datepicker thead{background:#627c83}.admin-color-ocean .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-ocean .cmb2-element.ui-datepicker td .ui-state-hover{background:#9ebaa0;color:#fff}.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover,.admin-color-sunrise .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover,.admin-color-sunrise .cmb2-element.ui-datepicker .ui-widget-header{background:#cf4944}.admin-color-sunrise .cmb2-element .ui-datepicker th,.admin-color-sunrise .cmb2-element.ui-datepicker th{border-color:#be3631;background:#be3631}.admin-color-sunrise .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-sunrise .cmb2-element.ui-datepicker td .ui-state-hover{background:#dd823b;color:#fff}.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-light .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-light .cmb2-element.ui-datepicker .ui-widget-header{background:#e5e5e5}.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-month,.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-year,.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-month,.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-year{color:#555}.admin-color-light .cmb2-element .ui-datepicker thead,.admin-color-light .cmb2-element.ui-datepicker thead{background:#888}.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-next:before,.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-prev:before,.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-title,.admin-color-light .cmb2-element .ui-datepicker td .ui-state-default,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-next:before,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-prev:before,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-title,.admin-color-light .cmb2-element.ui-datepicker td .ui-state-default{color:#555}.admin-color-light .cmb2-element .ui-datepicker td .ui-state-active,.admin-color-light .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-light .cmb2-element.ui-datepicker td .ui-state-active,.admin-color-light .cmb2-element.ui-datepicker td .ui-state-hover{background:#ccc}.admin-color-light .cmb2-element .ui-datepicker td.ui-datepicker-today,.admin-color-light .cmb2-element.ui-datepicker td.ui-datepicker-today{background:#eee}.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-widget-header{background:#56b274}.admin-color-bbp-evergreen .cmb2-element .ui-datepicker thead,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker thead{background:#36533f}.admin-color-bbp-evergreen .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker td .ui-state-hover{background:#446950;color:#fff}.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-widget-header{background:#4ca26a}.admin-color-bbp-mint .cmb2-element .ui-datepicker thead,.admin-color-bbp-mint .cmb2-element.ui-datepicker thead{background:#4f6d59}.admin-color-bbp-mint .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-bbp-mint .cmb2-element.ui-datepicker td .ui-state-hover{background:#5fb37c;color:#fff}@media only screen and (max-width:850px){.cmb2-context-wrap.cmb2-context-wrap-form_top{margin-left:0}}@media (max-width:450px){.cmb-th{font-size:1.2em;padding-bottom:1em;text-align:right}.cmb-th label{display:block;margin-top:0;margin-bottom:.5em}.cmb-td,.cmb-th,.cmb-th+.cmb-td{display:block;float:none;width:100%}.cmb-type-group .cmb-repeatable-group:not(:last-of-type),.cmb-type-group .cmb-row:not(:last-of-type),.cmb2-postbox .cmb-repeatable-group:not(:last-of-type),.cmb2-postbox .cmb-row:not(:last-of-type){border-bottom:0}.cmb2-options-page .cmb2-metabox>.cmb-row>.cmb-th+.cmb-td{padding:0;margin-right:0}} \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2/css/cmb2.css b/inc/vendors/cmb2-plugins/cmb2/css/cmb2.css new file mode 100755 index 00000000..34107620 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/cmb2.css @@ -0,0 +1,2098 @@ +/*! + * CMB2 - v2.6.0 - 2019-01-18 + * https://cmb2.io + * Copyright (c) 2019 + * Licensed GPLv2+ + */ + +/*-------------------------------------------------------------- + * Main Wrap +--------------------------------------------------------------*/ + +/* line 5, sass/partials/_main_wrap.scss */ + +.cmb2-wrap { + margin: 0; +} + +/* line 8, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input, +.cmb2-wrap textarea { + font-size: 14px; + max-width: 100%; + padding: 5px; +} + +/* line 18, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} + +/* line 23, sass/partials/_main_wrap.scss */ + +.cmb2-wrap textarea { + width: 500px; +} + +/* line 26, sass/partials/_main_wrap.scss */ + +.cmb2-wrap textarea.cmb2-textarea-code { + font-family: "Courier 10 Pitch", Courier, monospace; + line-height: 16px; +} + +/* line 34, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input.cmb2-text-small, +.cmb2-wrap input.cmb2-timepicker { + width: 100px; +} + +/* line 40, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input.cmb2-text-money { + width: 90px; +} + +/* line 45, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input.cmb2-text-medium { + width: 230px; +} + +/* line 50, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input.cmb2-upload-file { + width: 65%; +} + +/* line 54, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input.ed_button { + padding: 2px 4px; +} + +/* line 59, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input:not([type="hidden"]) + input, +.cmb2-wrap input:not([type="hidden"]) + .button-secondary, +.cmb2-wrap input:not([type="hidden"]) + select { + margin-left: 20px; +} + +/* line 67, sass/partials/_main_wrap.scss */ + +.cmb2-wrap ul { + margin: 0; +} + +/* line 71, sass/partials/_main_wrap.scss */ + +.cmb2-wrap li { + font-size: 14px; + line-height: 16px; + margin: 1px 0 5px 0; +} + +/* line 82, sass/partials/_main_wrap.scss */ + +.cmb2-wrap select { + font-size: 14px; + margin-top: 3px; +} + +/* line 87, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input:focus, +.cmb2-wrap textarea:focus { + background: #fffff8; +} + +/* line 92, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input[type="radio"] { + margin: 0 5px 0 0; + padding: 0; +} + +/* line 97, sass/partials/_main_wrap.scss */ + +.cmb2-wrap input[type="checkbox"] { + margin: 0 5px 0 0; + padding: 0; +} + +/* line 102, sass/partials/_main_wrap.scss */ + +.cmb2-wrap button, +.cmb2-wrap .button-secondary { + white-space: nowrap; +} + +/* line 107, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .mceLayout { + border: 1px solid #e9e9e9 !important; +} + +/* line 111, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .mceIframeContainer { + background: #ffffff; +} + +/* line 115, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .meta_mce { + width: 97%; +} + +/* line 118, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .meta_mce textarea { + width: 100%; +} + +/* line 124, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-input-wrap { + vertical-align: middle; +} + +/* line 129, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .wp-color-result, +.cmb2-wrap .wp-picker-container { + margin: 0 10px 0 0; +} + +/* line 134, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .cmb-row { + margin: 0; +} + +/* line 137, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .cmb-row:after { + content: ''; + clear: both; + display: block; + width: 100%; +} + +/* line 144, sass/partials/_main_wrap.scss */ + +.cmb2-wrap .cmb-row.cmb-repeat .cmb2-metabox-description { + padding-top: 0; + padding-bottom: 1em; +} + +/* line 152, sass/partials/_main_wrap.scss */ + +.cmb2-metabox { + clear: both; + margin: 0; +} + +/* line 158, sass/partials/_main_wrap.scss */ + +.cmb2-metabox > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox > .cmb-row:first-of-type > .cmb-th, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-td, +.cmb2-metabox .cmb-field-list > .cmb-row:first-of-type > .cmb-th { + border: 0; +} + +/* line 165, sass/partials/_main_wrap.scss */ + +.cmb-add-row { + margin: 1.8em 0 0; +} + +/* line 169, sass/partials/_main_wrap.scss */ + +.cmb-nested .cmb-td, +.cmb-repeatable-group .cmb-th, +.cmb-repeatable-group:first-of-type { + border: 0; +} + +/* line 175, sass/partials/_main_wrap.scss */ + +.cmb-row:last-of-type, +.cmb2-wrap .cmb-row:last-of-type, +.cmb-repeatable-group:last-of-type { + border-bottom: 0; +} + +/* line 181, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-grouping { + border: 1px solid #e9e9e9; + padding: 0 1em; +} + +/* line 185, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-grouping.cmb-row { + margin: 0 0 0.8em; +} + +/* line 193, sass/partials/_main_wrap.scss */ + +.cmb-th { + color: #222222; + float: left; + font-weight: 600; + line-height: 1.3; + padding: 20px 10px 20px 0; + vertical-align: top; + width: 200px; +} + +/* line 207, sass/partials/_main_wrap.scss */ + +.cmb-td { + line-height: 1.3; + max-width: 100%; + padding: 15px 10px; + vertical-align: middle; +} + +/* line 216, sass/partials/_main_wrap.scss */ + +.cmb-type-title .cmb-td { + padding: 0; +} + +/* line 221, sass/partials/_main_wrap.scss */ + +.cmb-th label { + display: block; + padding: 5px 0; +} + +/* line 226, sass/partials/_main_wrap.scss */ + +.cmb-th + .cmb-td { + float: left; +} + +/* line 230, sass/partials/_main_wrap.scss */ + +.cmb-td .cmb-td { + padding-bottom: 1em; +} + +/* line 234, sass/partials/_main_wrap.scss */ + +.cmb-remove-row { + text-align: right; +} + +/* line 238, sass/partials/_main_wrap.scss */ + +.empty-row.hidden { + display: none; +} + +/* line 243, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table { + background-color: #fafafa; + border: 1px solid #e1e1e1; +} + +/* line 247, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-row.cmb-repeat-row { + position: relative; + counter-increment: el; + margin: 0; + padding: 10px 10px 10px 50px; + border-bottom: none !important; +} + +/* line 255, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-row.cmb-repeat-row + .cmb-repeat-row { + border-top: solid 1px #e9e9e9; +} + +/* line 259, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-row.cmb-repeat-row.ui-sortable-helper { + outline: dashed 2px #e9e9e9 !important; +} + +/* line 263, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-row.cmb-repeat-row:before { + content: counter(el); + display: block; + top: 0; + left: 0; + position: absolute; + width: 35px; + height: 100%; + line-height: 35px; + cursor: move; + color: #757575; + text-align: center; + border-right: solid 1px #e9e9e9; +} + +/* line 280, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-row.cmb-repeat-row .cmb-td { + margin: 0; + padding: 0; +} + +/* line 287, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table + .cmb-add-row { + margin: 0; +} + +/* line 290, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table + .cmb-add-row:before { + content: ''; + width: 1px; + height: 1.6em; + display: block; + margin-left: 17px; + background-color: gainsboro; +} + +/* line 300, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-remove-row { + top: 7px; + right: 7px; + position: absolute; + width: auto; + margin-left: 0; + padding: 0 !important; + display: none; +} + +/* line 311, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button { + font-size: 20px; + text-indent: -1000px; + overflow: hidden; + position: relative; + height: auto; + line-height: 1; + padding: 0 10px 0; +} + +/* line 322, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-remove-row > .cmb-remove-row-button:before { + content: ""; + font-family: 'Dashicons'; + speak: none; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + margin: 0; + text-indent: 0; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + text-align: center; +} + +/* line 328, sass/partials/_main_wrap.scss */ + +.cmb-repeat-table .cmb-repeat-row:hover .cmb-remove-row { + display: block; +} + +/* line 336, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-th { + padding: 5px; +} + +/* line 340, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-group-title { + background-color: #e9e9e9; + padding: 8px 12px 8px 2.2em; + margin: 0 -1em; + min-height: 1.5em; + font-size: 14px; + line-height: 1.4; +} + +/* line 348, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-group-title h4 { + border: 0; + margin: 0; + font-size: 1.2em; + font-weight: 500; + padding: 0.5em 0.75em; +} + +/* line 356, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-group-title .cmb-th { + display: block; + width: 100%; +} + +/* line 362, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-group-description .cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: left; + width: 100%; +} + +/* line 27, sass/partials/_mixins.scss */ + +.cmb-repeatable-group .cmb-group-description .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; +} + +/* line 366, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-shift-rows { + font-size: 1em; + margin-right: 1em; + text-decoration: none; +} + +/* line 371, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-shift-rows .dashicons { + font-size: 1.5em; + height: 1.5em; + line-height: 1.2em; + width: 1em; +} + +/* line 377, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb-shift-rows .dashicons.dashicons-arrow-down-alt2 { + line-height: 1.3em; +} + +/* line 384, sass/partials/_main_wrap.scss */ + +.cmb-repeatable-group .cmb2-upload-button { + float: right; +} + +/* line 390, sass/partials/_main_wrap.scss */ + +p.cmb2-metabox-description { + color: #757575; + font-style: italic; + margin: 0; + padding-top: .5em; +} + +/* line 397, sass/partials/_main_wrap.scss */ + +span.cmb2-metabox-description { + color: #757575; + font-style: italic; +} + +/* line 402, sass/partials/_main_wrap.scss */ + +.cmb2-metabox-title { + margin: 0 0 5px 0; + padding: 5px 0 0 0; + font-size: 14px; +} + +/* line 408, sass/partials/_main_wrap.scss */ + +.cmb-inline ul { + padding: 4px 0 0 0; +} + +/* line 412, sass/partials/_main_wrap.scss */ + +.cmb-inline li { + display: inline-block; + padding-right: 18px; +} + +/* line 417, sass/partials/_main_wrap.scss */ + +.cmb-type-textarea-code pre { + margin: 0; +} + +/* line 423, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status { + clear: none; + display: inline-block; + vertical-align: middle; + margin-right: 10px; + width: auto; +} + +/* line 430, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status img { + max-width: 350px; + height: auto; +} + +/* line 436, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status img, +.cmb2-media-status .embed-status { + background: #eee; + border: 5px solid #ffffff; + outline: 1px solid #e9e9e9; + box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.05); + background-image: linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0), linear-gradient(45deg, #d0d0d0 25%, transparent 25%, transparent 75%, #d0d0d0 75%, #d0d0d0); + background-position: 0 0, 10px 10px; + background-size: 20px 20px; + border-radius: 2px; + -moz-border-radius: 2px; + margin: 15px 0 0 0; +} + +/* line 450, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .embed-status { + float: left; + max-width: 800px; +} + +/* line 455, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status, +.cmb2-media-status .embed-status { + position: relative; +} + +/* line 458, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status .cmb2-remove-file-button, +.cmb2-media-status .embed-status .cmb2-remove-file-button { + background: url(../images/ico-delete.png); + height: 16px; + left: -5px; + position: absolute; + text-indent: -9999px; + top: -5px; + width: 16px; +} + +/* line 472, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status .cmb2-remove-file-button { + top: 10px; +} + +/* line 477, sass/partials/_main_wrap.scss */ + +.cmb2-media-status .img-status img, +.cmb2-media-status .file-status > span { + cursor: pointer; +} + +/* line 482, sass/partials/_main_wrap.scss */ + +.cmb2-media-status.cmb-attach-list .img-status img, +.cmb2-media-status.cmb-attach-list .file-status > span { + cursor: move; +} + +/* line 489, sass/partials/_main_wrap.scss */ + +.cmb-type-file-list .cmb2-media-status .img-status { + clear: none; + vertical-align: middle; + width: auto; + margin-right: 10px; + margin-bottom: 10px; + margin-top: 0; +} + +/* line 498, sass/partials/_main_wrap.scss */ + +.cmb-attach-list li { + clear: both; + display: inline-block; + width: 100%; + margin-top: 5px; + margin-bottom: 10px; +} + +/* line 504, sass/partials/_main_wrap.scss */ + +.cmb-attach-list li img { + float: left; + margin-right: 10px; +} + +/* line 510, sass/partials/_main_wrap.scss */ + +.cmb2-remove-wrapper { + margin: 0; +} + +/* line 514, sass/partials/_main_wrap.scss */ + +.child-cmb2 .cmb-th { + text-align: left; +} + +/* line 518, sass/partials/_main_wrap.scss */ + +.cmb2-indented-hierarchy { + padding-left: 1.5em; +} + +/*-------------------------------------------------------------- + * Post Metaboxes +--------------------------------------------------------------*/ + +/* line 5, sass/partials/_post_metaboxes.scss */ + +#poststuff .cmb-group-title { + margin-left: -1em; + margin-right: -1em; + min-height: 1.5em; +} + +/* line 11, sass/partials/_post_metaboxes.scss */ + +#poststuff .repeatable .cmb-group-title { + padding-left: 2.2em; +} + +/* line 17, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb2-wrap, +.cmb-type-group .cmb2-wrap { + margin: 0; +} + +/* line 20, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb2-wrap > .cmb-field-list > .cmb-row, +.cmb-type-group .cmb2-wrap > .cmb-field-list > .cmb-row { + padding: 1.8em 0; +} + +/* line 26, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb2-wrap input[type=text].cmb2-oembed, +.cmb-type-group .cmb2-wrap input[type=text].cmb2-oembed { + width: 100%; +} + +/* line 32, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-row, +.cmb-type-group .cmb-row { + padding: 0 0 1.8em; + margin: 0 0 0.8em; +} + +/* line 36, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-row .cmbhandle, +.cmb-type-group .cmb-row .cmbhandle { + right: -1em; + position: relative; + color: #222222; +} + +/* line 43, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-repeatable-grouping, +.cmb-type-group .cmb-repeatable-grouping { + padding: 0 1em; + max-width: 100%; + min-width: 1px !important; +} + +/* line 49, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-repeatable-group > .cmb-row, +.cmb-type-group .cmb-repeatable-group > .cmb-row { + padding-bottom: 0; +} + +/* line 53, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-th, +.cmb-type-group .cmb-th { + width: 18%; + padding: 0 2% 0 0; +} + +/* line 59, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-td, +.cmb-type-group .cmb-td { + margin-bottom: 0; + padding: 0; + line-height: 1.3; +} + +/* line 65, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-th + .cmb-td, +.cmb-type-group .cmb-th + .cmb-td { + width: 80%; + float: right; +} + +/* line 70, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-row:not(:last-of-type), +.cmb2-postbox .cmb-repeatable-group:not(:last-of-type), +.cmb-type-group .cmb-row:not(:last-of-type), +.cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 1px solid #e9e9e9; +} + +/* line 79, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-repeat-group-field, +.cmb2-postbox .cmb-remove-field-row, +.cmb-type-group .cmb-repeat-group-field, +.cmb-type-group .cmb-remove-field-row { + padding-top: 1.8em; +} + +/*-------------------------------------------------------------- + * Context Metaboxes +--------------------------------------------------------------*/ + +/* Metabox collapse arrow indicators */ + +/* line 9, sass/partials/_context_metaboxes.scss */ + +.js .cmb2-postbox.context-box .toggle-indicator:before { + content: "\f142"; + display: inline-block; + font: normal 20px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} + +/* line 22, sass/partials/_context_metaboxes.scss */ + +.js .cmb2-postbox.context-box.closed .toggle-indicator:before { + content: "\f140"; +} + +/* line 30, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box { + margin-bottom: 10px; +} + +/* line 34, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box.context-before_permalink-box { + margin-top: 10px; +} + +/* line 38, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box.context-after_title-box { + margin-top: 10px; +} + +/* line 42, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box.context-after_editor-box { + margin-top: 20px; + margin-bottom: 0; +} + +/* line 47, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box.context-form_top-box { + margin-top: 10px; +} + +/* line 51, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box.context-form_top-box .hndle { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} + +/* line 59, sass/partials/_context_metaboxes.scss */ + +.cmb2-postbox.context-box .hndle { + cursor: auto; +} + +/* line 64, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap { + margin-top: 10px; +} + +/* line 68, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-right: 300px; + width: auto; +} + +/* line 75, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap.cmb2-context-wrap-no-title .cmb2-metabox { + padding: 10px; +} + +/* line 80, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap .cmb-th { + padding: 0 2% 0 0; + width: 18%; +} + +/* line 85, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap .cmb-td { + width: 80%; + padding: 0; +} + +/* line 90, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap .cmb-row { + margin-bottom: 10px; +} + +/* line 93, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap .cmb-row:last-of-type { + margin-bottom: 0; +} + +/* one column on the post write/edit screen */ + +/*-------------------------------------------------------------- + * Options page +--------------------------------------------------------------*/ + +/* line 5, sass/partials/_options-page.scss */ + +.cmb2-options-page { + max-width: 1200px; +} + +/* line 8, sass/partials/_options-page.scss */ + +.cmb2-options-page.wrap > h2 { + margin-bottom: 1em; +} + +/* line 12, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-metabox > .cmb-row { + padding: 1em; + margin-top: -1px; + background: #ffffff; + border: 1px solid #e9e9e9; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} + +/* line 19, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-metabox > .cmb-row > .cmb-th { + padding: 0; + font-weight: initial; +} + +/* line 24, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-metabox > .cmb-row > .cmb-th + .cmb-td { + float: none; + padding: 0 0 0 1em; + margin-left: 200px; +} + +/* line 37, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-wrap .cmb-type-title { + margin-top: 1em; + padding: 0.6em 1em; + background-color: #fafafa; +} + +/* line 42, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-wrap .cmb-type-title .cmb2-metabox-title { + font-size: 12px; + margin-top: 0; + margin-bottom: 0; + text-transform: uppercase; +} + +/* line 49, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-wrap .cmb-type-title .cmb2-metabox-description { + padding-top: 0.25em; +} + +/* line 55, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb-repeatable-group .cmb-group-description .cmb-th { + padding: 0 0 0.8em 0; +} + +/* line 59, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb-repeatable-group .cmb-group-name { + font-size: 16px; + margin-top: 0; + margin-bottom: 0; +} + +/* line 65, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb-repeatable-group .cmb-th > .cmb2-metabox-description { + font-weight: 400; + padding-bottom: 0 !important; +} + +/*-------------------------------------------------------------- + * New-Term Page +--------------------------------------------------------------*/ + +/* line 6, sass/partials/_new_term.scss */ + +#addtag .cmb-th { + float: none; + width: auto; + padding: 20px 0 0; +} + +/* line 12, sass/partials/_new_term.scss */ + +#addtag .cmb-td { + padding: 0; +} + +/* line 16, sass/partials/_new_term.scss */ + +#addtag .cmb-th + .cmb-td { + float: none; +} + +/* line 20, sass/partials/_new_term.scss */ + +#addtag select { + max-width: 100%; +} + +/* line 24, sass/partials/_new_term.scss */ + +#addtag .cmb2-metabox { + padding-bottom: 20px; +} + +/* line 28, sass/partials/_new_term.scss */ + +#addtag .cmb-row li label { + display: inline; +} + +/*-------------------------------------------------------------- + * Misc. +--------------------------------------------------------------*/ + +/* line 5, sass/partials/_misc.scss */ + +#poststuff .cmb-repeatable-group h2 { + margin: 0; +} + +/* line 12, sass/partials/_misc.scss */ + +.edit-tags-php .cmb2-metabox-title, +.profile-php .cmb2-metabox-title, +.user-edit-php .cmb2-metabox-title { + font-size: 1.4em; +} + +/* line 18, sass/partials/_misc.scss */ + +.cmb2-postbox .cmb-spinner, +.cmb2-no-box-wrap .cmb-spinner { + float: left; + display: none; +} + +/* line 24, sass/partials/_misc.scss */ + +.cmb-spinner { + display: none; +} + +/* line 26, sass/partials/_misc.scss */ + +.cmb-spinner.is-active { + display: block; +} + +/*-------------------------------------------------------------- + * Sidebar Placement Adjustments +--------------------------------------------------------------*/ + +/* line 10, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-wrap > .cmb-field-list > .cmb-row, +#side-sortables .cmb2-wrap > .cmb-field-list > .cmb-row { + padding: 1.4em 0; +} + +/* line 16, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-wrap input[type=text]:not(.wp-color-picker), +#side-sortables .cmb2-wrap input[type=text]:not(.wp-color-picker) { + width: 100%; +} + +/* line 20, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-wrap input + input:not(.wp-picker-clear), +.inner-sidebar .cmb2-wrap input + select, +#side-sortables .cmb2-wrap input + input:not(.wp-picker-clear), +#side-sortables .cmb2-wrap input + select { + margin-left: 0; + margin-top: 1em; + display: block; +} + +/* line 26, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-wrap input.cmb2-text-money, +#side-sortables .cmb2-wrap input.cmb2-text-money { + max-width: 70%; +} + +/* line 28, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-wrap input.cmb2-text-money + .cmb2-metabox-description, +#side-sortables .cmb2-wrap input.cmb2-text-money + .cmb2-metabox-description { + display: block; +} + +/* line 34, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-wrap label, +#side-sortables .cmb2-wrap label { + display: block; + font-weight: 700; + padding: 0 0 5px; +} + +/* line 42, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar textarea, +#side-sortables textarea { + max-width: 99%; +} + +/* line 46, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-repeatable-group, +#side-sortables .cmb-repeatable-group { + border-bottom: 1px solid #e9e9e9; +} + +/* line 50, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-type-group > .cmb-td > .cmb-repeatable-group, +#side-sortables .cmb-type-group > .cmb-td > .cmb-repeatable-group { + border-bottom: 0; + margin-bottom: -1.4em; +} + +/* line 55, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-th, +.inner-sidebar .cmb-td:not(.cmb-remove-row), +.inner-sidebar .cmb-th + .cmb-td, +#side-sortables .cmb-th, +#side-sortables .cmb-td:not(.cmb-remove-row), +#side-sortables .cmb-th + .cmb-td { + width: 100%; + display: block; + float: none; +} + +/* line 63, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .closed .inside, +#side-sortables .closed .inside { + display: none; +} + +/* line 67, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-th, +#side-sortables .cmb-th { + display: block; + float: none; + padding-bottom: 1em; + text-align: left; + width: 100%; + padding-left: 0; + padding-right: 0; +} + +/* line 27, sass/partials/_mixins.scss */ + +.inner-sidebar .cmb-th label, +#side-sortables .cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; +} + +/* line 14, sass/partials/_mixins.scss */ + +.inner-sidebar .cmb-th label, +#side-sortables .cmb-th label { + font-size: 14px; + line-height: 1.4em; +} + +/* line 74, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-group-description .cmb-th, +#side-sortables .cmb-group-description .cmb-th { + padding-top: 0; +} + +/* line 77, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-group-description .cmb2-metabox-description, +#side-sortables .cmb-group-description .cmb2-metabox-description { + padding: 0; +} + +/* line 84, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-group-title .cmb-th, +#side-sortables .cmb-group-title .cmb-th { + padding: 0; +} + +/* line 90, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-repeatable-grouping + .cmb-repeatable-grouping, +#side-sortables .cmb-repeatable-grouping + .cmb-repeatable-grouping { + margin-top: 1em; +} + +/* line 99, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-media-status .img-status img, +.inner-sidebar .cmb2-media-status .embed-status img, +#side-sortables .cmb2-media-status .img-status img, +#side-sortables .cmb2-media-status .embed-status img { + max-width: 90%; + height: auto; +} + +/* line 107, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-list label, +#side-sortables .cmb2-list label { + display: inline; + font-weight: normal; +} + +/* line 112, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-metabox-description, +#side-sortables .cmb2-metabox-description { + display: block; + padding: 7px 0 0; +} + +/* line 119, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-type-checkbox .cmb-td label, +.inner-sidebar .cmb-type-checkbox .cmb2-metabox-description, +#side-sortables .cmb-type-checkbox .cmb-td label, +#side-sortables .cmb-type-checkbox .cmb2-metabox-description { + font-weight: normal; + display: inline; +} + +/* line 126, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-row .cmb2-metabox-description, +#side-sortables .cmb-row .cmb2-metabox-description { + padding-bottom: 1.8em; +} + +/* line 130, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-metabox-title, +#side-sortables .cmb2-metabox-title { + font-size: 1.2em; + font-style: italic; +} + +/* line 135, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb-remove-row, +#side-sortables .cmb-remove-row { + clear: both; + padding-top: 12px; + padding-bottom: 0; +} + +/* line 141, sass/partials/_sidebar_placements.scss */ + +.inner-sidebar .cmb2-upload-button, +#side-sortables .cmb2-upload-button { + clear: both; + margin-top: 12px; +} + +/*-------------------------------------------------------------- + * Collapsible UI +--------------------------------------------------------------*/ + +/* line 6, sass/partials/_collapsible_ui.scss */ + +.cmb2-metabox .cmbhandle { + color: #757575; + float: right; + width: 27px; + height: 30px; + cursor: pointer; + right: -1em; + position: relative; +} + +/* line 14, sass/partials/_collapsible_ui.scss */ + +.cmb2-metabox .cmbhandle:before { + content: '\f142'; + right: 12px; + font: normal 20px/1 'dashicons'; + speak: none; + display: inline-block; + padding: 8px 10px; + top: 0; + position: relative; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} + +/* line 31, sass/partials/_collapsible_ui.scss */ + +.cmb2-metabox .postbox.closed .cmbhandle:before { + content: '\f140'; +} + +/* line 37, sass/partials/_collapsible_ui.scss */ + +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row { + -webkit-appearance: none !important; + background: none !important; + border: none !important; + position: absolute; + left: 0; + top: .5em; + line-height: 1em; + padding: 2px 6px 3px; + opacity: .5; +} + +/* line 47, sass/partials/_collapsible_ui.scss */ + +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]) { + cursor: pointer; + color: #a00; + opacity: 1; +} + +/* line 51, sass/partials/_collapsible_ui.scss */ + +.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]):hover { + color: #f00; +} + +/* + * jQuery UI CSS Framework 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * WordPress Styles adopted from "jQuery UI Datepicker CSS for WordPress" + * https://github.com/stuttter/wp-datepicker-styling + * + */ + +/* line 15, sass/partials/_jquery_ui.scss */ + +* html .cmb2-element.ui-helper-clearfix { + height: 1%; +} + +/* line 24, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker, +.cmb2-element .ui-datepicker { + padding: 0; + margin: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + background-color: #fff; + border: 1px solid #dfdfdf; + border-top: none; + -webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); + min-width: 17em; + width: auto; /* Default Color Scheme */ +} + +/* line 38, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker *, +.cmb2-element .ui-datepicker * { + padding: 0; + font-family: "Open Sans", sans-serif; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* line 46, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker table, +.cmb2-element .ui-datepicker table { + font-size: 13px; + margin: 0; + border: none; + border-collapse: collapse; +} + +/* line 53, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, +.cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background-image: none; + border: none; + color: #fff; + font-weight: normal; +} + +/* line 61, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, +.cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: transparent; + border-color: transparent; + cursor: pointer; +} + +/* line 67, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-title, +.cmb2-element .ui-datepicker .ui-datepicker-title { + margin: 0; + padding: 10px 0; + color: #fff; + font-size: 14px; + line-height: 14px; + text-align: center; +} + +/* line 75, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-title select, +.cmb2-element .ui-datepicker .ui-datepicker-title select { + margin-top: -8px; + margin-bottom: -8px; +} + +/* line 81, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-next, +.cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-next { + position: relative; + top: 0; + height: 34px; + width: 34px; +} + +/* line 89, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-next, +.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-next { + border: none; +} + +/* line 94, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover, +.cmb2-element .ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-prev-hover { + left: 0; +} + +/* line 99, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-next, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover, +.cmb2-element .ui-datepicker .ui-datepicker-next, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover { + right: 0; +} + +/* line 104, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-next span, +.cmb2-element.ui-datepicker .ui-datepicker-prev span, +.cmb2-element .ui-datepicker .ui-datepicker-next span, +.cmb2-element .ui-datepicker .ui-datepicker-prev span { + display: none; +} + +/* line 109, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-prev, +.cmb2-element .ui-datepicker .ui-datepicker-prev { + float: left; +} + +/* line 113, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-next, +.cmb2-element .ui-datepicker .ui-datepicker-next { + float: right; +} + +/* line 117, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.cmb2-element.ui-datepicker .ui-datepicker-next:before, +.cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.cmb2-element .ui-datepicker .ui-datepicker-next:before { + font: normal 20px/34px 'dashicons'; + padding-left: 7px; + color: #fff; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: 34px; + height: 34px; +} + +/* line 129, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.cmb2-element .ui-datepicker .ui-datepicker-prev:before { + content: '\f341'; +} + +/* line 133, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-next:before, +.cmb2-element .ui-datepicker .ui-datepicker-next:before { + content: '\f345'; +} + +/* line 137, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element.ui-datepicker .ui-datepicker-next-hover:before, +.cmb2-element .ui-datepicker .ui-datepicker-prev-hover:before, +.cmb2-element .ui-datepicker .ui-datepicker-next-hover:before { + opacity: 0.7; +} + +/* line 142, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker select.ui-datepicker-month, +.cmb2-element.ui-datepicker select.ui-datepicker-year, +.cmb2-element .ui-datepicker select.ui-datepicker-month, +.cmb2-element .ui-datepicker select.ui-datepicker-year { + width: 33%; + background: transparent; + border-color: transparent; + box-shadow: none; + color: #fff; +} + +/* line 149, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker select.ui-datepicker-month option, +.cmb2-element.ui-datepicker select.ui-datepicker-year option, +.cmb2-element .ui-datepicker select.ui-datepicker-month option, +.cmb2-element .ui-datepicker select.ui-datepicker-year option { + color: #333; +} + +/* line 154, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker thead, +.cmb2-element .ui-datepicker thead { + color: #fff; + font-weight: 600; +} + +/* line 157, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker thead th, +.cmb2-element .ui-datepicker thead th { + font-weight: normal; +} + +/* line 162, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker th, +.cmb2-element .ui-datepicker th { + padding: 10px; +} + +/* line 166, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td, +.cmb2-element .ui-datepicker td { + padding: 0; + border: 1px solid #f4f4f4; +} + +/* line 171, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td.ui-datepicker-other-month, +.cmb2-element .ui-datepicker td.ui-datepicker-other-month { + border: transparent; +} + +/* line 175, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td.ui-datepicker-week-end, +.cmb2-element .ui-datepicker td.ui-datepicker-week-end { + background-color: #f4f4f4; + border: 1px solid #f4f4f4; +} + +/* line 178, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today, +.cmb2-element .ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today { + -webkit-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); + box-shadow: inset 0px 0px 1px 0px rgba(0, 0, 0, 0.1); +} + +/* line 185, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td.ui-datepicker-today, +.cmb2-element .ui-datepicker td.ui-datepicker-today { + background-color: #f0f0c0; +} + +/* line 189, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td.ui-datepicker-current-day, +.cmb2-element .ui-datepicker td.ui-datepicker-current-day { + background: #bbdd88; +} + +/* line 193, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td .ui-state-default, +.cmb2-element .ui-datepicker td .ui-state-default { + background: transparent; + border: none; + text-align: center; + text-decoration: none; + width: auto; + display: block; + padding: 5px 10px; + font-weight: normal; + color: #444; +} + +/* line 205, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td.ui-state-disabled .ui-state-default, +.cmb2-element .ui-datepicker td.ui-state-disabled .ui-state-default { + opacity: 0.5; +} + +/* line 210, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-widget-header, +.cmb2-element.ui-datepicker .ui-datepicker-header, +.cmb2-element .ui-datepicker .ui-widget-header, +.cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} + +/* line 215, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker thead, +.cmb2-element .ui-datepicker thead { + background: #32373c; +} + +/* line 219, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker td .ui-state-hover, +.cmb2-element.ui-datepicker td .ui-state-active, +.cmb2-element .ui-datepicker td .ui-state-hover, +.cmb2-element .ui-datepicker td .ui-state-active { + background: #0073aa; + color: #fff; +} + +/* line 224, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div, +.cmb2-element .ui-datepicker .ui-timepicker-div { + font-size: 14px; +} + +/* line 226, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div dl, +.cmb2-element .ui-datepicker .ui-timepicker-div dl { + text-align: left; + padding: 0 .6em; +} + +/* line 229, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div dl dt, +.cmb2-element .ui-datepicker .ui-timepicker-div dl dt { + float: left; + clear: left; + padding: 0 0 0 5px; +} + +/* line 234, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd, +.cmb2-element .ui-datepicker .ui-timepicker-div dl dd { + margin: 0 10px 10px 40%; +} + +/* line 236, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div dl dd select, +.cmb2-element .ui-datepicker .ui-timepicker-div dl dd select { + width: 100%; +} + +/* line 242, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane, +.cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane { + padding: .6em; + text-align: left; +} + +/* line 246, sass/partials/_jquery_ui.scss */ + +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, +.cmb2-element.ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary, +.cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-primary, +.cmb2-element .ui-datepicker .ui-timepicker-div + .ui-datepicker-buttonpane .button-secondary { + padding: 0 10px 1px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + margin: 0 .6em .4em .4em; +} + +/* line 260, sass/partials/_jquery_ui.scss */ + +.admin-color-fresh .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-fresh .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-fresh .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #00a0d2; +} + +/* line 265, sass/partials/_jquery_ui.scss */ + +.admin-color-fresh .cmb2-element.ui-datepicker thead, +.admin-color-fresh .cmb2-element .ui-datepicker thead { + background: #32373c; +} + +/* line 269, sass/partials/_jquery_ui.scss */ + +.admin-color-fresh .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-fresh .cmb2-element .ui-datepicker td .ui-state-hover { + background: #0073aa; + color: #fff; +} + +/* line 277, sass/partials/_jquery_ui.scss */ + +.admin-color-blue .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-blue .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-blue .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #52accc; +} + +/* line 282, sass/partials/_jquery_ui.scss */ + +.admin-color-blue .cmb2-element.ui-datepicker thead, +.admin-color-blue .cmb2-element .ui-datepicker thead { + background: #4796b3; +} + +/* line 291, sass/partials/_jquery_ui.scss */ + +.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-active, +.admin-color-blue .cmb2-element .ui-datepicker td .ui-state-hover, +.admin-color-blue .cmb2-element .ui-datepicker td .ui-state-active { + background: #096484; + color: #fff; +} + +/* line 296, sass/partials/_jquery_ui.scss */ + +.admin-color-blue .cmb2-element.ui-datepicker td.ui-datepicker-today, +.admin-color-blue .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +/* line 305, sass/partials/_jquery_ui.scss */ + +.admin-color-coffee .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-coffee .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-coffee .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #59524c; +} + +/* line 310, sass/partials/_jquery_ui.scss */ + +.admin-color-coffee .cmb2-element.ui-datepicker thead, +.admin-color-coffee .cmb2-element .ui-datepicker thead { + background: #46403c; +} + +/* line 314, sass/partials/_jquery_ui.scss */ + +.admin-color-coffee .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-coffee .cmb2-element .ui-datepicker td .ui-state-hover { + background: #c7a589; + color: #fff; +} + +/* line 322, sass/partials/_jquery_ui.scss */ + +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #523f6d; +} + +/* line 327, sass/partials/_jquery_ui.scss */ + +.admin-color-ectoplasm .cmb2-element.ui-datepicker thead, +.admin-color-ectoplasm .cmb2-element .ui-datepicker thead { + background: #413256; +} + +/* line 331, sass/partials/_jquery_ui.scss */ + +.admin-color-ectoplasm .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-ectoplasm .cmb2-element .ui-datepicker td .ui-state-hover { + background: #a3b745; + color: #fff; +} + +/* line 339, sass/partials/_jquery_ui.scss */ + +.admin-color-midnight .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-midnight .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-midnight .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #363b3f; +} + +/* line 344, sass/partials/_jquery_ui.scss */ + +.admin-color-midnight .cmb2-element.ui-datepicker thead, +.admin-color-midnight .cmb2-element .ui-datepicker thead { + background: #26292c; +} + +/* line 348, sass/partials/_jquery_ui.scss */ + +.admin-color-midnight .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-midnight .cmb2-element .ui-datepicker td .ui-state-hover { + background: #e14d43; + color: #fff; +} + +/* line 356, sass/partials/_jquery_ui.scss */ + +.admin-color-ocean .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-ocean .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-ocean .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #738e96; +} + +/* line 361, sass/partials/_jquery_ui.scss */ + +.admin-color-ocean .cmb2-element.ui-datepicker thead, +.admin-color-ocean .cmb2-element .ui-datepicker thead { + background: #627c83; +} + +/* line 365, sass/partials/_jquery_ui.scss */ + +.admin-color-ocean .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-ocean .cmb2-element .ui-datepicker td .ui-state-hover { + background: #9ebaa0; + color: #fff; +} + +/* line 373, sass/partials/_jquery_ui.scss */ + +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header, +.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover { + background: #cf4944; +} + +/* line 379, sass/partials/_jquery_ui.scss */ + +.admin-color-sunrise .cmb2-element.ui-datepicker th, +.admin-color-sunrise .cmb2-element .ui-datepicker th { + border-color: #be3631; + background: #be3631; +} + +/* line 384, sass/partials/_jquery_ui.scss */ + +.admin-color-sunrise .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-sunrise .cmb2-element .ui-datepicker td .ui-state-hover { + background: #dd823b; + color: #fff; +} + +/* line 392, sass/partials/_jquery_ui.scss */ + +.admin-color-light .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-light .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #e5e5e5; +} + +/* line 397, sass/partials/_jquery_ui.scss */ + +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-year, +.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-month, +.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-year { + color: #555; +} + +/* line 402, sass/partials/_jquery_ui.scss */ + +.admin-color-light .cmb2-element.ui-datepicker thead, +.admin-color-light .cmb2-element .ui-datepicker thead { + background: #888; +} + +/* line 406, sass/partials/_jquery_ui.scss */ + +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-next:before, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-title, +.admin-color-light .cmb2-element .ui-datepicker td .ui-state-default, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-prev:before, +.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-next:before { + color: #555; +} + +/* line 414, sass/partials/_jquery_ui.scss */ + +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-light .cmb2-element.ui-datepicker td .ui-state-active, +.admin-color-light .cmb2-element .ui-datepicker td .ui-state-hover, +.admin-color-light .cmb2-element .ui-datepicker td .ui-state-active { + background: #ccc; +} + +/* line 418, sass/partials/_jquery_ui.scss */ + +.admin-color-light .cmb2-element.ui-datepicker td.ui-datepicker-today, +.admin-color-light .cmb2-element .ui-datepicker td.ui-datepicker-today { + background: #eee; +} + +/* line 426, sass/partials/_jquery_ui.scss */ + +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #56b274; +} + +/* line 431, sass/partials/_jquery_ui.scss */ + +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker thead, +.admin-color-bbp-evergreen .cmb2-element .ui-datepicker thead { + background: #36533f; +} + +/* line 435, sass/partials/_jquery_ui.scss */ + +.admin-color-bbp-evergreen .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-bbp-evergreen .cmb2-element .ui-datepicker td .ui-state-hover { + background: #446950; + color: #fff; +} + +/* line 443, sass/partials/_jquery_ui.scss */ + +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-datepicker-header, +.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-widget-header, +.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-datepicker-header { + background: #4ca26a; +} + +/* line 448, sass/partials/_jquery_ui.scss */ + +.admin-color-bbp-mint .cmb2-element.ui-datepicker thead, +.admin-color-bbp-mint .cmb2-element .ui-datepicker thead { + background: #4f6d59; +} + +/* line 452, sass/partials/_jquery_ui.scss */ + +.admin-color-bbp-mint .cmb2-element.ui-datepicker td .ui-state-hover, +.admin-color-bbp-mint .cmb2-element .ui-datepicker td .ui-state-hover { + background: #5fb37c; + color: #fff; +} + +/*# sourceMappingURL=cmb2.css.map */ + +@media only screen and (max-width: 850px) { + +/* line 103, sass/partials/_context_metaboxes.scss */ + +.cmb2-context-wrap.cmb2-context-wrap-form_top { + margin-right: 0; +} + +} + +@media (max-width: 450px) { + +/* line 193, sass/partials/_main_wrap.scss */ + +.cmb-th { + font-size: 1.2em; + display: block; + float: none; + padding-bottom: 1em; + text-align: left; + width: 100%; +} + +/* line 27, sass/partials/_mixins.scss */ + +.cmb-th label { + display: block; + margin-top: 0; + margin-bottom: 0.5em; +} + +/* line 523, sass/partials/_main_wrap.scss */ + +.cmb-th, +.cmb-td, +.cmb-th + .cmb-td { + display: block; + float: none; + width: 100%; +} + +/* line 70, sass/partials/_post_metaboxes.scss */ + +.cmb2-postbox .cmb-row:not(:last-of-type), +.cmb2-postbox .cmb-repeatable-group:not(:last-of-type), +.cmb-type-group .cmb-row:not(:last-of-type), +.cmb-type-group .cmb-repeatable-group:not(:last-of-type) { + border-bottom: 0; +} + +/* line 24, sass/partials/_options-page.scss */ + +.cmb2-options-page .cmb2-metabox > .cmb-row > .cmb-th + .cmb-td { + padding: 0; + margin-left: 0; +} + +} + diff --git a/inc/vendors/cmb2-plugins/cmb2/css/cmb2.min.css b/inc/vendors/cmb2-plugins/cmb2/css/cmb2.min.css new file mode 100755 index 00000000..ebe72573 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/cmb2.min.css @@ -0,0 +1,2 @@ +/*! CMB2 - v2.6.0 - 2019-01-18 | https://cmb2.io | Copyright (c) 2019 CMB2 team | Licensed GPLv2 */ +.cmb2-wrap{margin:0}.cmb2-wrap input,.cmb2-wrap textarea{font-size:14px;max-width:100%;padding:5px}.cmb2-wrap input[type=text].cmb2-oembed{width:100%}.cmb2-wrap textarea{width:500px}.cmb2-wrap textarea.cmb2-textarea-code{font-family:"Courier 10 Pitch",Courier,monospace;line-height:16px}.cmb2-wrap input.cmb2-text-small,.cmb2-wrap input.cmb2-timepicker{width:100px}.cmb2-wrap input.cmb2-text-money{width:90px}.cmb2-wrap input.cmb2-text-medium{width:230px}.cmb2-wrap input.cmb2-upload-file{width:65%}.cmb2-wrap input.ed_button{padding:2px 4px}.cmb2-wrap input:not([type=hidden])+.button-secondary,.cmb2-wrap input:not([type=hidden])+input,.cmb2-wrap input:not([type=hidden])+select{margin-left:20px}.cmb2-wrap ul{margin:0}.cmb2-wrap li{font-size:14px;line-height:16px;margin:1px 0 5px}.cmb2-wrap select{font-size:14px;margin-top:3px}.cmb2-wrap input:focus,.cmb2-wrap textarea:focus{background:#fffff8}.cmb2-wrap input[type=checkbox],.cmb2-wrap input[type=radio]{margin:0 5px 0 0;padding:0}.cmb2-wrap .button-secondary,.cmb2-wrap button{white-space:nowrap}.cmb2-wrap .mceLayout{border:1px solid #e9e9e9!important}.cmb2-wrap .mceIframeContainer{background:#fff}.cmb2-wrap .meta_mce{width:97%}.cmb2-wrap .meta_mce textarea{width:100%}.cmb2-wrap .wp-color-result,.cmb2-wrap .wp-picker-input-wrap{vertical-align:middle}.cmb2-wrap .wp-color-result,.cmb2-wrap .wp-picker-container{margin:0 10px 0 0}.cmb2-wrap .cmb-row{margin:0}.cmb2-wrap .cmb-row:after{content:'';clear:both;display:block;width:100%}.cmb2-wrap .cmb-row.cmb-repeat .cmb2-metabox-description{padding-top:0;padding-bottom:1em}.cmb2-metabox{clear:both;margin:0}.cmb2-metabox .cmb-field-list>.cmb-row:first-of-type>.cmb-td,.cmb2-metabox .cmb-field-list>.cmb-row:first-of-type>.cmb-th,.cmb2-metabox>.cmb-row:first-of-type>.cmb-td,.cmb2-metabox>.cmb-row:first-of-type>.cmb-th{border:0}.cmb-add-row{margin:1.8em 0 0}.cmb-nested .cmb-td,.cmb-repeatable-group .cmb-th,.cmb-repeatable-group:first-of-type{border:0}.cmb-repeatable-group:last-of-type,.cmb-row:last-of-type,.cmb2-wrap .cmb-row:last-of-type{border-bottom:0}.cmb-repeatable-grouping{border:1px solid #e9e9e9;padding:0 1em}.cmb-repeatable-grouping.cmb-row{margin:0 0 .8em}.cmb-th{color:#222;float:left;font-weight:600;line-height:1.3;padding:20px 10px 20px 0;vertical-align:top;width:200px}.cmb-td{line-height:1.3;max-width:100%;padding:15px 10px;vertical-align:middle}.cmb-type-title .cmb-td{padding:0}.cmb-th label{display:block;padding:5px 0}.cmb-th+.cmb-td{float:left}.cmb-td .cmb-td{padding-bottom:1em}.cmb-remove-row{text-align:right}.empty-row.hidden{display:none}.cmb-repeat-table{background-color:#fafafa;border:1px solid #e1e1e1}.cmb-repeat-table .cmb-row.cmb-repeat-row{position:relative;counter-increment:el;margin:0;padding:10px 10px 10px 50px;border-bottom:none!important}.cmb-repeat-table .cmb-row.cmb-repeat-row+.cmb-repeat-row{border-top:solid 1px #e9e9e9}.cmb-repeat-table .cmb-row.cmb-repeat-row.ui-sortable-helper{outline:dashed 2px #e9e9e9!important}.cmb-repeat-table .cmb-row.cmb-repeat-row:before{content:counter(el);display:block;top:0;left:0;position:absolute;width:35px;height:100%;line-height:35px;cursor:move;color:#757575;text-align:center;border-right:solid 1px #e9e9e9}.cmb-repeat-table .cmb-row.cmb-repeat-row .cmb-td{margin:0;padding:0}.cmb-repeat-table+.cmb-add-row{margin:0}.cmb-repeat-table+.cmb-add-row:before{content:'';width:1px;height:1.6em;display:block;margin-left:17px;background-color:#dcdcdc}.cmb-repeat-table .cmb-remove-row{top:7px;right:7px;position:absolute;width:auto;margin-left:0;padding:0!important;display:none}.cmb-repeat-table .cmb-remove-row>.cmb-remove-row-button{font-size:20px;text-indent:-1000px;overflow:hidden;position:relative;height:auto;line-height:1;padding:0 10px}.cmb-repeat-table .cmb-remove-row>.cmb-remove-row-button:before{content:"";font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center}.cmb-repeat-table .cmb-repeat-row:hover .cmb-remove-row{display:block}.cmb-repeatable-group .cmb-th{padding:5px}.cmb-repeatable-group .cmb-group-title{background-color:#e9e9e9;padding:8px 12px 8px 2.2em;margin:0 -1em;min-height:1.5em;font-size:14px;line-height:1.4}.cmb-repeatable-group .cmb-group-title h4{border:0;margin:0;font-size:1.2em;font-weight:500;padding:.5em .75em}.cmb-repeatable-group .cmb-group-title .cmb-th{display:block;width:100%}.cmb-repeatable-group .cmb-group-description .cmb-th{font-size:1.2em;display:block;float:none;padding-bottom:1em;text-align:left;width:100%}.cmb-repeatable-group .cmb-group-description .cmb-th label{display:block;margin-top:0;margin-bottom:.5em}.cmb-repeatable-group .cmb-shift-rows{font-size:1em;margin-right:1em;text-decoration:none}.cmb-repeatable-group .cmb-shift-rows .dashicons{font-size:1.5em;height:1.5em;line-height:1.2em;width:1em}.cmb-repeatable-group .cmb-shift-rows .dashicons.dashicons-arrow-down-alt2{line-height:1.3em}.cmb-repeatable-group .cmb2-upload-button{float:right}p.cmb2-metabox-description{color:#757575;font-style:italic;margin:0;padding-top:.5em}span.cmb2-metabox-description{color:#757575;font-style:italic}.cmb2-metabox-title{margin:0 0 5px;padding:5px 0 0;font-size:14px}.cmb-inline ul{padding:4px 0 0}.cmb-inline li{display:inline-block;padding-right:18px}.cmb-type-textarea-code pre{margin:0}.cmb2-media-status .img-status{clear:none;display:inline-block;vertical-align:middle;margin-right:10px;width:auto}.cmb2-media-status .img-status img{max-width:350px;height:auto}.cmb2-media-status .embed-status,.cmb2-media-status .img-status img{background:#eee;border:5px solid #fff;outline:1px solid #e9e9e9;box-shadow:inset 0 0 15px rgba(0,0,0,.3),inset 0 0 0 1px rgba(0,0,0,.05);background-image:linear-gradient(45deg,#d0d0d0 25%,transparent 25%,transparent 75%,#d0d0d0 75%,#d0d0d0),linear-gradient(45deg,#d0d0d0 25%,transparent 25%,transparent 75%,#d0d0d0 75%,#d0d0d0);background-position:0 0,10px 10px;background-size:20px 20px;border-radius:2px;-moz-border-radius:2px;margin:15px 0 0}.cmb2-media-status .embed-status{float:left;max-width:800px}.cmb2-media-status .embed-status,.cmb2-media-status .img-status{position:relative}.cmb2-media-status .embed-status .cmb2-remove-file-button,.cmb2-media-status .img-status .cmb2-remove-file-button{background:url(../images/ico-delete.png);height:16px;left:-5px;position:absolute;text-indent:-9999px;top:-5px;width:16px}.cmb2-media-status .img-status .cmb2-remove-file-button{top:10px}.cmb2-media-status .file-status>span,.cmb2-media-status .img-status img{cursor:pointer}.cmb2-media-status.cmb-attach-list .file-status>span,.cmb2-media-status.cmb-attach-list .img-status img{cursor:move}.cmb-type-file-list .cmb2-media-status .img-status{clear:none;vertical-align:middle;width:auto;margin-right:10px;margin-bottom:10px;margin-top:0}.cmb-attach-list li{clear:both;display:inline-block;width:100%;margin-top:5px;margin-bottom:10px}.cmb-attach-list li img{float:left;margin-right:10px}.cmb2-remove-wrapper{margin:0}.child-cmb2 .cmb-th{text-align:left}.cmb2-indented-hierarchy{padding-left:1.5em}#poststuff .cmb-group-title{margin-left:-1em;margin-right:-1em;min-height:1.5em}#poststuff .repeatable .cmb-group-title{padding-left:2.2em}.cmb-type-group .cmb2-wrap,.cmb2-postbox .cmb2-wrap{margin:0}.cmb-type-group .cmb2-wrap>.cmb-field-list>.cmb-row,.cmb2-postbox .cmb2-wrap>.cmb-field-list>.cmb-row{padding:1.8em 0}.cmb-type-group .cmb2-wrap input[type=text].cmb2-oembed,.cmb2-postbox .cmb2-wrap input[type=text].cmb2-oembed{width:100%}.cmb-type-group .cmb-row,.cmb2-postbox .cmb-row{padding:0 0 1.8em;margin:0 0 .8em}.cmb-type-group .cmb-row .cmbhandle,.cmb2-postbox .cmb-row .cmbhandle{right:-1em;position:relative;color:#222}.cmb-type-group .cmb-repeatable-grouping,.cmb2-postbox .cmb-repeatable-grouping{padding:0 1em;max-width:100%;min-width:1px!important}.cmb-type-group .cmb-repeatable-group>.cmb-row,.cmb2-postbox .cmb-repeatable-group>.cmb-row{padding-bottom:0}.cmb-type-group .cmb-th,.cmb2-postbox .cmb-th{width:18%;padding:0 2% 0 0}.cmb-type-group .cmb-td,.cmb2-postbox .cmb-td{margin-bottom:0;padding:0;line-height:1.3}.cmb-type-group .cmb-th+.cmb-td,.cmb2-postbox .cmb-th+.cmb-td{width:80%;float:right}.cmb-type-group .cmb-repeatable-group:not(:last-of-type),.cmb-type-group .cmb-row:not(:last-of-type),.cmb2-postbox .cmb-repeatable-group:not(:last-of-type),.cmb2-postbox .cmb-row:not(:last-of-type){border-bottom:1px solid #e9e9e9}.cmb-type-group .cmb-remove-field-row,.cmb-type-group .cmb-repeat-group-field,.cmb2-postbox .cmb-remove-field-row,.cmb2-postbox .cmb-repeat-group-field{padding-top:1.8em}.js .cmb2-postbox.context-box .toggle-indicator:before{content:"\f142";display:inline-block;font:400 20px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.js .cmb2-postbox.context-box.closed .toggle-indicator:before{content:"\f140"}.cmb2-postbox.context-box{margin-bottom:10px}.cmb2-postbox.context-box.context-after_title-box,.cmb2-postbox.context-box.context-before_permalink-box{margin-top:10px}.cmb2-postbox.context-box.context-after_editor-box{margin-top:20px;margin-bottom:0}.cmb2-postbox.context-box.context-form_top-box{margin-top:10px}.cmb2-postbox.context-box.context-form_top-box .hndle{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}.cmb2-postbox.context-box .hndle{cursor:auto}.cmb2-context-wrap{margin-top:10px}.cmb2-context-wrap.cmb2-context-wrap-form_top{margin-right:300px;width:auto}.cmb2-context-wrap.cmb2-context-wrap-no-title .cmb2-metabox{padding:10px}.cmb2-context-wrap .cmb-th{padding:0 2% 0 0;width:18%}.cmb2-context-wrap .cmb-td{width:80%;padding:0}.cmb2-context-wrap .cmb-row{margin-bottom:10px}.cmb2-context-wrap .cmb-row:last-of-type{margin-bottom:0}.cmb2-options-page{max-width:1200px}.cmb2-options-page.wrap>h2{margin-bottom:1em}.cmb2-options-page .cmb2-metabox>.cmb-row{padding:1em;margin-top:-1px;background:#fff;border:1px solid #e9e9e9;box-shadow:0 1px 1px rgba(0,0,0,.05)}.cmb2-options-page .cmb2-metabox>.cmb-row>.cmb-th{padding:0;font-weight:initial}.cmb2-options-page .cmb2-metabox>.cmb-row>.cmb-th+.cmb-td{float:none;padding:0 0 0 1em;margin-left:200px}.cmb2-options-page .cmb2-wrap .cmb-type-title{margin-top:1em;padding:.6em 1em;background-color:#fafafa}.cmb2-options-page .cmb2-wrap .cmb-type-title .cmb2-metabox-title{font-size:12px;margin-top:0;margin-bottom:0;text-transform:uppercase}.cmb2-options-page .cmb2-wrap .cmb-type-title .cmb2-metabox-description{padding-top:.25em}.cmb2-options-page .cmb-repeatable-group .cmb-group-description .cmb-th{padding:0 0 .8em}.cmb2-options-page .cmb-repeatable-group .cmb-group-name{font-size:16px;margin-top:0;margin-bottom:0}.cmb2-options-page .cmb-repeatable-group .cmb-th>.cmb2-metabox-description{font-weight:400;padding-bottom:0!important}#addtag .cmb-th{float:none;width:auto;padding:20px 0 0}#addtag .cmb-td{padding:0}#addtag .cmb-th+.cmb-td{float:none}#addtag select{max-width:100%}#addtag .cmb2-metabox{padding-bottom:20px}#addtag .cmb-row li label{display:inline}#poststuff .cmb-repeatable-group h2{margin:0}.edit-tags-php .cmb2-metabox-title,.profile-php .cmb2-metabox-title,.user-edit-php .cmb2-metabox-title{font-size:1.4em}.cmb2-no-box-wrap .cmb-spinner,.cmb2-postbox .cmb-spinner{float:left;display:none}.cmb-spinner{display:none}.cmb-spinner.is-active{display:block}#side-sortables .cmb2-wrap>.cmb-field-list>.cmb-row,.inner-sidebar .cmb2-wrap>.cmb-field-list>.cmb-row{padding:1.4em 0}#side-sortables .cmb2-wrap input[type=text]:not(.wp-color-picker),.inner-sidebar .cmb2-wrap input[type=text]:not(.wp-color-picker){width:100%}#side-sortables .cmb2-wrap input+input:not(.wp-picker-clear),#side-sortables .cmb2-wrap input+select,.inner-sidebar .cmb2-wrap input+input:not(.wp-picker-clear),.inner-sidebar .cmb2-wrap input+select{margin-left:0;margin-top:1em;display:block}#side-sortables .cmb2-wrap input.cmb2-text-money,.inner-sidebar .cmb2-wrap input.cmb2-text-money{max-width:70%}#side-sortables .cmb2-wrap input.cmb2-text-money+.cmb2-metabox-description,.inner-sidebar .cmb2-wrap input.cmb2-text-money+.cmb2-metabox-description{display:block}#side-sortables .cmb2-wrap label,.inner-sidebar .cmb2-wrap label{display:block;font-weight:700;padding:0 0 5px}#side-sortables textarea,.inner-sidebar textarea{max-width:99%}#side-sortables .cmb-repeatable-group,.inner-sidebar .cmb-repeatable-group{border-bottom:1px solid #e9e9e9}#side-sortables .cmb-type-group>.cmb-td>.cmb-repeatable-group,.inner-sidebar .cmb-type-group>.cmb-td>.cmb-repeatable-group{border-bottom:0;margin-bottom:-1.4em}#side-sortables .cmb-td:not(.cmb-remove-row),#side-sortables .cmb-th,#side-sortables .cmb-th+.cmb-td,.inner-sidebar .cmb-td:not(.cmb-remove-row),.inner-sidebar .cmb-th,.inner-sidebar .cmb-th+.cmb-td{width:100%;display:block;float:none}#side-sortables .closed .inside,.inner-sidebar .closed .inside{display:none}#side-sortables .cmb-th,.inner-sidebar .cmb-th{display:block;float:none;padding-bottom:1em;text-align:left;width:100%;padding-left:0;padding-right:0}#side-sortables .cmb-th label,.inner-sidebar .cmb-th label{display:block;margin-top:0;margin-bottom:.5em;font-size:14px;line-height:1.4em}#side-sortables .cmb-group-description .cmb-th,.inner-sidebar .cmb-group-description .cmb-th{padding-top:0}#side-sortables .cmb-group-description .cmb2-metabox-description,#side-sortables .cmb-group-title .cmb-th,.inner-sidebar .cmb-group-description .cmb2-metabox-description,.inner-sidebar .cmb-group-title .cmb-th{padding:0}#side-sortables .cmb-repeatable-grouping+.cmb-repeatable-grouping,.inner-sidebar .cmb-repeatable-grouping+.cmb-repeatable-grouping{margin-top:1em}#side-sortables .cmb2-media-status .embed-status img,#side-sortables .cmb2-media-status .img-status img,.inner-sidebar .cmb2-media-status .embed-status img,.inner-sidebar .cmb2-media-status .img-status img{max-width:90%;height:auto}#side-sortables .cmb2-list label,.inner-sidebar .cmb2-list label{display:inline;font-weight:400}#side-sortables .cmb2-metabox-description,.inner-sidebar .cmb2-metabox-description{display:block;padding:7px 0 0}#side-sortables .cmb-type-checkbox .cmb-td label,#side-sortables .cmb-type-checkbox .cmb2-metabox-description,.inner-sidebar .cmb-type-checkbox .cmb-td label,.inner-sidebar .cmb-type-checkbox .cmb2-metabox-description{font-weight:400;display:inline}#side-sortables .cmb-row .cmb2-metabox-description,.inner-sidebar .cmb-row .cmb2-metabox-description{padding-bottom:1.8em}#side-sortables .cmb2-metabox-title,.inner-sidebar .cmb2-metabox-title{font-size:1.2em;font-style:italic}#side-sortables .cmb-remove-row,.inner-sidebar .cmb-remove-row{clear:both;padding-top:12px;padding-bottom:0}#side-sortables .cmb2-upload-button,.inner-sidebar .cmb2-upload-button{clear:both;margin-top:12px}.cmb2-metabox .cmbhandle{color:#757575;float:right;width:27px;height:30px;cursor:pointer;right:-1em;position:relative}.cmb2-metabox .cmbhandle:before{content:'\f142';right:12px;font:400 20px/1 dashicons;speak:none;display:inline-block;padding:8px 10px;top:0;position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.cmb2-metabox .postbox.closed .cmbhandle:before{content:'\f140'}.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row{-webkit-appearance:none!important;background:none!important;border:none!important;position:absolute;left:0;top:.5em;line-height:1em;padding:2px 6px 3px;opacity:.5}.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]){cursor:pointer;color:#a00;opacity:1}.cmb2-metabox button.dashicons-before.dashicons-no-alt.cmb-remove-group-row:not([disabled]):hover{color:red}* html .cmb2-element.ui-helper-clearfix{height:1%}.cmb2-element .ui-datepicker,.cmb2-element.ui-datepicker{padding:0;margin:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background-color:#fff;border:1px solid #dfdfdf;border-top:none;-webkit-box-shadow:0 3px 6px rgba(0,0,0,.075);box-shadow:0 3px 6px rgba(0,0,0,.075);min-width:17em;width:auto}.cmb2-element .ui-datepicker *,.cmb2-element.ui-datepicker *{padding:0;font-family:"Open Sans",sans-serif;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.cmb2-element .ui-datepicker table,.cmb2-element.ui-datepicker table{font-size:13px;margin:0;border:none;border-collapse:collapse}.cmb2-element .ui-datepicker .ui-datepicker-header,.cmb2-element .ui-datepicker .ui-widget-header,.cmb2-element.ui-datepicker .ui-datepicker-header,.cmb2-element.ui-datepicker .ui-widget-header{border:none;color:#fff;font-weight:400}.cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover,.cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover{background:0 0;border-color:transparent;cursor:pointer}.cmb2-element .ui-datepicker .ui-datepicker-title,.cmb2-element.ui-datepicker .ui-datepicker-title{margin:0;padding:10px 0;color:#fff;font-size:14px;line-height:14px;text-align:center}.cmb2-element .ui-datepicker .ui-datepicker-title select,.cmb2-element.ui-datepicker .ui-datepicker-title select{margin-top:-8px;margin-bottom:-8px}.cmb2-element .ui-datepicker .ui-datepicker-next,.cmb2-element .ui-datepicker .ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-datepicker-next,.cmb2-element.ui-datepicker .ui-datepicker-prev{position:relative;top:0;height:34px;width:34px}.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-next,.cmb2-element .ui-datepicker .ui-state-hover.ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-next,.cmb2-element.ui-datepicker .ui-state-hover.ui-datepicker-prev{border:none}.cmb2-element .ui-datepicker .ui-datepicker-prev,.cmb2-element .ui-datepicker .ui-datepicker-prev-hover,.cmb2-element.ui-datepicker .ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-datepicker-prev-hover{left:0}.cmb2-element .ui-datepicker .ui-datepicker-next,.cmb2-element .ui-datepicker .ui-datepicker-next-hover,.cmb2-element.ui-datepicker .ui-datepicker-next,.cmb2-element.ui-datepicker .ui-datepicker-next-hover{right:0}.cmb2-element .ui-datepicker .ui-datepicker-next span,.cmb2-element .ui-datepicker .ui-datepicker-prev span,.cmb2-element.ui-datepicker .ui-datepicker-next span,.cmb2-element.ui-datepicker .ui-datepicker-prev span{display:none}.cmb2-element .ui-datepicker .ui-datepicker-prev,.cmb2-element.ui-datepicker .ui-datepicker-prev{float:left}.cmb2-element .ui-datepicker .ui-datepicker-next,.cmb2-element.ui-datepicker .ui-datepicker-next{float:right}.cmb2-element .ui-datepicker .ui-datepicker-next:before,.cmb2-element .ui-datepicker .ui-datepicker-prev:before,.cmb2-element.ui-datepicker .ui-datepicker-next:before,.cmb2-element.ui-datepicker .ui-datepicker-prev:before{font:400 20px/34px dashicons;padding-left:7px;color:#fff;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:34px;height:34px}.cmb2-element .ui-datepicker .ui-datepicker-prev:before,.cmb2-element.ui-datepicker .ui-datepicker-prev:before{content:'\f341'}.cmb2-element .ui-datepicker .ui-datepicker-next:before,.cmb2-element.ui-datepicker .ui-datepicker-next:before{content:'\f345'}.cmb2-element .ui-datepicker .ui-datepicker-next-hover:before,.cmb2-element .ui-datepicker .ui-datepicker-prev-hover:before,.cmb2-element.ui-datepicker .ui-datepicker-next-hover:before,.cmb2-element.ui-datepicker .ui-datepicker-prev-hover:before{opacity:.7}.cmb2-element .ui-datepicker select.ui-datepicker-month,.cmb2-element .ui-datepicker select.ui-datepicker-year,.cmb2-element.ui-datepicker select.ui-datepicker-month,.cmb2-element.ui-datepicker select.ui-datepicker-year{width:33%;background:0 0;border-color:transparent;box-shadow:none;color:#fff}.cmb2-element .ui-datepicker select.ui-datepicker-month option,.cmb2-element .ui-datepicker select.ui-datepicker-year option,.cmb2-element.ui-datepicker select.ui-datepicker-month option,.cmb2-element.ui-datepicker select.ui-datepicker-year option{color:#333}.cmb2-element .ui-datepicker thead,.cmb2-element.ui-datepicker thead{color:#fff;font-weight:600}.cmb2-element .ui-datepicker thead th,.cmb2-element.ui-datepicker thead th{font-weight:400}.cmb2-element .ui-datepicker th,.cmb2-element.ui-datepicker th{padding:10px}.cmb2-element .ui-datepicker td,.cmb2-element.ui-datepicker td{padding:0;border:1px solid #f4f4f4}.cmb2-element .ui-datepicker td.ui-datepicker-other-month,.cmb2-element.ui-datepicker td.ui-datepicker-other-month{border:transparent}.cmb2-element .ui-datepicker td.ui-datepicker-week-end,.cmb2-element.ui-datepicker td.ui-datepicker-week-end{background-color:#f4f4f4;border:1px solid #f4f4f4}.cmb2-element .ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today,.cmb2-element.ui-datepicker td.ui-datepicker-week-end.ui-datepicker-today{-webkit-box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1);-moz-box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1);box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1)}.cmb2-element .ui-datepicker td.ui-datepicker-today,.cmb2-element.ui-datepicker td.ui-datepicker-today{background-color:#f0f0c0}.cmb2-element .ui-datepicker td.ui-datepicker-current-day,.cmb2-element.ui-datepicker td.ui-datepicker-current-day{background:#bd8}.cmb2-element .ui-datepicker td .ui-state-default,.cmb2-element.ui-datepicker td .ui-state-default{background:0 0;border:none;text-align:center;text-decoration:none;width:auto;display:block;padding:5px 10px;font-weight:400;color:#444}.cmb2-element .ui-datepicker td.ui-state-disabled .ui-state-default,.cmb2-element.ui-datepicker td.ui-state-disabled .ui-state-default{opacity:.5}.cmb2-element .ui-datepicker .ui-datepicker-header,.cmb2-element .ui-datepicker .ui-widget-header,.cmb2-element.ui-datepicker .ui-datepicker-header,.cmb2-element.ui-datepicker .ui-widget-header{background:#00a0d2}.cmb2-element .ui-datepicker thead,.cmb2-element.ui-datepicker thead{background:#32373c}.cmb2-element .ui-datepicker td .ui-state-active,.cmb2-element .ui-datepicker td .ui-state-hover,.cmb2-element.ui-datepicker td .ui-state-active,.cmb2-element.ui-datepicker td .ui-state-hover{background:#0073aa;color:#fff}.cmb2-element .ui-datepicker .ui-timepicker-div,.cmb2-element.ui-datepicker .ui-timepicker-div{font-size:14px}.cmb2-element .ui-datepicker .ui-timepicker-div dl,.cmb2-element.ui-datepicker .ui-timepicker-div dl{text-align:left;padding:0 .6em}.cmb2-element .ui-datepicker .ui-timepicker-div dl dt,.cmb2-element.ui-datepicker .ui-timepicker-div dl dt{float:left;clear:left;padding:0 0 0 5px}.cmb2-element .ui-datepicker .ui-timepicker-div dl dd,.cmb2-element.ui-datepicker .ui-timepicker-div dl dd{margin:0 10px 10px 40%}.cmb2-element .ui-datepicker .ui-timepicker-div dl dd select,.cmb2-element.ui-datepicker .ui-timepicker-div dl dd select{width:100%}.cmb2-element .ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane,.cmb2-element.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane{padding:.6em;text-align:left}.cmb2-element .ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-primary,.cmb2-element .ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-secondary,.cmb2-element.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-primary,.cmb2-element.ui-datepicker .ui-timepicker-div+.ui-datepicker-buttonpane .button-secondary{padding:0 10px 1px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;margin:0 .6em .4em .4em}.admin-color-fresh .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-fresh .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-fresh .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-fresh .cmb2-element.ui-datepicker .ui-widget-header{background:#00a0d2}.admin-color-fresh .cmb2-element .ui-datepicker thead,.admin-color-fresh .cmb2-element.ui-datepicker thead{background:#32373c}.admin-color-fresh .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-fresh .cmb2-element.ui-datepicker td .ui-state-hover{background:#0073aa;color:#fff}.admin-color-blue .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-blue .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-blue .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-blue .cmb2-element.ui-datepicker .ui-widget-header{background:#52accc}.admin-color-blue .cmb2-element .ui-datepicker thead,.admin-color-blue .cmb2-element.ui-datepicker thead{background:#4796b3}.admin-color-blue .cmb2-element .ui-datepicker td .ui-state-active,.admin-color-blue .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-active,.admin-color-blue .cmb2-element.ui-datepicker td .ui-state-hover{background:#096484;color:#fff}.admin-color-blue .cmb2-element .ui-datepicker td.ui-datepicker-today,.admin-color-blue .cmb2-element.ui-datepicker td.ui-datepicker-today{background:#eee}.admin-color-coffee .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-coffee .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-coffee .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-coffee .cmb2-element.ui-datepicker .ui-widget-header{background:#59524c}.admin-color-coffee .cmb2-element .ui-datepicker thead,.admin-color-coffee .cmb2-element.ui-datepicker thead{background:#46403c}.admin-color-coffee .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-coffee .cmb2-element.ui-datepicker td .ui-state-hover{background:#c7a589;color:#fff}.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-ectoplasm .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-ectoplasm .cmb2-element.ui-datepicker .ui-widget-header{background:#523f6d}.admin-color-ectoplasm .cmb2-element .ui-datepicker thead,.admin-color-ectoplasm .cmb2-element.ui-datepicker thead{background:#413256}.admin-color-ectoplasm .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-ectoplasm .cmb2-element.ui-datepicker td .ui-state-hover{background:#a3b745;color:#fff}.admin-color-midnight .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-midnight .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-midnight .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-midnight .cmb2-element.ui-datepicker .ui-widget-header{background:#363b3f}.admin-color-midnight .cmb2-element .ui-datepicker thead,.admin-color-midnight .cmb2-element.ui-datepicker thead{background:#26292c}.admin-color-midnight .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-midnight .cmb2-element.ui-datepicker td .ui-state-hover{background:#e14d43;color:#fff}.admin-color-ocean .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-ocean .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-ocean .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-ocean .cmb2-element.ui-datepicker .ui-widget-header{background:#738e96}.admin-color-ocean .cmb2-element .ui-datepicker thead,.admin-color-ocean .cmb2-element.ui-datepicker thead{background:#627c83}.admin-color-ocean .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-ocean .cmb2-element.ui-datepicker td .ui-state-hover{background:#9ebaa0;color:#fff}.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-sunrise .cmb2-element .ui-datepicker .ui-datepicker-header .ui-state-hover,.admin-color-sunrise .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-sunrise .cmb2-element.ui-datepicker .ui-datepicker-header .ui-state-hover,.admin-color-sunrise .cmb2-element.ui-datepicker .ui-widget-header{background:#cf4944}.admin-color-sunrise .cmb2-element .ui-datepicker th,.admin-color-sunrise .cmb2-element.ui-datepicker th{border-color:#be3631;background:#be3631}.admin-color-sunrise .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-sunrise .cmb2-element.ui-datepicker td .ui-state-hover{background:#dd823b;color:#fff}.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-light .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-light .cmb2-element.ui-datepicker .ui-widget-header{background:#e5e5e5}.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-month,.admin-color-light .cmb2-element .ui-datepicker select.ui-datepicker-year,.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-month,.admin-color-light .cmb2-element.ui-datepicker select.ui-datepicker-year{color:#555}.admin-color-light .cmb2-element .ui-datepicker thead,.admin-color-light .cmb2-element.ui-datepicker thead{background:#888}.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-next:before,.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-prev:before,.admin-color-light .cmb2-element .ui-datepicker .ui-datepicker-title,.admin-color-light .cmb2-element .ui-datepicker td .ui-state-default,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-next:before,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-prev:before,.admin-color-light .cmb2-element.ui-datepicker .ui-datepicker-title,.admin-color-light .cmb2-element.ui-datepicker td .ui-state-default{color:#555}.admin-color-light .cmb2-element .ui-datepicker td .ui-state-active,.admin-color-light .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-light .cmb2-element.ui-datepicker td .ui-state-active,.admin-color-light .cmb2-element.ui-datepicker td .ui-state-hover{background:#ccc}.admin-color-light .cmb2-element .ui-datepicker td.ui-datepicker-today,.admin-color-light .cmb2-element.ui-datepicker td.ui-datepicker-today{background:#eee}.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-bbp-evergreen .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker .ui-widget-header{background:#56b274}.admin-color-bbp-evergreen .cmb2-element .ui-datepicker thead,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker thead{background:#36533f}.admin-color-bbp-evergreen .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-bbp-evergreen .cmb2-element.ui-datepicker td .ui-state-hover{background:#446950;color:#fff}.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-datepicker-header,.admin-color-bbp-mint .cmb2-element .ui-datepicker .ui-widget-header,.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-datepicker-header,.admin-color-bbp-mint .cmb2-element.ui-datepicker .ui-widget-header{background:#4ca26a}.admin-color-bbp-mint .cmb2-element .ui-datepicker thead,.admin-color-bbp-mint .cmb2-element.ui-datepicker thead{background:#4f6d59}.admin-color-bbp-mint .cmb2-element .ui-datepicker td .ui-state-hover,.admin-color-bbp-mint .cmb2-element.ui-datepicker td .ui-state-hover{background:#5fb37c;color:#fff}@media only screen and (max-width:850px){.cmb2-context-wrap.cmb2-context-wrap-form_top{margin-right:0}}@media (max-width:450px){.cmb-th{font-size:1.2em;padding-bottom:1em;text-align:left}.cmb-th label{display:block;margin-top:0;margin-bottom:.5em}.cmb-td,.cmb-th,.cmb-th+.cmb-td{display:block;float:none;width:100%}.cmb-type-group .cmb-repeatable-group:not(:last-of-type),.cmb-type-group .cmb-row:not(:last-of-type),.cmb2-postbox .cmb-repeatable-group:not(:last-of-type),.cmb2-postbox .cmb-row:not(:last-of-type){border-bottom:0}.cmb2-options-page .cmb2-metabox>.cmb-row>.cmb-th+.cmb-td{padding:0;margin-left:0}} \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2/css/index.php b/inc/vendors/cmb2-plugins/cmb2/css/index.php new file mode 100755 index 00000000..eea59b98 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/css/index.php @@ -0,0 +1,2 @@ +ek5w8FM`Epkb%EpTF?lvWz_=s!Vz8HhXn3$+BO%$UqKKS5^PbNMX^_!W!hJSrk13SsgZ)U!4 zX6O6O?{+eK0Dyf(a}z)#0BDp2@>(jck%V33t5PEBsUbuf4|&JSQ~me+tYcs09e2bG z#0l&7@#v-ByE9nUs>ZaW*}zZhGamzAJUWsW+SX9l&=mdVH2eX&n--EED<9kdjs#&~bsm5-qWwk46*#o1;yz*#hgvFrG z@N>L*)HbcW;ZN9Rcx=pa2OX77y*Pu9KPciSF(W zs&{TZd6H>bvTbPJq2j4CXV1O%`WtUv_*BJ?(fb4HRC~VsjB1hyCn)tRA`+qaka0N? ztX3Z!x@TvO^I~A_vm7I|OV$8|8|3)PfCAoC@Z7z=RiZ#A3Z7G(ami9wFq}e>oUI*> zGipC-1(Tt5JQTI*!1Kd?={RZASkaf`^WTG--u}X|ns)R-KInv|4UN zj_cMlHuezhA`j?MVu2g)VEVXYvwDX3+<42^so_xBeRxknab9z_iNgeuIG`3EsOoT+YFA6VK((q4qaS2q>RLKXkq+Db6CGY$ro?yis@1o&v}ZPL?aj__-W9ub znW8QgkyMV7hLlWI5_13M^oGV{s)?rekCVu(CS+_G%;cmv4C~Fhz zXNKhjGyF;t`-9}Q1i6$~3Y%~Z-bMmjj~g(9UAPr{NM=H0 zgE)jc@qXNgV>nJyJ4{k5povG&!&&q(Ajv(3kCWg|k>F0_8GHtx#pm!GzN}<5FSeak znJL8cgi>s!QQvhu_b9ci!o1uyZe4#2EK(sgiu?cI!r%X|zrf>&Vg_Oc<{7}6fzg3J zYA*EZ7kBM6<-?Rk5`GnhatIajI!-9=6T&|KhauI|QC~K~ibAqb`qw`MBw2j^OXi9D L`23HUxbfg0aBR{E literal 0 HcmV?d00001 diff --git a/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/composer.json b/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/composer.json new file mode 100755 index 00000000..88afc1bd --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/composer.json @@ -0,0 +1,13 @@ +{ + "name": "mustardbees/cmb_field_map", + "description": "Google Maps field type for Custom Metaboxes and Fields for WordPress", + "type": "wordpress-plugin", + "keywords": ["wordpress", "plugin"], + "homepage": "https://github.com/mustardBees/cmb_field_map/", + "authors": [ + { + "name": "Phil Wylie", + "homepage": "http://www.philwylie.co.uk/" + } + ] +} \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/css/style.css b/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/css/style.css new file mode 100755 index 00000000..78fe521c --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/css/style.css @@ -0,0 +1,17 @@ +.opal-map { + min-height: 300px; + width: 100%; + margin: 5px 1px 1px; + border: solid 1px #DDD; + box-sizing: border-box; +} +.opal-map img { + max-width: none; +} + + .opalestate-map-wrap { + display: block; + width: 100%; + position: relative; + padding: 12px; + } \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/js/script.js b/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/js/script.js new file mode 100755 index 00000000..7402f6cc --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/js/script.js @@ -0,0 +1,109 @@ +(function( $ ) { + 'use strict'; + + var maps = []; + + $( '.cmb-type-opal-map' ).each( function() { + initializeMap( $( this ) ); + }); + + function initializeMap( mapInstance ) { + var searchInput = mapInstance.find( '.opal-map-search' ); + var mapCanvas = mapInstance.find( '.opal-map' ); + var latitude = mapInstance.find( '.opal-map-latitude' ); + var longitude = mapInstance.find( '.opal-map-longitude' ); + var latLng = new google.maps.LatLng( 54.800685, -4.130859 ); + var zoom = 5; + + // If we have saved values, let's set the position and zoom level + if ( latitude.val().length > 0 && longitude.val().length > 0 ) { + latLng = new google.maps.LatLng( latitude.val(), longitude.val() ); + zoom = 17; + } + + // Map + var mapOptions = { + center: latLng, + zoom: zoom + }; + var map = new google.maps.Map( mapCanvas[0], mapOptions ); + + latitude.on('change', function() { + map.setCenter( new google.maps.LatLng( latitude.val(), longitude.val() ) ); + }); + + longitude.on('change', function() { + map.setCenter( new google.maps.LatLng( latitude.val(), longitude.val() ) ); + }); + + // Marker + var markerOptions = { + map: map, + draggable: true, + title: 'Drag to set the exact location' + }; + var marker = new google.maps.Marker( markerOptions ); + + //if ( latitude.val().length > 0 && longitude.val().length > 0 ) { + marker.setPosition( latLng ); + // } + + // Search + var autocomplete = new google.maps.places.Autocomplete( searchInput[0] ); + autocomplete.bindTo( 'bounds', map ); + + google.maps.event.addListener( autocomplete, 'place_changed', function() { + var place = autocomplete.getPlace(); + if ( ! place.geometry ) { + return; + } + + if ( place.geometry.viewport ) { + map.fitBounds( place.geometry.viewport ); + } else { + map.setCenter( place.geometry.location ); + map.setZoom( 17 ); + } + + marker.setPosition( place.geometry.location ); + + latitude.val( place.geometry.location.lat() ); + longitude.val( place.geometry.location.lng() ); + }); + + $( searchInput ).keypress( function( event ) { + if ( 13 === event.keyCode ) { + event.preventDefault(); + } + }); + + // Allow marker to be repositioned + google.maps.event.addListener( marker, 'drag', function() { + latitude.val( marker.getPosition().lat() ); + longitude.val( marker.getPosition().lng() ); + }); + + maps.push( map ); + } + + // Resize map when meta box is opened + if ( typeof postboxes !== 'undefined' ) { + postboxes.pbshow = function () { + var arrayLength = maps.length; + for (var i = 0; i < arrayLength; i++) { + var mapCenter = maps[i].getCenter(); + google.maps.event.trigger( maps[i], 'resize' ); + maps[i].setCenter( mapCenter ); + } + }; + } + + // When a new row is added, reinitialize Google Maps + $( '.cmb-repeatable-group' ).on( 'cmb2_add_row', function( event, newRow ) { + var groupWrap = $( newRow ).closest( '.cmb-repeatable-group' ); + groupWrap.find( '.cmb-type-opal-map' ).each( function() { + initializeMap( $( this ) ); + }); + }); + +})( jQuery ); diff --git a/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/map.php b/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/map.php new file mode 100755 index 00000000..0c9ffd04 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/map.php @@ -0,0 +1,116 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} +class Opalestate_Field_Map { + + /** + * Current version number + */ + const VERSION = '1.0.0'; + + /** + * Initialize the plugin by hooking into CMB2 + */ + public function __construct() { + add_filter( 'cmb2_render_opal_map', array( $this, 'render_map' ), 10, 5 ); + add_filter( 'cmb2_sanitize_opal_map', array( $this, 'sanitize_map' ), 10, 4 ); + } + + /** + * Render field + */ + public function render_map( $field, $field_escaped_value, $field_object_id, $field_object_type, $field_type_object ) { + $this->setup_admin_scripts(); + $address = (isset( $field_escaped_value['address'] ) ? $field_escaped_value['address'] : ''); + + echo '
              +
              +
              +
              +
              +
              + + '; + echo '
              '; + + $field_type_object->_desc( true, true ); + + echo '
              '; + echo ''; + echo $field_type_object->input( array( + 'type' => 'text', + 'name' => $field->args( '_name' ) . '[latitude]', + 'value' => isset( $field_escaped_value['latitude'] ) ? $field_escaped_value['latitude'] : '', + 'class' => 'opal-map-latitude form-control', + 'desc' => '', + ) ); + echo '
              '; + echo '
              '; + echo ''; + echo $field_type_object->input( array( + 'type' => 'text', + 'name' => $field->args( '_name' ) . '[longitude]', + 'value' => isset( $field_escaped_value['longitude'] ) ? $field_escaped_value['longitude'] : '', + 'class' => 'opal-map-longitude form-control', + 'desc' => '', + ) ); + echo '
              '; + echo '

              ' . __( 'You need to register Google API Key, then put the key in plugin setting.', + 'opalestate-pro' ) . '

              '; + + echo '
              '; + echo '
              '; + } + + /** + * Optionally save the latitude/longitude values into two custom fields + */ + public function sanitize_map( $override_value, $value, $object_id, $field_args ) { + if ( isset( $field_args['split_values'] ) && $field_args['split_values'] ) { + if ( ! empty( $value['latitude'] ) ) { + update_post_meta( $object_id, $field_args['id'] . '_latitude', $value['latitude'] ); + } + + if ( ! empty( $value['longitude'] ) ) { + update_post_meta( $object_id, $field_args['id'] . '_longitude', $value['longitude'] ); + } + + if ( ! empty( $value['address'] ) ) { + update_post_meta( $object_id, $field_args['id'] . '_address', $value['address'] ); + } + } + + return $value; + } + + /** + * Enqueue scripts and styles + */ + public function setup_admin_scripts() { + $api = opalestate_get_map_api_uri(); + + wp_enqueue_script("opalestate-google-maps", $api, null, "0.0.1", false); + + wp_enqueue_script( 'opalestate-google-maps-js', plugins_url( 'js/script.js', __FILE__ ), array( ) ); + wp_enqueue_style( 'opalestate-google-maps', plugins_url( 'css/style.css', __FILE__ ), array() ); + + + } +} + +new Opalestate_Field_Map(); diff --git a/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/readme.md b/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/readme.md new file mode 100755 index 00000000..edab3718 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/readme.md @@ -0,0 +1,39 @@ +# CMB2 Field Type: Google Maps + +## Description + +Google Maps field type for [CMB2](https://github.com/WebDevStudios/CMB2). + +The `pw_map` field stores the latitude/longitude values which you can then use to display a map in your theme. + +## Installation + +You can install this field type as you would a WordPress plugin: + +1. Download the plugin +2. Place the plugin folder in your `/wp-content/plugins/` directory +3. Activate the plugin in the Plugin dashboard + +## Usage + +### `pw_map` + +Save a location on a map. Example: + +```php +array( + 'name' => 'Location', + 'desc' => 'Drag the marker to set the exact location', + 'id' => $prefix . 'location', + 'type' => 'pw_map', + // 'split_values' => true, // Save latitude and longitude as two separate fields +), +``` + +#### Extra Parameters: + +* `split_values` Save the latitude/longitude values into two custom fields, they will be stored as `$id . '_latitude'` and `$id . '_longitude'`. + +## Screenshot + +![Image](screenshot-1.png?raw=true) \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/screenshot-1.png b/inc/vendors/cmb2-plugins/cmb2/custom-fields/map/screenshot-1.png new file mode 100755 index 0000000000000000000000000000000000000000..e2859114fead546894a15676f28e71f268692f7d GIT binary patch literal 89047 zcmbTdbx>SE_cl0KkiiKI5Ii_!aCevBA@~G$cXwxS37+8Y&fxCu?(PmTmiPC5wOhOU zRc+N)-9OrH_vzE;KF_(QyCYSUWH8W((EtDdhMcUV8UTO@1_0o#Q4ror2pgyz0RRMm zih{b->+5Ut_-oVHYwhrB>*Q<8#Ouw?&HdfY@87>)U!M;T4^K}|>qlN2MqfvFimtD3 ze!V<5jlWh8zHV=AmG`_>4ZQyS`}g+ta&>V$Jw5&E@}#8ubz@`W^mwlq2wC8nqd+Fu*DKRnO>G5G> zb$Vm}@!#ve!GVFiw%3dl@58~qDeSN*Uy1Eq=6%W^YqoczxSnI;V0tW}j&CNwzeC*A5*xlLk z#rf&o-PP#Q%WaENetv#;cV~I;>;1v7i;K(5?Ckwg-t9*9+*EIAX=zE@X=dZ=%=+`` z)%I48aA08I`tj@H&g*TT_0-nu#7^bl%4=og$Zeg-Z522&GEzZ7asO=NZZ>IpqH}y= zd|`1`L*wh>_S5yrXkNok!|<=2L6x!Tx`XT4+fKdsywTqI*Yxs*jpHHz(BzY~^!-V@ z-QAtesXxuV>$gLmRlRpLHPuUdukAfkR#sN0x34{8+eh<(#T9Lf$1TZ4lkf3xDJUo= zhudbC509&*A75X4=6*$Fj7(2W9v>g8ebqZz?aHn{-R)TRxVZTD zdcC=}u-9ZVJiC3^<(5^wWth8sY4LS$+_-xoyJ_fRb$=!wb|06&ur^*-tj^k3?2=F% zy567q_hI&|f^(obwW9Y|Z&&Swj_i$#QA=fMO4)W|X0@;&&*sakv3t(`NKBl!&U$;` z`Bu@tzgri@RC|jJV++-O@y#4;im?f~x@1IEZCO)oWd= z>v>_(K8v@ndK~Q4(GUw;x6--02&nzMlGxVnS)@7Z-gpNSrQy^{tcq`!lwJhP!ca`V z$)j>>Dmfur;?sNrmM<@hPcz_rb2_pA{O|LXgOMC3YlyV;xo5<=*5v2?MvNKpwMqb- zR-&Awn7YU6`FgE2o+07Tjk(%ZDJd!Yd;SyxXp%y4aNfrU55t@TCr0aiSIsVOCBVZupXUyd4+qj$f=h! zY}T~3(mO`Y6M9 zQb3EjV1*a2twS?9(1f6-08A!!PowAu>>L;#UE_YetEP4ffnwRV;<6rv-pbXYSPlnd% zgEv1h3x1Pr+C1Ml9lyJ2)r&ym0443m4DQ?UfVB7F#nD=inLuXVpL1PK?@q)a(e#cF zS&d$o(bSU%dFopVKS&`O$d+y3cpwVLe%?<#mFTC%V#f7?O}(_3sSDq+xZl=Zzm8pe zNB4_TfsD&i9Xz1)!QIS(-}^B|iZ5=Zy`}Z7-J3`um`*dAV2d@Q@A_-af)OE>yvR2s zAXit-!hFln0?o^>YW&X6NZQ$Q-FG$chWi( zL6O=Iyu#kW$!(VrBCfCbUqUaBpC#7$LTepbTk5X^>AHY?E0|B_` z_c8I%oueQnJH@WvM&xKh4A95t4q$*N=Q)G|1PHWPZhNyk_?a5_Ks^9rp5awqwH|hN zO1K^(E?j^tVk;mZCmsm64%GvQiVh=ni#(pCp#TWO3@Q8xO;tyWD#(Am;jb0xrAh6 zvJ?sy1;GH2KWEcOJZ)yOf>?K7aktT`1-F77Kl2;Ied@~JYcDQ| z6{i|1qbvt100vP&;=w3EF108pK@__b5J6sPkZuamTJfKDw6S#(b;dYD{1##q#M*>- z@a2*e)<^yqUdS~A+9kYfZ27xYQS3}v0vE@6cj61>{?660h!)L~1p_L-nGfRP<6jVK zOHD*Utfq#LbGumAtOu7Fi#&HDXj#}YuTBJv)O&O9?;f1jRrmXx#I8bN4G{8Z?C63L zwj~`9c1_fV|C>lx6C{k;wRBD3vE==`lgEv~HR0z|f9}{tC$9-wQuH@pT@rc$#-%T) zR0k%KAmgFkIa!cMMs&AseAHJ44=mk*lU3eOkfU?d+uj|dNZDPbxv znvEoxDgIdSzt7*1Pw5`igJk*Arw5+tGPO*vM32R}d%JDD?U|cN7d2-F>;+$1+Mdp3 zr91%}U%uD48YX%`N_;x!hJaKLCgPxM4e#;l0Y;ab)^y{Ui`~h{_Sz_L)G1od$9SO^ zCn^!&(_ZQun2Kitn4mu_9s|O=agCKZ?xJeas^1pO<=W$0-Qe$NlZoOI_xpKA3WF{O zEvf&kci*X4#2CAj?jwwzmEc{~+ibpmN}F`qK^oDQrZu{eS~>l=JN+)c3kfzf^+Bj# znfthxdiUlakpJgZ0dSYx+x&c&^Zk%xan8xM3arqV7IZz=TZ&9f>T@pRAIHthPjb+b8k_2k{f z+2{M)+W8{et4R{P*@?#^Q=liP_v-OWu4Cba@1^G7ZQD~5+uYcD0I#H@R-MEW%``y5_0oVFpI zXDi|^^H%h-NOf8<02c8_1Q**KP-$nJdsM(Q6&8xUs~trq6mv$K5Ph*GmP@b=p|zw| zqNDROAb`NGOC}yV=$jxY@@Qo3Wfm*D{LXdQlG)h zl%TibjaZ~sixDaH5lgZm$JlQO?~({U84V9mI;qy7&;a29*g~Dit-R{sg70c1jJxvR z7(7+FE0MF%rN$EjKj+E}sE(km3Q>oR81-HZ0e%K!kwHU7md^^uA;@He%nHp}7S{lBtSd8O{QXir_UU z)6?It(nDWZ9-toB?1S%2=uA{(P7^Hp14lHFF;*`S2B^GuRfXKQ=89(xQ7nDMdjJ0B8{C-|FVOx^)K&c_9Axr@?QMw;@}#c}vO%j9$%f*b zZ47jg>e#oK8rmn$-$Yujw#YQ=-L~4>npb%W<-^f3oW8N2VwsOO@hv#uS*cDHCC!)z z8x9VANF5m4rL}3LP7_e?JD8U|XsF@Y?{)HSZxvhAaT;^NVn9~<7!S?gH?sN`otAq4 z9UGDFSF`=|nc#!wll$L@sP1pg0-z14lgyWYr(s?44|*`;t*50t@vmhL{vCO{!jyUMzLf6*_mVQ9~Zztw*k`EL{p2+!3!nu~R)@6ZPqty9f({ba)m z8|gMvV%1-^F>sXe?w^_`jMvrclj7r6=Bof$+N^RKJsZ6`?qGcYO4$*o_0Zxwd**L`E zxQ-UoO^Hw$G9hhKXZ>3**;&_2=NId*zl=`EUQ+M%S_hOu8EHtpl+{w!s`rD|SCaXR zig+Cd2&GbrhXfkZ5=UbDdji_{)e4jS61Yg?spC>@^h|-R$22CO0mbD*c1o8)=BVd( zFWw+8zLYuszyxTo`5gu2S6N$n_Fe|8VQ{k|6`Ru621nA@Kc4tum%DV{=Ht69I7r*2 zAvHh{FbobP9cIh9jX#`bN$W_dRc(C2J3H(!*fO%PX@nZsAU4q}hGuWB$@d5A77G(T z@K4zL7mPKj{27aag#CqdSBK@Nlf{o+o_B7x)5Ub2SC@sCz0}{y*Ls_ut0d>7hV7yQ z1gKCWqd5s`tb;Z%iCDl1&m7r z84=<}Vrtg1y+a<@V??0IUYJ^a^a#gmJYT7SGu)XAEcD{9(|B z&&==zr(!nr<5G!J-*qjAf}Lxu&up$3usOWGl{fE*O8jL+z%OI$o0>6irWwbI5^<`G za|puNHMvxSatz#s;<4C!%{gCKL6VZwg@mBLN6Pv`PI!-DJPV!EEl$G8^nl6k7rHql zp*Pv!aGq?jp2be7a>BW@%bZSKMco~VJ{<3QxQj(xy^Q?mef~r3dPBK+M`TQ%6$G9o zTtYM^lanE8TG^;ki9+5tsnRq5?iWvNs36gWFOo^~({-}g7YB8qhjYRdPh`@mF5O0E z@L8{c}|LiN-LVLmcxiVqY(56_5mv|BXfIKs)J?+N?$1R7RE4 z+IvcB^xE;h@xMn`T)+Nf&(uzme7jUtYx}>R6l*nN` zNDb%`ge>0s<6A63m-qjgyJ6z@CHcqqYGk7{l7GEq8_1c)Vn&6}|QeUZKa z^y1kO4Mxnqm8@-JwQ)If(zghAApHu@ICo5E6`(ywdz@SyQ1&IaqlH8ilmaVhYgX~^ z+_%VnuH6qia_R`l!K0w{aTNESp=gv_Q|SqFM>OI9_51A6uec ztu3XoE|<61*=5_(rlR!~Q?h0uF8JO%u?96uUV~=XV@(Vc0$?SJQai`?HFAu~NmakBUpo(q>nPcR4|shyEma7frrFbhGnxf`DTV^JyWm`Iy5>VaWKy{y znH#`R0A+BH<90>JdaRu`FYxb1U;sFPUlhb|uLf$qHD`{>i<)o;t`3nMFe~e0J}_+?^@HyK<}huaO8l?zyXeRA&JB;`dm!>&5Vt zA5E}qy*?h@4J|zHp}~pb=Ky1zPkWyP{rk!1?}a|Ma93R^s`tapvXsGAL5!w()kZ$` zyZ*fk91x*B^1(k?@BxgXAmXF>&?C=J^HJmr?SEM}?EXTweL9^LE8Cv`nDV?1HzCX; zentB_iwRLbWD^&Ow)Z3LdUb7odGJg+_xbZ%AOxjRa`1;+>P9cT>ez#YfEh5(!Uy7hl%Gh5|c2^y*nu593TE0A1W-72w z4k{XRduQZ4p^vGCB2()#q8238WzC1iU}^B$?=b~Sb8|iNj><&Auxo`#LzF@=oICJ< ziP1!MH?+nqK+W`c3k{+1bCJ)+>`I+!I zjrY25h%=DITQ6Gjl|pCWbICTs!8&?3zAU3MoDk|-ZkpWR0Wu%?-$p>Umq)cK9wYb? zQUn#}JH_P}Z9{?wObu zl?_7iKJ>ST|7PYdlo!nx6nTo}9V`uj$i@?g3*ivWCR-?yTxHb`Tt#Oz~#3S&JW{#vCN6Ul~JGMB9w ziUQByV38c>^6}e90hIElH2oxqn46T!o|2%SsJ)c+TIsa6XfQyj(J4eH2MBO+OaxPR z9({y>l+{4wyB$cz=REZ}P|iWFp0v1G)iCe#HM`vRSi^E(t744B=Y~AYZpWfu@Nf5I z_YbKMb?MoFgZBZF6{K&WIK{ojSS<>XM zaBEnKh^GQQLzN5z7%;_f0mr+Iu400~>bT>oF$$%t7gARquY2YCDz--iLGkpKbUr~oh^=iPKD<}p0L z>J5ed_t{BL*O^+|w&1roI;6eeKZrvKc$>hGtD!f%?nE^Y>imkzUt8zr{+KPP7?naj zM8GTXt=eTL^|g5j5F15FCh9Qv6!w!YzslK^TJ@N20%kS3lzhB(Q^&0LJ4=WCRp#4^wD zndF;0Xk%Kr@rOof5_v}Jh)0+s{v4#6xlXk6lQ%FsrF;X-S8zMb?(G2>xikFRx;$Z+ zWmuj%m(Qp9ci?XMi{$u*!(MMd=e|K76$!OHjkKI!?QaMFOUt`T;SK6&kHTgP{PK*>l zOn0XH&EaHGPg_wPTsUo0_5=WAksjw00rnEyf8PbGAiKu5opZ=$ zw;&H9+>@+QZT^z+E1_C_wfew-tlyfV3So924QxOvNAOXGaY+2urn$!({Q4Ia5;JnE zv3^#|(&ap*(-;b7b`iMSOAC!xChZ)CGi$fI5;dy*RP~qH#RG)~OdzPCDRR~oU9%Ea zZTe09c9l99Ol!PiX%b=pEAMw9Kd(le7hIuJgGFepBNv~QPWozEHWOg^3WxV~UCh%4 zx!i=i?9j!0!u6K~rMF;dwV(Wi$ij&6n&BJ*z0Sv!5g^0jpbR(RcelGI&I_7+qA3d( z5WHfiID9O$La5Cs;g_X0@k?>?f~;HqGgsA+V6c*ziz6`+W!fd=5zFxSaNy!)Tib|Cf;=&vige< zrQ@Iy%L#`dMlvpJ2xU;bDiVb)53Mc^dCvqKSK1d z3ZRYl_p~0bQdJC!*LhL0T1&d z>xgVk3)%mqtZ-V8G!#)aBDAN!nV#U?-?OOYcW-bn$amJteLsT0&@=Ns{E$4oM z^9QxU!F-)q#n0UB4p(khj}r?Rz$=?PAn9cebo7+@Ua=1j);8!uemRwLH|`~|4A)yR zTdGXgtxx%%-gYE0|A?vG*ks=P?Elewm3w%(wYb456H6qwTlNM7c|eidZ7d^GPo95c zU0H2#fAE$kaU#mYTyCPk0dQj21;Af>j&A{6F&IU}yV(KkStK#N02j6p7cp!Q1q7WE zg58fK3zCopAv(hSpVc=!MlNiWD7!rI;Nv+YvFT#q+iUUQ$^U)p|5s=KzCnC?34bG^ zyhV@Oi=YzJe1JDW-qxr_wnu?Xkb9jD+@7#odoX)a&~x;KB7!N-)vss)hvE% z`#k8ToOiJ3$M^JTO*rr{G-2}lI{fbDE2`0OTmf{;9p3x8@4xW5V_W0YxJDCxFHUm) zned}j|GLoH_Tm0wT!v4P(mm@RTI4k2uHe0unG-H|gUb|Go*cOa{7ED=?@!L*B)Tug1{FablLZ9iT zyWbC$9PxA}`A9hHRGa`-^FcfxXl;mWqsgu+_S_D3o7=mEWYR@=VnlDPtc>@R4lpqR z=WUb7U@VlFOB}N>ELU*4X-&jCn97Bf@Kg}mr#41lQwQCHcrWUTMU!)pe46ICVH*2QpZOnzj4oMp*sHI*G1YU_yM3hRAL zoAWs}&xP6cDpo^lK5>1#&z+=k6ol;D>Ve9#`!d7+1Ki*C0khFw3x0)ugXnvlta0R2 zlK1ji5}{v^iAWqblFffH$%oXx$9s98-Y2q|9;+2J(EFHV4|YTy6DS!a1c~Y)7eG}Z z&vM4l{_vi9pd9Tb0)c(no0@_1Zz2*O|Bo_P9sJ`ZYMFu$O^cy6R|o~OA4}Ke28a$h zzPZZefOaZ6Y=3?kt&~CzpZZ1Q>yfCNM&0U%xNA(o^3C7H3+MYvGFy{8AhA@NYntiB zOWK2(1HA!kCs+ujQ78bH6*U0(7$I8AyIlC0pq;mfjP|~1Ov>Vb$t0`%n+t$&Vx$gI z;ew?F_K?&I3K zm!kckRK0&jRDMVxw4mz=*TG;{j{d0-deMKJ*FUdAc0GMcl>}SfF4{%rs?Qj$rq+&3 z!Z_KrqJTu7!6(uOf?VNRv3I?7t;8b`VXCR-yFEUz_$fhCvG5H8vQRG{A0iyGZubgm_tseSIBqlM4v_@r-qk+aH| z4#{a2ABUI4u4ONOWNP&a8(2gBaqJ31F}^nlE(8KsNejW!^^qDzrS8 zu=}&W=+*A;>uB6o0$AF0M}{og(9}}|x8MK6>;MxC@DA|}z>njGC{bpS-nR1oz4N2} z@6O(Th@mU-I`hBVeI9sSe*5{{EO*-njWtVkS`5{P(*Br!g7>Bh+;p%Z)|b1 zbc=uTMl0C%dr*e|Nfi8-B$WOaNp#h@4>H;zh!OsfkNEQDOcSa&F2_p;K}Equ+D-%F z?|1lAytI%qy8Nsm#jR$Gf5DAz=sFtS9UzR_U=2?I_#jQ7@2e5Fy;@o}*kdZ2gRuk3um3 z^cMkXI*y5WZ6IZyRCPo5aLEnPprp3V_lf*N0`<_A82WSqhiVgL$MtWvJQpRmt~$DH z&;Bbb8w2=lvQzfb%V4*sr*z(m%l@5b$7m}r!Ky@$QyN*vWqA#9BqvnD24oAQhlmauV}MO(k9x3YnaE3 zQA(a%_0$^B7Ixu0{@va?Ox<}jVo^G!mxs6;45v=N1s$vA@kv83lAqwf16 ze!%``UPaXx16;Tl2tM>nn?d6Rtd@Ub{5)^W^L=SZv7*^XGS&63Iz}Yf@_M&q$%Y_f zE*EvhPT?3g9PwbL>A^4X&a&R26F3}g9W93E_0V!R9DKD=s-Ts6U@-2~E^E2O4d**t z-hQ@@%$5Jq(evr%{Jt4~HzUPFcwS$rDq$v5I&mXPUrk{HfS%y*#4ze-StdYbZ`J?k zXVvXL%a-%8ciBfb7P;0Q_s63v!AoRfq>SF68=Eyq6@9`2#24;u;V@E6E7D8478(xg zHG*(0g6#;=D)Zb8`mG+GFdb<9$K?j{h+tkHXIj66)~+t4Mr; zwppg!_?TqKZ73t!s{GcV8QhGrv*9-AACGV~ytM)NC!O3q$`hdVs%WaT-MfZd10|0T$rJ51Z5dkm zA{MB<^15Hn!FPs>V*cv2P&%O&X$Ij|<3E`#(5-f-NprVLO(a7K%vIlUH=>jZpm-5xpt0wayun zf#40C;{cg$eWx8I($cwGP_?#m7}4jC-}{{1gqTO9e8B}Q04Hxd>1Q%z6}-z~q*g$3 zH1~dx9zb3x3-WfHD-*{FE*^@t4__h*jv7W%3DkR^0L+1JrKbXQD_7(QxfiZGWRe;? ziGc(39Afi0A)acC zp}O=aGbs_fKuN=o#D)S`=|+0yR6)akat5q&sSqc3eGKw*&Kb^LP;lR`i!)b9j(y>K zPag6GN}-C*4Tlg!-H(83GoLPL?Bkt%c=-8tN~GRDY9uT!TU)${lKMD=O!~C1jEIEG z#3f_;u+&C?njdDt-3V>~bIw7@U2Ds}9v?>X#7G+ly7WcfWF8>{9w94@XTO*Wfv%#T zg^==hrP&dB|P<>}$|EI*)f-SQPg8!d zDV4vP)@9kFQwgjDD(Z`(;1Folu>sl(>cZ~B&lwMEu_51vVpBOCH`82Bu(g9`s3qbtRl?qS#u6|&*Z#{N_ zU2(KTs}^P3raXk{`hL-wbuA6#EQTKX z_c<9@A^LksFm+m05i>CVk_Is~g8k;Dh&eMXV;`C}t?=EC{n>sefvXA?r!9&EKztuU zzKuKUfVL8}8a+@2N_}%@e8NXG-l>6dTyIiBT2~1>|512ThOdl4oJeT&wt1Er1P0QW zY(B^lQWfTQtQ93weU-=^KhIS;4Eja5dKxi`!w^>b-s^(ISACt7C63apHoTUdQ9Q_& zH>}yt@m?Y}>IQB1;9KlJp;UiqOjI%I!r96xmpV1V@A4#F#doUvFy9-~^(R5)7RnuZ zUXbK7nbAuX$q;7e)tF{!@)mnTdjrkX%i%?`onV^Ml}M7(ny2{1AKr;#`i*vhj(<40 z5-;}_!l5R2k8Rb>A0hrK1dbV_#Vy0(@9{x(5qe?Fhbk0DB^2UPd<&%x_dg}GNrIlo zUXsUBoI-P|X(#Jt^&TGRjX^7=A`|&kW?SxbV=+jI>y)j*q3%*3`xiJBw4|C zl9WaU3pFwC@tv=W!UG`b^Pe#>IBOtS9S_(RMJm^I-t+@%I0*&7B5Z##MxlzPny52T zuY@49M6$&;f6?x8d$XnsHza=&Nvz-LCT5#s?(8C)E;?wxTbyPX&M#R{6tCHw!f>$V zG~!6fK)+j^&U+sy&f~&lb;+x+`0yp!j2Z$2R=Ck#d?+0f-T~2K19rs=we_nTIBST8 zhfgY8R*Y4w!SCsFh`djfGA;wU@^Xp%U=yQhnb#rIsF9I9wslYyQ(p7zjkB&GD>C*6 zsyKt#?*~-ka*sGk-i0AK!O6?AYhUJa?j&@SB*v?cn1y0v)G9uzPgh<<7Ts9x8|6d9 zQ=;rVt0TX7UmQ4*Rp|HB+aCS+@Ltda)EoL>=OX_S*eEXM`k){wJN)I)dJ@#a3Kv}yPd>bsL2FyHMcn$dHu6n! zmjvF;eL7hVCXwyz^1bf~FN*83W*3<=q5^Zra$&n=dinbjCwPWAsCMgX9E490Oz_&? zl1v_A*tJQ{b@3}A5H3^e8IWn*OdUm|frZ@!F+mz9#0d8lph(Nd`7pH>G!9RM!q+gu z>#I8;+QFClFpGLcFqMoNu$ES@+xYvVl0Ug?h96?P!zXr~oH!gcu4lojcmelqd0t)j z_Ht@Bw!Y9rF((f=T#9hx7K$}*tD%tYk%*zBZlmgH*?`7%-{`w4_Xnjv6~`-lQz}=f zf?u6RWtlw6yyp7s+cV2f-_!6?bthAseP7tEH(GII#p}5U`oLn)jMHm_iW*qK_x6+g z!%xch$3On|51SXe6wJ_1B3K_3IlN9LilDa9UY1yrt_s*&!b0ugiLsXSHi8oQiE{EE zrHTTb*3x)rCSXw-O181u?KPy!(}|3zc3DCnvv~!Ukb}ig*6qWhi|C`$3~m5) zb4f;L&o=~>GUZ}5Xp&S10~Q!gR5P&skHfx>Q6awmu3s}&2qW!h$*Q~b)}C$^HQx0o zL^KCjSatgTp<16>CC9D`g+}+P%D6h_YkW?`KVtXO`66uV>-8;E?*?tuISn!oD8T#~ z%)~`(6f8mNC$Z?d(N=PXd%S&Upy1r9@%@8v4{oWFW+A0F&4J0v9a!Jb?d$ikSmycB zgdA_JMWLPA;<0I2t=8}lG|JfR$jbamt-lMI#|DV;Ri7aUO31slOchq2`u~8^3lg$7_u4)kbLgG9I>R-S~=lDiD1# zn1+rhHvDTW$ia&e^~yWQfJDd&MVwYGISDN+8HZlK4|9J;dzjr%QmA}xaV*{D-F@#5 zjKZzo*Mv5r|GZLRL>*XLTG|I@&E+<#?@h~=|11-Yw~WnI!_BA*(U62R_hEa*)~(!) zgx&t}nQS?v{!q=G*ssaW-Tfpu0(RA{tXS#zE$Kn!p5JbmR+K(kdFWK33 zFP2mh@GbJ=8Ml;Fykp-jZO1OnKx<}EiG*0(R9c!re;o+wT=L)IFAgYx5@5TI^X>SP_*bbFq6f=FBwO3E_N0+hm{2``ZO-CiIZqdJ_~Pb*f#II7BB|c@ zg&5b=7_MdX#k#SFj?-kTK_>?G_wE-lXa9Ul7UN`~RVjOXcXMpc8zju?(0nG6l3&Q%`%qgF zO#gQ4hfz#RxuAV$$Q}7-YD6dx4S*dhi0YfTOu8>cj0$0j2HyxQ@!LR zy!oMZzC*XNp}pD*#kI$C#mWnhddyW5-_el1oOU@QuZ9vF^al~dY~2CBTyO?f4^3$G zNF}OHL?7`A;o#z-W^7YSAQ#Go?J00_5T^`A5X2quS{<&gIhz&Hk9{B4u!B`TOAZhSM)DK5%Ti$=arQFA6^-v zB~ZD z>Cd<@xbaclIm~A$5z%fahv(GjNIy8pBOzXHUIM$ZPcI$ajNiZWFFc?WkC0K6hd|I2 zPVVqfh=yW`44^cH{oPtUC@*z=5jziFo^X8EXsZ+b(3$zhR!(seI!R&?F%&VD+gMUH zF;psCdCJc6^746~F$*uk$wSP?NsnIvKbo4FFmvkfy6sQS&jE0&0Y82SziZ2P9ubb6 zOTgv3`$)j!&zvWqySm#_8o7S*{M>SHT&hBKi0hfH8A`>vG!- zg~6v|vg(KO%3#V2>a_EV5lU`%?|YW;46f)(=OYfQp!7Vw_gP%&uLl&@b(TfjpBQbV zP;u_qtLdr4VUwgA)}S`t(Zv1I*A%pp9CrI_^wiVj-ugsv+-#MN90-7Rc*H zvBc9QLZ3uKc`^nP{;u&k6{yB;&oN7Ac%R4GlDGgV61DV5IQBk6>vdPpE4Zt}%?oQC zODRU`_jD8xP^}ZGUE}0-Smmq?C|HlO9Rvu%io0PIqoj6dNHB zV)Z|VbYgry0l$OMrFHU&r}0;q z&VC^&6a12D+GG~>Q5riwdA8j`fq%Q))j3nIkzE@X$pVb?#f9h{QhIc1{B@N zaBj;Da!>)6n z*Iu&4@YowLHlD_*%SSl# zaKeBfe)Qr>gK?V97XG@S45v)SxECH@G+i)BFKZWpL@8QX-YS)@kU64x_v{)+JF9G0 ziXn>Q%kN(Qo@=UXuMQSBjGv=6@f6jH3VJ%PeBt)Gzl=ykL&3z8bJ-KtfEvy&zAmLZ zR}pgyF+oEzS(}T~buupM40ut(vQreF6WuXDP_3I7GbyjQN1&N_sxw6JJ2*Bl=Y`D7 zG-+_D0E{ibBFbJ1W5iN3#IE-*eO_U%G$%zK3Pfi))FPxgDMMIN%mXJ1MAIZiBXwhw z1_saxj$sCA$&pmq%xLX-S|6Q^IVW5U=y2D01W?nZ zF>#~pG5W099Zq(9n$|bQK9oi^iMCh4@*}0wLkD(z1QLHc;x>GYQW}&dT7#XNSdjYd zIpg>YekFa4Z#ipgJ;x%Dhq#Sabi3q-`AGUcL3cL71Wtx8aZy+$<%i_0iFbi}Fn zS)MkUAgR=3njwWa5|hbYtEzh%zo=5@rJXcD)V?35Hl(ku0Q&h=8kCQRH#FVnns20a z>4M2J{@$Fx4V0g*G;dYtw;^)cJu%?Mmoef&Mh}MaA3PdS5q)p9x4C;4O^38M+YmcOAMaXu4z!1T28b`HV>=7qIt(QiZk&AG(4YKuFs?=p@)I1hHWJi>jo|VN*11 zpm~~uejJ2+1oJ?LC=7}fE}zy|1n023r;zD?grHB+lO%yn>Y}qS?6;6dZq3{)wFucs zlOk2pN~z6=N}!b}TnWq>s%$vlA^eL99^ZtqBt`pdbuQap#X*QCR6rqF#DyC5u(R!k zIGxJFzWnsRi~sr#o1R#kr+o+~Pz;jBjWH*-9i?m9)%xi_#XuV(`(AaMg>3y+#Mfi!IbNba^<8J2yfo&pH^@KTJZG&28jaLl`SAH8@e!JQ{hCodpg-O zOOZJiVDW}tr+GSzx!@*QP$4;ygk`b-$AKD^#Anlt7aw7ioS{{&0Ols}4?R#m!qX@6 zcd8V9Y2aDZ&DEhilgu!0-s!1-kKDkJ_TGDR35Ri$05(laK<*y*7o@{e?B%QhlWB6= z?ank28|Lz+xyDLkJ~$Gr6l?aM*s{JdjjQt~79Ya!w6ew%@iU_Iu@;39BSm-ftsC3i zNbG;rV&(UCz#Fr;%Yr|PjZCKT=gNoKT)uP)Ga-L)&ipJf zOv6<|$iOxTjLBn=1yM)!#zljY7Q~b3-=_m*yD!>5@yeRGu`#-`{WF0bhwr))nk-KJ zYRt%EYW)53VR&SSGi$q;t?Ms$SQa6s%Z%7kZd}oH1pAF3pG+*a<3PfqNm9%s=J(TN z`1=}+i&+(9?L$1?h?wd**58V?gfrQy1#+ra;^-jq4UN`uWrv}ns7M)OuLsx$=O?)J zq$e!~s7HMCpGfep-QsyEiwu>N)z2GICd(jYWl$VA;SVCzC7~_E-o|Qlsp8=QiqJ#> zP#-`xG5H0{S94+mMlj2Ck8G&zMYnK;wRdH{(}rS)VTTpF;tAr?u@d0J7a3OyeeSVL z`ZRvGIUsT@?l(;Dn&4nkJ{uzZV2a&~{!Ipg*i-tcX6)tirk|0*5(B2URyt){Rjn>a zC|(pyj1Mhj)kMJ?IMrap3;UT1E|Xf1-!ElnYD~vOGy`$pue@Ly-0Ghg&1)LO-;7wA z^uGStFHG|0QNgA2=25bXrra8WEw?#hX$Q!t_JoVp+g+~yWu%;*7j+%)BxijckiAUO za4uU}>zhWK!=1ewQ#dQfu(?x zetZJRduOe&5s&`v%s?jSB#|@nGW#FiM689La+76hLvEWX#v~roOK_Ay2gI_Xn zGW^-h|7vih=S5YT$9rk*q-UXNIptzk)w(HK22)E}w$&`AO(&eg69oqT9{^xLpTCeP z9u_Jzpdut4nwgaw6TgHXz;o}d>Z&f< z_BFcVkI+RykKt1N<9{CaR4?U|!U$HWnsHPSSau2*%I*nVKuSn@C2FYG$b4gH=*spK zpt87-5a0kJ7ck)!3f^XZlzHAqnDs1tJu$B1X_t$Wt zN~uSXC{$P8d7*c6xmCo)t<~epxs)znmgsm_)p3JqNaO~7-LUUZ^8;1-j6sJs<`dvj z!-XYE79C2Zb2D8VQ=KcWS*_yIR;$F38GHxa4yIA-{pDFoK}n(Hd{puf6_lnXP!RSZ zCn9%&ANn-tF4|G1G2~Mp%kUx{j^GmhXShgG7g=+G1(8r*PTcb>frSQvP|-pu_DI}P zb@tMi%lN}Q!7$3U9n|m=m%z&9o-3s3j|bATQ$}Wd-2sGSS&TJ5&>1LzxSD ziis*ExJ?+I^qlLmn+W#q9sNP$3 z4HDi883(xSfp#v21kH|HgtpMT@|cjWKU1Py|jZve$CO=j3) zdtn*@(V0ke;_nIoIF;t2bXrL5seC#X*$s@2q?pZYE2!w(dgTNz^vdh6*JO=AFIy@C z$=3Z6&Cg_dw@i6#8r52CJs^EOD_Ep+7rT$83nPCW7wT&CAyyN?nBv7_$E%7A_=vPn zxr^h^a!T(2ptZ0mq{KLYmj2vPW-1kYXjQE?J5(|qi;9c46sJbZdWBa3*bWz|%>Dh@ zAHH~hV{%c^qK4~3AOV~F_h$FfOVbv=V>OEgboO zaFI3_SP}7CBtijLh>M3q2>TM9Z2>Cb@Z?N_*I;MJ1Qd4wf;V1!D(A|OZjcyMTzs`= z&F0W<6R?S+k6!fjGHfgW)JT-MIK@Rz<)yiZd%!IQDOGe&H@Q~dI*E%wADwIUi|;9q zY+s2YkThx_tt;CA;Ib24Tn-i~J%x*aK!;44q)wNsM}2=27wNS7Q7VKF6&c&SP>i^R zytsTE9k*$*imV6%V0PMFPy;$tGF9d*;f2!BfD2Tl9;jN$5!8k0;Ci1QrG?)f(~I8Q zSAH~;MO#dc)xS2joN+Nts48Zq@v6!6h5T^u30yFgMNcGPl!VdG@S?lDxcj*1+INfQ z;$iR!SX5Dsu-ks9`F$xp5r$8MzI0WO?H;&8v7aRzGz>>TXt5n{0Qldm1GQ{!i{oZ} zN#&DKbjK~t%>_Eoc>xk{8Ck4=+tK$eXxYV&{zhVA0bT<^w#0ezAfj)~?5xMp8nK6uAp6c4DRr zvChQqA_EIX3}SJG?(VpN@cs-hl)d<$a1pz|BosLt`o7i18?|n8fL33puv#3pLfMjb zHNr(;I7xK`h-w2Dr-IjJw#DM@1j;ac+>ET1OH8tO@kxW5qRv_am)$VP4G{&Ox{Dsl zCyCC!T^^jk1#@fe*99CJ;^_hxdYOBAf!57>{-B^!&m5R7>Uuq|XRpV!=GWE9ppzCs z04uh=a^+e!*C?w`U=IKAPh;16}l^h3MADQb9%({nNU$~(4LecZS zy#v!8Mk;wsxe);3bndy?pY67!fzf%w56?<(5q3sR7N?qKgqenuOsJ^Eyhw*5vAwvv zxab{=C|bPaYs^YR*Psw)aS;pok1$9Id8#@B;Mi)B=)0Kl9F)e_BE*)D8t}-URqQ7( z=5^D+I;*dlH*OHbMR3{#-dp+DT!ek0Mj(rez=q0Nv43J~ZfoQ%yn$3h((}aG_;m5fm$RdJAfTx3coJ{C!gQ4>K2yMqei`9{L-&K#5qS+PwPc zqv$ex+!~$6#j3Oshgd!Rb@j4LTwn=x^;cOG(V&ZrY6!&c*f$o$*Q&W=rXAIt&+-7= zj#|!(<7LptFFi=-_W^767zEZ{Z4mL10j=j{j*fGa16()wKA1o9{ z>Fn?Y{lhsuU##okLc|M)L!|dJxKN^>*$ky3_7kEOPwz+TBHlU^#b;dd;#`UsX?u~u z#ebT*P_%d=1dAdt2m;SA7;Q9wv#z+n&`Yp$VO?EOXb@GK%$I}P@&t1s5ZP++r%G#I zbF8#T3}!!%UxhMXS1vD)gI0y&^91S!~_L z#2n(nyM!sbQEx=zqByl(#y0M)i+Z_NrV|0LWV;C4MdAR(&oMx?l5iwrFaBFx;QuCLF0hf4OW?)eYcOg(+}&M- zDpHL$iya;xA5sw!;$W3A+c8D5;@!h{LH(&BDSo=lmR&_UpWD>SXng~N^BosyQ99j` z`e(|gs;KE!PD+86Dn(q+kJgG)n=vlxmoU&SATD&o#ieUw6eDo+5(eHGT+~2G`iFJ^ zPBJ;ovGw&S;7sjpkCZe=(mMGLW*I#d~A}*jBEioF>nnDVbKoOetmSfu(CDodE+>6 zC$JfwLtH#qx%BDQ1-+lssQ+Ryu{5(c6I`?rJWU`Gw+N?gUT8ic9YzDXiNHgCbd;mA z0Fkv9y>M~&W08aw_kyKaY{z;AQI>h3Pi#1$yuCV;RKuLXf?SkI1KnFK5HdDM_C zon`_8_cg;NJ4OJYm!g(VKv}MFYcdAXK9h(!h*JDhZ-^`MQC?>q09yR6I>*`IO^OX zoy^rzSKiTU$cG&67x`@U@?{yA-1_xa?w!}7rY`7I9pFfi(2UcXpLNiJ8mVU3^=;({ z_@c~Rc)C8lHBq=Q90WRgv(Ig(EZoJ1a}Vk(9~SevTpSH3DWwSX_Htw!nn`{#YG|yY zMQCX)-vCAsNzwONVc7B^mPP*n7yfw`;erFOTG=qyUx<0m}ONZuyl3}vTuVI%@oOQM>bA6yQ)Mb17oXJ|3PA-n>m4yw()f=eO zc^7{P7mwZFgry_T%(V6d*e&q+=bx|CN6HsQF|Cid*euYwk(Hpn>3=jjH#;_ggRu(e zG&V;&?FF;D(gNI|!yXUKgA{d<_$Fi(r@F%=b&-ihdgCHJ-z_n{NuPQz;UZHPQM7oX1(r0YlmN3VB*kqipm%Smfz~=1i^yDO zY)qfBN&LS@Hh>-E=Lx?WgVDC??_DpbJvb03xGXZ4gIEn4qN3or?gc-LlsW%iod z_bn@y_@!>zn1|YK(sl7SaiMt8+g>~lyV!jpo53#&t^O*^hQx(`b{9It%@i8ieknO+ zrcc}%0#3oSgxjx}6B84gZ|Zu#K7C;ES>;^a{y^IvcmJ)`3C^S5Et}O#07gOV=wMDF3$8! zU7U+>;meqd0}zXV&}}Yr6H@15TBLBnFjE;#9jd=}n0t*s^)7~iM!V}xo0%^W2DRCN zZziwJ%nS<6NHr$Ey!h?>PmP(`*(rew_B^CDdvo~|7hQ3IQ?yKj2Z{A&_?aTGcJ#y( z=a>4&Zr;2Z^sBB;+#`bTnmIG6j@5hCwEJ0FD7iKPi6OnL7pBIspQGUEm6O9hAvIQK zsb?(mhqy@WMV1#y_Cn&K);wIr-iyOkETZDwO)euYe!UeffaZraNSXT>dyMl%`AMBZ ztdeDRq-Knb1?H%%C@)bl%TL#2J9vN4Z;J=LZ1;~XRFK1>eTyv0S9*pQpX|M@8d815 zD&p)eX{oeltEG;)K~;*Gk+!EGt5Hd0yaO=E@V-vPjPWld3@n$s#UrA_|+ypI9AfF zwIoMc(3^X+dpBn#F57>v~?6R1I<79Qc2N$pO1YBB%f zib#M?=%qzvn6tbXySXj;rd%oU`#>O?)#~>w|u?Dsi(;_3A3tV8T zG(WuEuPa=r$-X*NWT2xyNL98sKzpc18MQkuloDJ>owOHm^5SE$gFPo~#qm>zSQfd= zqA6I$n@-RP!D-h`g(HT`Euv|{Y`niQxPE1FAf3&)zWBukjq4Q7qGdTrJ|;+Id+(I% z<9hJf0nc)^eTCynYfJY7vd5*>nigvI^|O(;(3Ep05aTCR5aFyBE>JXQJE3IF6OGqri-o{M(*v6izI)M#YIQ5^W61ASq(u~VddcvwF9V_ z7={gr7TxTIg0>u=0}wkyp=msuBoj*G6m$R;~O0gIeywm94|eSko|DAUAnc_i1$=4d$7 zOzS#CavfyG70HYNbQkBZUKzscc4KmZu|T#BDa|y@G?Qnp@SV>L%dmqiaaWJ~4$x8D z+4}^{l1p4-QP4D)wn9jW%Sh6Xj#?}27MQCK@q|0lbD+BW|SZQzntD}!}rRU#y2fMV)k~y;geoZY<6JUp*7E*gD4^l^cu3;M`NJ~?+2q6;Y zF21`c#>QRzQ(8bk1_rx05V@z!GQF+MExi!oV)z1fhK`INE;iA26h^$t=0xG*INrJP z+8AaoBraY$8H@DBMW&jXEv6>X$T8C5conyaU=$)=_;e96@@raz1D2r$a{#pIb|}Zx zf$@c8#+7gH{I~%G0WvhWjy3}#ZEuXhqIhC#Ha33bmdI9=vcx?&Cz~(LJInivW|EqC zlR`?ATUL7>CjkoMILJbidce+AxPau zn1Rp(k*Dz5@rXyd}C{oe7v}sCQ=y-Pg;_yHqfG=p#vy7U>MK4~Y?S;a{K@O{? z_@2WgXAU!&(%GBPRTgA$5zW>ty}5LC_ecYis3Hb&qS$0;a8{h!xwCL>X7CG@K%N>J zP+jDHI~*BewhG_u&aR1SwFXjOEWaO5fC8=QDbUm+8$so})`<(2W8$zoFMz0YD3=LD z%aa)l&dzish#tC&xX94Fd+I_A@by*ww~=cj^L7~GoK-EnzilcKf6<&D8gMu__VxoY zDPD}3wnZc<8#UhzAZh0`EmMRda~GeyFsfi7!6COgO*TM_BR7Xc1@hq3UG&1mu5fx` zoe&%R$IojJV*Ig-HwDOFZ8qh4JFZK_B=9lJamE?Zp1RUKyJ49e{IRb`u)-TeMs=fNtV8 zB+|6h-)|yw3N_!LAeW0<6kwVg*M`R200=1wQ!&FVana61Z9&k4NCPvB$t)$cxj{1b z=u&yo_oG{mxH}~v)MU)Q{;|#4$qK6SqME=3ji1~N7n&w{VNux|O1SFOigYH4M*ag_ z^iEwUbD=irSd9jcphp@F!G#ANKc8srY52wsHbr7muccI#D ziDhC+^}KC!2P}0vj2+uGu0<3jP^~35No4^uT#%v;ab26H|Mf-N{$zPTWlS;8K}t-j zM2KO5l5~5F843YP1hnq{0-t6X2F>vt5!@g-l;@HAv&oCQkBcN0ITNC7NXn=YE&xRu zw>dKilXmWQ{RFXmf&f@g*1+bZ?%G6DnD+550r{$C z8*(<0uH%P(_B;#>wcUjks7AO`T=c?4vLzV(1m-HLXU`va#12H~5h0wVau>fe(yyNq zbX79eC@X3JxU)kGg6pDuTEGvA@)h||ru_wdYI~tSxG)lRZ>g5f-l>bfnC{FZFC;E@ z<;-ZTiy$*T?T?1LALBmb++TCT@xt0EEhvCWRWJfd|o3 zn?5KFt{dDjiIc1>6U`k4=Ulw+5W<~(*{+3V+qP0>fhB{O2{jChrMuFJmc@myNM>mAUDBT4G zAf?y=pW@<=lz%ue7r63|A7DK1xm}IJi`aJoO37^1?wV;pHyKp;j`T#(Y@2^Bs8zgP%opSx*wdm} zgOOzayLt;pZXrB^l(cLCc5-hFDk`i5*=m}^BH7f1!bNXhWb8!-7pUmQW!DV{IuzS_ z|7cgk2P@PdD>nr~Gb*gAo3L?4Ifs&aXK?+;J76y2#wWi1BUbptNO0hmW3woEF}u-- z6Zxe;PYn)MBB~)0Ky5Q)z_IQ$H>5&H8%YdlGNAUgnU9y+QHYHCY-lXj0a5 zgHv4m0WKc(<9YW{D!IE%>qUi&jKK)tq&611(ZZtY9!GLGesawN^aqK(m|X6BZtd~E z8;fLl(H$3$$GE_{$no*PV{e*}kwXGdYHCpWSc9xsYOSho@&IZsK8X_>KGOS5y^Kh( zzSv$LY+yL?EI5-xcZOyw`h?iMYr7<9s##&%aBUK#%Jm6PhgdRQluYogO<}thdLApC zwq%{daR@%N?)44NS9`#-VsUpkZGXygLfm4&WzhHE;v$Jf!s5tqD{O^pt+h4ru+|Fk z!Seue?-f0RQto+_af|b{R_o!lHN=H{3|lR-=6fCo?$ygTY^_=asF{1)({Zp{(*~y? z7Co>X&iD3ya%}xctcA>t>SY5ug_YDJ0LyV9QOP;Q#UJ3}2qN_uf=5e+OP}k43ox^; zU5z;EB0@poqS=I4%^C=?^w@9cP`*c9q!%vI>5HDYc!=%%i|g{zM#4OOd1rl;=cgM3zcKd&^zN#hHw`NMez&h#*+Q zhMVEyd&9zOwD4hgn7%h$99e_4A|B@eZ@fL?i{oMuzb+ov{NyWA3r5Z#$vkFF>*j|{ zkm^PY6EY{mkBuD$3Kv@*YTC59IlEov>kTL|(_EM=S0Y^WmrIWA*w-3UxFl2C{eWl6 zx>sE3&)^~;aut>|-zHxSC1loAqLhe3<SudWJKTs`7%7>dqo2p#bJPz z;g2-avKⅇ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�_<6<}*Z_pbp5)lI|38Yjd;QESIkx!CG<)TqGsa{KC!h=wD`OvRwyaurOF*MunLbW?EFl1v|dk z6?tv%-YZuw*B$KKJ1dNbwb4vW<(8wA5}n+#+UX>?;OM;`^_a^U9p!{@3&Djii@CO+!j9tV9H>=XvUah|^XF!-oa<55WpH19RU9rpQbE5dQtP7o zd@-y>8vr#&IfpBz(ieg4`oukWB5VUY1k?#nj=^7$D9~YN<%&QP)I@fePJ`ISMFm;; zW*#>aT1e}I*OQngQj@qME|6?CZ!6;hToJl$z@j263{se2ValHxkqd?kW37mJ0P6mi z1$5y{uX)d&?LYTRwM%Was^0K2;DT7V8P%)fA{>pyGHM$_EzveBORZWfm50NXW0TMB zrRo={wXnmd2huhBhP;MdE(C|;2}FqE?~o;Iu#=88b#H!oIhdd=cSAEfcFat8(2PY7 zaN2B`H3Lp;z=imiKRyNh@lQr=NIYI~f~(E+NqChdP<*LSi5GNoS-C6nuj1n2AmHLQ zaXsd4_x29XWgdccL3RT!VAo3i%}gr^cix_B7=*m);+vT_2Ool^@n&Y^u2XY>^EL!= zO^S;awZ$3*Q~(Uh)XrWkBD%KjWY z>_NPch>bKVN?09NBn2L;kQZqXCLe<};&{#i%((PECp;s`b+)v8GFxFxlYeR|n3Yg| zyAyatS({}|YX(uj8&HvylSxu^MG~czaUms5?#3pi*$hLBK-XBz!hl6JR_rNhM;R@u z;=(-A5O8t%3bEN8#2Pr)re@UH?r=su3YT14G~5zi$Aubg0gYjoZ)8+$AL^z|ku zA14HxBJfv>iC_+J;Tl)R@rW8t0u)^JTnvniSS+k&ob?Hc3*;go5jhAyywt71&rB@V zqK2Egosd8!UC>-`doL#`n)d*CVhi^Qh8GdU`WAIOx9SJurCxjvtc$jrRxjMd-~#Yx z**a9Sff0NxwQu91vd9Qd-28sHHf0SblhnQdyF!EiH4Rt9h2f1; zlLhYi_UVBOQ=Ideaj|=o$kMWni+Og$r#sPOr+|KV3}%p@}7VaV+s0z(v~0 zE$dILm)m>D6XAuQ3?aaOyy2}ebNRV&iVzaD- z5d;?SM=Gr;WtCf7Srccl#ftry{60$p@v2EV1>a7bNbX66tKG@F3KmM&R^z9 zM38W7cJGyQqmUaR$q~*)aN%t;tc#f1)7IL<)pF5MZyUrf#4aB^1Jpm}5Lm06?%CNZ zv$9Agjsh;IdC?`H5UKB0YH_7cTKBRs0Dv8~N(2}R(r6FI&?VwvAsNRuNR2Ns3qP)5iT6JWNuoCxd< zCw2iY8b_LH!6^j;M7_@%Y?$TmP;7#O7q+d7ilNRVmL-|a4l($UWNXy7z=b9!tAs9K z$f+++y65>0GC#zyEUKFoj1*>A=tc#*HRHl;Tzfn_X3S4Y9E_VO>xOm$J+i!-rAp<)J z%x`Pwr<5IT$8E58exNrF%l-hT{ZHWYEUq*VTyPS}U9=*OvvSTM63g^+01N^W7vP{x zQ(ggQ1VT~CB!>ttI5>qQu-Tl*!o4JygxH0@=m&sgi&=PKFf1F?=qrMQ#4e6M*VEDi zzyM<;!d9l36fa<#%x^m*TUZx*Pwz5VupkEb(pn{4Fn^_D=pua*1b)c1x@&cH*RE|a zEzEUTOchDNSYf~dDDiB#cnyN)0{hMUgccCI0CitEcaD^RJ2_6^N^%Ow#aWeJzzE#C z?7|X8fCY++i-3myy;NuW0U7=MF!+CoIwSDsWg{_4LlSge@aINfq8S%oe5zD*Mi|YESpPaL5|5{#>w{7UG6yaUB?O5m`F9*TVGn|5G z=p%YGOD+PfOT$gH-^Ca^XAx)*oZz={QCU{{b%#tc6T^&)xeUgcxpV*!LBz^`pw~BL zj*rpekU@*hhD8+zq(Y%ZbzHEouh%YvO>o8N?SKq*qpkG(1S^OB6p!$%2^Q40&~MM~ z{Ss^gDyWH}5L#FW7egMzBSluqtp)8<>^sU~&Vx7}d%SzlG!o)6<_(TvVY&1e)%h2VNv#Gk4+S)OpyL*I^E{sN{+~J1(lz!ko1#4R7$! zHbRf5rXC}di%%~ILf+##bFWQtyG0BonJx<$e)ZnQ*3L-r>tuq^QtKOECl$Hin?O2FsIf?FSUR+<(Pj1~n@vA1E+hJ`1p5BHu$UL^Lro)2YZ9VKNItSr0mZ3Xmij zGxg=8C&yw`Q5mr{M@3q&eqJ^O6#`ufB9V(P!hgU038=LFM}~{C7CsxR!6sjwddwyy zURa%C<3=nKGz4t~F3hfo-qH78$Atlla$1=Cb5dZ6vTQpaeBCPG>~Q{~RY3K*qDF>D z^t$Leo_eR|6zqlTw27XJOD`ZN$W@<>=lr}wv-q6Ep$w%Qg{(i99UjK@Ity6BTTbkkV(+j7B$Y#c_Y`oUE3d8F;w z#g@3xWZ8oZVQu5k^t{yU(XER{UINK-n1n{dC!1@odC;}zukGHA%7h0DSRAYb3o|Or zoG{!FU}VD04~_} z*;!=BC)ymufSFZDUrox4PMLS`L+3RCNwO#yw7}~nY{n{b=C|1Fn>z-`iqXm@5tx?I z(=UQ3EhsO@_7}hS)a`cPy5oMuXmufK65l0}>J6-j&~R?D)Tr`SE~3v`&L7mnoCnRc zc=nnL*jsfRs@WAWjEhvMDY7RUym(vDg4Z3Q;Lqj)0S^v&N;DO^y2R|zJgc7NrQi+8 z;h;rpLegrG)^azPf~VX_&^w3&(SBL6MvmxGqpb_m7Fw}m98*0KX!TrsI#}NS2;8Dv zsd@SkB$4E8Tx^jU;pO)~pKm6F*s>2FYr)V6xWLT%n9J~dCbRyy8Y9*Qec1MFVOp42 zVXCb#lY+6~S#gn{d3o<^uXT3ry&|0J?`N@2lYAQ%*IPp#P3rV^ii!szi9!NGnpbpC zTwx{!qXkfc90ZR9WX1*Zj8T7w`9WBe#`ue}e3oa45drQi>;0>YvMr0H3VQY9AS&*7TGFbQB+__Z@VWI5<@`=G-4O>9E3WPGW)y?pIiSKYc$ zWUQ~lRz$(0m!n%sF;3mI@Z~8l*4qHiZwPb#Q&;3)npjqO?Q}io^N5Fm z4?u@+3AO{Ub@W(ILl5kDpU60&ix(0Q%$W*)V``N$N3+@D!6IU^S}pDVU{kllzKx4Y zvewjiXk`|y%VM;^RTr>>G>M``l8^`b=N&O7B18Vv?1z9%u&A6XHG!hS)%eaTxB%(6 zIJCDP0~^k-R;Go|y9$B7v#&yeAcAyF9JBP7XaTtBH)0nQ8-|EO;;_N%8xrJM#Hzby z1-RqJ^y|AY6cPEcQa3lzE!*to5Q-mW=&gH8cAc&M)z zIq@ji5@+5Ao=2-2YFpZ}a|VTw^ymGPkJ zxPT8XLca556Tc#pembOlGU6w!08Y%H1l=k%tDqlvf{BY@O?WrvQS~Ew0HX_tu>R2m zLD-`k!Es{K*kysuGXh$$Pp4t;I%HnMCSXtx1eabX(dP}vpPF;5ozTV6l;(!7Vo zD2y?iR|}yDln(gkSEq_#V-z}uiGy4nZmKAJ`+4z#NG6B175&;Fv$tX}oo`V0-0;L7}bQ+EIurV~1iXBL> z@Ip3_GxlOql+R1$kA+m>pMI+&;;-O}l(zqbcsOLP?mz&c3&+YS;_1@BryqG0Ef{nM+1MaR;d?AD-n=&&y+uco>(k){MV|pxPhTq0y zsWD^`N()FOp+f{hQAty}6|_(=QYf#czCsoUPn2kcY!J8yaOzz@o&H z*597DdqV9pp1cZC34p|1T;|!aqFYLIL3%}E)9@WEJUk|l;dOx@+9YXviCJaqLQCqj zKpLtd&P$z8zy%Bpx#l@lHN`5rw)YqL-*;$8i8oMY5Mj)blBNP>E1AGz9rVaTw zxHvpQkEbAgYFQst6bd0r>c|m9)Vb53#g+r^cboKVQBE^0%vq5g-kp2kJ7q%Rv1JGF z;)Kp@7w0cJIS$z*1$Pk7%=)7y1WLRS<6Mf(GruoHKEk+Aush287AJx?cBPQqG&}sQ zcH{)}BBMZ0A<0fVqmrQw7~5>vKRoO&Z*#A2Gn1^n`}FBVFbf-~-G(9PG^RkbSrey= zqPT5cY=MiU2G#{;u1FPe2LKm{ljT}Dx;!40Yn#KPYVG*ksX3TWRtAe|rbP)BMo{xV z#f7=d__h6)_ac%l3(W#81Ob~yrq72E6l$00WP-PE>Pam0mv|w7{mfW_^#d}*;jn$o zZIkeh5E1|xg8opn(}O5249SXayi`o<=8^Se!cN1W@c=V`9GC@#WPMbQgy}6F_Jeux zZNdohgKd2K>CfyADG(`tO^*yQ&ifH$DT|Rzq{!MbAA${dpQ_QKIxb-ISyzgbQ(Siv zFJ62hHM6hokVWiLpp@^#i8>t@&L>Y=T6&V4aO2hwR_RioZVK{ysz5SwqHiXoPn%zF zlZvr~I-t}we~>3j@T{1QRlg*kes{M3ew;wC?Q2KUnB+jkU`K)=qN$xdm0ur%CcOLI zrzxkER~!mlARc85U`=6S-^Rt3y*f2oS;15t7cWT?;%dW(!N^#yZB}ItVi$*_??3fC zz@mz2Ve&)%6I4`RkviYWLJf$=@SXqiIaJd6x^ds3nHp5CS6A(HKRs@triUO1SFVr} z42V~BIZEGY3L<(Lus}okvck*_f(u&T#Usy&8A1#5S}$JMqT!g&gB(+<0_w8a0T*c` z%AFWd+4QL+E|(}v7z={fQAGHUzXeP%R?rPn(~0j783>vnxL7@T-r^w>7j;=`j!@Ns z%(dU0bHDrD-N>yd%qp8m zoe@a2Nn{~#D^jxEcsKcWhyZ%f>34%>;k;w%l~**yHfB>qgczB&>n^s$MN*?x%o_gZ zxM)m5xT02taA&g$xFE5MaP;u0T~%OVHZ4H^5-f~MwK^_#&%=djXO*2aa)rSaDGd}F z>&KtFv@Qe-FUR=PYX zu$pOasB#H5p)!dlD4FE*Q-a-&?6!qK7Qmp}1d0Tlp>{e*l-+LGy-=_#e|!3ELJKBh zTxj6i-zt=OB0DT0XijttR=Roiu@EPr#lE^STGW_pzfH!)zmAK4PK%oP`I@B{_S6v_ z@sNKXFQfd4It#^xpL8Eds-3l+$v1w~boy*#7c3(_?Y-w!xmsBA@sj2Xr7VCwe^5c| zx*qf+yXN3U+r_tKzj4uqnj3nWPD{$$X~!EuCZG3Ccb-mldi!L@P=po5=vCjjA%xMF z!MJ$$bOD1YYFF$scJm>mYv_&bs?LhCCfQ=tYd$*UhDs}|>%{pTH8lrot_|ch=8QDA zVpU$p1vkDtzIVv5!`I)*S zFNE|7sG)-gEuPelP?6xm8%@@>EUP0;%P`{XXpGBGe1e zYu(NBG=yaLI)2c0qWL&fU9@$XiJOwuyass5|BB{ZxSu#ze{TPeH{wXMBQ;RazGZ7aZyt_hg#YCs}2iepxhR; zIGAVIVL>P63&0Cv%1Lf4h){HS@sl|+(CA^bb!9D9tc^j#Wr(1+#EJ>8T3efJjm1>2 zT|g07S)PSD@W5~(E9w*2g)yZx4bES$jq#ss=z&nNOlg4-b^s@mDR>y%@@V=h><20c z?FilYf$Y}cwy7x_xDEk~)7@|fkICy}rTF38HZHbY!0vhe#EJc${R|hlQi4R2C@wO~ zhm#z5B8M~0986L_HE;^5I?1268h*&X5w+M=P1SK>n7(^<*VN40cOJZadEZV5rA&y@ znC&c2vZwr~>I@NHOrVk=5$Pxd7%#xw!adsgzw8tvLYvvbExNC%Nbs>yQ3*^YD!rOQ}k=NT?Q*-W%0 zJgOz`{gv{9xgyc=`baGLBs`j|^{Sbc(P&q03JTJ0D99|I$+$3=b5_Sibw{KMEm+_p zj}%$9Ep>@HF)6WMu##1?BIwBNqPo;OFmSVFrR7of>pi1hQ0-`}7{90bv)_C2=#hG_ z0E^H%{DLq&lufKJR%s>(H@lN1hbix`6|UZxq(+>~CDf zWX*rldMh}5j@NC(Amvj!B`X4ODwI(kf3NzLIcI+qPUPoG^EI(6Z4S7u;lboZl@J0 z2ACfrQU2N#BsesE%7-4zWUH*EF0cr!u6Qt8)-c%aX1IuC@2PEC?n$QB`}vYP^4q5i z-+S`)`|3SE*8=<1PL3O0&Lt3?K)y+)$i=f87ocjUg_#zWk|Mi(Hu3iUy4$60K^{2s z7nf`kkmNw1J^3t&U99x9)V4fIXOD)-B^DV6a$Hj3-z7j0^d&}AoaneJDiEYiX&CjppM1Rk-JdH7?A?g&7ym?k+M|RE~0*rd#hg zv!A>H^EN&AENb$_BigsBn0OL%7AHp=jy_rjRE!)2pTw$;9B)w@ z&(XF=*+3y;tn3}mVPZExv8_PMR)#w66v>Lz!@2V77<|!o?D2Sbl3x189lO}nq>zS0 zXTYvW2MZX-3lJSWO$>@usJ&fbAr>2tg6VDRVoO}SH}Ao8+)!otunebs5OCq6jy%4` zV4){ZtNS7Utk`1Lzln=V1;-2+F!ivT(c)!@c3ysM{|lha#5e*<>3#|EjXOw_Z&({L zOD@1teb>Z6&G9L;E)o|o$^=}H>BAC?9U=XhS~9r^o9a$*fk{=f-Jz#%m9A9Yx9;!Q zF{`%p`6e%fCRjwna7c#J>yZ%`8Xw^xroqKpT*%d?y1c3Y<^?q_1d59%)>QT$!G-hu z;}Hmb>MOiWnke}q`>F;yD=kLd8Wvm8!a%oPak2j*JNffTULu_=MDdk;>f*%{`H3Tt zxe2*)k3a`r@uv@X(d)(6A1%kMwe|OUGRatNt+yvLJ973Mc|+|TLBC$Qj5c=7VySz2aw z85W#fh80!$7nsVSkw?B6$T1oM3nM}6D!LUUh@z&HhJLy8Y)cT3A|RIlwzCo@33=|`JX_!lB z8F8W21t&Gpk4Dp875afQDPLb#BNEGu{(k-hlweLh--h!Ze@7L4WVlj@8=COVwhu{Rd(piqk z$vOS!h%f>$#A%jVI3`cha8rBPTqqIBPm=OE*Rh66T%rhT&k8vj*?c?VNjDtLZSTSe z3PDkK)0ex!8IeRD1tL&!?+9E#?Qn>n@J+A`4&WS#P%Eo#<6^U{bvr$}$B~q_?(dt_ zaj}P9c)L$+o=mp0iXXx*!~ZHSs_|l8?_KfQJ`j{28#0(NVXCGg-R}w=fQu`8XFcGN zh{Af`yiOe|uuDWbF1%5JlnKPVYC805XjR`++Y$};aGlZRmS`t@*^4gIta`g!zh$(j z)>1SLE4VKt*ss+R6HwOgvOEcpNDg>s^p(DFJh-Z|F!7~$rNDNNX4a1a@_(?csbvIptCF`zs8_q2Z(=1gx zEn-n@9^~l4gI=&q@7;(DNadBw zGe0r2C#4J*1v_NsCqe>NjDt(Q@-U7oP0IvYIlx6C4WH8-;KSQen|=beb2vuJKXuTU6DSx`uj;S)XC6Aq7%bzv4HIz$%I)JLTk3VKz9o)KZ?awO(N zkNKKUUut+C$05;8b0@=Dy{^`VeW;z-7X^q^2u*J%xWI38knHK?H?kNWyHM2mEOkk; zhH(4`SBJN8u~}BE;cL&o)#Ia=nMqiqjrXjd`S8aEo0|`uIdkAcp9X#Pv+pJPS77mf zz=gpJ5Ckw@gDY0ozIBz5vC+7gKSEXG4^BE9b^%Qg$HTO&w4_{7{pG!T_oA(lmP|I{ zRTur?mZMe<<;G*RPSs025fbWTb5jk`rkz&vDL$D%6(!oU(`1-C$KlB$q-!~+Vuc|o ziK0U!-U!Si8uLFc`d!Y*OI;tI zGw|aXYqQMuoe|`mA$IF+8}H^FB1TB2P@WguWsL$gefj*ZT@8jM31$bRx? zr_X5Jk95JjbWX=bZOh!Jx>{BL*pXU3mH|*zSd)Rfi~+%GPPB7Kq{W68FT_+t=5( zve?%PgGv`yme%0s0D0F2V54`Xm#7ckuz}w2VDHVFbjKpyJM&Di0Bv$a=(4iglB5V@ z)_Gc@Cds_b@&e^WDSG39BT5%yW&m?CidUgA=l86lXblq=gMdItPAnBVj68EhUlnLs zQdr=a*NkI6i(QH}G;>bY6$=!BplFxC+e7VGdAp`zDA4%wyA?1`#2Z(y5;FMx!=%ph zdae*4k&K~28nFfL+qkGCs7a_XAVH_F!?i}i;mgA(Y0rBHl+C#KW))ccOAADH{hPR` z!V3c!W@dnNWYo;(eYD3d)QZ>CQ88Y~L49Nel{uS{$PNufI94Xm#;wiu&3sr*Oh%vF zdot>(U2gG0dHm5>w2k3Hw3Dw_l#Unuh)OnlA{85!L*_NVb6+Py7Tq|R8XoH6HH{Gi z-XHmozy0lB!)^YPtB+4k5`w^ycme6c619b1>ghQyQe5O0mqtf#uFTD?JRDtXSXv4< zgdg_y&CK-mJ{%pLTUpA``vU`uz0rK{?c*!3_u&dWrJ=X43M{A}QY~z8(Wa3=fE|d; z;DBT+E5qNR*))ZgcOvvUJFgIAh~x^x!Rh#QUa(;vb;YNTJ$1@Xx z{K%1~docn(M8G!1IOg%muQX&ZS1-6pS_C5iK}Rqip(Um5%5~9wr{nbL_Tq3yFgRWG zcZtdN_CR(4oR1DV5t~0hwLU+;X&V=tWj(aRu$lAMJXn(<>dCZccOB8^2FU|^bTM4i zn1dEo{E+_y70=%8%>ag(7-ncN8)MIeFQ1>^kXt35^+E>%rTr09E|Djnd+16XkGNLm zVzJoK%e{*aKioI-+8m@Ue)+p!7CEl7=V&eG9m#mPT3Xd936>D~3>07t=ujctYiwd^5h34;hU*yH|s=f+BT|*#QkUO%RU$>6aUFiio!xK#{uANyL?afD5h)uEbFnn`q#S_lw z!z;&^de;W~syRj*eg@ z5fz=c@!mZ?-+;d3lxL4#G5yU?Z?-O~%nvcuW&Lk(VeZMY$KVA8h6x#FXy{&vo+v5f z#s0`}fqdBj89Lx2o<>aF7pCFs=)yGI&!6fe8rU(@*SC9LUvJUxFQ&O-k%k&woB%)A znvt&TbYOVF?*c{Axoo`90ShS;q~VL93d7bcJLsjK#R!xCarfT9d4Pfg-q)jPJ*nQomfnNA`_#2Hf{UfKzQwgA;*6*($Jf@5 zldZYf(pqmXyT8(#Zyi0p6kS^zUs-Bci&ntJI{_9ZT2u~O?DM*fJSVGLW$Q;L$QsnT zdGI%o=eFYbfuE#-f6$6@q}zU4iby0@gH)1Q}#| zvGwUwgj!#;b-C?#G4f1kl6>Q;h)L%@))EKw@aD~jCuRoM`Ud)X)l^>}I3s694P5l< zQH-0%DK4mSapq<(@MUQfHdmsCby0mhK*g{H#D<Xdwi#s=b_u(0iqqtzXo!m(%(TEhGkRn0D9O>bD$PoKN$u5kjoP?|z zFTef`c=&VLaT@LHvS}DG@$MmJkGwvONqQAy0ekMkgp%nuBF>iaC*v(WoE=RESI;|y z+{x8fPoA6_j^EkNj8w$MwVG?lv&(a6CrpjWUqh!5@|{Abb`nxBedVhmb7th5TLdjk zu=ro%!muyQz%V1DDlp8vFg4JQ_>1wO;6h@AWcNl8lr3-29&spGq${X9hK4#oLmhEl zS)PCZLZYCNV?A7p*QvRnWrbSIK}gQUlwKu2IjfcPppEhe;MEEYJj4F1|2*;I?HX7a zFCP8lA4T!#i<(W)Ucoq7=OL*@O|p>y%LM%}G660|2L}f|JQZJUeCc6yaB-^>4l-a-x!U5;0E9q$zrHiJR{(te zsfZuIxlr^&DWxpZ&M?}3B?gyEMjFsMT2u^&=iMXjrA3Y^k z$x6WCLLtXd)$4;9>bcf7jV6OS60Kh16*ipVT#`*F(Zaz(9_Vd%gF?1rVTevU3Knwh zn6Ix_e*nwve5E71B(PCnwVdzf*B-<6^U{(AlP@X3sTvhihtfz4e;U1E|Ok zzVYw=FIoW?T0?}g>P1a1)!*e=)e37!Mta4G4t*(mEXLJ>AP_3h&V{*RG2!f8A=_L! zQcG^(A)Id`riKb&tHePI;A?|tKST!g1g6I%cR2dTKUzDZ;gGDj1yC|I9|C6t3lh-c z#F6LgQuF)vFi;zm)y_kCQ&D$%tANKan^+GCj z*CITwwRa`|<{a#u8ysBf-NKryZdx4F&*(v)DBE%3B>eX2+?}h#f#Ko!{WP&JQYVOx zSVKMmavXFV`dHft)UG%QA*{xrJ;>AxKM>mQ^ z^}%GW=#M0>f9qa4;h*e$@W7dlCpx{yxNTf)mK91L-&@i(e9hxANTKV6uYC8bC0qb2 zKJ?Wuy#Je(VPSN8{Ga2(%nPPH&yI|(c(H$C{s`Kr$kbGrX7?B-_SYOFH#H~$F*Ib4 zMVD%qqOF+Xf?w}~W7Ak~UV;m#`XspM867=Vt7b+s>9!Wjidq}XL|w7)XzQ_XxRpcR zo*u8!&8fgf0wOfqKh?pn+U=SQAAqx6iqQJvU;lVC`r=U;gasm$KXZ0s!mc69i4(}P zM-PG2oT%wr*J9sdFZ7@Z=T{ct&f;51HzBx%-Q>vPt{uROK9W+U#aggMe*RN7KVQia z*{7e*Jr*RRY+(4+saM4@h1h8e(;dN%ctWf@K{bCOACD7QKp!m72oNH~TQd!B@-H=H zI1V{^?r;N`8ck$aG%t10b6Xe|kN}JP9{fFOC;fGlc13K5*KpL6#eLZ)aI!;|1DBq2 zN=`w6UG<{qO!#wI7tCY*#m8U#_|IRrxdpfF=;zyN+dlvEU@-zM03Q3Zk)xl_d~cMC z{5{m=B!?IW|(+U$ssv1;WHIwU&xT`-uF)&F^r2EUp%-#@+WE=_!Dg^ zZ<9nUu8%lVB*a8;;iR}|TjspWwW`349`imaCRAtace%8hjW0(CQD`#5o}h&oeu!L@ zbY*YgOAgUta|og=DcYDkb~OCri=%A{FMrY|P$9)Ovv1#Rw`Vu>^fHu!uW(&teODiZ zJ1;KoCX39BHS85Tl-;wesb!T!ir3tiFmOPj2}Bev~ObP zOuWG1;~COr69X<>KKCn`hNC{7JKn(6a#lxMLk~XQ(4>e)0Oa){vL^UJvFIPqJQr$% zBhAU@I<3#S9A0mdgEjClRlojBt5C|YdC3nUvwK6l}0L;as@j*HD*$P=%H^?ecI*v zG~3!dne4w(@?9MlRe`YsWDuh|GdA(!y_V37Jl0ffh!8&{v20 z$7E3uc^M`zN@EV09~&cs-EFeOf0E4M5ClmhMb*|LgcgQ8br;KdG1CXy^vjb`kYs-7dX}X98}14Ml&r@ zYweTh@^Z8@d016AIN%y@P-C?%;Y`E#zLkqJM0~seEwmP1OcK4=4!Ah*t!8hw{$@DV z$wi=`|5x`T&;f9Kd{o`W#b#Mco_ro%+gLEYUsp{@A9~AMK4gR}wz4e#%XWns7}d)F zsv8;Rs*H;9PR5HJ$OS^>@{sNf11yVrWWW_EMmUbR+iI((X{{m7eXqU;u>&A8~H zu?rVRaKUlljQlb!c5-du+SrJHI&d%3`L5#wWbe%hgQ1Co&vq$_gU_t3WJ1YoX zvMdOiD1aQYpg4H`^&8Z45s)Fz!TBSQY4qsz?Rrj}wcp#wi#-(^@R1)?T)ql^hyh;X zG*Z=s?tFvBaWd-7zI}No&Ow{v$wV4DW@U5eOw3E-H(IRq*s(LmGY7J@FC9J8c=TQG zI(B%u;f#y{7oxlSbT`r!%nB~m>%>m4`rNlvPINI`#Ktj~X{~L^kTrhE;}jQgpaIvm zsoCrs>b+bE5rR#;f9n&iANj~fT0fy6C%jg@GtOyez%8`YXYW1wdk~8yA&v z0U}|}{f5k>FmUmFWjEy6OTPa%_JwgRSB6GqTx`vYIv+>m!f0I+q~%!OLx>ta?Ca}2 z`b%4FTg=NL98+7Zt?E%5E)6tRE|TuRn{iYf-bC(!h&?*I`4LC7#qK9s_w)-&uyN} zF!SW=Ht?dlc~LGCES|}-A5PNo&re+7RxWpGkQ+?}In|{(Ga#4-#HSecOT4 zFcH~%rtNqv*4ml7Yi&GmthM!c%=^;uMwgodTr}B8H%%sCdODp@+YF)n8E{xJ4>J9CvBr`FpnHPozPPMkQ zEPGi4Ev6L3#Tpb--|SnAg@0-FMvr041oH!htl+RoK0$DcA_Oet zbzBHocECCox_THYC9@GaiYPU|V_&MqhxB!u`Epz^UQ~@<81H9g%fh^#&jbsm9TT1% z6c)rG3Oq)LYmLsUt-UjYv<-15w-ybzd_8&;A5(jpYDY)j)fOEe4ZFV%%>l->@zK#y zwZY3#zr^WuH#L<|nCO7&ZS`JpI(IJ&&PXDiQ}0E_V-V>$44p;*7qF;btv{|tB7O*B zKKV@~{hJof$*JFR;o}q$KaaR=5K8_PWJZ2oL@rv=A3FdZ%lmqwKlDeJkN$m>vy3jk zuP3vOi_Nm`d?r?ao+r4dBGrgX-YGz-VTrZ!N~9 z8#3ahXt>FudM(jdJ+u&sw6s{?^{$rXTFZ!fhT~m;3z2i9lCr^$Nd;mTP0r+K3~-UG zSJZDsp8O_p{98&SlYy4N#p18NCmmOzjzawwm>nE43H zDH!l)8_mN#+{ao7BIL#KOzT=aSLP@ny9U`lZ+Z^7Fs>&F3#gTEf4IMMvbeXr^_U zdMTXK9&Lc_d-WF2+k}oB$`0{aGMQ48NbMHXe=CABLJGeU*_>vFbZ@o@6(ZSOZo8_p zGA?vg0EK~yGFamtEV83(o|*oxglJA3}yErx0><84ugoaYV5t zplCct7i&UxG$`}@(R#xvg7vNdLXuGQAdS*0>wben`S zM$|W*mSpNGRgZ3y?oDu=I0N=fW0`l4?fP?K~2UC%^izO4~@M6R{t28OvnW%OA{>}V^=v} zcq|ul-WY3ZZ+gis<--ILqln>x>$)nEe2O!algR5_iDvGqh9Vkd{aL=id5LYny~4G? z0C4Ojo}Q>-gmF0h;^K=gGg2*znoq;7PWNNsEl43nw<06aXc(~_Qr+lTOb?Um(&K0W z>#9`LqpK2-_H@fWE*j&)RAW$Bc@Tz+T>_k+CR{MtfzjCQ-WwNJh6c_Ly>|5~u_&OO z^Md;(#4ZRfeBnQg3c_d`rG;Y-EQVTnmU$G!>Nslbjns+aLefzED&=0pl!uP0coEHS@tJjYyw6s(+Ln;rZ=S5wsk48j&?|pWRY1dJg-YUFKdp^Gb6GgF6g1n zIJ3dR?uR^nyNA~ek?Rcga4vABBvoNC8PH0hlWb1n+T9K^48%J+p>&M3-E8tca+j2* zF85hZiT$;}y>y{zg5qNAEZ6M5L~J1rzd$jqn&>FOG6jlT?)l& zxEOe?Yv>B#f{f5Dzy=*$Vz@x9)Vc@;**Y?Fqc012+83|u`V-cL;Mrz~tifZ+46hU{ z1hp!)aBm*MotbL#nxYD1ejoY6-sVmwOk3Qx3So0`v08@FGMSb2WFc%#?GSjDufe)3 z2@dkLUY(n?CsTLP9${juiWBULx36J@@P_kM=p|pG(mSL;9@c6?mDMn`i-B>g#zo53S#6D3}UVC1Q260KI9@A4@x{ zGRb`H((w?R!}0vfK_t)FHVA3hy8iY{p#Tz9#Bl*A%X|rQJ`H>b zU4U0c(gX!@q*%>y=7!eP^y6PtpuNkhxHzOI^IpzL(nX3-!4sp3E@BT^JvN!jJ_v=N z^b>P*wz+{gXD7G{Nfy-Q>8dh=VHg*CQqhk>37FyckQYoSySzvg(I7FxdLCX+MGAup zE~;#l85i+|$RIMrZc1Q>oT*+!7uC~!-TSy`j0;N^Bae-vAL5Ihvp>|Lt)n9uy zF)(zs*Fk3o)0OZB+LmT!I0P6yTQL-}oLLePQ+Of5n6R?;Fi*!%MOLcoeBIXwhx5r* zS!2$QZZ3fLck1aA$LDP3g$)?+(QXN7d-60*mcjn|I#z;?OZ^+68$9pj0;Cs&T<4t} zhrs*sD759yrwGu+kr;gorhv><9}3w_7JINUSf(rB6iN5!qOWZf78O-jplFT$aO;8Q zT&RdHUCO+{O(}1 zGEzny6?;gwJQ9`Q9NmaYj&H4ZD~8(Lv5$)exUjN}yMw~Qg^d;eVOW6v4O}#)h20Zj znj5-xHS|GxVBpr(kLTZgjZ|_T8A^W;dhNo6ra*ft+uk8?fp*T<00V|>SopBZXuM?v z3=FY|$?{}K;>CCJN9St?T6lyw+?7Ej@N^qV6~@S|Zpv^eQu9IN>BX^DHG_GUu&x@4 zP*m!e=HH16J1^LW_8F+VBu_!GjdDhy8I}V3-DZX2y;uVKJG$uh|r-Z3&d074UZ8B<%q>G*%P_spKSl-SHAMg zKPOWrEifNXjsPk+ldTRyOP3dLQ3{!AhA!1}nwM=#&1AQSg7UII6LKdhdQAF1IF0+4x9Hy$tBpG%~CgC#S@jJM-SJBbh>JUBfsB$@r>ZQv% zR>qb3v-h3=T-b)WQ`xKL_ksn`Vv;x_2#d8)jBl#{K1{E;0W+=6`yF1+=ffSj9QN=c z$>4&W07ES1eVoJDxw3$q=e`oVaU=GXGZ+gR*+QLKi$=iba*+VCL|-HwZd{x=Iy!pp z#*G{IJDr?Y%mIIZ7u~p+WJMGLPpmL+`BCVc%ftmL!)Oap=hrjT&xjz*I@rIi->tY` z^l@k+7ruKxjJ<)?6z4qiA_s!*cLi?Vxi4{t_i^#h;(~F)j8{-x(CW?qDl9;|Z}_!q zFIqHe7J=f;Qw{Y^_8(Ci8Ii^qaQOX`LBu0o-xU}2_xn-5!(nm<=QG3=x1=ykNFHo^ zvN`wLu$eQo2m@IIy^@j2&PnDV!V3!*j_qaGR@!{8mOOhdiNWHEqKd$QOPwC|u1P=N zwaYv)1xh04qJ8u}?zvEh$IyHnhXcep*~r5D(-kn3vf^0mEYxVnVn60-H3(jVBv3w% z$YOdVi>Nn!s#S(Vj>^lW`Z-QhJ(tM*9O4Q}{90L{&IqwWD&<@WySmNDP9+0oMScY6 zlL18rlje{M$(MJZQF!G{7xbuwe_eoz&-SiTZ0zvi9BjM2hdCII^P_fd9~TYegez)y zP*|)mad8OrU&lpbVARQm3+oE7PoS;A;`v)|-g*;sba?p9H*fv)$jP6+-gE1x7Am%h z0qRBh%pOjL0EZAu_y=&|aP$Y+Q5@=yD{)jOMJq}YFYziS58QzZgz^*@mNcF@Eo%L@ zk{!udXQZdGc)|7(oOsG=Ol82Z%Vfpw4ZQQ?Jr)hq-mx%LP9~C(QKB?T!sLK*};xs&FzaA zd*2}~ttseMz0b9ca>_){VY=;>`+7|A-tY46(D0i_$vt$BP7M{N=H}=YExY7xS`ZhVw1PI2BGqqS?d><8Q_kdfK8&At zD)h918Ru}+vnH9O$Bw%7?wHhYdUmwJ#s{MX#KcO$7%wdFoR}lHu=B!ZSL_9g=PwmE zA}g$m7BtnrQPf3@6!9)>V}yCy{cm5te(hReY6_!Vh$+|pFq~B#W(}*PCBM=vf||bq z`@~>r`WhYFfgQ|NYn9AzRuDZ>C(u(;KY1I|(HRDWI}_kPcsR(1hOyp%`C1q)Y`qg| zzYA+K z7IW`g7meg3SCyR+c2H0q`d`JxHZ5#p;;!_vUJg8a^a&Aw4EG7G$7)u^oZn9iC=lF~ z3$+3L4!Esd$s#G0B&$Ro=QsLAjIhQhM^L>4SrU++t*ON}6Q&*) zlMV;C_CXrnEcW*pL8ZI0*T!8Fj$M%2)XkOKIIaNr~867E- z7v7XavfKl%e{Edm`Kc+`_I&&L^~+n4`=#bp2xtUoE>vV@lB$5q^vhrNIGsJe9II5p zYgk(kBMjCEtsI}M@ln!MQ9*NXG<)=u>lC0~@zM=|&%GNw2|P#R`o^zs_di^Xd=&b9 zB(t>z#tSIFuqCM5A>-tr@Db}^&n%D*_)Pfgv2MTxG`BxEi~`_{=st9#)Rp64IL?dj z+~2n@8slP5F;Gx_nsBivFd7&az2-$wPm8p}xGvJ+;m zb&_01`m)Sy2=EH9#fx}mB+G0R8!rs2N&H@O=*#ZfNc9$x}JNk>nmpvD7+5L$gJm`!QiDU4)X`b zSXvgyD;)${04@-f_s6;@64wR>h;!A9F$4F#Gm^OxDxHC_iNv)$OTCfhqE@Sy2O}h! z_#w>p9n9oi?)zf**|9&xUvzt0ME3&>RUqD2`zxbJ=p@5&aCa)dkBdEV(b%G3vT*TV z$HXq$V*$w#kiVW5wIF9Jved_bVb`#k@wDV<4PF~THYxhJ-8m6-zD5iTHie;U0zz76 z{fQ91eoY`(e+F67io-{b_5}}+FKUPl(<&Hn;gEKML{t@>M{Hvlu5(l>k))tYI~^Tf zv*QA^7b_TFcf#UWK%v)gF<*wgLL~VZU0+);TI=(`XC=vmhv6Uh2K_{4GRM$Wr2^?* zhj0!Osj+4afuu`Fxx2YWPRIhiMT2z2={)V0OV7YB3zshUmlp*0UlTAn^*8ZXpaVYSeh0UW zwU@eHada)VFOD^xjfKvY{@S#Uiw1Ij(T<6FQ2a0A!ag6Icp_J9wgnAx22s6c8}g!$ zY=hjX)`hCFqXJ5nJ(4{WqHFXsyaI>YfeajQ*fyk25fh-ksEU_n=vO6DZ1GZT;vyd* z&WO$Kz(sRs0ZXa`d*{+@9a?#71KZBykx5BduZ0VX84dS0*-;8%8GLOu1dlU)0=}alVk#~#XEUUH-LJ!*p%p`rWGtvZCa)E#dsv9Rw@#w5 z1~1pD%rI(&RPr6Nf|^lS@}AP1=90KNC;<=}&)pkb)b5V{X5y zvmq{+?3nl;#>JDy#ZKFT8P#dOb^XjD(6C7edk|yTj*Dtik`0p>nk?(s-f0TL>~a=7 z#c=}#%}BrOM|NE7G%m2LqdUXcN@v*Pq)eHxAR3;XQ4N7-4-XQ*hXqn6DV*>^G;cSC zin<4ki$f$cV%OfRFkvxYR3$_fmzI+$zSH3&E5(qmk3bhKViP@h8qsCJ*Fz`eV3ECa z>B%6))kbBF#Z}S>J>C60=dvQ(GinhEGfJ>d0?89sX|(hPhNeo>D|i3P!_u z5qB$!=ykzIE?4(OpSlO~ej>FLC15=i0cWII1CT`!Q+Wv#e^ju4m@OdcHt z8^QUNxQ`db}Hkl3pr7{uV2*EJq71=C1V*I_GLa?0ElKXn&JRD_X8 zLmjm`6l!9OkkO+Uo84my0#e+5NQSISl4kHCeJr5rolq`Ms!Uv*F2RDMa~EC37Sv6% zRU-u+Qxj{D;kOcbETGJWG0LewT%@}d%^m*KCk_g}vK z(lcy-!0~^a6%enW(>`DIkYPR5@&>?<%s)OOy2uC%UC$&9GN%Jt?}M7oUIwp>K=P!l zAcj?`N0tW5g%p`l&KnTUK;?>5-b7eY4OOtwu~Lo>W-(&a6vuhVBffpj)<}amp%i)$ z{SBR!)3F%3*V)}|c(6H?ePK{pzbj;;N%m{##!#Ap9b{GeR>v0ZLKyC~~-o-=Qxp@#45FfZa!7SFR}H!e6K0auZZ zgu1CXa9v;rS(s{$)TwP#ybZPrJI1_6AZVKL!6UG_5ZDhD7xudFe8hAv6nSS^CsrAp z*iHS@f(Svv6VeXl>gE2+4+2kr>6u+|alA1rYMLMC6=aYGQZ&gmcb$Qq2?6|)o8z=p zIqva-@(YzzQ1byTpz2AJF_!gtiO`jYpAbGKPen39a}Hg`X-{MdrqdwdQY%Ryqk3r~ z^>^~hNehm|eX~--P_^mxy%sVEr3L%ze?5+zKRwaQa-&Q$ zPoQF^580H=%t7^qC3}!T5tWIyo}SPcG)s6v&K99{)bL8pg%eW=&`RO)u6(l^tG zy*@<~yu$44?97J~GqWCDfX|Z4!pm-HYrD=%AW91+!#2W~nf!(=cVT+oVDcv zAW8;1Doj?`0v1f~o@mu4$p?csyUuWA3s4hm_IRly9QF!l0|Bmydr*0B=4?|i z;C`;tr))lg&7=uIX0}h<>^LV69BMA~R&QGTn~3Qo$_W=7z7={My; z0d+r1U?JAf%U-Va>OL<1eO!F{V9^*C5a-;J7NFkvCpM+oIY+WFK?{@xtxv*ZjK7ZZ-#QQF;~;2uH4v|(Bv-V z#=0cA%{|u6q360@YI>>bQOfMNFDGSIDIa7e)z*V=_J+55?zmmCB$&X=U}V@^wj^ z*1Gz1Ts%fX4{Y%v!-ZWZ>g)=;VR78w>e;v-x}RBJ+gb~PeHHKmE(j5O02glwPT*s# znd8Qqo7`svCH6u#4A|t5n{6g7hbv{)aqr;;i_mu?8)uOo@!X|WgJQ@~$)>4QqZSyyIg=`Sx4Q)Hp*%Rx^fl=-xmrJaf-~u+Z`&vhdGcv}( zHm{`tn0qh4_0^V}nHd|KnOV%?58)=!g@q3%`fzSyW~RBTPjI&jZ~|`IOlaMS3tcx8 zB9?g8%4*7AcWL2E&zQ7e#)TahcDn*(aw4s0>A9fJZ>~k4<1=4bc;F|cYx5exMSEMU z4RGNltBsr7V{L6+u-EY=h0OBK!eY`eGW)v7SeiJZ5>-ickXwjmtgfibQfIWk|2h)L zZ-dSx_GkzdHDswWqNyxLVz6r&2*7v8y02ud3I#H;%)5X;@`%_!B3y|HZJV6_|i5l6j>E5>wpqN z2%`GJ@H+ysD?ef#J8FOYvZ3LfiIG65i)_xIu}#25P<++xQxX$if{vwE-Ae;Pdm;hX zSKEg(GZXOk;ROB=5HaKK5K0q$eQ?(-Id*sS!F6ZhqGnwLC;ev7gat0@&5OGHg2V6F zc20z%jTRs~EbPI}V<(?FFzHMyVa1TA*GHhkp6>{WoQtPc%Q598x9FumA^fC*7Z#DZ zp9{byVz4f}T-((p&fSrZj{Jaboc=*Hi!AjlOGTqdiZZU<#-id}d29f0mF-eBgme$G zB&wN}PTml3%~Zm*NP|Nk4T<^83!zI&Dbz_j+83e~GfqmCiH3Cza;93hUgXU_RY^yk zBasCah;p$7=|#)}A&5z($BL@#o#VVbHCuYUTx?Vjl+g)Shg%U9pkG%ziDZ!24N#8WIyN4;&pFSz z|D0ufWnpE{IKm1`CDX*{`r5K!0?rI_s&%lCrL#Ydt~x|j3>Vf5+oSgS$ZXE#MDyXn z@Qu*dJxMMimjm@8t`OVer>emmXlvpv$Pcvu7}<<@ON9|A`$2U|ANVQc z_iXa^xCKrS+<{KF6E2$)tS|DxR&dTS+U7$H7u4{8M`Zsnx&s%}?jm(YLW>aQbnAc% z^65TWOTi1<)`jN5te^=OJ)Q=GH(HOK=&fN7(=eVAIJvuRaiUQs4J`~u4dD^=s?X~&CP9>a19q-r5=~6HA80P&yN*oG{x3J zmAXPTP=2M81sMHj5f(_eQL1at#jSIWN^}rvN8Vc@ogW2iV;Ix?v?twjqbFYR;!=sz zJObtpJ4c;fbD;oHDjEh)CeF^p)008&bRqNJMtXhSgRo%88nQ{3CH*(?{Vity5H1ex zs!uyE8qlKN6(LCxM5NpT$wGa(ge+|1L99#uLwRDIvYBXpyFSSD1{5-~-X!DH>zPslI|(0x@KBN{J89J*l>XzlfVj7K}{90N0rnAY@Ko=+v0?+&illnL+LcT zaMaCy@h&O#?!RsRY@R?Uz#+c&lR}e4A|S#ICvc-1O{ilucMdG7PC;pYsfjz2JEI8k z^2&TF8Cl~6WJ!|{Q~wllkTe7m33mlSAa9DWEF)8@hJtfyxSHtUDgU|rKkBiR`F7_C|w~H(Cr8KJt6hWq!YD(x~16k;MZQIyzAWJE> zpwp@+tc{|TkzG(-m{@G*K<&`D#A&#rRO*2X%K2dqcQlid=_Uwnl!U~6^lpIjws(Lj z(G1o_bMC`geP;H(sq~|JqEiI zTc(AL7WCMfV{zftE6^E_uq1gP5{ctm2(%be)HOm!={kBiR|E*i!y8oMG^m~)c3``eOq)Ucb& zBa3LK;IF=#vJdhnZBZJDq}$~MPlFU=`N(`YL-%r2JrJAdo0*xF6-0(k7E;;5(h?kT z7>cuISnNU{9-aZ+A@62~$q{^t(E`^DiCR;*C<-J)V3&&OJJxDe6EiKoW`l*jg>3%S z{(h3b5L5*z;#2_)i-&}f7B9R833dwVc5=w&qTU={M#(iD^YCF!m>-7|WHwpPnFkCE z;$mRt1M21s(oCLE`C%kXXM`9EDXhn`w7LLG+aRqXLXLASvJfZ6UF6kPO{WzZs;pjH zi^2%M%Ic5q0TP_CK~e`Y>yWZ?%v63_6P#*<_^!t-T^av{y!i(E?y`X>&7wdn8PDzlT|yNfy=E zSXfCS5GQp&d4rEyI<55))^X3njP<=SBP|nI%ZfdZ0y#yQg1a#@c2H&q>A>w zESg#M`=MNwT$kpu#a1*2rbQ!IShSc^r*B7B$l9=x6=*IQtYmk>X_fd5J`QGZJ2@9t zY3G+EvB(!Pm^G}^CUseYrty?VR(q{1FwDc*7#~-c1O9RaWtPY zCk07`d@@B1DGVQGs^iO=-w%)Uh_ZSbD)e19+=<8WY`Bu`gglZ6#rM#`f)?9E9B?~b ze{JI+XVU=-S2^E(x6?PVh?LP-xFXfY30K2~)rI6Bcpq!)S&LyLz1zKyi_bDHzW8@( z0T+bB-rJ1?>*G$*OXWjMBDvBhouXC+&)MN;3zHcvcu7;N3&pT4Pj;YQdUdeCn#GvD z8Z08^+qm-QlEYE@bC|V*+&MZ+G(2*&vF_9_W0r)zVY4K}(5T;F$%^tRojmWKJ9+F- znlzN7Rtpw(TrgV9FY8kyc~KVRt!N?qWC^(@uR+8R=H8P1V{m$l7qnYlROQtS76cwS zi1UGqdYm?mdvt%@d8WW_SbGeiS5450h$^~JC@x1<=!SV(0#S%&YlDBWBtf^jZyclb|ZUhlKbZb;b%yzVoif?|p6kDAFK&JHv&+RcgXcMiKl zqluimQmxj;2}jCPeF_3HXm25+?KIQWhQ5!BhH~02#Q#xT*o=!K^|+|DiUiqT_Achd zF^LO+daMR>T@wUFELX+ewBHsFs2Aq9tD;Qvyca1FeJH%Q<6?OF?Vo@xfnuW1Cw4_E zw9;Uh_Q(t2sAXNexx=~uH$^2C6*G5+k4~G-ZwUREC(p9ntGbYkM-m;q$IR^Mfw{Ru z4XeJbwaD|+NBfc)+PfvM)UPz+w`~?VvjDg#L8Q|~@L{<@nnuR~g`=`TQ=F6*s62@2 z(;cP@rI9Lm0fm!Wk@CVSud^bELbRNLMFJZ}&4Zbul`UAK?d-NN^4)TD;jT(KK8pvJk+4Lm^Lr=*_cxlow4jl)ro)t>Di7Qr9D}AfVd5`Iq?=*ZiX_;KJ2)j^n&t39jn} z(Z#u6bWK1#dcpl5?EWYm_ogZcnd5|;N6MSgq(~h-%=TJarD6NH_TT`jD&@$@r`JtDw3uhEJ|Bzbl?P&XD8eh1L<1o;mF8C)#FFOp?jhB zrWd*b+}T{rW&G$*c_WsHHv=y2K_oNLB|`bjSrJNSp<=9%$-5t9{~9~%RX-}YkaPnQ zsbgo(;+6H^Y^|i=#4Rm?6=fn$k+6@8{{viDw6GOu(eYW-Hok&DlfAv$k--y)2@F;r zX~vET&23Gcv0PUm(AE~n=3rSjbcT)faI~ADk!19wBv$Teaj6p%)520N7W)GBgJyg|crlT_rzX2Jmlj&nNSlB1wSjI)?C3521QSwd9 zl0%PJ9VGG8J9lOU!)kivQD#9n$8bR^-<_&#RH7>zBI5$xry#04&!hODNefZxtN~Wn zwqX`z2c&pQ)&;d#$v{>#vycya%7c;wXfoB~u*Yz*3g9V3-g5H1D1=_{9j-irGOa)4 z!{G-px4U#00UmsM&h3uDuS=hByYB%mCLUEX1$W@^)L-51u8+bl;F}s=(OMm7y{a2) z(Sj^0Vx5Vm6e$4rXLWv7aIsrrLF3cYU`9-{DNzlT*F{yro?@W_E($3$ z;WA;Ur4m&S|1etHx2Q?HeU3SjCbuaNy<1!^%8#Qfk*RDUxkA>NF68g(a9+AAkw^8! zl@*#$fzu4GIS>}~P)QFbL;XEkFkHw2w1wEO zYwX{~g+ugmO@h0`HMzm2C;=|Ar5GG_CK8;lZU&~Ul(Io(C$G{6TbWFLTzYb1@Z2|_ zZ>8sZJx3EI(*e1MmyGdo-H`chQ(T#y9-l6b11e-)V8#U0a8X_i!(Gg3XO#|;)H6T- zrR|u-*LI)CX>ERdntz|^QdvLgh+3p_4(eH`+7b={+! zyPti~-qe}k2J_{r`t}smS3Fb@lV@4kX@e;mFFQn#M}i-8Wqny)9xw8DBbd#z3Rf1k zV9SUoOW0hIn(igPG0Vciyt!(D6Yk~I%@xtdqDn5`;p7X8i5o3~4o+Rl>q1^%^E(eh zzszUjzHW*3v-%3jY#AIYoG&Mnr%2=*df3(Vhyt~v20?`(7lrPNr`5ieeO!EoaRKcj zjcH-IBA_&}tkcLQ9@@ccxH#_x2CIy#4!>drkWS&L4vDq6%X2Di-P^6yjjc@ z>}9x+0$>r?G=pYgYcu`glQdBhJLUJIwBIi{ojXs6p>0GI1qU>m9`E)0dk|u{n5HI% zEUCN-7liD;a+2zKn`LpVk*r0r0XWMikX)Y204e{K{G2@&<*pq#hbepyq;31lw8ni^OL!${y&9M zoQoG>KT$ZJ%p@N#PITqoQe1S?3qu}MnW{SKu9lMvw54}&UEo& zGZx_59RwG$(wG)j2;X7RV!QZr5`n#23}`(tKf|usqi@2}=BEiTSfb>F zrRd|u5U3gY)LAzd!1T+B3BX16?qFr1GFV;}X~v0HkVlr;-X@7SSsnxKrO8#jc0xTO z2u5*j>sn^Vf))Tqq`bO3&U*1h$s>x=xI_d`^=Q<*P-G8;T_08G%2g6D5#RY!C=`tj zZYGIOlS$?Q9fIQHB#)|FegD-J1;sOwLN=N|NLyiLDV13jT`q>iK7hr~e%8aEzW6M9 zb{`l28ZN%`?eFi2&F4e(ttOeB)o;-Pq#Hp&GkR``IzQRkgZdhjY|ft| zf~Sp=L%nPZ(qR|#qJ1(9Y zKYIPWqjp{1nw}=L=+br&kS`WRWi_gIcH&&9v#E*V!o_uZyrUDS!~K@e_4vW#FsHBz zdTCkJkz`h*8;TWSsf!qgM+8CBjJ3#`Xc=Z^k51(AG9ZHQltck&vCLjlVo4MQgx6Pi z!OP)$p)gmI2*$=GE?kAW)Ns5T<8Fj6_C2ff^0>&hFtQX+G#oBR7Dx+951o}$$%+6L zj`J{k?)1ez+~V_`25)44alpTZi$mZ3@y_S`_}ib3ePyP0qlHzV#pY-EWkl6VLkbS7 zEVH$)y|M}FE?PxDJs!%2IV!KBU}TPq6SyU=rX9h~Ae@$!a`0vgnBs(@ub`iN-AN;e z@J?O?-kb+o5S@ep!}nsbdt}n^0n1xzwNb*Zbo$2^`({nQ#+Wo&v17L0UK>!4Z@)V4 zAC2CA5@qkbJv{x%ClDW*A=eHy3M5%H1~VK7rQoAATr^GO^xRm_bMAoB-u2hmqSs5u zN*D%dNjK^naHJ=?Zq}=UAV?^_6rLDHz! z@PED*>tqT-U6!cApO4>BEf6b0lRXG-nFNnm>fw4IqEQMo`Am6z9-j}MpAM46U7`K3c}*@IbNG%i)HpQO;DUO^tL4a}msZ&p#qSLmIKh5Cf=$(6J zdj$8;(9o5J#5m%gF~g?4#{m_T6}!TMV3cVmE}of&IOmi4B>KtG>;2cK>32M=)8U!I zGM^f$09Z#uoeUT8!XFkp7ss48+?{9KFXi)aCq=MMhvXX8idb4=ZSjI$y(>vUz&t8k zu0$%P5rfAigjthH^s!Z^Y9U4$S2a2W(Zz`&5Lv3+9LfRbUkDYY@#0iDZw^Accp7+7 z6dk-!>%3FpEi#A^Rb^|wHMLb0Q8>T(%ZGG{lF#L%)4&clA<@O{Eo4kN*^RecA2iBTotc5;wzCB_Id zNqnN090Zq$9im_bK>7c8h@ zrfjjHsGHG+IM*3^j^e_5``2TOjzrs+18(u0dt%}b?lWjxno;zy>L**VI-3rLilrpau+jX-105#k0x4CN9hCPJW6A_pINHo_@V{((t5 za0~E)*SjJ3Vfu@@hj51Ofx_Jw4gS7V`h6L@;)TUCais*MHHX`BW4Xg6cU#j~TVj6$ z`@e>Z?>vc%@BDY77mWiKtZBVb;KIs^%vt@0bP7&=LRCdrC*d>!SsEpY&Cv)i??`$$ zdi@SR*bI1Vv0aQc!N{!k&KSqVI@=Os6R_)F;F`zA5CDv zivi9{hfKbHiy-34(0R_+i~NxIv}qD(X7b>vfq{XW18-a%_|mRQ!)Ee1AO&SbBUn6L zFNTYHng-U1aRCJvoBjQl-#=<8dK=u4%a=bndS_fT>naVT@Q^7jct%H^Fr3pHzuYmF z_%h(4!<_|xq~pPTk75OVjp8_AElcyhWe*P*MSA6WruwJo8dDY1oHVQQXjKs~BwxRl zO^`jT4M$`pq+IZ$b&lxLjn2{0(XZclAvFH$+xe;&p=X7b)2E-kc$$|`iv!WD3*d=x zyPRLhAXE3e-g}Xh3*BGj4xb63z+#j8tZ%IIFjyCEC%2D_|8-pavtdrl6|omn)$bDI z4Je=*hT3O|A6I2Vk~C3diOtCC$R=1|<`ueHW3T1f7nPVH#(ZOeK#Xha;Kp*kQnS(} zaBZD|wxuOEK*JXpQ;aS_Q#HuCGzS77xL+F@Sn_&XkDPe<<)QOSWMU`sf*h?kUp95+ z;Xo`@i-EvTiNrNBiGNo|Fr@px?<0lxRjE2WW#+}U3$ z9G8eqOq813UT<3faBiNRu=0VRAaYo)h(11DYr&xJ1%yRW zr-{w3vLD$LBw3NMs~-<_U2T4~3#veynoG^ifD2)?!#A2B-baGGze#Y>bfHbbZZGyv zrf<40w4R49hnoZG3m4Ku1L^r-zzGcwLK89vYa3n}LD(TLS~P z=9eyveLTO^c6I*3t$~-HX{-~bj@wxQGFidIkYU3`uW>iBS#MOl-%oTIw6X=I9q+I8 z*FekHatvT#Y@Bg}!Co5G+6XSVm)vosE%riUEX>!n?n;PBkYorf)=A^nBJ1nXI0DgT z6^!G9TbgLp_94jT!sAF}B}0eUB=g}_Ly!&38Uu-8G9O`?E*I?q^a=842=oHSLD&Lx z5ikL;Fb4@pDmiy1iBN%kS!Lt*rF*}R-0ohyALkAyN*u;sH$rV4K4M+?gneB6Z{y<7 z-=oE@feR8olr+mkfD&+KFbkb>(U#u?ULZ5E`RAmDc53qYmEe_udtB?8)Lq7!gYYA4VjxZqxWV`#w54LyJA;E?;m(93{}rTMPV8&CuGYHZBi zKIU%gbd0s-+#RGT9v#85{+9I$D5~41>St~%`4;&kPN#j_>DR@Bn_fL$)VTW>7ft0&YvIq;I-UR(_$OP zaG@j;O=HdNF^4nO(d_1&v7W#iLpR;$A*lhl_~62Yce`F&id`KV`gpM^0ERofeCbB2!V01cacAzd z_ZgK~3ovYZZEbxpGg2k^UIiN=o`={ZQz|lLVo8^gDO^L9hsP+Jgnqnr@LBFYj6@^l zt^AI8iO7e_(Qs#|28N_kDO7K0er zYG+5ndUQc9lHl#_{>RW(UR3aM?%XdTqQ_drC?S}}p9j;Ry0TJ^K(!?qbO#@X!-(dK zR;mlptxXXT!MUpoHAXNzS@~DY6W_*M%e)nVrnEw8gwAGXl4Pg8TfdZqDZ=xZs5LoV&dV z7*WGTDKzl1g^Qa67Xvk19NS%cvjTMFfE^dCRd*h6vBmJEH76E81Vo6j{J zZSz8sF-ehlQT+O!e;Ld5M}LitOHe5V9T>ES9-(j&2r&YH06whW4X?tP^##@_TCG{Maum9|4KPyD@+ffw} z9qSg8;T6_%dB#q$&wm%$k^EeqaIAx-i=^v?5=I$f0HRk)BuQ4$@&`cZtc zsv|b6H}y6hJNjsF9e50J#&Xy|as6(k8ijG*wZ|*tJgKnpi`Yi(olej!iz2$&RdS_Lt-I>lcy>D`X-u#6#Cp{eL_<(?SBCrLVt* zTP|Ka?H~SaC;Y)49fo(8-ih8tvL?wAzeusCHLm?&Q-5LpzF2s7u*8_=X>1EFzLS3K6Y>E zs)dWmvCzArv76_w#@@Xbd*l51&>I()+V;W)1BHzhHdyS9i_I0{c(7(Q)&R>cnBhLG zN}JJ#9??)}R*1)DUwRQSr83d?ehD2~V(j{=?BhxyE|Z5LzmZ6_lHJCOQZzjDfHtOM zqZd&^1OXRoq=o`uWcHQv0@-6!tl#{Cd7Vwnk!!X^r922`O9Bgz`pos#e@!)*QyZq)R`aixaDW36_gzrwDzs%%S+8U zC&W2&?Mq7+z~~@vx4@L>{ovyddLfevHy7T$d4B%h2TSi>xOo$f4?eYrfE0VP0<`00 zVv){mTuhU(e|^Z3G(1D{8#-ATpm+qH_wcOlLEx<-mcmMgb<xP(=FpX!H*cPY+aY*6vNtCz zRM=th1<>xecz^RfYF)JS%^*vHidi<)cnB9icoTvs$Z~D)g>2HI|Lr(SI!9Kjnaoz` z(cr@kwJ2|uB~d^kFY>aE={4!Ab?fOez5J;%o3f&gCOYbd6#+@|&4~o3dFp40$ndE= zuwo%gm&}Fx-!5BStd%M_7`R0_{q{pLv}1;I(cMW!1;!WtR{h-P{z7#BbDvwigmkSN zA>pEO`q})*h#4teCRG~UeW!a!t188m0{G}N_HpsQgo{Ia$fAX1Ti5~@Uz)sf61Ib| z2Bjc!&}w3l6mlbEfOTODT?FcP0LdaRAnLxHs)vP13cDCIzI*T9cWs8p9O|8$n>%JJ zraJKXW3^g|r{^4WkGn0u@$|t%#JxCjkXaLRb5HM~y-@*}psaXubkK1N7t41dFd9_t zdt#@8+4fa@7!C8JR$dk8Fgi}y^zSYXyfWI#lMBAEVJPS{yt z>hqvoad8M4C=zDIe!V2*(QA=SnBcp)tdkG|?+IeEJcOn*^o?tAvtR<=^2iHu1I!_! zjc5|-yfr1=g(uupU1zYw^X&KFh{VZu5O;~Q=J(3j#kD^g<$RJkUCT_KCN~g>m32B4WRq#cqAlBKb8Kiy--k>4_ zw!enUBwlJ1d(df+e(`i66Mcw4&tfF*hdTep-ueEtQO9xIF_-TisJ)1~^UQg%x$D`B zw)UEum}+R+S|%%uqqS7!M{%Kr0tKY}kZK3xM-k@GikKkr!3_GusR=?t?40ol29!*f zg*1^zE{hM0e}Iqte81Onr830d&hXB--Y+QIxEG(#=ll8b2XS%gtst7F!rrt2jmct0#t;He1wOjT|k_cMlRp4aY6H(_7M9a0=dvcqLHPgMpRyoXhrL_ zA8eD1XgG*0RF$KjvXF*-pLKQBNwm!5abd17KzYrHYD2XkA)3Q2Hub$--9BUk>q1}= zGGi%{(Sj(-*+}VWe2jQ+U2j`kuU|kC95N;b&V`Z_3FPhmh*l&?kT@0v-Ch)6;`VQn zc!bMS5a@hL4^+VaxpU9!Z^7;eY;;u;2a6zftU!EO#w#=KE|z8c<{(r7LMR*$UG8#X zTyXqBC-6U5!2aq>qlK^-ed*P|zkq!YSZK7+U{OSi+7c_O)o1}f-oz0h3@FE#K!XT# zgC8o$w#dEM@KeDlaOeFREee{>Xexq6If6}*iYf7Tk)lMC#tKbZdP=^iM#IGeB`4YL zAekL~!x6p0=35%plW1^!`u5 zx}cDmsfQEw)rK0Dfm;o|ev{W=_{v%LtifOdTo??F<8Z^1)<~6+R3U1;?^QMH z^0+7~wM`X`7wizF{PJDNqtCU2@H)kvHy+oaL8JEW-^qy^u5bJ?P=E@875m1;Vd*3n zbomJ`NM?k>391LeAWag^Tl2z$RM*5bu|oNWuk~MC&>^hGZZBfMb!l{a%~Xw}1xx_b zGme&e2Su&J%yr{7E_$BC&PY8(F)gLlhU4|{L7B}27kbQ*9ynvDG1CZe(Ky`Ji!b2N zhD|51K#7XiVN?C{mvDm8>2jrF;bSB<-5cxzoRa)Ex#>X*cCFt%wz{Q{G1YR(s{U6bO zle1J>6a_Atx95M9>vGeyP=O|OoS+&SW3xqRS{;(S-H^KEfjisZKM#6;IyN$L=LqQ5 zkr>gfvDlH37@Uob9D&_C_o>4-(w`*-aAG%7Jow-qxX6!dDp5G`!sP^FB_seW3JAfX z0`a_}kS5*pE5ttb~ox-?hz;(33%{Z(@$b5Sg7NM<17XHH53wF#JK3C;DF%b$x;^fTLcA63wndcr%Bn* zH|~&PCnKFf-OgDU#TJ3w^>DbpzUKK8=jLcrTnN)9qwqn0|H*fOi0XRRF^mjg#WDdz z7-wxLbA%m`4KCUl{JX;0-5ol>#csIxZ)(4^xNR3&JUp16e~Jh%il>z8N^&JrwK@cA zZG|;vl898DsDIrtdN&vsTGX=|VT+6@6ce z!%=_l*pP$h>gVnYO`MT<7{_Z~c;UFAdZ9PixMleAtFOK?81Aj}6GWIP9Psp4f&bAM z?8OVIzBU0aFf5#U)@&i@P+l+?LQb+v2D@`1x8EMXjmBjLp89yl9W%*0I^t&PsTK!T zi^n60#{7i*wl*QRXOAm(QO4#3LLSK4z&{}uXE83GOQr1bfJq>&e-ChRv*Y5%o(M=A zDBi41SI4|y@+5C49D!1OWIC%f$D%^9 zeBluQm!s)E6Kz6u7hLb+;KoFP^xT{eDY*pBgzKY~*`cAK(@jI-(9pSOo;+RE;yA|! z-E%OJnt9Ri;%88uT5WjUYt|cb`YP1>DQuy;E^K>!p93_!PHbH;reQxE=!i3-;(`P| zHuNek5Tw)?xu7qOANjDUZ+Sf!wl7ai%pOB}T;?bBSH0lq_lOvK!Z8N0;B?O^h$xN% z5>3`q<2d`<4a}1klVfnAHkAT{L#2xM02en2F81(5_MnB9{N0?-Gr}U(rFp3{g~}%p zuUM_PVP_v$uN~X#BBxoTigoC8ItMI?04`diJ)P06Y>7H}kj{Z=Qzo(W}$d zZ$uCOhW3{-0oo&Kxjz+vVs~8J_A6Y}Dm3{GtB9z0g0UvJ2N|2VIhKbVx~q-hO&Axl zte~Ki+$h6M7w6qcXd4a^0UP+GsUBvkhTOw-&bloaeZ20}R~Rb5mgvEOjAyHC7eB*1 zc%jbc#1LSr@Rs;362H)h4~lV-Fq2*UTfoSRT_M5lLD(+nTX6vZk_&N?<55{TU=G+E z_sW9VtPeNQ;9(%=TJY3sImC`)rJa2I05L;>&;+YSXr(YuYpic?!<*&5b!Pu zz8Ynhx7i+7M~`ur7woCX7{NtlHj~Lxf#;uRj}B~7al0rk%%oB?h@#AZ4@knvWa7lO zU;==MATf^;kr|0m7IE))(H;k5r0oC~H#aVJ&E+hfvV;Bcas=WPHD)RDlDbO5;zPNC zB!mwR@~Bx2=Y<&*R&mjBnx=UZ&2yYYH#jOBqmXVva8VtNzF7~rXf41+!*Og~wDvfl z@@v0&m%j@Yg*ezt8YA{F%67%Y!zwOJ0>;J4VrXZq0_`v^2rZDn`<ePOmcO`!WTo8RLC@`3?(W#g?@Gz>kUc~XvDx{bjV2z{x^`2_4 zk60I$v(6XtD|J(f&13%J1Eh=M%F!XKSQ3@LwEkS8LMnFMe5 zf)lT<`2!=FT|1m2{xN_<}*|ArMQa22cLjwS4h zbf`xp2LWei<#F-;wKscSOB<$JS9>}kc2WQSo9AoZKHfPF_Quuf=JwnF7$^3bH9>gr zC-h*Eb#b^D7kIMzWl@}oBttu56$LVyxF#h(APBVXmPE0u%SUkGBJK!%8oWA!i64`$ z*9TIImP`izRA#Bn z=4O_Ltzy;!E z+T;px$X@^qRzij1X(1ocAQyyrpR&>AXRx|MX8{<9A0zG@@B#zFO}hDsa|^DoT4bYw z5Kh&!*{VKmU@c|>Ag1b>6DuMAaHFZ})2|ty&rCI(usw^ZKyFnOq=Xu6xT~Sn3&2A)s6)ZlYGO*QW zGGQn)6UDf~a^i|BxsGumttTU&mzMinm)-?~Giq-w!*ph>7A z?}YZ5d9_09qI3GtAEm_JtoRK#<4@p1YmS3)QEtLheug=OG+?MXTa1x2u_|EEwrEM6 zNa#(ba!Fd?_6Obb3*lL{yXPIaiAZw317gTc#;%WEaHJ_c#sy^t&6v%cYOlZvs%|DZ z)79&2JKNUnvtSam7z_>S=oLo5Sz%5y`7Awx6K0FWzhO3$tGHH{p*cJ~fQ%oCdpKHw ztgVTZii?by%HEQF=458GGNb52DX$RN%vkcc*n~akXVC zq+Jb!E=!0Zp$i%=D+yO9na732oK-frGFi_+w$dAMq5zVznd_OSGD0Q;dl0)=?z3aT z=f{uDq#7^asRUkxpiS4}H~k1XBL}#+S#hD!VrL)UT~i^mQ3`F#Bx7c<+bgUlJbLW1DQ{dL6bUJ`;CJ@=AbGmujxcUfb~eZ;4D{im zY>rOqBvvT}qA9kYbPp%yi$pdizdwS^r6k3>=4lFHG5vUZb~u@IZqq`;h0#RrNw_## z1j$VzVgh!-*Bv2u>pfC9Z1%Vygma$2a-~P|NR%{yq)K5REJ}6|c4P!k za)DP+0#79v?(!xkzCImDBo`0zE^bm>Xqkz7x*{abN$dwwte(RK$MX^*xFD(}V~QSq zbTU7C=mm1ItOV^;GqUDs0V1^6r9zx&f1KDqDgH`U6yu^e1suk^lSoC-)yN@Di4`x> zL^^bWodNcSiNVJ-5=`B_dE){Z7n316->GKej_~Zacg%V(_l6oT`S9H1bLSjHkFXSb z0;hcPl$qdyY@{a4n*?sQ_4LySQF@h7Br+Z9_Rd67+q4J(F0`Skid}+1BVl`7U=@z_ zfR*6yzNFruhw^p3o_gf{Dif;&k{4+PDIPr$(j$@4%Ph_Fw2`E0g~5`b5jy5Ue&{h8 zLY%yiOhp#?gS?BI6Bh-vP#tirBk$Zg316c`b47@8k^6Cy5eO54G12tfCAZ~qVQqc@ ziwrR?)7`d)$E>5fYvDp!F)jx8qDB5GhpndHWW+u*D31K4dT>|cLJM7#a4a$jxY)cX zD@#+sfgtm;fO$bLx`w?-@m=OPnHFXuGbqoCHl%Q4LkpK&UG8}iQH@oY;VdT_!F^u?a2zP5~d}qhX}P z`3Hboz^#MIQ(C*Z$}D91fQ9M(;+`4I|2 z{oGj}V{@)YBJ2FcjRRcV?6}xAE{>2!mQb-#QfORE5-6B>)mW_^RAgR2xLuWQ>?H!3s_LupRbCioX;V#mlJ0<)}Ga3@RK? zBd>e75EpF6% z^z#ik4A|{qy;ARZzP@I2Ii5^y;--NL%E_FeXrp4bNZ`d7+3Sg!iR1?3X@u|C3l(&2 z{M^K1Lf=F%Ff_O2bYI9x!B-ypz#DDg+~t+ZO;?cM#;qS&}7 z3|&}pwFm<&#tk|`Mb@$AqT zw5`EwAtw0ne+5PE{p}>CDH{=%Gl____fcwu&U);YZ zqS1ojLNhKvI(4D6&Moh5To7NRShR^-nX_8GE_ZJp5-A?#1nV4#C=3g$6N`&qeH8&E z7Z(_XG9l+gWU&SulyemD!bs;nJK`^TD~0SjyGf)X6`ApBxS*LFE<7^Sx~O8gV?rF3 zNu6IhH!~TW!I|lY^$&dpHWX|&DG%g$Ql9JCs-v(lQZ=xZT^`702aaYbJi25!_Z{~w zy6_t(QwMn$HytjtCvlfrk#}Mk7p>#hs?$)>asIW}9LHa4=;^7KEqFjsmCQ@!%?PWV zOf$Y}z+=H$W3lIs#M+~=yzacO1izHr2~T3V1z@30IR=9yR&oPcXx~xZRoW99MM&7c zVw0ypOEJx~7>Qk3np}&G+xMmerQoVi)H6{RM4aO$FysmGbu=wh_=OwCJq&g z6-A!oo1{>;v%9OVh$>EZ0;w9qc^IVPZ0wF7e@rCU0<^P3>JfP(deNe~jp)D>O-Vq`63mIJEaYT)0)b3r3Uae50U%&YY#q(AY{;9n zKtT!IRh7*WT=WJ}PO@mfbP)v@X{zDCy13bJv4a&mX`$g_ytP%uMa4a4gF@LVC<`7C z1g=FnA}TAyh2hO;w5KI)IDhSU&$VkkJth&0j9>tQti@O`x5YD>C_~UBX+7Jc4J-urhYw(WtTuFj7B&- zh>%Fr9M0SB;6x*%KDAm|9?zhiBFogc*G%^UFAH^DUFsa+*oy#827n2iC>^1Q&!B1Q)sT^41EQtpYLC6jcSCAZ_(6Hq!8$C>F)e$SRppoOWD` zzG0Y312t+5??@;H2vYmPiF?opkQW_(w>MvG!s49x^m^Gk{kIWm=$}{LNhKvca|9?GEoeihglEH&54|mAu~My3*@!P z6EUjLAdO`NlW6j}&w6vwhPv*8kg3vvM=5HW4KGfhS%4CFCsklw%o&+&K196O|KM0` zEXef41T0U0k}0=Fl;omwG56j9kDW;T+D(U{{KFpSIFARHifqL*nVM&C24{RLvn6Cc z$GFI5wv_AFGh5Uq#4QLeVDH_nOa^e_J=?9tY~t~cF45vsA{ZC(1MA}dgNwrjxH!JL zdfaAv5eE9!SM}H^9BtQ;l~LW@_m$MbG~=Fps5AX$b@b|Sut&hxz#r#p(qMYvImWLU zqHxNl#xC$aoY#^$|9M(KC(t#}srH{HV`r|kuZ_l*erksud?pqfom^Ur#l}}-H-N>? zm1m6>TF!-LT!5^cLU5sAUMM)9n&o(z-nJ@sj1Zt@1rc$IPc$Fk3 zd29zRNZ=DrVaKEiXwhV0Wm@Jq4ws-Moftr@iRO7ZPFfl+Zhk%k&^m)LP0rU z=L51i{jQ5)VrL-UsP|M>ei1qvud4rgtWuFEq0)nvLmSJ2gev2dvdIp3DCsFn-Pe?P zfOUSF2z}c7sq>@8;X1&N`u7l*<71aD(e#x402luoT-=t!MJL1?Y_@dtjTfp;oGd*- zQPhc=2Fk+HsGKZ|mXo2TBNz;%L<~ZmU{Ca1ZJpL|VFfFqeH#~@=}vON?6&MR=&P>AoskQbiXD}|VtX)|GasVzmV|%lr7_piwvTa(Vw=Jwl&S2bS!}4xP2De2hkAW znEz7HE;hu416=$TE=Hn*R_kEx%O$_j?YsSa4fpt;63MNVq!9}y76P%Li);umW zTKv<-1qkqfae=p2MhP@j)1rNHX>t^kBNqE}5!gQ_1Aj<3PJTD6u+;x~1n#M?lYJq;t4Xqw?JVGI^@N2Cv z0xOV$kS7k$zDZ#v37&5xd_8XmDF}-eAozh)(M{_7!gV*~WHF50LQ$44Sg2sXhkDBK zR3ZtU%;Llh1V{rA@C=idTW}*lWv=f+Tci6dC(6rV{8k8s$y*9gpc=NrS9;e)L$NB1 zX+OZlUbvWiJpJC()YN`;}Xieh9`pp6Om z`b<1dD#Sd`Dip&aI~>02!t;XEZ{ws6%_O}@A&vu1`exvodjVhe=oLJz;Op;8?|B5T zxma+x^kQ-`fjnU*&M-&~b_8Tz5msDyoG4Wzh(8Ue;F4g@5HoKy`8i`Wq^z3+_-eW#rPZT zkaBe-x{8-kkFQ2!a3+dB;7n_@bNm`UKQ-=nV;l^RtJmIs8?Z7BpHxJPf6}-hxBxAU zjsh-f!N|A*rUfjFTxlO6&d8Oe*wVO$3yl@Uu-Kgz;EJfLsHDL37xvDrwTU2#{u7G4%&O##A+38DQT)R(wxs5doIHaCA z)r5m;2_%NH79xg^70|J~3sYD8l=y!-n0QF7KPsSPsXIIGo zHe3v^9~+w(>P3UYQe_Odn9X(wUmERQbkwYG&uKw&ONzPqa4eXuSqfL7h+`!SP~Qe{ zK&`w*c#^^Id>SJrxUR_KYCk%Qjv{#+NXa*l7Qh9!blSQWGv%-4w0#S+$Lc>}4OY~0 zEgV`@b6?E3aESNjOUhbcnD!km_iikEwy{ z6oMk>AzgH<*f(mDy~)6)z+i{W;!QCb;-?5&sA_jW=9>icM#B=nUZQq96&aU)Da1A+ zS11XYC#=}X+PxsqUZis*F=As1f&}679Ap!#MS!XKvKus#K!%A#o&P&hOp+$89F7<@ zV$IE(=6lfwz)U`!>%cw>F497&GQsyC^M-m-nB>#Bjv_`_rXx4n%K=i%jE-hTdo5f* z>cHd1;9`_cH~amQ7V#oh9JOFEqp#`0b6*fQ%~zX$tl+k2;Sy_@&q5)~7tX6z@Lt+D zTG*RG9E8CYtU!(>^RSrPBq!xeMEykLJ6@{g}$o>wLAu; zTRpR-saw4(60R-u_cMvrDPIzMc=|_72Q8?k895R&E_D%}ynjliRQmkkgR1(y5nJjY zo&9WLw^9~Z;Im$9Km zd^(S5o%e>@A4FG;r+OD=hC9m77RSp#$JtzTl@NW9+Qo2jHu_+kEocZXIvn|a%khBU zO$%7gaV(hGtgvxWLh-8wvm0kc!)XCrvvf|&g}}gW{$9hLuKOog)TYH6xCJiQje`f)owCpYT%es9 z8jxu624dsl`sqDPc%%`p-mNCLG;Q3XZlUGe_^i;qYV@4FwTRPSQTUD7Gf?@q)lGsO*D9DRG3xl$}y14i*(mE-KI&4l0vvn=iG z#6ZM3T-3+K;>8vB{^H)M!jnQ_TzHczu6pyNFi{fXJ-x%*3x$&KtkT19v3>Z-lfp0I zLTX;)aN#>%Ub(XTjMsXq(t<>5!2-sDDJXvBYW`7=6r2@}rA3A%Z)Vbk0k-4dUdCT* zfRUS}d{y48DOup}Sf3VKqan#1o#^`bz3m0`OxHs>OzPrdLw4jNV+8>%T2T3FMm=C3 zl*diOBkpNwdtpH> z#_a|_KLSe_Ml*TZb`ZWrQxb<<5zC46UA?Pr^xCw*6&)FUkVF}h#DI@~{_vdy(_>5% zx&`BhD2f>1XfOmNOff)Ceqy4DG>3~>aIx7fM-*3$R|-QzrB&+(qMHW>QbTYkE|i7R zSPv!xJ=ly)2oJ`}xnCE)O!PKzGZJSn!Ge4-&T2jBAwoR4_W083F2qd>iw3h>O<1^T z@xO2ZT2!EJ7I?rEn-HsgGYnT|&JzSjW_K)Hu=tx6?T4m!a;S*yYYpq)Sk(tvCT?RG zsAWNMq=ip9+m7+ri0q$<6J0;QY|DMbLL76ZI7V{aOeP~xFEm2gj$`l^7a$_x{c7^~ z{M=<|mR_$krU z0b)c~OiLDy{p~rxWmEv9l6BbNYuBqVk6a54W~q& zi9Lub^J036Sn9@2>OL*Vq8rpCo`;{?@d;7cjgurDL_^uF-4UjaH0={bMMsTqn8rH^ zJ??w>7=<*e#k-z|P;dvK(?E#ll6x60!itl73SARRk#aSeon)T|8qCgq1FVagm?FVK zJkI@^k79{q9=tEjYi;tSmv?b1lXFQhuF4@(V{La{<$eg<7mNCz(I*(%5`J} zo(ATXbb&oer!jq*F5S#5tQk0Uv%=k2!R=e@q5)A3K-J_YL|`qb)(aowWY^E{;tW6p zYSIEr4!mX6aQgYX>w7&C-r%N%PRR|fTs*EqV#@L{Zh#io@2bi0+JJ2QX77AL8>!+r z-ikU)RaPlDO=wZ34pJl1?ASvvAv4iVrqfQ#)J!x>Qo0Ss2x>5`o6aUtsPRu%Tc-}8 z;DDR5IDw)=L00e}iWg6w%7RA^d+5olSHJH~)1cREWZ_E2P@BQ8k<@f3Pmr4AU zd%*aQ7Wv2UwIA}d_}E}lo)yO#cyD1ye}#DcQ1yjH_%Htb)2Yb&1R0Dky#0!Mcu;Hu zc_dqX2e{BLJSHXm`PXlP@44r(XDym7gN{Z&#m0$N~*3^wOmCl4Gf=)<$UZn5>bBc?HpY-#u&Mb+S#_;tazT*DtH&#~HFUXx0 z&qCqFA68bz#z^M!WfB$&bmwHH^JWj2eG=8qaB+KFY`A^l(ndeFQGtu*8WuSLiL1|k zykC1%TEmt}?EL;(tx=Ntwy*8cjZ_zlpQsO~zq`1A?tAdTenAl4yZYXdKS15#h4449 zxaWi(ivA5&2v zhg?Wp7!8MYKFAxoVT>}>6se+1JKDe~E3p+#l4MRYP?$#fh@8#J5R;y%7Dz&xNmLnh z@JW{E!r=j}!sr}Tc4k;(q@%}@B=RiT6fYSZo0eG}ZP_%NKyN&{(|Ln8P{QDskt80q zeI?M{*{RMu;G#e8^!0f+>hR6a`kLE$=UL~*OP{&>Yk4~y|M-j7;@kVR`o^By=WK7> zEA`p68tMyIuAs$T$Hl$9EB;+#bWU!)hw{HHaNZ6TRR1+C{=HF(3r8T4<0fr^K*Nd& z2)%=tU?U_nnL9Xc+C7E||3~N~dL?m^&g<|Qo$H8!;}h|I4o)`HgA0c1m2OBrVG^{F z#M8^wEN5^X`6(&L7`O~}KyqP3<_Zv8Q7fjUbdZ-Nj?r1DnvxH3G03vgs5Zx?Wu4Q-UzZ_2h&AoBAeFFaB+uIo%LGDdHU(3AVl2~c13Cp+w(rgN@jhdVR_z- z?X|u7d!Gt!ob0IHXfzwOTFLV4#@@y~cN-Vb$>BByhR|8h=<1XcSGUE5V7UlgJ9<*W zmirgSc1k4|kz2B&ozU@6jXYIQ9Llmla0m_y2?SU?fyLc5xI4SJTOhCjmf)@df@{#= z9^7GB+%+6*@c_Y{gvYt>ecaDC)l=2g(^b>c-PIq{g62aISDEA&OBU>sA5z^>WtBFS zDwi6;+_Yh&#&VF1jJKkpgDAH((RnwEedoz?x2pEyT2;jz4jCgmD)d@%Bf>2JT-oru zI8y%F2{pLfx^U=EfA^~}OePJmTuFQ4EWTm&qQ~49{PZ_W*#_mT?)t6sW|lS9N}`9bs39&_4NY4f~N@3XXR{E165t{{Ay~XpiVarR8yI$7GPJJ z`F8D1S%^D`fXmxt(ms+OEIg;T`tGGF^cy%|YYTy=8&d_ww2HMuUeV}yVuaRuXC46) zf`&;DLp&sHsM;G?rCc)+TlnFJJMiV7@EkXHGx2UemnyBFPR?JC<6&LXJ=(hpIoaoO zj+|ysm)QnRmCJq;rdr(kvv!{nrwwnb@AfQ)Fer49;Kd_{n#n&6ZbqEUY&u%`ieJiMVFy{S3Z7J zujPn#gn%Q%PEiXeD1B%HBt5d{1bti9x6X+Lqr{L0$2df7Q91B@%?4XIqkKIF`GKylx4sb=F#0shB_aY%lEY zs@vqWS=;-*c63qgvUu)W?a5&l@w<>;^Wv!&!`mH=()tWp3}RPjH-1(+KdeahZO<}z z*0WGezOmz@Ylg^8(u}|=CEF_l-LwHpVf4(PCcW!QlF$FRti=Yg))}q)Md3is&QH_3rT<;E-zqeVz5yNznv683glcR&|mHE5QMlOl^ zV+J<-Syd(4QM}-PZ~#QunltcVrJvcePfjE)F zv+pTbn&mY{5b|}-@>!_USGtQN;Cy=EgGp2{p4LV2H<$8}LXg_r< z2%F=C{XzzRiqWJye>e{HrVhrNq)sQHBABoWXCC_=u4knT*36533{PgB$T%e3g$;pg z(lHU7=>dz?D805G(5dXhH_eCdSpgT)ELT=b>_?^H%HbES9@`e_!< zDU;RZRyxR1Zo7%`x03#L5~nFXe>{j=**s1)t|vBrqyXc$a5IB2qo(>Zi^F&h&!+>x7L^MW^*mguqz+M$?y(yH`|r}wU=(RReWg%P=r zSg^xhze_gI2fP@;j%taC# z$T!_3SC4iFc9`C>+ntq;*F}BRqN_Sno#_2q@IL zVOUw{Rqg*xdk#a05VZ)=xPhsiGQ#ts1|0|6UV?9_Tya`T4-NdGH2%V`cU#hplwPz5 z;qrlp>S}QIzA3nQK5p6EExiFAv4$HaBHW1;9TN)5khV)r0s#iwpCqWR1;yu04?ZZf zvuX*_-XG>@Z@{k8t<1fef8P+IgV0EXM5~^IcG`o)JL8fFgt;Z8jv(-i{kGO1~+cJvfT!Wthu zL%|}K8c+lCRl)4}-4-ZU&8Qc#;(F^i%>#2YXs9UP7)rR&J7y>J@qT%Ei!EN5N62e$ zLllv1n*=o+=^+_=Vg780+xe$ZJpVZyFn;D^t)*MJLwcXIyGVLk4}2`){;GL$XkpR|QC4`vNtE7f^*v4}R)P-)y+ zzSLQzqm1kc+rLj)k0siLxqes?Q4B-pRvaFA80?ZJ^Q{{6+sMF#&U=3FVK1IN_*}ok z81h0gz|xydHg0jVs=1@i)#baxIzq(Q-8ZVg%6O2ct)}0(tE=uuqMJ0{eOcB=GJ&dh zj^nm>y9G7c^;4dX-F8wOftQT%#Oa}QUWfz~rU+YMK-SsI#Cg8je z8Wv;a^et*Oa8THlEIdLCPCsXh^e%9hIKY>$+NzPv)yJ2iIg?TtJpfz?zpiTUWuB|ZB(ymobI8VmE;CYwgHN%^H*)YsD^e6dR3obm}(sOm^ij>64o z7{bi7)K7_Br4lyrOM7gv_Y6fw5FPlmw9wS|;Ue``*2T@iFYRlt2o~=TKLA1+*7Z#k zB$d2gu*A~G(=JEt#2dKN`0Dvw4uB}mZXgg`OV3fm25ryLc&t!YlOK*ob!lA<3ZBPq zV&sr+eIlO$eQ^h`ocP#e@nf3!X0MNS(#jh$w{)x3$Qi(FVzfUD-01te(666^YU@YO z>lGFF)pV0|sa5;&gkg_k>qV)_VaItt!5ETctjT0tYolOej*<$C+2M7iElYhN%O}fY zw+ee+Fsd8(affcogOWZzQ?pBpDV^`NhMkfzzV`JmjR^7Cs^#jt^M_9ae`(xT(^}kU zlX_0V@TmQ}aQ>_|o;+;HjDjLLO}$09C^~i8ghY8?oJk%C37~+&X+p8zr`pi$?^l`V zv;3OL%wf>lnm%x7Se|oBL!q(xtRhC{K)?g@q(yrv^0}+a!6*whQ~zoS$;C$+9*)Xv zexu=Cb%=b&g-O2qI1{MDO@W8pRI$d%x!#_sd2=`4YStnZ)tdh8up2)<0M%oFOzi=~ zzmO-(rO&d4h9p?YUviibQ)B`4;Oy#i4AlACJU#*{p&C5Qq0C0x?oTmD<~v%9Yo-(3 zbhUw%QUq381gk;Z^uRO-LYq8ug3Y# zlvBj7nKD5E*cJ*i)z%@aax`}d4)q7)2$r3^7Nf4pamRQrWyv--SY^Gj7in%Ma7=7- z%_P1hShr_MeUJZ~rhCYtm)`j}i6mqCk_^Qu+bEgbh~U%GE*_{} zBP(BVBXCwO7ME$e6B4EEkTxOD1x#vuUwWt~#vebOSPoIvOT(4r_7~HhfZ}mcD<%1S zErpy0Pqn7&CX(9Zb{_cHQWQJtiy#94J_wxDSf$et3t0AgOA?LS07o*rD@U|U4tzZ zfS2?q$bfJ>dwR}Y*!{y^vusQ|#Ku)6^zY5kTE}+^LrFz zdNI?iVH_E9S+By|PXZakczAd{?CJD$j&#U($fnG7?2>Jgm!YqW2&)Cle5WeQk28oK|Yk_St+AwYS>J<<(j)~=ENlIH?=}=51SJs^s0ffM zim_V%WmJS6Y%ibrDk?uR@hq~IuE2cGpD~yBovDI+?-LMp<9SvW&}$<2Z{L`}eO z-@I_MUWxPT1D376!Hq1-k~MB}^efLkn=? zglSiU??;59ZJNUo59$UEuLi(0M|_zcU^>SHamPC!8O)I9dnB!1BP#Z@njSx|w0g9; z9clQjVAvvn(=)>d9ovAQEOGf&znPKq3oFD`L(gx#eATSTJIHjq;BuCb=M4HZ*+=Vj zW;5;gXcye-f1FvA=;N*z z?!LE+JS2&bL|UyM3I3!>9G?X^k$tr$1?s|bV_Tmxrn+sa*HuD$%?~YcJv%P_Pm8{U z%!ZYuysTepJDC%vck^O(WNh0wYvY{rsDl|}e5tpeji#BzG2NL`qBPUYC{33+EfXQZ z&eQeVjV3CSbkNKO()CiN1Z6WgLnxggs%X2F`&pvBfFdh-75~>*t$WRPA7v$RiSsz` zE@b@eSE*fwL#l z$>xVp6FrSXM=pi6pgc<%0gqH9i7mk2p|V446(^C$0I-1Z1>U2?0E{It#=?{V1V zrU+MGY5@XIWQq$Tc{Y`SV*Bx82GQu%G+6ll&iv2VEMRfx5JL=DJATPjQx2vgnNbjw?a2|LYXa>C5w8 z?gmR3yCUq$dv8S4y$Du%)ZUeMMUs6--XQ1D{Ax~Q!gzL)X4?I(nd7IFNZ%Du4|-hc zLZ4+86kCjWDfiYS->~6drB0{PIfbrzzH)|8e^KE8@p0|Ji-Y~QM&c^4MgnC`Ju_E1 zrN9(u5_*Ui?sAMvpEN_T6}c4ftRH|aLC%mzTIU?j{R}_IPxD$R_tlePS3>V;OpXW< z3JN+JUFu}T_9T%4b^yxjfhqXzM8}JLv?&bDeY8kVRJs3-2zYce7(@sEN0xYiI``8N zp-3l0zU@LMQFbf)J(t0>WqpM+!>cp!3zURM_utUQ1o*H~R*Ba`h1#`^7Ww}L%L(t$ zm;OWWA60;KB=pD{JArZ0M+-`vv@c<$ATM9h?L>VG#X{@tX zOhz%W*3#iGabhS{w=#xv#|FL#ZRvaYXWwq|)Q4O_?D>y#f_vTGftggkA-`5e> zQn%&7tq-%a&1`~G7;Z67DuCwXm%3SwLG{X4@BId#aJl|II~&O>M&5GSwYMwE_5Cps zavCXq!~87I{P^!Z&#FFd4f4xwFJ|qoLpK8;d|`J%d)*(jpj{3{ESo{%N;h-vmW&K3 zlncSQos1^lJi2lm`^25LiQAZMD4@-75Uxrlj$K(35RyEndTEym{LMdZIH{XPVZXemlC0;{LT+AN{%K~k+4JS(oVhfAoOMwNl-}s6!V;GF@wWSX(H7)UNlavM^Dw``K>W%ph zBy9cZcqNAw)edFq&o>GxZRP0h0{`IfXDZyC#kzpu6$R>; zV-)M~*t>7VX=8ovba%ys=xAFMYYV#>!Ir_^?sb4BK4%pk?e}f=Ov^Lv53gylUi|Iw zdLTGg!`Z=TLs8$12FZM}2Lm9_Rqt3z8h`J3IlA+85ry^94l1-;SmHjE`F+b;3g!F2 z%cP^kKm*e{CD*gCoWc$%Ko3Xuw7e4-FweAl=Vov-$O6c7cSVXah+Zeq{ozz~DXvsK zHf;FJE#LZVL@S{}yf47di7)QV8bK1TviKSoLPove_<_Vvg&_aYpW?fF!*j1X5^<$) z_t7|OWdU>yQy8A8kib|ez`qC&8suMO2>Y2P^`FBDs$OA+f4S7n5jaPZKWnUBqnJ~M zTRi1WYqXQo{IJ3H2{r#ZgfTUQK{WjThPZ7ciir^*kQYttBdXkg0sftbJE}Jc|0(Pt R5sLD>l;qXrs%6ZB{|E8L+?N0V literal 0 HcmV?d00001 diff --git a/inc/vendors/cmb2-plugins/cmb2/custom-fields/user/assets/script.js b/inc/vendors/cmb2-plugins/cmb2/custom-fields/user/assets/script.js new file mode 100755 index 00000000..03d5becb --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/custom-fields/user/assets/script.js @@ -0,0 +1,49 @@ +(function( $ ) { + 'use strict'; + $( document ).ready( function() { + + + $( ".adduser-team" ).delegate( ".remove-user", "click", function() { + if( confirm( $(this).data('alert') ) ){ + $(this).parents( '.user-team' ).remove(); + } + }); + + $( '.opalestate-add-user-field' ).each( function() { + var $this = $(this); + $('.button', this).click( function () { + + + var user_search = $( '.opalestate-adduser-search', $(this).parent().parent() ).val(); + + + $('.opalestate-ajax').show(); + + var data = { + action: 'opalestate_ajax_search_username', + user_name: user_search, + + }; + + + + $.ajax({ + type: "POST", + data: data, + dataType: "json", + url: ajaxurl, + success: function ( response ) { + if( response.status == true ){ + var template = wp.template( 'adduser-team-template' ); + $('.adduser-team', $this ).append( template( response.user ) ); + }else { + alert( response.message ); + } + } + }); + + } ); + } ); + } ); + +})( jQuery ); \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2/custom-fields/user/assets/style.css b/inc/vendors/cmb2-plugins/cmb2/custom-fields/user/assets/style.css new file mode 100755 index 00000000..aa9106a3 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/custom-fields/user/assets/style.css @@ -0,0 +1,29 @@ +.adduser-team{ + width: 80%; +} +.user-team{ + padding: 12px 10px; + display: block; + border-bottom: solid 1px #f3f3f3 +} +.user-team > div{ + display: inline-block; + width: 33%; + +} + +.user-team > div img{ + width: 30px; + height: 30px; + border: solid 3px #CCC; + border-radius: 50%; + float: left; + margin-right: 6px; +} + +.remove-user { + cursor: pointer; +} +.remove-user:hover { + color: red; +} \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php b/inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php new file mode 100755 index 00000000..4561f746 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php @@ -0,0 +1,100 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} +class Opalestate_Field_Adduser { + + /** + * Current version number + */ + const VERSION = '1.0.0'; + + /** + * Initialize the plugin by hooking into CMB2 + */ + public static function init() { + add_filter( 'cmb2_render_adduser', array( __CLASS__, 'render_map' ), 10, 5 ); + add_filter( 'cmb2_sanitize_adduser', array( __CLASS__, 'sanitize_map' ), 10, 4 ); + } + + /** + * Render field + */ + public static function render_map( $field, $field_escaped_value, $field_object_id, $field_object_type, $field_type_object ) { + self::setup_admin_scripts(); + + $users = $field->value; + + // echo '
              '.print_r( $value, 1 );die;
              +		echo '
              '; ?> +
              +
              +
              +

              + +
              + +
              +
              +
              +
              +
              +
              + + + data ?> +
              + + +
              +
              + + + +
              +
              + + + + '; + } + + /** + * Optionally save the latitude/longitude values into two custom fields + */ + public static function sanitize_map( $override_value, $value, $object_id, $field_args ) { + + return $value; + } + + /** + * Enqueue scripts and styles + */ + public static function setup_admin_scripts() { + wp_enqueue_script( 'opalestate-adduser', plugins_url( 'assets/script.js', __FILE__ ), array( ), self::VERSION ); + wp_enqueue_style( 'opalestate-adduser', plugins_url( 'assets/style.css', __FILE__ ), array(), self::VERSION ); + } +} + +Opalestate_Field_Adduser::init(); diff --git a/inc/vendors/cmb2-plugins/cmb2/images/ico-delete.png b/inc/vendors/cmb2-plugins/cmb2/images/ico-delete.png new file mode 100755 index 0000000000000000000000000000000000000000..08f249365afd29594b51210c6e21ba253897505d GIT binary patch literal 715 zcmV;+0yO=JP)C4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/inc/vendors/cmb2-plugins/cmb2/images/index.php b/inc/vendors/cmb2-plugins/cmb2/images/index.php new file mode 100755 index 00000000..eea59b98 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/images/index.php @@ -0,0 +1,2 @@ +N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/inc/vendors/cmb2-plugins/cmb2/images/ui-bg_flat_75_ffffff_40x100.png b/inc/vendors/cmb2-plugins/cmb2/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100755 index 0000000000000000000000000000000000000000..ac8b229af950c29356abf64a6c4aa894575445f0 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= literal 0 HcmV?d00001 diff --git a/inc/vendors/cmb2-plugins/cmb2/images/ui-bg_glass_55_fbf9ee_1x400.png b/inc/vendors/cmb2-plugins/cmb2/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..ad3d6346e00f246102f72f2e026ed0491988b394 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v literal 0 HcmV?d00001 diff --git a/inc/vendors/cmb2-plugins/cmb2/images/ui-bg_glass_65_ffffff_1x400.png b/inc/vendors/cmb2-plugins/cmb2/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..42ccba269b6e91bef12ad0fa18be651b5ef0ee68 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/inc/vendors/cmb2-plugins/cmb2/images/ui-bg_glass_75_dadada_1x400.png b/inc/vendors/cmb2-plugins/cmb2/images/ui-bg_glass_75_dadada_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..5a46b47cb16631068aee9e0bd61269fc4e95e5cd GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uP{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse literal 0 HcmV?d00001 diff --git a/inc/vendors/cmb2-plugins/cmb2/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/inc/vendors/cmb2-plugins/cmb2/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100755 index 0000000000000000000000000000000000000000..7c9fa6c6edcfcdd3e5b77e6f547b719e6fc66e30 GIT binary patch literal 101 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 literal 0 HcmV?d00001 diff --git a/inc/vendors/cmb2-plugins/cmb2/images/ui-icons_2e83ff_256x240.png b/inc/vendors/cmb2-plugins/cmb2/images/ui-icons_2e83ff_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..09d1cdc856c292c4ab6dd818c7543ac0828bd616 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/inc/vendors/cmb2-plugins/cmb2/images/ui-icons_454545_256x240.png b/inc/vendors/cmb2-plugins/cmb2/images/ui-icons_454545_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..59bd45b907c4fd965697774ce8c5fc6b2fd9c105 GIT binary patch literal 4369 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 '', + 'title' => '', + // Post type slug, or 'user', 'term', 'comment', or 'options-page'. + 'object_types' => array(), + + /** + * The context within the screen where the boxes should display. Available contexts vary + * from screen to screen. Post edit screen contexts include 'normal', 'side', and 'advanced'. + * + * For placement in locations outside of a metabox, other options include: + * 'form_top', 'before_permalink', 'after_title', 'after_editor' + * + * Comments screen contexts include 'normal' and 'side'. Default is 'normal'. + */ + 'context' => 'normal', + 'priority' => 'high', + 'show_names' => true, // Show field names on the left. + 'show_on_cb' => null, // Callback to determine if metabox should display. + 'show_on' => array(), // Post IDs or page templates to display this metabox. overrides 'show_on_cb'. + 'cmb_styles' => true, // Include CMB2 stylesheet. + 'enqueue_js' => true, // Include CMB2 JS. + 'fields' => array(), + + /** + * Handles hooking CMB2 forms/metaboxes into the post/attachement/user/options-page screens + * and handles hooking in and saving those fields. + */ + 'hookup' => true, + 'save_fields' => true, // Will not save during hookup if false. + 'closed' => false, // Default metabox to being closed. + 'taxonomies' => array(), + 'new_user_section' => 'add-new-user', // or 'add-existing-user'. + 'new_term_section' => true, + 'show_in_rest' => false, + 'classes' => null, // Optionally add classes to the CMB2 wrapper. + 'classes_cb' => '', // Optionally add classes to the CMB2 wrapper (via a callback). + + /* + * The following parameter is for post alternate-context metaboxes only. + * + * To output the fields 'naked' (without a postbox wrapper/style), then + * add a `'remove_box_wrap' => true` to your metabox registration array. + */ + 'remove_box_wrap' => false, + + /* + * The following parameter is any additional arguments passed as $callback_args + * to add_meta_box, if/when applicable. + * + * CMB2 does not use these arguments in the add_meta_box callback, however, these args + * are parsed for certain special properties, like determining Gutenberg/block-editor + * compatibility. + * + * Examples: + * + * - Make sure default editor is used as metabox is not compatible with block editor + * [ '__block_editor_compatible_meta_box' => false/true ] + * + * - Or declare this box exists for backwards compatibility + * [ '__back_compat_meta_box' => false ] + * + * More: https://wordpress.org/gutenberg/handbook/extensibility/meta-box/ + */ + 'mb_callback_args' => null, + + /* + * The following parameters are for options-page metaboxes, + * and several are passed along to add_menu_page()/add_submenu_page() + */ + + // 'menu_title' => null, // Falls back to 'title' (above). Do not define here so we can set a fallback. + 'message_cb' => '', // Optionally define the options-save message (via a callback). + 'option_key' => '', // The actual option key and admin menu page slug. + 'parent_slug' => '', // Used as first param in add_submenu_page(). + 'capability' => 'manage_options', // Cap required to view options-page. + 'icon_url' => '', // Menu icon. Only applicable if 'parent_slug' is left empty. + 'position' => null, // Menu position. Only applicable if 'parent_slug' is left empty. + + 'admin_menu_hook' => 'admin_menu', // Alternately 'network_admin_menu' to add network-level options page. + 'display_cb' => false, // Override the options-page form output (CMB2_Hookup::options_page_output()). + 'save_button' => '', // The text for the options-page save button. Defaults to 'Save'. + 'disable_settings_errors' => false, // On settings pages (not options-general.php sub-pages), allows disabling. + 'tab_group' => '', // Tab-group identifier, enables options page tab navigation. + // 'tab_title' => null, // Falls back to 'title' (above). Do not define here so we can set a fallback. + // 'autoload' => true, // Defaults to true, the options-page option will be autloaded. + ); + + /** + * Metabox field objects + * + * @var array + * @since 2.0.3 + */ + protected $fields = array(); + + /** + * An array of hidden fields to output at the end of the form + * + * @var array + * @since 2.0.0 + */ + protected $hidden_fields = array(); + + /** + * Array of key => value data for saving. Likely $_POST data. + * + * @var string + * @since 2.0.0 + */ + protected $generated_nonce = ''; + + /** + * Whether there are fields to be shown in columns. Set in CMB2::add_field(). + * + * @var bool + * @since 2.2.2 + */ + protected $has_columns = false; + + /** + * If taxonomy field is requesting to remove_default, we store the taxonomy here. + * + * @var array + * @since 2.2.3 + */ + protected $tax_metaboxes_to_remove = array(); + + /** + * Get started + * + * @since 0.4.0 + * @param array $config Metabox config array. + * @param integer $object_id Optional object id. + */ + public function __construct( $config, $object_id = 0 ) { + + if ( empty( $config['id'] ) ) { + wp_die( esc_html__( 'Metabox configuration is required to have an ID parameter.', 'cmb2' ) ); + } + + $this->cmb_id = $config['id']; + $this->meta_box = wp_parse_args( $config, $this->mb_defaults ); + $this->meta_box['fields'] = array(); + + // Ensures object_types is an array. + $this->set_prop( 'object_types', $this->box_types() ); + $this->object_id( $object_id ); + + if ( $this->is_options_page_mb() ) { + $this->init_options_mb(); + } + + $this->mb_object_type(); + + if ( ! empty( $config['fields'] ) && is_array( $config['fields'] ) ) { + $this->add_fields( $config['fields'] ); + } + + CMB2_Boxes::add( $this ); + + /** + * Hook during initiation of CMB2 object + * + * The dynamic portion of the hook name, $this->cmb_id, is this meta_box id. + * + * @param array $cmb This CMB2 object + */ + do_action( "cmb2_init_{$this->cmb_id}", $this ); + + // Hook in the hookup... how meta. + add_action( "cmb2_init_hookup_{$this->cmb_id}", array( 'CMB2_hookup', 'maybe_init_and_hookup' ) ); + + // Hook in the rest api functionality. + add_action( "cmb2_init_hookup_{$this->cmb_id}", array( 'CMB2_REST', 'maybe_init_and_hookup' ) ); + } + + /** + * Loops through and displays fields + * + * @since 1.0.0 + * @param int $object_id Object ID. + * @param string $object_type Type of object being saved. (e.g., post, user, or comment). + * + * @return CMB2 + */ + public function show_form( $object_id = 0, $object_type = '' ) { + $this->render_form_open( $object_id, $object_type ); + + foreach ( $this->prop( 'fields' ) as $field_args ) { + $this->render_field( $field_args ); + } + + return $this->render_form_close( $object_id, $object_type ); + } + + /** + * Outputs the opening form markup and runs corresponding hooks: + * 'cmb2_before_form' and "cmb2_before_{$object_type}_form_{$this->cmb_id}" + * + * @since 2.2.0 + * @param integer $object_id Object ID. + * @param string $object_type Object type. + * + * @return CMB2 + */ + public function render_form_open( $object_id = 0, $object_type = '' ) { + $object_type = $this->object_type( $object_type ); + $object_id = $this->object_id( $object_id ); + + echo "\n\n"; + + $this->nonce_field(); + + /** + * Hook before form table begins + * + * @param array $cmb_id The current box ID. + * @param int $object_id The ID of the current object. + * @param string $object_type The type of object you are working with. + * Usually `post` (this applies to all post-types). + * Could also be `comment`, `user` or `options-page`. + * @param array $cmb This CMB2 object. + */ + do_action( 'cmb2_before_form', $this->cmb_id, $object_id, $object_type, $this ); + + /** + * Hook before form table begins + * + * The first dynamic portion of the hook name, $object_type, is the type of object + * you are working with. Usually `post` (this applies to all post-types). + * Could also be `comment`, `user` or `options-page`. + * + * The second dynamic portion of the hook name, $this->cmb_id, is the meta_box id. + * + * @param array $cmb_id The current box ID + * @param int $object_id The ID of the current object + * @param array $cmb This CMB2 object + */ + do_action( "cmb2_before_{$object_type}_form_{$this->cmb_id}", $object_id, $this ); + + echo '

              '; + + return $this; + } + + /** + * Defines the classes for the CMB2 form/wrap. + * + * @since 2.0.0 + * @return string Space concatenated list of classes + */ + public function box_classes() { + + $classes = array( 'cmb2-wrap', 'form-table' ); + + // Use the callback to fetch classes. + if ( $added_classes = $this->get_param_callback_result( 'classes_cb' ) ) { + $added_classes = is_array( $added_classes ) ? $added_classes : array( $added_classes ); + $classes = array_merge( $classes, $added_classes ); + } + + if ( $added_classes = $this->prop( 'classes' ) ) { + $added_classes = is_array( $added_classes ) ? $added_classes : array( $added_classes ); + $classes = array_merge( $classes, $added_classes ); + } + + /** + * Add our context classes for non-standard metaboxes. + * + * @since 2.2.4 + */ + if ( $this->is_alternate_context_box() ) { + $context = array(); + + // Include custom class if requesting no title. + if ( ! $this->prop( 'title' ) && ! $this->prop( 'remove_box_wrap' ) ) { + $context[] = 'cmb2-context-wrap-no-title'; + } + + // Include a generic context wrapper. + $context[] = 'cmb2-context-wrap'; + + // Include a context-type based context wrapper. + $context[] = 'cmb2-context-wrap-' . $this->prop( 'context' ); + + // Include an ID based context wrapper as well. + $context[] = 'cmb2-context-wrap-' . $this->prop( 'id' ); + + // And merge all the classes back into the array. + $classes = array_merge( $classes, $context ); + } + + /** + * Globally filter box wrap classes + * + * @since 2.2.2 + * + * @param string $classes Array of classes for the cmb2-wrap. + * @param CMB2 $cmb This CMB2 object. + */ + $classes = apply_filters( 'cmb2_wrap_classes', $classes, $this ); + + // Clean up. + $classes = array_map( 'strip_tags', array_filter( $classes ) ); + + // Remove any duplicates. + $classes = array_unique( $classes ); + + // Make a string. + return implode( ' ', $classes ); + } + + /** + * Outputs the closing form markup and runs corresponding hooks: + * 'cmb2_after_form' and "cmb2_after_{$object_type}_form_{$this->cmb_id}" + * + * @since 2.2.0 + * @param integer $object_id Object ID. + * @param string $object_type Object type. + * + * @return CMB2 + */ + public function render_form_close( $object_id = 0, $object_type = '' ) { + $object_type = $this->object_type( $object_type ); + $object_id = $this->object_id( $object_id ); + + echo '
              '; + + $this->render_hidden_fields(); + + /** + * Hook after form form has been rendered + * + * The dynamic portion of the hook name, $this->cmb_id, is the meta_box id. + * + * The first dynamic portion of the hook name, $object_type, is the type of object + * you are working with. Usually `post` (this applies to all post-types). + * Could also be `comment`, `user` or `options-page`. + * + * @param int $object_id The ID of the current object + * @param array $cmb This CMB2 object + */ + do_action( "cmb2_after_{$object_type}_form_{$this->cmb_id}", $object_id, $this ); + + /** + * Hook after form form has been rendered + * + * @param array $cmb_id The current box ID. + * @param int $object_id The ID of the current object. + * @param string $object_type The type of object you are working with. + * Usually `post` (this applies to all post-types). + * Could also be `comment`, `user` or `options-page`. + * @param array $cmb This CMB2 object. + */ + do_action( 'cmb2_after_form', $this->cmb_id, $object_id, $object_type, $this ); + + echo "\n\n"; + + return $this; + } + + /** + * Renders a field based on the field type + * + * @since 2.2.0 + * @param array $field_args A field configuration array. + * @return mixed CMB2_Field object if successful. + */ + public function render_field( $field_args ) { + $field_args['context'] = $this->prop( 'context' ); + + if ( 'group' === $field_args['type'] ) { + + if ( ! isset( $field_args['show_names'] ) ) { + $field_args['show_names'] = $this->prop( 'show_names' ); + } + $field = $this->render_group( $field_args ); + + } elseif ( 'hidden' === $field_args['type'] && $this->get_field( $field_args )->should_show() ) { + // Save rendering for after the metabox. + $field = $this->add_hidden_field( $field_args ); + + } else { + + $field_args['show_names'] = $this->prop( 'show_names' ); + + // Render default fields. + $field = $this->get_field( $field_args )->render_field(); + } + + return $field; + } + + /** + * Render a group of fields. + * + * @param array|CMB2_Field $args Array of field arguments for a group field parent or the group parent field. + * @return CMB2_Field|null Group field object. + */ + public function render_group( $args ) { + $field_group = false; + + if ( $args instanceof CMB2_Field ) { + $field_group = 'group' === $args->type() ? $args : false; + } elseif ( isset( $args['id'], $args['fields'] ) && is_array( $args['fields'] ) ) { + $field_group = $this->get_field( $args ); + } + + if ( ! $field_group ) { + return; + } + + $field_group->render_context = 'edit'; + $field_group->peform_param_callback( 'render_row_cb' ); + + return $field_group; + } + + /** + * The default callback to render a group of fields. + * + * @since 2.2.6 + * + * @param array $field_args Array of field arguments for the group field parent. + * @param CMB2_Field $field_group The CMB2_Field group object. + * + * @return CMB2_Field|null Group field object. + */ + public function render_group_callback( $field_args, $field_group ) { + + // If field is requesting to be conditionally shown. + if ( ! $field_group || ! $field_group->should_show() ) { + return; + } + + $field_group->index = 0; + + $field_group->peform_param_callback( 'before_group' ); + + $desc = $field_group->args( 'description' ); + $label = $field_group->args( 'name' ); + $group_val = (array) $field_group->value(); + + echo '
              group_wrap_attributes( $field_group ), '>'; + + if ( $desc || $label ) { + $class = $desc ? ' cmb-group-description' : ''; + echo '
              '; + if ( $label ) { + echo '

              ', $label, '

              '; + } + if ( $desc ) { + echo '

              ', $desc, '

              '; + } + echo '
              '; + } + + if ( ! empty( $group_val ) ) { + foreach ( $group_val as $group_key => $field_id ) { + $this->render_group_row( $field_group ); + $field_group->index++; + } + } else { + $this->render_group_row( $field_group ); + } + + if ( $field_group->args( 'repeatable' ) ) { + echo '

              '; + } + + echo '
              '; + + $field_group->peform_param_callback( 'after_group' ); + + return $field_group; + } + + /** + * Get the group wrap attributes, which are passed through a filter. + * + * @since 2.2.3 + * @param CMB2_Field $field_group The group CMB2_Field object. + * @return string The attributes string. + */ + public function group_wrap_attributes( $field_group ) { + $classes = 'cmb-nested cmb-field-list cmb-repeatable-group'; + $classes .= $field_group->options( 'sortable' ) ? ' sortable' : ' non-sortable'; + $classes .= $field_group->args( 'repeatable' ) ? ' repeatable' : ' non-repeatable'; + + $group_wrap_attributes = array( + 'class' => $classes, + 'style' => 'width:100%;', + ); + + /** + * Allow for adding additional HTML attributes to a group wrapper. + * + * The attributes will be an array of key => value pairs for each attribute. + * + * @since 2.2.2 + * + * @param string $group_wrap_attributes Current attributes array. + * @param CMB2_Field $field_group The group CMB2_Field object. + */ + $group_wrap_attributes = apply_filters( 'cmb2_group_wrap_attributes', $group_wrap_attributes, $field_group ); + + $atts = array(); + foreach ( $group_wrap_attributes as $att => $att_value ) { + if ( ! CMB2_Utils::is_data_attribute( $att ) ) { + $att_value = htmlspecialchars( $att_value ); + } + + $atts[ sanitize_html_class( $att ) ] = sanitize_text_field( strip_tags( $att_value ) ); + } + + return CMB2_Utils::concat_attrs( $atts ); + } + + /** + * Render a repeatable group row + * + * @since 1.0.2 + * @param CMB2_Field $field_group CMB2_Field group field object. + * + * @return CMB2 + */ + public function render_group_row( $field_group ) { + + $field_group->peform_param_callback( 'before_group_row' ); + $closed_class = $field_group->options( 'closed' ) ? ' closed' : ''; + $confirm_deletion = $field_group->options( 'remove_confirm' ); + $confirm_deletion = ! empty( $confirm_deletion ) ? $confirm_deletion : ''; + + echo ' +
              '; + + if ( $field_group->args( 'repeatable' ) ) { + echo ''; + } + + echo ' +

              +

              ', $field_group->replace_hash( $field_group->options( 'group_title' ) ), '

              + +
              '; + // Loop and render repeatable group fields. + foreach ( array_values( $field_group->args( 'fields' ) ) as $field_args ) { + if ( 'hidden' === $field_args['type'] ) { + + // Save rendering for after the metabox. + $this->add_hidden_field( $field_args, $field_group ); + + } else { + + $field_args['show_names'] = $field_group->args( 'show_names' ); + $field_args['context'] = $field_group->args( 'context' ); + + $this->get_field( $field_args, $field_group )->render_field(); + } + } + + if ( $field_group->args( 'repeatable' ) ) { + echo ' +
              +
              + +
              +
              + '; + } + echo ' +
              +
              + '; + + $field_group->peform_param_callback( 'after_group_row' ); + + return $this; + } + + /** + * Add a hidden field to the list of hidden fields to be rendered later. + * + * @since 2.0.0 + * + * @param array $field_args Array of field arguments to be passed to CMB2_Field. + * @param CMB2_Field|null $field_group CMB2_Field group field object. + * @return CMB2_Field + */ + public function add_hidden_field( $field_args, $field_group = null ) { + if ( isset( $field_args['field_args'] ) ) { + // For back-compatibility. + $field = new CMB2_Field( $field_args ); + } else { + $field = $this->get_new_field( $field_args, $field_group ); + } + + $types = new CMB2_Types( $field ); + + if ( $field_group ) { + $types->iterator = $field_group->index; + } + + $this->hidden_fields[] = $types; + + return $field; + } + + /** + * Loop through and output hidden fields + * + * @since 2.0.0 + * + * @return CMB2 + */ + public function render_hidden_fields() { + if ( ! empty( $this->hidden_fields ) ) { + foreach ( $this->hidden_fields as $hidden ) { + $hidden->render(); + } + } + + return $this; + } + + /** + * Returns array of sanitized field values (without saving them) + * + * @since 2.0.3 + * @param array $data_to_sanitize Array of field_id => value data for sanitizing (likely $_POST data). + * @return mixed + */ + public function get_sanitized_values( array $data_to_sanitize ) { + $this->data_to_save = $data_to_sanitize; + $stored_id = $this->object_id(); + + // We do this So CMB will sanitize our data for us, but not save it. + $this->object_id( '_' ); + + // Ensure temp. data store is empty. + cmb2_options( 0 )->set(); + + // We want to get any taxonomy values back. + add_filter( "cmb2_return_taxonomy_values_{$this->cmb_id}", '__return_true' ); + + // Process/save fields. + $this->process_fields(); + + // Put things back the way they were. + remove_filter( "cmb2_return_taxonomy_values_{$this->cmb_id}", '__return_true' ); + + // Get data from temp. data store. + $sanitized_values = cmb2_options( 0 )->get_options(); + + // Empty out temp. data store again. + cmb2_options( 0 )->set(); + + // Reset the object id. + $this->object_id( $stored_id ); + + return $sanitized_values; + } + + /** + * Loops through and saves field data + * + * @since 1.0.0 + * @param int $object_id Object ID. + * @param string $object_type Type of object being saved. (e.g., post, user, or comment). + * @param array $data_to_save Array of key => value data for saving. Likely $_POST data. + * + * @return CMB2 + */ + public function save_fields( $object_id = 0, $object_type = '', $data_to_save = array() ) { + + // Fall-back to $_POST data. + $this->data_to_save = ! empty( $data_to_save ) ? $data_to_save : $_POST; + $object_id = $this->object_id( $object_id ); + $object_type = $this->object_type( $object_type ); + + $this->process_fields(); + + // If options page, save the updated options. + if ( 'options-page' === $object_type ) { + cmb2_options( $object_id )->set(); + } + + return $this->after_save(); + } + + /** + * Process and save form fields + * + * @since 2.0.0 + * + * @return CMB2 + */ + public function process_fields() { + + $this->pre_process(); + + // Remove the show_on properties so saving works. + $this->prop( 'show_on', array() ); + + // save field ids of those that are updated. + $this->updated = array(); + + foreach ( $this->prop( 'fields' ) as $field_args ) { + $this->process_field( $field_args ); + } + + return $this; + } + + /** + * Process and save a field + * + * @since 2.0.0 + * @param array $field_args Array of field arguments. + * + * @return CMB2 + */ + public function process_field( $field_args ) { + + switch ( $field_args['type'] ) { + + case 'group': + if ( $this->save_group( $field_args ) ) { + $this->updated[] = $field_args['id']; + } + + break; + + case 'title': + // Don't process title fields. + break; + + default: + $field = $this->get_new_field( $field_args ); + + if ( $field->save_field_from_data( $this->data_to_save ) ) { + $this->updated[] = $field->id(); + } + + break; + } + + return $this; + } + + /** + * Fires the "cmb2_{$object_type}_process_fields_{$cmb_id}" action hook. + * + * @since 2.2.2 + * + * @return CMB2 + */ + public function pre_process() { + $object_type = $this->object_type(); + + /** + * Fires before fields have been processed/saved. + * + * The dynamic portion of the hook name, $object_type, refers to the + * metabox/form's object type + * Usually `post` (this applies to all post-types). + * Could also be `comment`, `user` or `options-page`. + * + * The dynamic portion of the hook name, $this->cmb_id, is the meta_box id. + * + * @param array $cmb This CMB2 object + * @param int $object_id The ID of the current object + */ + do_action( "cmb2_{$object_type}_process_fields_{$this->cmb_id}", $this, $this->object_id() ); + + return $this; + } + + /** + * Fires the "cmb2_save_{$object_type}_fields" and + * "cmb2_save_{$object_type}_fields_{$cmb_id}" action hooks. + * + * @since 2.x.x + * + * @return CMB2 + */ + public function after_save() { + $object_type = $this->object_type(); + $object_id = $this->object_id(); + + /** + * Fires after all fields have been saved. + * + * The dynamic portion of the hook name, $object_type, refers to the metabox/form's object type + * Usually `post` (this applies to all post-types). + * Could also be `comment`, `user` or `options-page`. + * + * @param int $object_id The ID of the current object + * @param array $cmb_id The current box ID + * @param string $updated Array of field ids that were updated. + * Will only include field ids that had values change. + * @param array $cmb This CMB2 object + */ + do_action( "cmb2_save_{$object_type}_fields", $object_id, $this->cmb_id, $this->updated, $this ); + + /** + * Fires after all fields have been saved. + * + * The dynamic portion of the hook name, $this->cmb_id, is the meta_box id. + * + * The dynamic portion of the hook name, $object_type, refers to the metabox/form's object type + * Usually `post` (this applies to all post-types). + * Could also be `comment`, `user` or `options-page`. + * + * @param int $object_id The ID of the current object + * @param string $updated Array of field ids that were updated. + * Will only include field ids that had values change. + * @param array $cmb This CMB2 object + */ + do_action( "cmb2_save_{$object_type}_fields_{$this->cmb_id}", $object_id, $this->updated, $this ); + + return $this; + } + + /** + * Save a repeatable group + * + * @since 1.x.x + * @param array $args Field arguments array. + * @return mixed Return of CMB2_Field::update_data(). + */ + public function save_group( $args ) { + if ( ! isset( $args['id'], $args['fields'] ) || ! is_array( $args['fields'] ) ) { + return; + } + + return $this->save_group_field( $this->get_new_field( $args ) ); + } + + /** + * Save a repeatable group + * + * @since 1.x.x + * @param CMB2_Field $field_group CMB2_Field group field object. + * @return mixed Return of CMB2_Field::update_data(). + */ + public function save_group_field( $field_group ) { + $base_id = $field_group->id(); + + if ( ! isset( $this->data_to_save[ $base_id ] ) ) { + return; + } + + $old = $field_group->get_data(); + // Check if group field has sanitization_cb. + $group_vals = $field_group->sanitization_cb( $this->data_to_save[ $base_id ] ); + $saved = array(); + + $field_group->index = 0; + $field_group->data_to_save = $this->data_to_save; + + foreach ( array_values( $field_group->fields() ) as $field_args ) { + if ( 'title' === $field_args['type'] ) { + // Don't process title fields. + continue; + } + + $field = $this->get_new_field( $field_args, $field_group ); + $sub_id = $field->id( true ); + if ( empty( $saved[ $field_group->index ] ) ) { + $saved[ $field_group->index ] = array(); + } + + foreach ( (array) $group_vals as $field_group->index => $post_vals ) { + + // Get value. + $new_val = isset( $group_vals[ $field_group->index ][ $sub_id ] ) + ? $group_vals[ $field_group->index ][ $sub_id ] + : false; + + // Sanitize. + $new_val = $field->sanitization_cb( $new_val ); + + if ( is_array( $new_val ) && $field->args( 'has_supporting_data' ) ) { + if ( $field->args( 'repeatable' ) ) { + $_new_val = array(); + foreach ( $new_val as $group_index => $grouped_data ) { + // Add the supporting data to the $saved array stack. + $saved[ $field_group->index ][ $grouped_data['supporting_field_id'] ][] = $grouped_data['supporting_field_value']; + // Reset var to the actual value. + $_new_val[ $group_index ] = $grouped_data['value']; + } + $new_val = $_new_val; + } else { + // Add the supporting data to the $saved array stack. + $saved[ $field_group->index ][ $new_val['supporting_field_id'] ] = $new_val['supporting_field_value']; + // Reset var to the actual value. + $new_val = $new_val['value']; + } + } + + // Get old value. + $old_val = is_array( $old ) && isset( $old[ $field_group->index ][ $sub_id ] ) + ? $old[ $field_group->index ][ $sub_id ] + : false; + + $is_updated = ( ! CMB2_Utils::isempty( $new_val ) && $new_val !== $old_val ); + $is_removed = ( CMB2_Utils::isempty( $new_val ) && ! CMB2_Utils::isempty( $old_val ) ); + + // Compare values and add to `$updated` array. + if ( $is_updated || $is_removed ) { + $this->updated[] = $base_id . '::' . $field_group->index . '::' . $sub_id; + } + + // Add to `$saved` array. + $saved[ $field_group->index ][ $sub_id ] = $new_val; + + }// End foreach. + + $saved[ $field_group->index ] = CMB2_Utils::filter_empty( $saved[ $field_group->index ] ); + }// End foreach. + + $saved = CMB2_Utils::filter_empty( $saved ); + + return $field_group->update_data( $saved, true ); + } + + /** + * Get object id from global space if no id is provided + * + * @since 1.0.0 + * @param integer|string $object_id Object ID. + * @return integer|string $object_id Object ID. + */ + public function object_id( $object_id = 0 ) { + global $pagenow; + + if ( $object_id ) { + $this->object_id = $object_id; + return $this->object_id; + } + + if ( $this->object_id ) { + return $this->object_id; + } + + // Try to get our object ID from the global space. + switch ( $this->object_type() ) { + case 'user': + $object_id = isset( $_REQUEST['user_id'] ) ? wp_unslash( $_REQUEST['user_id'] ) : $object_id; + $object_id = ! $object_id && 'user-new.php' !== $pagenow && isset( $GLOBALS['user_ID'] ) ? $GLOBALS['user_ID'] : $object_id; + break; + + case 'comment': + $object_id = isset( $_REQUEST['c'] ) ? wp_unslash( $_REQUEST['c'] ) : $object_id; + $object_id = ! $object_id && isset( $GLOBALS['comments']->comment_ID ) ? $GLOBALS['comments']->comment_ID : $object_id; + break; + + case 'term': + $object_id = isset( $_REQUEST['tag_ID'] ) ? wp_unslash( $_REQUEST['tag_ID'] ) : $object_id; + break; + + case 'options-page': + $key = $this->doing_options_page(); + if ( ! empty( $key ) ) { + $object_id = $key; + } + break; + + default: + $object_id = isset( $GLOBALS['post']->ID ) ? $GLOBALS['post']->ID : $object_id; + $object_id = isset( $_REQUEST['post'] ) ? wp_unslash( $_REQUEST['post'] ) : $object_id; + break; + } + + // reset to id or 0. + $this->object_id = $object_id ? $object_id : 0; + + return $this->object_id; + } + + /** + * Sets the $object_type based on metabox settings + * + * @since 1.0.0 + * @return string Object type. + */ + public function mb_object_type() { + if ( null !== $this->mb_object_type ) { + return $this->mb_object_type; + } + + if ( $this->is_options_page_mb() ) { + $this->mb_object_type = 'options-page'; + return $this->mb_object_type; + } + + $registered_types = $this->box_types(); + + $type = ''; + + // if it's an array of one, extract it. + if ( 1 === count( $registered_types ) ) { + $last = end( $registered_types ); + if ( is_string( $last ) ) { + $type = $last; + } + } elseif ( ( $curr_type = $this->current_object_type() ) && in_array( $curr_type, $registered_types, true ) ) { + $type = $curr_type; + } + + // Get our object type. + switch ( $type ) { + + case 'user': + case 'comment': + case 'term': + $this->mb_object_type = $type; + break; + + default: + $this->mb_object_type = 'post'; + break; + } + + return $this->mb_object_type; + } + + /** + * Gets the box 'object_types' array based on box settings. + * + * @since 2.2.3 + * @param array $fallback Fallback value. + * + * @return array Object types. + */ + public function box_types( $fallback = array() ) { + return CMB2_Utils::ensure_array( $this->prop( 'object_types' ), $fallback ); + } + + /** + * Initates the object types and option key for an options page metabox. + * + * @since 2.2.5 + * + * @return void + */ + public function init_options_mb() { + $keys = $this->options_page_keys(); + $types = $this->box_types(); + + if ( empty( $keys ) ) { + $keys = ''; + $types = $this->deinit_options_mb( $types ); + } else { + + // Make sure 'options-page' is one of the object types. + $types[] = 'options-page'; + } + + // Set/Reset the option_key property. + $this->set_prop( 'option_key', $keys ); + + // Reset the object types. + $this->set_prop( 'object_types', array_unique( $types ) ); + } + + /** + * If object-page initiation failed, remove traces options page setup. + * + * @since 2.2.5 + * + * @param array $types Array of types. + * @return array + */ + protected function deinit_options_mb( $types ) { + if ( isset( $this->meta_box['show_on']['key'] ) && 'options-page' === $this->meta_box['show_on']['key'] ) { + unset( $this->meta_box['show_on']['key'] ); + } + + if ( array_key_exists( 'options-page', $this->meta_box['show_on'] ) ) { + unset( $this->meta_box['show_on']['options-page'] ); + } + + $index = array_search( 'options-page', $types ); + + if ( false !== $index ) { + unset( $types[ $index ] ); + } + + return $types; + } + + /** + * Determines if metabox is for an options page + * + * @since 1.0.1 + * @return boolean True/False. + */ + public function is_options_page_mb() { + return ( + // 'show_on' values checked for back-compatibility. + $this->is_old_school_options_page_mb() + || in_array( 'options-page', $this->box_types() ) + ); + } + + /** + * Determines if metabox uses old-schoold options page config. + * + * @since 2.2.5 + * @return boolean True/False. + */ + public function is_old_school_options_page_mb() { + return ( + // 'show_on' values checked for back-compatibility. + isset( $this->meta_box['show_on']['key'] ) && 'options-page' === $this->meta_box['show_on']['key'] + || array_key_exists( 'options-page', $this->meta_box['show_on'] ) + ); + } + + /** + * Determine if we are on an options page (or saving the options page). + * + * @since 2.2.5 + * + * @return bool + */ + public function doing_options_page() { + $found_key = false; + $keys = $this->options_page_keys(); + + if ( empty( $keys ) ) { + return $found_key; + } + + if ( ! empty( $_GET['page'] ) && in_array( $_GET['page'], $keys ) ) { + $found_key = sanitize_text_field( $_GET['page'] ); + } + + if ( ! empty( $_POST['action'] ) && in_array( $_POST['action'], $keys ) ) { + $found_key = sanitize_text_field( $_POST['action'] ); + } + + return $found_key ? $found_key : false; + } + + /** + * Get the options page key. + * + * @since 2.2.5 + * @return string|array + */ + public function options_page_keys() { + $key = ''; + if ( ! $this->is_options_page_mb() ) { + return $key; + } + + $values = null; + if ( ! empty( $this->meta_box['show_on']['value'] ) ) { + $values = $this->meta_box['show_on']['value']; + } elseif ( ! empty( $this->meta_box['show_on']['options-page'] ) ) { + $values = $this->meta_box['show_on']['options-page']; + } elseif ( $this->prop( 'option_key' ) ) { + $values = $this->prop( 'option_key' ); + } + + if ( $values ) { + $key = $values; + } + + if ( ! is_array( $key ) ) { + $key = array( $key ); + } + + return $key; + } + + /** + * Returns the object type + * + * @since 1.0.0 + * @param string $object_type Type of object being saved. (e.g., post, user, or comment). Optional. + * @return string Object type. + */ + public function object_type( $object_type = '' ) { + if ( $object_type ) { + $this->object_type = $object_type; + return $this->object_type; + } + + if ( $this->object_type ) { + return $this->object_type; + } + + $this->object_type = $this->current_object_type(); + + return $this->object_type; + } + + /** + * Get the object type for the current page, based on the $pagenow global. + * + * @since 2.2.2 + * @return string Page object type name. + */ + public function current_object_type() { + global $pagenow; + $type = 'post'; + + if ( in_array( $pagenow, array( 'user-edit.php', 'profile.php', 'user-new.php' ), true ) ) { + $type = 'user'; + } + + if ( in_array( $pagenow, array( 'edit-comments.php', 'comment.php' ), true ) ) { + $type = 'comment'; + } + + if ( in_array( $pagenow, array( 'edit-tags.php', 'term.php' ), true ) ) { + $type = 'term'; + } + + if ( defined( 'DOING_AJAX' ) && isset( $_POST['action'] ) && 'add-tag' === $_POST['action'] ) { + $type = 'term'; + } + + if ( + in_array( $pagenow, array( 'admin.php', 'admin-post.php' ), true ) + && $this->doing_options_page() + ) { + $type = 'options-page'; + } + + return $type; + } + + /** + * Set metabox property. + * + * @since 2.2.2 + * @param string $property Metabox config property to retrieve. + * @param mixed $value Value to set if no value found. + * @return mixed Metabox config property value or false. + */ + public function set_prop( $property, $value ) { + $this->meta_box[ $property ] = $value; + + return $this->prop( $property ); + } + + /** + * Get metabox property and optionally set a fallback + * + * @since 2.0.0 + * @param string $property Metabox config property to retrieve. + * @param mixed $fallback Fallback value to set if no value found. + * @return mixed Metabox config property value or false. + */ + public function prop( $property, $fallback = null ) { + if ( array_key_exists( $property, $this->meta_box ) ) { + return $this->meta_box[ $property ]; + } elseif ( $fallback ) { + return $this->meta_box[ $property ] = $fallback; + } + } + + /** + * Get a field object + * + * @since 2.0.3 + * @param string|array|CMB2_Field $field Metabox field id or field config array or CMB2_Field object. + * @param CMB2_Field|null $field_group (optional) CMB2_Field object (group parent). + * @param bool $reset_cached (optional) Reset the internal cache for this field object. + * Use sparingly. + * + * @return CMB2_Field|false CMB2_Field object (or false). + */ + public function get_field( $field, $field_group = null, $reset_cached = false ) { + if ( $field instanceof CMB2_Field ) { + return $field; + } + + $field_id = is_string( $field ) ? $field : $field['id']; + + $parent_field_id = ! empty( $field_group ) ? $field_group->id() : ''; + $ids = $this->get_field_ids( $field_id, $parent_field_id ); + + if ( ! $ids ) { + return false; + } + + list( $field_id, $sub_field_id ) = $ids; + + $index = implode( '', $ids ) . ( $field_group ? $field_group->index : '' ); + + if ( array_key_exists( $index, $this->fields ) && ! $reset_cached ) { + return $this->fields[ $index ]; + } + + $this->fields[ $index ] = new CMB2_Field( $this->get_field_args( $field_id, $field, $sub_field_id, $field_group ) ); + + return $this->fields[ $index ]; + } + + /** + * Handles determining which type of arguments to pass to CMB2_Field + * + * @since 2.0.7 + * @param mixed $field_id Field (or group field) ID. + * @param mixed $field_args Array of field arguments. + * @param mixed $sub_field_id Sub field ID (if field_group exists). + * @param CMB2_Field|null $field_group If a sub-field, will be the parent group CMB2_Field object. + * @return array Array of CMB2_Field arguments. + */ + public function get_field_args( $field_id, $field_args, $sub_field_id, $field_group ) { + + // Check if group is passed and if fields were added in the old-school fields array. + if ( $field_group && ( $sub_field_id || 0 === $sub_field_id ) ) { + + // Update the fields array w/ any modified properties inherited from the group field. + $this->meta_box['fields'][ $field_id ]['fields'][ $sub_field_id ] = $field_args; + + return $this->get_default_args( $field_args, $field_group ); + } + + if ( is_array( $field_args ) ) { + $this->meta_box['fields'][ $field_id ] = array_merge( $field_args, $this->meta_box['fields'][ $field_id ] ); + } + + return $this->get_default_args( $this->meta_box['fields'][ $field_id ] ); + } + + /** + * Get default field arguments specific to this CMB2 object. + * + * @since 2.2.0 + * @param array $field_args Metabox field config array. + * @param CMB2_Field $field_group (optional) CMB2_Field object (group parent). + * @return array Array of field arguments. + */ + protected function get_default_args( $field_args, $field_group = null ) { + if ( $field_group ) { + $args = array( + 'field_args' => $field_args, + 'group_field' => $field_group, + ); + } else { + $args = array( + 'field_args' => $field_args, + 'object_type' => $this->object_type(), + 'object_id' => $this->object_id(), + 'cmb_id' => $this->cmb_id, + ); + } + + return $args; + } + + /** + * When fields are added in the old-school way, intitate them as they should be + * + * @since 2.1.0 + * @param array $fields Array of fields to add. + * @param mixed $parent_field_id Parent field id or null. + * + * @return CMB2 + */ + protected function add_fields( $fields, $parent_field_id = null ) { + foreach ( $fields as $field ) { + + $sub_fields = false; + if ( array_key_exists( 'fields', $field ) ) { + $sub_fields = $field['fields']; + unset( $field['fields'] ); + } + + $field_id = $parent_field_id + ? $this->add_group_field( $parent_field_id, $field ) + : $this->add_field( $field ); + + if ( $sub_fields ) { + $this->add_fields( $sub_fields, $field_id ); + } + } + + return $this; + } + + /** + * Add a field to the metabox + * + * @since 2.0.0 + * @param array $field Metabox field config array. + * @param int $position (optional) Position of metabox. 1 for first, etc. + * @return string|false Field id or false. + */ + public function add_field( array $field, $position = 0 ) { + if ( ! array_key_exists( 'id', $field ) ) { + return false; + } + + // Perform some field-type-specific initiation actions. + switch ( $field['type'] ) { + case 'file': + case 'file_list': + // Initiate attachment JS hooks. + add_filter( 'wp_prepare_attachment_for_js', array( 'CMB2_Type_File_Base', 'prepare_image_sizes_for_js' ), 10, 3 ); + break; + + case 'oembed': + // Initiate oembed Ajax hooks. + cmb2_ajax(); + break; + + case 'group': + if ( empty( $field['render_row_cb'] ) ) { + $field['render_row_cb'] = array( $this, 'render_group_callback' ); + } + break; + case 'colorpicker': + // https://github.com/JayWood/CMB2_RGBa_Picker + // Dequeue the rgba_colorpicker custom field script if it is used, + // since we now enqueue our own more current version. + add_action( 'admin_enqueue_scripts', array( 'CMB2_Type_Colorpicker', 'dequeue_rgba_colorpicker_script' ), 99 ); + break; + } + + if ( isset( $field['column'] ) && false !== $field['column'] ) { + $field = $this->define_field_column( $field ); + } + + if ( isset( $field['taxonomy'] ) && ! empty( $field['remove_default'] ) ) { + $this->tax_metaboxes_to_remove[ $field['taxonomy'] ] = $field['taxonomy']; + } + + $this->_add_field_to_array( + $field, + $this->meta_box['fields'], + $position + ); + + return $field['id']; + } + + /** + * Defines a field's column if requesting to be show in admin columns. + * + * @since 2.2.3 + * @param array $field Metabox field config array. + * @return array Modified metabox field config array. + */ + protected function define_field_column( array $field ) { + $this->has_columns = true; + + $column = is_array( $field['column'] ) ? $field['column'] : array(); + + $field['column'] = wp_parse_args( $column, array( + 'name' => isset( $field['name'] ) ? $field['name'] : '', + 'position' => false, + ) ); + + return $field; + } + + /** + * Add a field to a group + * + * @since 2.0.0 + * @param string $parent_field_id The field id of the group field to add the field. + * @param array $field Metabox field config array. + * @param int $position (optional) Position of metabox. 1 for first, etc. + * @return mixed Array of parent/field ids or false. + */ + public function add_group_field( $parent_field_id, array $field, $position = 0 ) { + if ( ! array_key_exists( $parent_field_id, $this->meta_box['fields'] ) ) { + return false; + } + + $parent_field = $this->meta_box['fields'][ $parent_field_id ]; + + if ( 'group' !== $parent_field['type'] ) { + return false; + } + + if ( ! isset( $parent_field['fields'] ) ) { + $this->meta_box['fields'][ $parent_field_id ]['fields'] = array(); + } + + $this->_add_field_to_array( + $field, + $this->meta_box['fields'][ $parent_field_id ]['fields'], + $position + ); + + return array( $parent_field_id, $field['id'] ); + } + + /** + * Add a field array to a fields array in desired position + * + * @since 2.0.2 + * @param array $field Metabox field config array. + * @param array $fields Array (passed by reference) to append the field (array) to. + * @param integer $position Optionally specify a position in the array to be inserted. + */ + protected function _add_field_to_array( $field, &$fields, $position = 0 ) { + if ( $position ) { + CMB2_Utils::array_insert( $fields, array( $field['id'] => $field ), $position ); + } else { + $fields[ $field['id'] ] = $field; + } + } + + /** + * Remove a field from the metabox + * + * @since 2.0.0 + * @param string $field_id The field id of the field to remove. + * @param string $parent_field_id (optional) The field id of the group field to remove field from. + * @return bool True if field was removed. + */ + public function remove_field( $field_id, $parent_field_id = '' ) { + $ids = $this->get_field_ids( $field_id, $parent_field_id ); + + if ( ! $ids ) { + return false; + } + + list( $field_id, $sub_field_id ) = $ids; + + unset( $this->fields[ implode( '', $ids ) ] ); + + if ( ! $sub_field_id ) { + unset( $this->meta_box['fields'][ $field_id ] ); + return true; + } + + if ( isset( $this->fields[ $field_id ]->args['fields'][ $sub_field_id ] ) ) { + unset( $this->fields[ $field_id ]->args['fields'][ $sub_field_id ] ); + } + if ( isset( $this->meta_box['fields'][ $field_id ]['fields'][ $sub_field_id ] ) ) { + unset( $this->meta_box['fields'][ $field_id ]['fields'][ $sub_field_id ] ); + } + + return true; + } + + /** + * Update or add a property to a field + * + * @since 2.0.0 + * @param string $field_id Field id. + * @param string $property Field property to set/update. + * @param mixed $value Value to set the field property. + * @param string $parent_field_id (optional) The field id of the group field to remove field from. + * @return mixed Field id. Strict compare to false, as success can return a falsey value (like 0). + */ + public function update_field_property( $field_id, $property, $value, $parent_field_id = '' ) { + $ids = $this->get_field_ids( $field_id, $parent_field_id ); + + if ( ! $ids ) { + return false; + } + + list( $field_id, $sub_field_id ) = $ids; + + if ( ! $sub_field_id ) { + $this->meta_box['fields'][ $field_id ][ $property ] = $value; + return $field_id; + } + + $this->meta_box['fields'][ $field_id ]['fields'][ $sub_field_id ][ $property ] = $value; + return $field_id; + } + + /** + * Check if field ids match a field and return the index/field id + * + * @since 2.0.2 + * @param string $field_id Field id. + * @param string $parent_field_id (optional) Parent field id. + * @return mixed Array of field/parent ids, or false. + */ + public function get_field_ids( $field_id, $parent_field_id = '' ) { + $sub_field_id = $parent_field_id ? $field_id : ''; + $field_id = $parent_field_id ? $parent_field_id : $field_id; + $fields =& $this->meta_box['fields']; + + if ( ! array_key_exists( $field_id, $fields ) ) { + $field_id = $this->search_old_school_array( $field_id, $fields ); + } + + if ( false === $field_id ) { + return false; + } + + if ( ! $sub_field_id ) { + return array( $field_id, $sub_field_id ); + } + + if ( 'group' !== $fields[ $field_id ]['type'] ) { + return false; + } + + if ( ! array_key_exists( $sub_field_id, $fields[ $field_id ]['fields'] ) ) { + $sub_field_id = $this->search_old_school_array( $sub_field_id, $fields[ $field_id ]['fields'] ); + } + + return false === $sub_field_id ? false : array( $field_id, $sub_field_id ); + } + + /** + * When using the old array filter, it is unlikely field array indexes will be the field id. + * + * @since 2.0.2 + * @param string $field_id The field id. + * @param array $fields Array of fields to search. + * @return mixed Field index or false. + */ + public function search_old_school_array( $field_id, $fields ) { + $ids = wp_list_pluck( $fields, 'id' ); + $index = array_search( $field_id, $ids ); + return false !== $index ? $index : false; + } + + /** + * Handles metabox property callbacks, and passes this $cmb object as property. + * + * @since 2.2.3 + * @param callable $cb The callback method/function/closure. + * @param mixed $additional_params Any additoinal parameters which should be passed to the callback. + * @return mixed Return of the callback function. + */ + public function do_callback( $cb, $additional_params = null ) { + return call_user_func( $cb, $this, $additional_params ); + } + + /** + * Generate a unique nonce field for each registered meta_box + * + * @since 2.0.0 + * @return void + */ + public function nonce_field() { + wp_nonce_field( $this->nonce(), $this->nonce(), false, true ); + } + + /** + * Generate a unique nonce for each registered meta_box + * + * @since 2.0.0 + * @return string unique nonce string. + */ + public function nonce() { + if ( ! $this->generated_nonce ) { + $this->generated_nonce = sanitize_html_class( 'nonce_' . basename( __FILE__ ) . $this->cmb_id ); + } + + return $this->generated_nonce; + } + + /** + * Checks if field-saving updated any fields. + * + * @since 2.2.5 + * + * @return bool + */ + public function was_updated() { + return ! empty( $this->updated ); + } + + /** + * Whether this box is an "alternate context" box. This means the box has a 'context' property defined as: + * 'form_top', 'before_permalink', 'after_title', or 'after_editor'. + * + * @since 2.2.4 + * @return bool + */ + public function is_alternate_context_box() { + return $this->prop( 'context' ) && in_array( $this->prop( 'context' ), array( 'form_top', 'before_permalink', 'after_title', 'after_editor' ), true ); + } + + /** + * Magic getter for our object. + * + * @param string $property Object property. + * @throws Exception Throws an exception if the field is invalid. + * @return mixed + */ + public function __get( $property ) { + switch ( $property ) { + case 'updated': + case 'has_columns': + case 'tax_metaboxes_to_remove': + return $this->{$property}; + default: + return parent::__get( $property ); + } + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Ajax.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Ajax.php new file mode 100755 index 00000000..17c3f2cb --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Ajax.php @@ -0,0 +1,323 @@ +' . esc_html__( 'Please Try Again', 'cmb2' ) . '

              ' ); + } + + // Set width of embed. + $embed_width = isset( $_REQUEST['oembed_width'] ) && intval( $_REQUEST['oembed_width'] ) < 640 ? intval( $_REQUEST['oembed_width'] ) : '640'; + + // Set url. + $oembed_url = esc_url( $oembed_string ); + + // Set args. + $embed_args = array( + 'width' => $embed_width, + ); + + $this->ajax_update = true; + + // Get embed code (or fallback link). + $html = $this->get_oembed( array( + 'url' => $oembed_url, + 'object_id' => $_REQUEST['object_id'], + 'object_type' => isset( $_REQUEST['object_type'] ) ? sanitize_text_field( $_REQUEST['object_type'] ) : 'post', + 'oembed_args' => $embed_args, + 'field_id' => $_REQUEST['field_id'], + ) ); + + wp_send_json_success( $html ); + } + + /** + * Retrieves oEmbed from url/object ID + * + * @since 0.9.5 + * @param array $args Arguments for method. + * @return mixed HTML markup with embed or fallback. + */ + public function get_oembed_no_edit( $args ) { + global $wp_embed; + + $oembed_url = esc_url( $args['url'] ); + + // Sanitize object_id. + $this->object_id = is_numeric( $args['object_id'] ) ? absint( $args['object_id'] ) : sanitize_text_field( $args['object_id'] ); + + $args = wp_parse_args( $args, array( + 'object_type' => 'post', + 'oembed_args' => array(), + 'field_id' => false, + 'wp_error' => false, + ) ); + + $this->embed_args =& $args; + + /* + * Set the post_ID so oEmbed won't fail + * wp-includes/class-wp-embed.php, WP_Embed::shortcode() + */ + $wp_embed->post_ID = $this->object_id; + + // Special scenario if NOT a post object. + if ( isset( $args['object_type'] ) && 'post' != $args['object_type'] ) { + + if ( 'options-page' == $args['object_type'] ) { + + // Bogus id to pass some numeric checks. Issue with a VERY large WP install? + $wp_embed->post_ID = 1987645321; + } + + // Ok, we need to hijack the oembed cache system. + $this->hijack = true; + $this->object_type = $args['object_type']; + + // Gets ombed cache from our object's meta (vs postmeta). + add_filter( 'get_post_metadata', array( $this, 'hijack_oembed_cache_get' ), 10, 3 ); + + // Sets ombed cache in our object's meta (vs postmeta). + add_filter( 'update_post_metadata', array( $this, 'hijack_oembed_cache_set' ), 10, 4 ); + + } + + $embed_args = ''; + + foreach ( $args['oembed_args'] as $key => $val ) { + $embed_args .= " $key=\"$val\""; + } + + // Ping WordPress for an embed. + $embed = $wp_embed->run_shortcode( '[embed' . $embed_args . ']' . $oembed_url . '[/embed]' ); + + // Fallback that WordPress creates when no oEmbed was found. + $fallback = $wp_embed->maybe_make_link( $oembed_url ); + + return compact( 'embed', 'fallback', 'args' ); + } + + /** + * Retrieves oEmbed from url/object ID + * + * @since 0.9.5 + * @param array $args Arguments for method. + * @return string HTML markup with embed or fallback. + */ + public function get_oembed( $args ) { + $oembed = $this->get_oembed_no_edit( $args ); + + // Send back our embed. + if ( $oembed['embed'] && $oembed['embed'] != $oembed['fallback'] ) { + return '
              '; + } + + // Otherwise, send back error info that no oEmbeds were found. + return sprintf( + '

              %s

              ', + sprintf( + /* translators: 1: results for. 2: link to codex.wordpress.org/Embeds */ + esc_html__( 'No oEmbed Results Found for %1$s. View more info at %2$s.', 'cmb2' ), + $oembed['fallback'], + 'codex.wordpress.org/Embeds' + ) + ); + } + + /** + * Hijacks retrieving of cached oEmbed. + * Returns cached data from relevant object metadata (vs postmeta) + * + * @since 0.9.5 + * @param boolean $check Whether to retrieve postmeta or override. + * @param int $object_id Object ID. + * @param string $meta_key Object metakey. + * @return mixed Object's oEmbed cached data. + */ + public function hijack_oembed_cache_get( $check, $object_id, $meta_key ) { + if ( ! $this->hijack || ( $this->object_id != $object_id && 1987645321 !== $object_id ) ) { + return $check; + } + + if ( $this->ajax_update ) { + return false; + } + + return $this->cache_action( $meta_key ); + } + + /** + * Hijacks saving of cached oEmbed. + * Saves cached data to relevant object metadata (vs postmeta) + * + * @since 0.9.5 + * @param boolean $check Whether to continue setting postmeta. + * @param int $object_id Object ID to get postmeta from. + * @param string $meta_key Postmeta's key. + * @param mixed $meta_value Value of the postmeta to be saved. + * @return boolean Whether to continue setting. + */ + public function hijack_oembed_cache_set( $check, $object_id, $meta_key, $meta_value ) { + + if ( + ! $this->hijack + || ( $this->object_id != $object_id && 1987645321 !== $object_id ) + // Only want to hijack oembed meta values. + || 0 !== strpos( $meta_key, '_oembed_' ) + ) { + return $check; + } + + $this->cache_action( $meta_key, $meta_value ); + + // Anything other than `null` to cancel saving to postmeta. + return true; + } + + /** + * Gets/updates the cached oEmbed value from/to relevant object metadata (vs postmeta). + * + * @since 1.3.0 + * + * @param string $meta_key Postmeta's key. + * @return mixed + */ + protected function cache_action( $meta_key ) { + $func_args = func_get_args(); + $action = isset( $func_args[1] ) ? 'update' : 'get'; + + if ( 'options-page' === $this->object_type ) { + + $args = array( $meta_key ); + + if ( 'update' === $action ) { + $args[] = $func_args[1]; + $args[] = true; + } + + // Cache the result to our options. + $status = call_user_func_array( array( cmb2_options( $this->object_id ), $action ), $args ); + } else { + + $args = array( $this->object_type, $this->object_id, $meta_key ); + $args[] = 'update' === $action ? $func_args[1] : true; + + // Cache the result to our metadata. + $status = call_user_func_array( $action . '_metadata', $args ); + } + + return $status; + } + + /** + * Hooks in when options-page data is saved to clean stale + * oembed cache data from the option value. + * + * @since 2.2.0 + * @param string $option_key The options-page option key. + * @return void + */ + public static function clean_stale_options_page_oembeds( $option_key ) { + $options = cmb2_options( $option_key )->get_options(); + $modified = false; + if ( is_array( $options ) ) { + + $ttl = apply_filters( 'oembed_ttl', DAY_IN_SECONDS, '', array(), 0 ); + $now = time(); + + foreach ( $options as $key => $value ) { + // Check for cached oembed data. + if ( 0 === strpos( $key, '_oembed_time_' ) ) { + $cached_recently = ( $now - $value ) < $ttl; + + if ( ! $cached_recently ) { + $modified = true; + // Remove the the cached ttl expiration, and the cached oembed value. + unset( $options[ $key ] ); + unset( $options[ str_replace( '_oembed_time_', '_oembed_', $key ) ] ); + } + } // End if. + // Remove the cached unknown values. + elseif ( '{{unknown}}' === $value ) { + $modified = true; + unset( $options[ $key ] ); + } + } + } + + // Update the option and remove stale cache data. + if ( $modified ) { + $updated = cmb2_options( $option_key )->set( $options ); + } + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Base.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Base.php new file mode 100755 index 00000000..e84ce4b0 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Base.php @@ -0,0 +1,533 @@ + value data for saving. Likely $_POST data. + * + * @var array + * @since 2.2.3 + */ + public $data_to_save = array(); + + /** + * Array of field param callback results + * + * @var array + * @since 2.0.0 + */ + protected $callback_results = array(); + + /** + * The deprecated_param method deprecated param message signature. + */ + const DEPRECATED_PARAM = 1; + + /** + * The deprecated_param method deprecated callback param message signature. + */ + const DEPRECATED_CB_PARAM = 2; + + /** + * Get started + * + * @since 2.2.3 + * @param array $args Object properties array. + */ + public function __construct( $args = array() ) { + if ( ! empty( $args ) ) { + foreach ( array( + 'cmb_id', + 'properties_name', + 'object_id', + 'object_type', + 'data_to_save', + ) as $object_prop ) { + if ( isset( $args[ $object_prop ] ) ) { + $this->{$object_prop} = $args[ $object_prop ]; + } + } + } + } + + /** + * Returns the object ID + * + * @since 2.2.3 + * @param integer $object_id Object ID. + * @return integer Object ID + */ + public function object_id( $object_id = 0 ) { + if ( $object_id ) { + $this->object_id = $object_id; + } + + return $this->object_id; + } + + /** + * Returns the object type + * + * @since 2.2.3 + * @param string $object_type Object Type. + * @return string Object type + */ + public function object_type( $object_type = '' ) { + if ( $object_type ) { + $this->object_type = $object_type; + } + + return $this->object_type; + } + + /** + * Get the object type for the current page, based on the $pagenow global. + * + * @since 2.2.2 + * @return string Page object type name. + */ + public function current_object_type() { + global $pagenow; + $type = 'post'; + + if ( in_array( $pagenow, array( 'user-edit.php', 'profile.php', 'user-new.php' ), true ) ) { + $type = 'user'; + } + + if ( in_array( $pagenow, array( 'edit-comments.php', 'comment.php' ), true ) ) { + $type = 'comment'; + } + + if ( in_array( $pagenow, array( 'edit-tags.php', 'term.php' ), true ) ) { + $type = 'term'; + } + + return $type; + } + + /** + * Set object property. + * + * @since 2.2.2 + * @param string $property Metabox config property to retrieve. + * @param mixed $value Value to set if no value found. + * @return mixed Metabox config property value or false. + */ + public function set_prop( $property, $value ) { + $this->{$this->properties_name}[ $property ] = $value; + + return $this->prop( $property ); + } + + /** + * Get object property and optionally set a fallback + * + * @since 2.0.0 + * @param string $property Metabox config property to retrieve. + * @param mixed $fallback Fallback value to set if no value found. + * @return mixed Metabox config property value or false + */ + public function prop( $property, $fallback = null ) { + if ( array_key_exists( $property, $this->{$this->properties_name} ) ) { + return $this->{$this->properties_name}[ $property ]; + } elseif ( $fallback ) { + return $this->{$this->properties_name}[ $property ] = $fallback; + } + } + + /** + * Get default field arguments specific to this CMB2 object. + * + * @since 2.2.0 + * @param array $field_args Metabox field config array. + * @param CMB2_Field $field_group (optional) CMB2_Field object (group parent). + * @return array Array of field arguments. + */ + protected function get_default_args( $field_args, $field_group = null ) { + if ( $field_group ) { + $args = array( + 'field_args' => $field_args, + 'group_field' => $field_group, + ); + } else { + $args = array( + 'field_args' => $field_args, + 'object_type' => $this->object_type(), + 'object_id' => $this->object_id(), + 'cmb_id' => $this->cmb_id, + ); + } + + return $args; + } + + /** + * Get a new field object specific to this CMB2 object. + * + * @since 2.2.0 + * @param array $field_args Metabox field config array. + * @param CMB2_Field $field_group (optional) CMB2_Field object (group parent). + * @return CMB2_Field CMB2_Field object + */ + protected function get_new_field( $field_args, $field_group = null ) { + return new CMB2_Field( $this->get_default_args( $field_args, $field_group ) ); + } + + /** + * Determine whether this cmb object should show, based on the 'show_on_cb' callback. + * + * @since 2.0.9 + * + * @return bool Whether this cmb should be shown. + */ + public function should_show() { + // Default to showing this cmb + $show = true; + + // Use the callback to determine showing the cmb, if it exists. + if ( is_callable( $this->prop( 'show_on_cb' ) ) ) { + $show = (bool) call_user_func( $this->prop( 'show_on_cb' ), $this ); + } + + return $show; + } + + /** + * Displays the results of the param callbacks. + * + * @since 2.0.0 + * @param string $param Field parameter. + */ + public function peform_param_callback( $param ) { + echo $this->get_param_callback_result( $param ); + } + + /** + * Store results of the param callbacks for continual access + * + * @since 2.0.0 + * @param string $param Field parameter. + * @return mixed Results of param/param callback + */ + public function get_param_callback_result( $param ) { + + // If we've already retrieved this param's value. + if ( array_key_exists( $param, $this->callback_results ) ) { + + // Send it back. + return $this->callback_results[ $param ]; + } + + // Check if parameter has registered a callback. + if ( $cb = $this->maybe_callback( $param ) ) { + + // Ok, callback is good, let's run it and store the result. + ob_start(); + $returned = $this->do_callback( $cb ); + + // Grab the result from the output buffer and store it. + $echoed = ob_get_clean(); + + // This checks if the user returned or echoed their callback. + // Defaults to using the echoed value. + $this->callback_results[ $param ] = $echoed ? $echoed : $returned; + + } else { + + // Otherwise just get whatever is there. + $this->callback_results[ $param ] = isset( $this->{$this->properties_name}[ $param ] ) ? $this->{$this->properties_name}[ $param ] : false; + } + + return $this->callback_results[ $param ]; + } + + /** + * Unset the cached results of the param callback. + * + * @since 2.2.6 + * @param string $param Field parameter. + * @return CMB2_Base + */ + public function unset_param_callback_cache( $param ) { + if ( isset( $this->callback_results[ $param ] ) ) { + unset( $this->callback_results[ $param ] ); + } + + return $this; + } + + /** + * Handles the parameter callbacks, and passes this object as parameter. + * + * @since 2.2.3 + * @param callable $cb The callback method/function/closure. + * @param mixed $additional_params Any additoinal parameters which should be passed to the callback. + * @return mixed Return of the callback function. + */ + protected function do_callback( $cb, $additional_params = null ) { + return call_user_func( $cb, $this->{$this->properties_name}, $this, $additional_params ); + } + + /** + * Checks if field has a callback value + * + * @since 1.0.1 + * @param string $cb Callback string. + * @return mixed NULL, false for NO validation, or $cb string if it exists. + */ + public function maybe_callback( $cb ) { + $args = $this->{$this->properties_name}; + if ( ! isset( $args[ $cb ] ) ) { + return null; + } + + // Check if requesting explicitly false. + $cb = false !== $args[ $cb ] && 'false' !== $args[ $cb ] ? $args[ $cb ] : false; + + // If requesting NO validation, return false. + if ( ! $cb ) { + return false; + } + + if ( is_callable( $cb ) ) { + return $cb; + } + + return null; + } + + /** + * Checks if this object has parameter corresponding to the given filter + * which is callable. If so, it registers the callback, and if not, + * converts the maybe-modified $val to a boolean for return. + * + * The registered handlers will have a parameter name which matches the filter, except: + * - The 'cmb2_api' prefix will be removed + * - A '_cb' suffix will be added (to stay inline with other '*_cb' parameters). + * + * @since 2.2.3 + * + * @param string $hook_name The hook name. + * @param bool $val The default value. + * @param string $hook_function The hook function. Default: 'add_filter'. + * + * @return null|bool Null if hook is registered, or bool for value. + */ + public function maybe_hook_parameter( $hook_name, $val = null, $hook_function = 'add_filter' ) { + + // Remove filter prefix, add param suffix. + $parameter = substr( $hook_name, strlen( 'cmb2_api_' ) ) . '_cb'; + + return self::maybe_hook( + $this->prop( $parameter, $val ), + $hook_name, + $hook_function + ); + } + + /** + * Checks if given value is callable, and registers the callback. + * If is non-callable, converts the $val to a boolean for return. + * + * @since 2.2.3 + * + * @param bool $val The default value. + * @param string $hook_name The hook name. + * @param string $hook_function The hook function. + * + * @return null|bool Null if hook is registered, or bool for value. + */ + public static function maybe_hook( $val, $hook_name, $hook_function ) { + if ( is_callable( $val ) ) { + call_user_func( $hook_function, $hook_name, $val, 10, 2 ); + return null; + } + + // Cast to bool. + return ! ! $val; + } + + /** + * Mark a param as deprecated and inform when it has been used. + * + * There is a default WordPress hook deprecated_argument_run that will be called + * that can be used to get the backtrace up to what file and function used the + * deprecated argument. + * + * The current behavior is to trigger a user error if WP_DEBUG is true. + * + * @since 2.2.3 + * + * @param string $function The function that was called. + * @param string $version The version of CMB2 that deprecated the argument used. + * @param string $message Optional. A message regarding the change, or numeric + * key to generate message from additional arguments. + * Default null. + */ + protected function deprecated_param( $function, $version, $message = null ) { + + if ( is_numeric( $message ) ) { + $args = func_get_args(); + + switch ( $message ) { + + case self::DEPRECATED_PARAM: + $message = sprintf( esc_html__( 'The "%1$s" field parameter has been deprecated in favor of the "%2$s" parameter.', 'cmb2' ), $args[3], $args[4] ); + break; + + case self::DEPRECATED_CB_PARAM: + $message = sprintf( esc_html__( 'Using the "%1$s" field parameter as a callback has been deprecated in favor of the "%2$s" parameter.', 'cmb2' ), $args[3], $args[4] ); + break; + + default: + $message = null; + break; + } + } + + /** + * Fires when a deprecated argument is called. This is a WP core action. + * + * @since 2.2.3 + * + * @param string $function The function that was called. + * @param string $message A message regarding the change. + * @param string $version The version of CMB2 that deprecated the argument used. + */ + do_action( 'deprecated_argument_run', $function, $message, $version ); + + /** + * Filters whether to trigger an error for deprecated arguments. This is a WP core filter. + * + * @since 2.2.3 + * + * @param bool $trigger Whether to trigger the error for deprecated arguments. Default true. + */ + if ( defined( 'WP_DEBUG' ) && WP_DEBUG && apply_filters( 'deprecated_argument_trigger_error', true ) ) { + if ( function_exists( '__' ) ) { + if ( ! is_null( $message ) ) { + trigger_error( sprintf( esc_html__( '%1$s was called with a parameter that is deprecated since version %2$s! %3$s', 'cmb2' ), $function, $version, $message ) ); + } else { + trigger_error( sprintf( esc_html__( '%1$s was called with a parameter that is deprecated since version %2$s with no alternative available.', 'cmb2' ), $function, $version ) ); + } + } else { + if ( ! is_null( $message ) ) { + trigger_error( sprintf( '%1$s was called with a parameter that is deprecated since version %2$s! %3$s', $function, $version, $message ) ); + } else { + trigger_error( sprintf( '%1$s was called with a parameter that is deprecated since version %2$s with no alternative available.', $function, $version ) ); + } + } + } + } + + /** + * Magic getter for our object. + * + * @param string $field Requested property. + * @throws Exception Throws an exception if the field is invalid. + * @return mixed + */ + public function __get( $field ) { + switch ( $field ) { + case 'args': + case 'meta_box': + if ( $field === $this->properties_name ) { + return $this->{$this->properties_name}; + } + case 'properties': + return $this->{$this->properties_name}; + case 'cmb_id': + case 'object_id': + case 'object_type': + return $this->{$field}; + default: + throw new Exception( sprintf( esc_html__( 'Invalid %1$s property: %2$s', 'cmb2' ), __CLASS__, $field ) ); + } + } + + /** + * Allows overloading the object with methods... Whooaaa oooh it's magic, y'knoooow. + * + * @since 1.0.0 + * @throws Exception Invalid method exception. + * + * @param string $method Non-existent method. + * @param array $args All arguments passed to the method. + * @return mixed + */ + public function __call( $method, $args ) { + $object_class = strtolower( get_class( $this ) ); + + if ( ! has_filter( "{$object_class}_inherit_{$method}" ) ) { + throw new Exception( sprintf( esc_html__( 'Invalid %1$s method: %2$s', 'cmb2' ), get_class( $this ), $method ) ); + } + + array_unshift( $args, $this ); + + /** + * Allows overloading the object (CMB2 or CMB2_Field) with additional capabilities + * by registering hook callbacks. + * + * The first dynamic portion of the hook name, $object_class, refers to the object class, + * either cmb2 or cmb2_field. + * + * The second dynamic portion of the hook name, $method, is the non-existent method being + * called on the object. To avoid possible future methods encroaching on your hooks, + * use a unique method (aka, $cmb->prefix_my_method()). + * + * When registering your callback, you will need to ensure that you register the correct + * number of `$accepted_args`, accounting for this object instance being the first argument. + * + * @param array $args The arguments to be passed to the hook. + * The first argument will always be this object instance. + */ + return apply_filters_ref_array( "{$object_class}_inherit_{$method}", $args ); + } +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Boxes.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Boxes.php new file mode 100755 index 00000000..4bee566d --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Boxes.php @@ -0,0 +1,139 @@ +cmb_id ] = $cmb_instance; + } + + /** + * Remove a CMB2 instance object from the registry. + * + * @since 1.X.X + * + * @param string $cmb_id A CMB2 instance id. + */ + public static function remove( $cmb_id ) { + if ( array_key_exists( $cmb_id, self::$cmb2_instances ) ) { + unset( self::$cmb2_instances[ $cmb_id ] ); + } + } + + /** + * Retrieve a CMB2 instance by cmb id. + * + * @since 1.X.X + * + * @param string $cmb_id A CMB2 instance id. + * + * @return CMB2|bool False or CMB2 object instance. + */ + public static function get( $cmb_id ) { + if ( empty( self::$cmb2_instances ) || empty( self::$cmb2_instances[ $cmb_id ] ) ) { + return false; + } + + return self::$cmb2_instances[ $cmb_id ]; + } + + /** + * Retrieve all CMB2 instances registered. + * + * @since 1.X.X + * @return CMB2[] Array of all registered cmb2 instances. + */ + public static function get_all() { + return self::$cmb2_instances; + } + + /** + * Retrieve all CMB2 instances that have the specified property set. + * + * @since 2.4.0 + * @param string $property Property name. + * @param mixed $compare (Optional) The value to compare. + * @return CMB2[] Array of matching cmb2 instances. + */ + public static function get_by( $property, $compare = 'nocompare' ) { + $boxes = array(); + + foreach ( self::$cmb2_instances as $cmb_id => $cmb ) { + $prop = $cmb->prop( $property ); + + if ( 'nocompare' === $compare ) { + if ( ! empty( $prop ) ) { + $boxes[ $cmb_id ] = $cmb; + } + continue; + } + + if ( $compare === $prop ) { + $boxes[ $cmb_id ] = $cmb; + } + } + + return $boxes; + } + + /** + * Retrieve all CMB2 instances as long as they do not include the ignored property. + * + * @since 2.4.0 + * @param string $property Property name. + * @param mixed $to_ignore The value to ignore. + * @return CMB2[] Array of matching cmb2 instances. + */ + public static function filter_by( $property, $to_ignore = null ) { + $boxes = array(); + + foreach ( self::$cmb2_instances as $cmb_id => $cmb ) { + + if ( $to_ignore === $cmb->prop( $property ) ) { + continue; + } + + $boxes[ $cmb_id ] = $cmb; + } + + return $boxes; + } + + /** + * Deprecated and left for back-compatibility. The original `get_by_property` + * method was misnamed and never actually used by CMB2 core. + * + * @since 2.2.3 + * + * @param string $property Property name. + * @param mixed $to_ignore The value to ignore. + * @return CMB2[] Array of matching cmb2 instances. + */ + public static function get_by_property( $property, $to_ignore = null ) { + _deprecated_function( __METHOD__, '2.4.0', 'CMB2_Boxes::filter_by()' ); + return self::filter_by( $property ); + } +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Field.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Field.php new file mode 100755 index 00000000..273592b4 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Field.php @@ -0,0 +1,1618 @@ +group = $args['group_field']; + $this->object_id = $this->group->object_id; + $this->object_type = $this->group->object_type; + $this->cmb_id = $this->group->cmb_id; + } else { + $this->object_id = isset( $args['object_id'] ) && '_' !== $args['object_id'] ? $args['object_id'] : 0; + $this->object_type = isset( $args['object_type'] ) ? $args['object_type'] : 'post'; + + if ( isset( $args['cmb_id'] ) ) { + $this->cmb_id = $args['cmb_id']; + } + } + + $this->args = $this->_set_field_defaults( $args['field_args'] ); + + if ( $this->object_id ) { + $this->value = $this->get_data(); + } + } + + /** + * Non-existent methods fallback to checking for field arguments of the same name + * + * @since 1.1.0 + * @param string $name Method name. + * @param array $arguments Array of passed-in arguments. + * @return mixed Value of field argument + */ + public function __call( $name, $arguments ) { + if ( 'string' === $name ) { + return call_user_func_array( array( $this, 'get_string' ), $arguments ); + } + + $key = isset( $arguments[0] ) ? $arguments[0] : ''; + return $this->args( $name, $key ); + } + + /** + * Retrieves the field id + * + * @since 1.1.0 + * @param boolean $raw Whether to retrieve pre-modidifed id. + * @return string Field id + */ + public function id( $raw = false ) { + $id = $raw ? '_id' : 'id'; + return $this->args( $id ); + } + + /** + * Get a field argument + * + * @since 1.1.0 + * @param string $key Argument to check. + * @param string $_key Sub argument to check. + * @return mixed Argument value or false if non-existent + */ + public function args( $key = '', $_key = '' ) { + $arg = $this->_data( 'args', $key ); + + if ( in_array( $key, array( 'default', 'default_cb' ), true ) ) { + + $arg = $this->get_default(); + + } elseif ( $_key ) { + + $arg = isset( $arg[ $_key ] ) ? $arg[ $_key ] : false; + } + + return $arg; + } + + /** + * Retrieve a portion of a field property + * + * @since 1.1.0 + * @param string $var Field property to check. + * @param string $key Field property array key to check. + * @return mixed Queried property value or false + */ + public function _data( $var, $key = '' ) { + $vars = $this->{$var}; + if ( $key ) { + return array_key_exists( $key, $vars ) ? $vars[ $key ] : false; + } + return $vars; + } + + /** + * Get Field's value + * + * @since 1.1.0 + * @param string $key If value is an array, is used to get array key->value. + * @return mixed Field value or false if non-existent + */ + public function value( $key = '' ) { + return $this->_data( 'value', $key ); + } + + /** + * Retrieves metadata/option data + * + * @since 1.0.1 + * @param string $field_id Meta key/Option array key. + * @param array $args Override arguments. + * @return mixed Meta/Option value + */ + public function get_data( $field_id = '', $args = array() ) { + if ( $field_id ) { + $args['field_id'] = $field_id; + } elseif ( $this->group ) { + $args['field_id'] = $this->group->id(); + } + + $a = $this->data_args( $args ); + + /** + * Filter whether to override getting of meta value. + * Returning a non 'cmb2_field_no_override_val' value + * will effectively short-circuit the value retrieval. + * + * @since 2.0.0 + * + * @param mixed $value The value get_metadata() should + * return - a single metadata value, + * or an array of values. + * + * @param int $object_id Object ID. + * + * @param array $args { + * An array of arguments for retrieving data + * + * @type string $type The current object type + * @type int $id The current object ID + * @type string $field_id The ID of the field being requested + * @type bool $repeat Whether current field is repeatable + * @type bool $single Whether current field is a single database row + * } + * + * @param CMB2_Field object $field This field object + */ + $data = apply_filters( 'cmb2_override_meta_value', 'cmb2_field_no_override_val', $this->object_id, $a, $this ); + + /** + * Filter and parameters are documented for 'cmb2_override_meta_value' filter (above). + * + * The dynamic portion of the hook, $field_id, refers to the current + * field id paramater. Returning a non 'cmb2_field_no_override_val' value + * will effectively short-circuit the value retrieval. + * + * @since 2.0.0 + */ + $data = apply_filters( "cmb2_override_{$a['field_id']}_meta_value", $data, $this->object_id, $a, $this ); + + // If no override, get value normally. + if ( 'cmb2_field_no_override_val' === $data ) { + $data = 'options-page' === $a['type'] + ? cmb2_options( $a['id'] )->get( $a['field_id'] ) + : get_metadata( $a['type'], $a['id'], $a['field_id'], ( $a['single'] || $a['repeat'] ) ); + } + + if ( $this->group ) { + + $data = is_array( $data ) && isset( $data[ $this->group->index ][ $this->args( '_id' ) ] ) + ? $data[ $this->group->index ][ $this->args( '_id' ) ] + : false; + } + + return $data; + } + + /** + * Updates metadata/option data. + * + * @since 1.0.1 + * @param mixed $new_value Value to update data with. + * @param bool $single Whether data is an array (add_metadata). + * @return mixed + */ + public function update_data( $new_value, $single = true ) { + $a = $this->data_args( array( + 'single' => $single, + ) ); + + $a['value'] = $a['repeat'] ? array_values( $new_value ) : $new_value; + + /** + * Filter whether to override saving of meta value. + * Returning a non-null value will effectively short-circuit the function. + * + * @since 2.0.0 + * + * @param null|bool $check Whether to allow updating metadata for the given type. + * + * @param array $args { + * Array of data about current field including: + * + * @type string $value The value to set + * @type string $type The current object type + * @type int $id The current object ID + * @type string $field_id The ID of the field being updated + * @type bool $repeat Whether current field is repeatable + * @type bool $single Whether current field is a single database row + * } + * + * @param array $field_args All field arguments + * + * @param CMB2_Field object $field This field object + */ + $override = apply_filters( 'cmb2_override_meta_save', null, $a, $this->args(), $this ); + + /** + * Filter and parameters are documented for 'cmb2_override_meta_save' filter (above). + * + * The dynamic portion of the hook, $a['field_id'], refers to the current + * field id paramater. Returning a non-null value + * will effectively short-circuit the function. + * + * @since 2.0.0 + */ + $override = apply_filters( "cmb2_override_{$a['field_id']}_meta_save", $override, $a, $this->args(), $this ); + + // If override, return that. + if ( null !== $override ) { + return $override; + } + + // Options page handling (or temp data store). + if ( 'options-page' === $a['type'] || empty( $a['id'] ) ) { + return cmb2_options( $a['id'] )->update( $a['field_id'], $a['value'], false, $a['single'] ); + } + + // Add metadata if not single. + if ( ! $a['single'] ) { + return add_metadata( $a['type'], $a['id'], $a['field_id'], $a['value'], false ); + } + + // Delete meta if we have an empty array. + if ( is_array( $a['value'] ) && empty( $a['value'] ) ) { + return delete_metadata( $a['type'], $a['id'], $a['field_id'], $this->value ); + } + + // Update metadata. + return update_metadata( $a['type'], $a['id'], $a['field_id'], $a['value'] ); + } + + /** + * Removes/updates metadata/option data. + * + * @since 1.0.1 + * @param string $old Old value. + * @return mixed + */ + public function remove_data( $old = '' ) { + $a = $this->data_args( array( + 'old' => $old, + ) ); + + /** + * Filter whether to override removing of meta value. + * Returning a non-null value will effectively short-circuit the function. + * + * @since 2.0.0 + * + * @param null|bool $delete Whether to allow metadata deletion of the given type. + * @param array $args Array of data about current field including: + * 'type' : Current object type + * 'id' : Current object ID + * 'field_id' : Current Field ID + * 'repeat' : Whether current field is repeatable + * 'single' : Whether to save as a + * single meta value + * @param array $field_args All field arguments + * @param CMB2_Field object $field This field object + */ + $override = apply_filters( 'cmb2_override_meta_remove', null, $a, $this->args(), $this ); + + /** + * Filter whether to override removing of meta value. + * + * The dynamic portion of the hook, $a['field_id'], refers to the current + * field id paramater. Returning a non-null value + * will effectively short-circuit the function. + * + * @since 2.0.0 + * + * @param null|bool $delete Whether to allow metadata deletion of the given type. + * @param array $args Array of data about current field including: + * 'type' : Current object type + * 'id' : Current object ID + * 'field_id' : Current Field ID + * 'repeat' : Whether current field is repeatable + * 'single' : Whether to save as a + * single meta value + * @param array $field_args All field arguments + * @param CMB2_Field object $field This field object + */ + $override = apply_filters( "cmb2_override_{$a['field_id']}_meta_remove", $override, $a, $this->args(), $this ); + + // If no override, remove as usual. + if ( null !== $override ) { + return $override; + } // End if. + // Option page handling. + elseif ( 'options-page' === $a['type'] || empty( $a['id'] ) ) { + return cmb2_options( $a['id'] )->remove( $a['field_id'] ); + } + + // Remove metadata. + return delete_metadata( $a['type'], $a['id'], $a['field_id'], $old ); + } + + /** + * Data variables for get/set data methods + * + * @since 1.1.0 + * @param array $args Override arguments. + * @return array Updated arguments + */ + public function data_args( $args = array() ) { + $args = wp_parse_args( $args, array( + 'type' => $this->object_type, + 'id' => $this->object_id, + 'field_id' => $this->id( true ), + 'repeat' => $this->args( 'repeatable' ), + 'single' => ! $this->args( 'multiple' ), + ) ); + return $args; + } + + /** + * Checks if field has a registered sanitization callback + * + * @since 1.0.1 + * @param mixed $meta_value Meta value. + * @return mixed Possibly sanitized meta value + */ + public function sanitization_cb( $meta_value ) { + + if ( $this->args( 'repeatable' ) && is_array( $meta_value ) ) { + // Remove empties. + $meta_value = array_filter( $meta_value ); + } + + // Check if the field has a registered validation callback. + $cb = $this->maybe_callback( 'sanitization_cb' ); + if ( false === $cb ) { + // If requesting NO validation, return meta value. + return $meta_value; + } elseif ( $cb ) { + // Ok, callback is good, let's run it. + return call_user_func( $cb, $meta_value, $this->args(), $this ); + } + + $sanitizer = new CMB2_Sanitize( $this, $meta_value ); + $field_type = $this->type(); + + /** + * Filter the value before it is saved. + * + * The dynamic portion of the hook name, $field_type, refers to the field type. + * + * Passing a non-null value to the filter will short-circuit saving + * the field value, saving the passed value instead. + * + * @param bool|mixed $override_value Sanitization/Validation override value to return. + * Default: null. false to skip it. + * @param mixed $value The value to be saved to this field. + * @param int $object_id The ID of the object where the value will be saved + * @param array $field_args The current field's arguments + * @param object $sanitizer This `CMB2_Sanitize` object + */ + $override_value = apply_filters( "cmb2_sanitize_{$field_type}", null, $sanitizer->value, $this->object_id, $this->args(), $sanitizer ); + + if ( null !== $override_value ) { + return $override_value; + } + + // Sanitization via 'CMB2_Sanitize'. + return $sanitizer->{$field_type}(); + } + + /** + * Process $_POST data to save this field's value + * + * @since 2.0.3 + * @param array $data_to_save $_POST data to check. + * @return array|int|bool Result of save, false on failure + */ + public function save_field_from_data( array $data_to_save ) { + $this->data_to_save = $data_to_save; + + $meta_value = isset( $this->data_to_save[ $this->id( true ) ] ) + ? $this->data_to_save[ $this->id( true ) ] + : null; + + return $this->save_field( $meta_value ); + } + + /** + * Sanitize/store a value to this field + * + * @since 2.0.0 + * @param array $meta_value Desired value to sanitize/store. + * @return array|int|bool Result of save. false on failure + */ + public function save_field( $meta_value ) { + + $updated = false; + $action = ''; + $new_value = $this->sanitization_cb( $meta_value ); + + if ( ! $this->args( 'save_field' ) ) { + + // Nothing to see here. + $action = 'disabled'; + + } elseif ( $this->args( 'multiple' ) && ! $this->args( 'repeatable' ) && ! $this->group ) { + + $this->remove_data(); + $count = 0; + + if ( ! empty( $new_value ) ) { + foreach ( $new_value as $add_new ) { + if ( $this->update_data( $add_new, false ) ) { + $count++; + } + } + } + + $updated = $count ? $count : false; + $action = 'repeatable'; + + } elseif ( ! CMB2_Utils::isempty( $new_value ) && $new_value !== $this->get_data() ) { + $updated = $this->update_data( $new_value ); + $action = 'updated'; + } elseif ( CMB2_Utils::isempty( $new_value ) ) { + $updated = $this->remove_data(); + $action = 'removed'; + } + + if ( $updated ) { + $this->value = $this->get_data(); + $this->escaped_value = null; + } + + $field_id = $this->id( true ); + + /** + * Hooks after save field action. + * + * @since 2.2.0 + * + * @param string $field_id the current field id paramater. + * @param bool $updated Whether the metadata update action occurred. + * @param string $action Action performed. Could be "repeatable", "updated", or "removed". + * @param CMB2_Field object $field This field object + */ + do_action( 'cmb2_save_field', $field_id, $updated, $action, $this ); + + /** + * Hooks after save field action. + * + * The dynamic portion of the hook, $field_id, refers to the + * current field id paramater. + * + * @since 2.2.0 + * + * @param bool $updated Whether the metadata update action occurred. + * @param string $action Action performed. Could be "repeatable", "updated", or "removed". + * @param CMB2_Field object $field This field object + */ + do_action( "cmb2_save_field_{$field_id}", $updated, $action, $this ); + + return $updated; + } + + /** + * Determine if current type is exempt from escaping + * + * @since 1.1.0 + * @return bool True if exempt + */ + public function escaping_exception() { + // These types cannot be escaped. + return in_array( $this->type(), array( + 'file_list', + 'multicheck', + 'text_datetime_timestamp_timezone', + ) ); + } + + /** + * Determine if current type cannot be repeatable + * + * @since 1.1.0 + * @param string $type Field type to check. + * @return bool True if type cannot be repeatable + */ + public function repeatable_exception( $type ) { + // These types cannot be repeatable. + $internal_fields = array( + // Use file_list instead. + 'file' => 1, + 'radio' => 1, + 'title' => 1, + 'wysiwyg' => 1, + 'checkbox' => 1, + 'radio_inline' => 1, + 'taxonomy_radio' => 1, + 'taxonomy_radio_inline' => 1, + 'taxonomy_radio_hierarchical' => 1, + 'taxonomy_select' => 1, + 'taxonomy_multicheck' => 1, + 'taxonomy_multicheck_inline' => 1, + 'taxonomy_multicheck_hierarchical' => 1, + + ); + + /** + * Filter field types that are non-repeatable. + * + * Note that this does *not* allow overriding the default non-repeatable types. + * + * @since 2.1.1 + * + * @param array $fields Array of fields designated as non-repeatable. Note that the field names are *keys*, + * and not values. The value can be anything, because it is meaningless. Example: + * array( 'my_custom_field' => 1 ) + */ + $all_fields = array_merge( apply_filters( 'cmb2_non_repeatable_fields', array() ), $internal_fields ); + return isset( $all_fields[ $type ] ); + } + + /** + * Determine if current type has its own defaults field-arguments method. + * + * @since 2.2.6 + * @param string $type Field type to check. + * @return bool True if has own method. + */ + public function has_args_method( $type ) { + + // These types have their own arguments parser. + $type_methods = array( + 'group' => 'set_field_defaults_group', + 'wysiwyg' => 'set_field_defaults_wysiwyg', + ); + + if ( isset( $type_methods[ $type ] ) ) { + return $type_methods[ $type ]; + } + + $all_or_nothing_types = array_flip( apply_filters( 'cmb2_all_or_nothing_types', array( + 'select', + 'radio', + 'radio_inline', + 'taxonomy_select', + 'taxonomy_radio', + 'taxonomy_radio_inline', + 'taxonomy_radio_hierarchical', + ), $this ) ); + + if ( isset( $all_or_nothing_types[ $type ] ) ) { + return 'set_field_defaults_all_or_nothing_types'; + } + + return false; + } + + /** + * Escape the value before output. Defaults to 'esc_attr()' + * + * @since 1.0.1 + * @param callable|string $func Escaping function (if not esc_attr()). + * @param mixed $meta_value Meta value. + * @return mixed Final value. + */ + public function escaped_value( $func = 'esc_attr', $meta_value = '' ) { + + if ( null !== $this->escaped_value ) { + return $this->escaped_value; + } + + $meta_value = $meta_value ? $meta_value : $this->value(); + + // Check if the field has a registered escaping callback. + if ( $cb = $this->maybe_callback( 'escape_cb' ) ) { + // Ok, callback is good, let's run it. + return call_user_func( $cb, $meta_value, $this->args(), $this ); + } + + $field_type = $this->type(); + + /** + * Filter the value for escaping before it is ouput. + * + * The dynamic portion of the hook name, $field_type, refers to the field type. + * + * Passing a non-null value to the filter will short-circuit the built-in + * escaping for this field. + * + * @param bool|mixed $override_value Escaping override value to return. + * Default: null. false to skip it. + * @param mixed $meta_value The value to be output. + * @param array $field_args The current field's arguments. + * @param object $field This `CMB2_Field` object. + */ + $esc = apply_filters( "cmb2_types_esc_{$field_type}", null, $meta_value, $this->args(), $this ); + if ( null !== $esc ) { + return $esc; + } + + if ( false === $cb || $this->escaping_exception() ) { + // If requesting NO escaping, return meta value. + return $this->val_or_default( $meta_value ); + } + + // escaping function passed in? + $func = $func ? $func : 'esc_attr'; + $meta_value = $this->val_or_default( $meta_value ); + + if ( is_array( $meta_value ) ) { + foreach ( $meta_value as $key => $value ) { + $meta_value[ $key ] = call_user_func( $func, $value ); + } + } else { + $meta_value = call_user_func( $func, $meta_value ); + } + + $this->escaped_value = $meta_value; + return $this->escaped_value; + } + + /** + * Return non-empty value or field default if value IS empty + * + * @since 2.0.0 + * @param mixed $meta_value Field value. + * @return mixed Field value, or default value + */ + public function val_or_default( $meta_value ) { + return ! CMB2_Utils::isempty( $meta_value ) ? $meta_value : $this->get_default(); + } + + /** + * Offset a time value based on timezone + * + * @since 1.0.0 + * @return string Offset time string + */ + public function field_timezone_offset() { + return CMB2_Utils::timezone_offset( $this->field_timezone() ); + } + + /** + * Return timezone string + * + * @since 1.0.0 + * @return string Timezone string + */ + public function field_timezone() { + $value = ''; + + // Is timezone arg set? + if ( $this->args( 'timezone' ) ) { + $value = $this->args( 'timezone' ); + } // End if. + // Is there another meta key with a timezone stored as its value we should use? + elseif ( $this->args( 'timezone_meta_key' ) ) { + $value = $this->get_data( $this->args( 'timezone_meta_key' ) ); + } + + return $value; + } + + /** + * Format the timestamp field value based on the field date/time format arg + * + * @since 2.0.0 + * @param int $meta_value Timestamp. + * @param string $format Either date_format or time_format. + * @return string Formatted date + */ + public function format_timestamp( $meta_value, $format = 'date_format' ) { + return date( stripslashes( $this->args( $format ) ), $meta_value ); + } + + /** + * Return a formatted timestamp for a field + * + * @since 2.0.0 + * @param string $format Either date_format or time_format. + * @param string|int $meta_value Optional meta value to check. + * @return string Formatted date + */ + public function get_timestamp_format( $format = 'date_format', $meta_value = 0 ) { + $meta_value = $meta_value ? $meta_value : $this->escaped_value(); + $meta_value = CMB2_Utils::make_valid_time_stamp( $meta_value ); + + if ( empty( $meta_value ) ) { + return ''; + } + + return is_array( $meta_value ) + ? array_map( array( $this, 'format_timestamp' ), $meta_value, $format ) + : $this->format_timestamp( $meta_value, $format ); + } + + /** + * Get timestamp from text date + * + * @since 2.2.0 + * @param string $value Date value. + * @return mixed Unix timestamp representing the date. + */ + public function get_timestamp_from_value( $value ) { + return CMB2_Utils::get_timestamp_from_value( $value, $this->args( 'date_format' ) ); + } + + /** + * Get field render callback and Render the field row + * + * @since 1.0.0 + */ + public function render_field() { + $this->render_context = 'edit'; + + $this->peform_param_callback( 'render_row_cb' ); + + // For chaining. + return $this; + } + + /** + * Default field render callback + * + * @since 2.1.1 + */ + public function render_field_callback() { + + // If field is requesting to not be shown on the front-end. + if ( ! is_admin() && ! $this->args( 'on_front' ) ) { + return; + } + + // If field is requesting to be conditionally shown. + if ( ! $this->should_show() ) { + return; + } + + $field_type = $this->type(); + + /** + * Hook before field row begins. + * + * @param CMB2_Field $field The current field object. + */ + do_action( 'cmb2_before_field_row', $this ); + + /** + * Hook before field row begins. + * + * The dynamic portion of the hook name, $field_type, refers to the field type. + * + * @param CMB2_Field $field The current field object. + */ + do_action( "cmb2_before_{$field_type}_field_row", $this ); + + $this->peform_param_callback( 'before_row' ); + + printf( "
              \n", $this->row_classes(), $field_type ); + + if ( ! $this->args( 'show_names' ) ) { + echo "\n\t
              \n"; + + $this->peform_param_callback( 'label_cb' ); + + } else { + + if ( $this->get_param_callback_result( 'label_cb' ) ) { + echo '
              ', $this->peform_param_callback( 'label_cb' ), '
              '; + } + + echo "\n\t
              \n"; + } + + $this->peform_param_callback( 'before' ); + + $types = new CMB2_Types( $this ); + $types->render(); + + $this->peform_param_callback( 'after' ); + + echo "\n\t
              \n
              "; + + $this->peform_param_callback( 'after_row' ); + + /** + * Hook after field row ends. + * + * The dynamic portion of the hook name, $field_type, refers to the field type. + * + * @param CMB2_Field $field The current field object. + */ + do_action( "cmb2_after_{$field_type}_field_row", $this ); + + /** + * Hook after field row ends. + * + * @param CMB2_Field $field The current field object. + */ + do_action( 'cmb2_after_field_row', $this ); + + // For chaining. + return $this; + } + + /** + * The default label_cb callback (if not a title field) + * + * @since 2.1.1 + * @return string Label html markup. + */ + public function label() { + if ( ! $this->args( 'name' ) ) { + return ''; + } + + $style = ! $this->args( 'show_names' ) ? ' style="display:none;"' : ''; + + return sprintf( "\n" . '%3$s' . "\n", $style, $this->id(), $this->args( 'name' ) ); + } + + /** + * Defines the classes for the current CMB2 field row + * + * @since 2.0.0 + * @return string Space concatenated list of classes + */ + public function row_classes() { + + $classes = array(); + + /** + * By default, 'text_url' and 'text' fields get table-like styling + * + * @since 2.0.0 + * + * @param array $field_types The types of fields which should get the 'table-layout' class + */ + $repeat_table_rows_types = apply_filters( 'cmb2_repeat_table_row_types', array( + 'text_url', + 'text', + ) ); + + $conditional_classes = array( + 'cmb-type-' . str_replace( '_', '-', sanitize_html_class( $this->type() ) ) => true, + 'cmb2-id-' . str_replace( '_', '-', sanitize_html_class( $this->id() ) ) => true, + 'cmb-repeat' => $this->args( 'repeatable' ), + 'cmb-repeat-group-field' => $this->group, + 'cmb-inline' => $this->args( 'inline' ), + 'table-layout' => 'edit' === $this->render_context && in_array( $this->type(), $repeat_table_rows_types ), + ); + + foreach ( $conditional_classes as $class => $condition ) { + if ( $condition ) { + $classes[] = $class; + } + } + + if ( $added_classes = $this->args( 'classes' ) ) { + $added_classes = is_array( $added_classes ) ? implode( ' ', $added_classes ) : (string) $added_classes; + } elseif ( $added_classes = $this->get_param_callback_result( 'classes_cb' ) ) { + $added_classes = is_array( $added_classes ) ? implode( ' ', $added_classes ) : (string) $added_classes; + } + + if ( $added_classes ) { + $classes[] = esc_attr( $added_classes ); + } + + /** + * Globally filter row classes + * + * @since 2.0.0 + * + * @param string $classes Space-separated list of row classes + * @param CMB2_Field object $field This field object + */ + return apply_filters( 'cmb2_row_classes', implode( ' ', $classes ), $this ); + } + + /** + * Get field display callback and render the display value in the column. + * + * @since 2.2.2 + */ + public function render_column() { + $this->render_context = 'display'; + + $this->peform_param_callback( 'display_cb' ); + + // For chaining. + return $this; + } + + /** + * The method to fetch the value for this field for the REST API. + * + * @since 2.5.0 + */ + public function get_rest_value() { + $field_type = $this->type(); + $field_id = $this->id( true ); + + if ( $cb = $this->maybe_callback( 'rest_value_cb' ) ) { + add_filter( "cmb2_get_rest_value_for_{$field_id}", $cb, 99 ); + } + + $value = $this->get_data(); + + /** + * Filter the value before it is sent to the REST request. + * + * @since 2.5.0 + * + * @param mixed $value The value from CMB2_Field::get_data() + * @param CMB2_Field $field This field object. + */ + $value = apply_filters( 'cmb2_get_rest_value', $value, $this ); + + /** + * Filter the value before it is sent to the REST request. + * + * The dynamic portion of the hook name, $field_type, refers to the field type. + * + * @since 2.5.0 + * + * @param mixed $value The value from CMB2_Field::get_data() + * @param CMB2_Field $field This field object. + */ + $value = apply_filters( "cmb2_get_rest_value_{$field_type}", $value, $this ); + + /** + * Filter the value before it is sent to the REST request. + * + * The dynamic portion of the hook name, $field_id, refers to the field id. + * + * @since 2.5.0 + * + * @param mixed $value The value from CMB2_Field::get_data() + * @param CMB2_Field $field This field object. + */ + return apply_filters( "cmb2_get_rest_value_for_{$field_id}", $value, $this ); + } + + /** + * Default callback to outputs field value in a display format. + * + * @since 2.2.2 + */ + public function display_value_callback() { + // If field is requesting to be conditionally shown. + if ( ! $this->should_show() ) { + return; + } + + $display = new CMB2_Field_Display( $this ); + $field_type = $this->type(); + + /** + * A filter to bypass the default display. + * + * The dynamic portion of the hook name, $field_type, refers to the field type. + * + * Passing a non-null value to the filter will short-circuit the default display. + * + * @param bool|mixed $pre_output Default null value. + * @param CMB2_Field $field This field object. + * @param CMB2_Field_Display $display The `CMB2_Field_Display` object. + */ + $pre_output = apply_filters( "cmb2_pre_field_display_{$field_type}", null, $this, $display ); + + if ( null !== $pre_output ) { + echo $pre_output; + return; + } + + $this->peform_param_callback( 'before_display_wrap' ); + + printf( "
              \n", $this->row_classes(), $field_type ); + + $this->peform_param_callback( 'before_display' ); + + CMB2_Field_Display::get( $this )->display(); + + $this->peform_param_callback( 'after_display' ); + + echo "\n
              "; + + $this->peform_param_callback( 'after_display_wrap' ); + + // For chaining. + return $this; + } + + /** + * Replaces a hash key - {#} - with the repeatable index + * + * @since 1.2.0 + * @param string $value Value to update. + * @return string Updated value + */ + public function replace_hash( $value ) { + // Replace hash with 1 based count. + return str_replace( '{#}', ( $this->index + 1 ), $value ); + } + + /** + * Retrieve text parameter from field's text array (if it has one), or use fallback text + * For back-compatibility, falls back to checking the options array. + * + * @since 2.2.2 + * @param string $text_key Key in field's text array. + * @param string $fallback Fallback text. + * @return string Text + */ + public function get_string( $text_key, $fallback ) { + // If null, populate with our field strings values. + if ( null === $this->strings ) { + $this->strings = (array) $this->args['text']; + + if ( is_callable( $this->args['text_cb'] ) ) { + $strings = call_user_func( $this->args['text_cb'], $this ); + + if ( $strings && is_array( $strings ) ) { + $this->strings += $strings; + } + } + } + + // If we have that string value, send it back. + if ( isset( $this->strings[ $text_key ] ) ) { + return $this->strings[ $text_key ]; + } + + // Check options for back-compat. + $string = $this->options( $text_key ); + + return $string ? $string : $fallback; + } + + /** + * Retrieve options args. + * + * @since 2.0.0 + * @param string $key Specific option to retrieve. + * @return array|mixed Array of options or specific option. + */ + public function options( $key = '' ) { + if ( empty( $this->field_options ) ) { + $this->set_options(); + } + + if ( $key ) { + return array_key_exists( $key, $this->field_options ) ? $this->field_options[ $key ] : false; + } + + return $this->field_options; + } + + /** + * Generates/sets options args. Calls options_cb if it exists. + * + * @since 2.2.5 + * + * @return array Array of options + */ + public function set_options() { + $this->field_options = (array) $this->args['options']; + + if ( is_callable( $this->args['options_cb'] ) ) { + $options = call_user_func( $this->args['options_cb'], $this ); + + if ( $options && is_array( $options ) ) { + $this->field_options = $options + $this->field_options; + } + } + + return $this->field_options; + } + + /** + * Store JS dependencies as part of the field args. + * + * @since 2.2.0 + * @param array $dependencies Dependies to register for this field. + */ + public function add_js_dependencies( $dependencies = array() ) { + foreach ( (array) $dependencies as $dependency ) { + $this->args['js_dependencies'][ $dependency ] = $dependency; + } + + CMB2_JS::add_dependencies( $dependencies ); + } + + /** + * Send field data to JS. + * + * @since 2.2.0 + */ + public function register_js_data() { + if ( $this->group ) { + CMB2_JS::add_field_data( $this->group ); + } + + return CMB2_JS::add_field_data( $this ); + } + + /** + * Get an array of some of the field data to be used in the Javascript. + * + * @since 2.2.4 + * + * @return array + */ + public function js_data() { + return array( + 'label' => $this->args( 'name' ), + 'id' => $this->id( true ), + 'type' => $this->type(), + 'hash' => $this->hash_id(), + 'box' => $this->cmb_id, + 'id_attr' => $this->id(), + 'name_attr' => $this->args( '_name' ), + 'default' => $this->get_default(), + 'group' => $this->group_id(), + 'index' => $this->group ? $this->group->index : null, + ); + } + + /** + * Returns a unique hash representing this field. + * + * @since 2.2.4 + * + * @return string + */ + public function hash_id() { + if ( '' === $this->hash_id ) { + $this->hash_id = CMB2_Utils::generate_hash( $this->cmb_id . '||' . $this->id() ); + } + + return $this->hash_id; + } + + /** + * Gets the id of the group field if this field is part of a group. + * + * @since 2.2.4 + * + * @return string + */ + public function group_id() { + return $this->group ? $this->group->id( true ) : ''; + } + + /** + * Get CMB2_Field default value, either from default param or default_cb param. + * + * @since 0.2.2 + * + * @return mixed Default field value + */ + public function get_default() { + $default = $this->args['default']; + + if ( null !== $default ) { + return apply_filters( 'cmb2_default_filter', $default, $this ); + } + + $param = is_callable( $this->args['default_cb'] ) ? 'default_cb' : 'default'; + $default = $this->args['default'] = $this->get_param_callback_result( $param ); + + // Allow a filter override of the default value. + return apply_filters( 'cmb2_default_filter', $this->args['default'], $this ); + } + + /** + * Fills in empty field parameters with defaults + * + * @since 1.1.0 + * + * @param array $args Field config array. + * @return array Modified field config array. + */ + public function _set_field_defaults( $args ) { + $defaults = $this->get_default_field_args( $args ); + + /** + * Filter the CMB2 Field defaults. + * + * @since 2.6.0 + * @param array $defaults Metabox field config array defaults. + * @param string $id Field id for the current field to allow for selective filtering. + * @param string $type Field type for the current field to allow for selective filtering. + * @param CMB2_Field object $field This field object. + */ + $defaults = apply_filters( 'cmb2_field_defaults', $defaults, $args['id'], $args['type'], $this ); + + // Set up blank or default values for empty ones. + $args = wp_parse_args( $args, $defaults ); + + /** + * Filtering the CMB2 Field arguments once merged with the defaults, but before further processing. + * + * @since 2.6.0 + * @param array $args Metabox field config array defaults. + * @param CMB2_Field object $field This field object. + */ + $args = apply_filters( 'cmb2_field_arguments_raw', $args, $this ); + + /* + * Deprecated usage: + * + * 'std' -- use 'default' (no longer works) + * 'row_classes' -- use 'class', or 'class_cb' + * 'default' -- as callback (use default_cb) + */ + $args = $this->convert_deprecated_params( $args ); + + $args['repeatable'] = $args['repeatable'] && ! $this->repeatable_exception( $args['type'] ); + $args['inline'] = $args['inline'] || false !== stripos( $args['type'], '_inline' ); + $args['_id'] = $args['id']; + $args['_name'] = $args['id']; + + if ( $method = $this->has_args_method( $args['type'] ) ) { + $args = $this->{$method}( $args ); + } + + if ( $this->group ) { + $args = $this->set_group_sub_field_defaults( $args ); + } + + $args['has_supporting_data'] = in_array( + $args['type'], + array( + // CMB2_Sanitize::_save_file_id_value()/CMB2_Sanitize::_get_group_file_value_array(). + 'file', + // See CMB2_Sanitize::_save_utc_value(). + 'text_datetime_timestamp_timezone', + ), + true + ); + + // Repeatable fields require jQuery sortable library. + if ( ! empty( $args['repeatable'] ) ) { + CMB2_JS::add_dependencies( 'jquery-ui-sortable' ); + } + + /** + * Filter the CMB2 Field arguments after processing. + * + * @since 2.6.0 + * @param array $args Metabox field config array after processing. + * @param CMB2_Field object $field This field object. + */ + return apply_filters( 'cmb2_field_arguments', $args, $this ); + } + + /** + * Sets default arguments for the group field types. + * + * @since 2.2.6 + * + * @param array $args Field config array. + * @return array Modified field config array. + */ + protected function set_field_defaults_group( $args ) { + $args['options'] = wp_parse_args( $args['options'], array( + 'add_button' => esc_html__( 'Add Group', 'cmb2' ), + 'remove_button' => esc_html__( 'Remove Group', 'cmb2' ), + 'remove_confirm' => '', + ) ); + + return $args; + } + + /** + * Sets default arguments for the wysiwyg field types. + * + * @since 2.2.6 + * + * @param array $args Field config array. + * @return array Modified field config array. + */ + protected function set_field_defaults_wysiwyg( $args ) { + $args['id'] = strtolower( str_ireplace( '-', '_', $args['id'] ) ); + $args['options']['textarea_name'] = $args['_name']; + + return $args; + } + + /** + * Sets default arguments for the all-or-nothing field types. + * + * @since 2.2.6 + * + * @param array $args Field config array. + * @return array Modified field config array. + */ + protected function set_field_defaults_all_or_nothing_types( $args ) { + $args['show_option_none'] = isset( $args['show_option_none'] ) ? $args['show_option_none'] : null; + $args['show_option_none'] = true === $args['show_option_none'] ? esc_html__( 'None', 'cmb2' ) : $args['show_option_none']; + + if ( null === $args['show_option_none'] ) { + $off_by_default = in_array( $args['type'], array( 'select', 'radio', 'radio_inline' ), true ); + $args['show_option_none'] = $off_by_default ? false : esc_html__( 'None', 'cmb2' ); + } + + return $args; + } + + /** + * Sets default arguments for group sub-fields. + * + * @since 2.2.6 + * + * @param array $args Field config array. + * @return array Modified field config array. + */ + protected function set_group_sub_field_defaults( $args ) { + $args['id'] = $this->group->args( 'id' ) . '_' . $this->group->index . '_' . $args['id']; + $args['_name'] = $this->group->args( 'id' ) . '[' . $this->group->index . '][' . $args['_name'] . ']'; + + return $args; + } + + /** + * Gets the default arguments for all fields. + * + * @since 2.2.6 + * + * @param array $args Field config array. + * @return array Field defaults. + */ + protected function get_default_field_args( $args ) { + $type = isset( $args['type'] ) ? $args['type'] : ''; + + return array( + 'type' => $type, + 'name' => '', + 'desc' => '', + 'before' => '', + 'after' => '', + 'options' => array(), + 'options_cb' => '', + 'text' => array(), + 'text_cb' => '', + 'attributes' => array(), + 'protocols' => null, + 'default' => null, + 'default_cb' => '', + 'classes' => null, + 'classes_cb' => '', + 'select_all_button' => true, + 'multiple' => false, + 'repeatable' => 'group' === $type, + 'inline' => false, + 'on_front' => true, + 'show_names' => true, + 'save_field' => true, // Will not save if false. + 'date_format' => 'm\/d\/Y', + 'time_format' => 'h:i A', + 'description' => isset( $args['desc'] ) ? $args['desc'] : '', + 'preview_size' => 'file' === $type ? array( 350, 350 ) : array( 50, 50 ), + 'render_row_cb' => array( $this, 'render_field_callback' ), + 'display_cb' => array( $this, 'display_value_callback' ), + 'label_cb' => 'title' !== $type ? array( $this, 'label' ) : '', + 'column' => false, + 'js_dependencies' => array(), + 'show_in_rest' => null, + ); + } + + /** + * Get default field arguments specific to this CMB2 object. + * + * @since 2.2.0 + * @param array $field_args Metabox field config array. + * @param CMB2_Field $field_group (optional) CMB2_Field object (group parent). + * @return array Array of field arguments. + */ + protected function get_default_args( $field_args, $field_group = null ) { + $args = parent::get_default_args( array(), $this->group ); + + if ( isset( $field_args['field_args'] ) ) { + $args = wp_parse_args( $field_args, $args ); + } else { + $args['field_args'] = wp_parse_args( $field_args, $this->args ); + } + + return $args; + } + + /** + * Returns a cloned version of this field object, but with + * modified/overridden field arguments. + * + * @since 2.2.2 + * @param array $field_args Array of field arguments, or entire array of + * arguments for CMB2_Field. + * + * @return CMB2_Field The new CMB2_Field instance. + */ + public function get_field_clone( $field_args ) { + return $this->get_new_field( $field_args ); + } + + /** + * Returns the CMB2 instance this field is registered to. + * + * @since 2.2.2 + * + * @return CMB2|WP_Error If new CMB2_Field is called without cmb_id arg, returns error. + */ + public function get_cmb() { + if ( ! $this->cmb_id ) { + return new WP_Error( 'no_cmb_id', esc_html__( 'Sorry, this field does not have a cmb_id specified.', 'cmb2' ) ); + } + + return cmb2_get_metabox( $this->cmb_id, $this->object_id, $this->object_type ); + } + + /** + * Converts deprecated field parameters to the current/proper parameter, and throws a deprecation notice. + * + * @since 2.2.3 + * @param array $args Metabox field config array. + * @return array Modified field config array. + */ + protected function convert_deprecated_params( $args ) { + + if ( isset( $args['row_classes'] ) ) { + + // We'll let this one be. + // $this->deprecated_param( __CLASS__ . '::__construct()', '2.2.3', self::DEPRECATED_PARAM, 'row_classes', 'classes' ); + // row_classes param could be a callback. This is definitely deprecated. + if ( is_callable( $args['row_classes'] ) ) { + + $this->deprecated_param( __CLASS__ . '::__construct()', '2.2.3', self::DEPRECATED_CB_PARAM, 'row_classes', 'classes_cb' ); + + $args['classes_cb'] = $args['row_classes']; + $args['classes'] = null; + } else { + + $args['classes'] = $args['row_classes']; + } + + unset( $args['row_classes'] ); + } + + // default param can be passed a callback as well. + if ( is_callable( $args['default'] ) ) { + + $this->deprecated_param( __CLASS__ . '::__construct()', '2.2.3', self::DEPRECATED_CB_PARAM, 'default', 'default_cb' ); + + $args['default_cb'] = $args['default']; + $args['default'] = null; + } + + // options param can be passed a callback as well. + if ( is_callable( $args['options'] ) ) { + + $this->deprecated_param( __CLASS__ . '::__construct()', '2.2.3', self::DEPRECATED_CB_PARAM, 'options', 'options_cb' ); + + $args['options_cb'] = $args['options']; + $args['options'] = array(); + } + + return $args; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Field_Display.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Field_Display.php new file mode 100755 index 00000000..442e9518 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Field_Display.php @@ -0,0 +1,484 @@ +type() ) { + case 'text_url': + $type = new CMB2_Display_Text_Url( $field ); + break; + case 'text_money': + $type = new CMB2_Display_Text_Money( $field ); + break; + case 'colorpicker': + $type = new CMB2_Display_Colorpicker( $field ); + break; + case 'checkbox': + $type = new CMB2_Display_Checkbox( $field ); + break; + case 'wysiwyg': + case 'textarea_small': + $type = new CMB2_Display_Textarea( $field ); + break; + case 'textarea_code': + $type = new CMB2_Display_Textarea_Code( $field ); + break; + case 'text_time': + $type = new CMB2_Display_Text_Time( $field ); + break; + case 'text_date': + case 'text_date_timestamp': + case 'text_datetime_timestamp': + $type = new CMB2_Display_Text_Date( $field ); + break; + case 'text_datetime_timestamp_timezone': + $type = new CMB2_Display_Text_Date_Timezone( $field ); + break; + case 'select': + case 'radio': + case 'radio_inline': + $type = new CMB2_Display_Select( $field ); + break; + case 'multicheck': + case 'multicheck_inline': + $type = new CMB2_Display_Multicheck( $field ); + break; + case 'taxonomy_radio': + case 'taxonomy_radio_inline': + case 'taxonomy_select': + case 'taxonomy_radio_hierarchical': + $type = new CMB2_Display_Taxonomy_Radio( $field ); + break; + case 'taxonomy_multicheck': + case 'taxonomy_multicheck_inline': + case 'taxonomy_multicheck_hierarchical': + $type = new CMB2_Display_Taxonomy_Multicheck( $field ); + break; + case 'file': + $type = new CMB2_Display_File( $field ); + break; + case 'file_list': + $type = new CMB2_Display_File_List( $field ); + break; + case 'oembed': + $type = new CMB2_Display_oEmbed( $field ); + break; + default: + $type = new self( $field ); + break; + }// End switch. + + return $type; + } + + /** + * Setup our class vars + * + * @since 2.2.2 + * @param CMB2_Field $field A CMB2 field object. + */ + public function __construct( CMB2_Field $field ) { + $this->field = $field; + $this->value = $this->field->value; + } + + /** + * Catchall method if field's 'display_cb' is NOT defined, or field type does + * not have a corresponding display method + * + * @since 2.2.2 + */ + public function display() { + // If repeatable. + if ( $this->field->args( 'repeatable' ) ) { + + // And has a repeatable value. + if ( is_array( $this->field->value ) ) { + + // Then loop and output. + echo '
                '; + foreach ( $this->field->value as $val ) { + $this->value = $val; + echo '
              • ', $this->_display(), '
              • '; + ; + } + echo '
              '; + } + } else { + $this->_display(); + } + } + + /** + * Default fallback display method. + * + * @since 2.2.2 + */ + protected function _display() { + print_r( $this->value ); + } +} + +class CMB2_Display_Text_Url extends CMB2_Field_Display { + /** + * Display url value. + * + * @since 2.2.2 + */ + protected function _display() { + echo make_clickable( esc_url( $this->value ) ); + } +} + +class CMB2_Display_Text_Money extends CMB2_Field_Display { + /** + * Display text_money value. + * + * @since 2.2.2 + */ + protected function _display() { + $this->value = $this->value ? $this->value : '0'; + echo ( ! $this->field->get_param_callback_result( 'before_field' ) ? '$' : ' ' ), $this->value; + } +} + +class CMB2_Display_Colorpicker extends CMB2_Field_Display { + /** + * Display color picker value. + * + * @since 2.2.2 + */ + protected function _display() { + echo ' ', esc_html( $this->value ), ''; + } +} + +class CMB2_Display_Checkbox extends CMB2_Field_Display { + /** + * Display multicheck value. + * + * @since 2.2.2 + */ + protected function _display() { + echo $this->value === 'on' ? 'on' : 'off'; + } +} + +class CMB2_Display_Select extends CMB2_Field_Display { + /** + * Display select value. + * + * @since 2.2.2 + */ + protected function _display() { + $options = $this->field->options(); + + $fallback = $this->field->args( 'show_option_none' ); + if ( ! $fallback && isset( $options[''] ) ) { + $fallback = $options['']; + } + if ( ! $this->value && $fallback ) { + echo $fallback; + } elseif ( isset( $options[ $this->value ] ) ) { + echo $options[ $this->value ]; + } else { + echo esc_attr( $this->value ); + } + } +} + +class CMB2_Display_Multicheck extends CMB2_Field_Display { + /** + * Display multicheck value. + * + * @since 2.2.2 + */ + protected function _display() { + if ( empty( $this->value ) || ! is_array( $this->value ) ) { + return; + } + + $options = $this->field->options(); + + $output = array(); + foreach ( $this->value as $val ) { + if ( isset( $options[ $val ] ) ) { + $output[] = $options[ $val ]; + } else { + $output[] = esc_attr( $val ); + } + } + + echo implode( ', ', $output ); + } +} + +class CMB2_Display_Textarea extends CMB2_Field_Display { + /** + * Display textarea value. + * + * @since 2.2.2 + */ + protected function _display() { + echo wpautop( wp_kses_post( $this->value ) ); + } +} + +class CMB2_Display_Textarea_Code extends CMB2_Field_Display { + /** + * Display textarea_code value. + * + * @since 2.2.2 + */ + protected function _display() { + echo '' . print_r( $this->value, true ) . ''; + } +} + +class CMB2_Display_Text_Time extends CMB2_Field_Display { + /** + * Display text_time value. + * + * @since 2.2.2 + */ + protected function _display() { + echo $this->field->get_timestamp_format( 'time_format', $this->value ); + } +} + +class CMB2_Display_Text_Date extends CMB2_Field_Display { + /** + * Display text_date value. + * + * @since 2.2.2 + */ + protected function _display() { + echo $this->field->get_timestamp_format( 'date_format', $this->value ); + } +} + +class CMB2_Display_Text_Date_Timezone extends CMB2_Field_Display { + /** + * Display text_datetime_timestamp_timezone value. + * + * @since 2.2.2 + */ + protected function _display() { + $field = $this->field; + + if ( empty( $this->value ) ) { + return; + } + + $datetime = maybe_unserialize( $this->value ); + $this->value = $tzstring = ''; + + if ( $datetime && $datetime instanceof DateTime ) { + $tz = $datetime->getTimezone(); + $tzstring = $tz->getName(); + $this->value = $datetime->getTimestamp(); + } + + $date = $this->field->get_timestamp_format( 'date_format', $this->value ); + $time = $this->field->get_timestamp_format( 'time_format', $this->value ); + + echo $date, ( $time ? ' ' . $time : '' ), ( $tzstring ? ', ' . $tzstring : '' ); + } +} + +class CMB2_Display_Taxonomy_Radio extends CMB2_Field_Display { + /** + * Display single taxonomy value. + * + * @since 2.2.2 + */ + protected function _display() { + $taxonomy = $this->field->args( 'taxonomy' ); + $types = new CMB2_Types( $this->field ); + $type = $types->get_new_render_type( $this->field->type(), 'CMB2_Type_Taxonomy_Radio' ); + $terms = $type->get_object_terms(); + $term = false; + + if ( is_wp_error( $terms ) || empty( $terms ) && ( $default = $this->field->get_default() ) ) { + $term = get_term_by( 'slug', $default, $taxonomy ); + } elseif ( ! empty( $terms ) ) { + $term = $terms[ key( $terms ) ]; + } + + if ( $term ) { + $link = get_edit_term_link( $term->term_id, $taxonomy ); + echo '', esc_html( $term->name ), ''; + } + } +} + +class CMB2_Display_Taxonomy_Multicheck extends CMB2_Field_Display { + /** + * Display taxonomy values. + * + * @since 2.2.2 + */ + protected function _display() { + $taxonomy = $this->field->args( 'taxonomy' ); + $types = new CMB2_Types( $this->field ); + $type = $types->get_new_render_type( $this->field->type(), 'CMB2_Type_Taxonomy_Multicheck' ); + $terms = $type->get_object_terms(); + + if ( is_wp_error( $terms ) || empty( $terms ) && ( $default = $this->field->get_default() ) ) { + $terms = array(); + if ( is_array( $default ) ) { + foreach ( $default as $slug ) { + $terms[] = get_term_by( 'slug', $slug, $taxonomy ); + } + } else { + $terms[] = get_term_by( 'slug', $default, $taxonomy ); + } + } + + if ( is_array( $terms ) ) { + + $links = array(); + foreach ( $terms as $term ) { + $link = get_edit_term_link( $term->term_id, $taxonomy ); + $links[] = '' . esc_html( $term->name ) . ''; + } + // Then loop and output. + echo '
              '; + echo implode( ', ', $links ); + echo '
              '; + } + } +} + +class CMB2_Display_File extends CMB2_Field_Display { + /** + * Display file value. + * + * @since 2.2.2 + */ + protected function _display() { + if ( empty( $this->value ) ) { + return; + } + + $this->value = esc_url_raw( $this->value ); + + $types = new CMB2_Types( $this->field ); + $type = $types->get_new_render_type( $this->field->type(), 'CMB2_Type_File_Base' ); + + $id = $this->field->get_field_clone( array( + 'id' => $this->field->_id() . '_id', + ) )->escaped_value( 'absint' ); + + $this->file_output( $this->value, $id, $type ); + } + + protected function file_output( $url_value, $id, CMB2_Type_File_Base $field_type ) { + // If there is no ID saved yet, try to get it from the url. + if ( $url_value && ! $id ) { + $id = CMB2_Utils::image_id_from_url( esc_url_raw( $url_value ) ); + } + + if ( $field_type->is_valid_img_ext( $url_value ) ) { + $img_size = $this->field->args( 'preview_size' ); + + if ( $id ) { + $image = wp_get_attachment_image( $id, $img_size, null, array( + 'class' => 'cmb-image-display', + ) ); + } else { + $size = is_array( $img_size ) ? $img_size[0] : 200; + $image = ''; + } + + echo $image; + + } else { + + printf( '
              %1$s %3$s
              ', + esc_html( $field_type->_text( 'file_text', esc_html__( 'File:', 'cmb2' ) ) ), + $url_value, + CMB2_Utils::get_file_name_from_path( $url_value ) + ); + + } + } +} + +class CMB2_Display_File_List extends CMB2_Display_File { + /** + * Display file_list value. + * + * @since 2.2.2 + */ + protected function _display() { + if ( empty( $this->value ) || ! is_array( $this->value ) ) { + return; + } + + $types = new CMB2_Types( $this->field ); + $type = $types->get_new_render_type( $this->field->type(), 'CMB2_Type_File_Base' ); + + echo '
                '; + foreach ( $this->value as $id => $fullurl ) { + echo '
              • ', $this->file_output( esc_url_raw( $fullurl ), $id, $type ), '
              • '; + } + echo '
              '; + } +} + +class CMB2_Display_oEmbed extends CMB2_Field_Display { + /** + * Display oembed value. + * + * @since 2.2.2 + */ + protected function _display() { + if ( ! $this->value ) { + return; + } + + cmb2_do_oembed( array( + 'url' => $this->value, + 'object_id' => $this->field->object_id, + 'object_type' => $this->field->object_type, + 'oembed_args' => array( + 'width' => '300', + ), + 'field_id' => $this->field->id(), + ) ); + } +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Hookup_Base.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Hookup_Base.php new file mode 100755 index 00000000..7a847819 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Hookup_Base.php @@ -0,0 +1,105 @@ +cmb = $cmb; + $this->object_type = $this->cmb->mb_object_type(); + } + + abstract public function universal_hooks(); + + /** + * Ensures WordPress hook only gets fired once per object. + * + * @since 2.0.0 + * @param string $action The name of the filter to hook the $hook callback to. + * @param callback $hook The callback to be run when the filter is applied. + * @param integer $priority Order the functions are executed. + * @param int $accepted_args The number of arguments the function accepts. + */ + public function once( $action, $hook, $priority = 10, $accepted_args = 1 ) { + static $hooks_completed = array(); + + $args = func_get_args(); + + // Get object hash.. This bypasses issues with serializing closures. + if ( is_object( $hook ) ) { + $args[1] = spl_object_hash( $args[1] ); + } elseif ( is_array( $hook ) && is_object( $hook[0] ) ) { + $args[1][0] = spl_object_hash( $hook[0] ); + } + + $key = md5( serialize( $args ) ); + + if ( ! isset( $hooks_completed[ $key ] ) ) { + $hooks_completed[ $key ] = 1; + add_filter( $action, $hook, $priority, $accepted_args ); + } + } + + /** + * Magic getter for our object. + * + * @param string $field Property to return. + * @throws Exception Throws an exception if the field is invalid. + * @return mixed + */ + public function __get( $field ) { + switch ( $field ) { + case 'object_type': + case 'cmb': + return $this->{$field}; + default: + throw new Exception( sprintf( esc_html__( 'Invalid %1$s property: %2$s', 'cmb2' ), __CLASS__, $field ) ); + } + } +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_JS.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_JS.php new file mode 100755 index 00000000..ff4e2eea --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_JS.php @@ -0,0 +1,245 @@ + 'jquery', + ); + + /** + * Array of CMB2 fields model data for JS. + * + * @var array + * @since 2.4.0 + */ + protected static $fields = array(); + + /** + * Add a dependency to the array of CMB2 JS dependencies + * + * @since 2.0.7 + * @param array|string $dependencies Array (or string) of dependencies to add. + */ + public static function add_dependencies( $dependencies ) { + foreach ( (array) $dependencies as $dependency ) { + self::$dependencies[ $dependency ] = $dependency; + } + } + + /** + * Add field model data to the array for JS. + * + * @since 2.4.0 + * + * @param CMB2_Field $field Field object. + */ + public static function add_field_data( CMB2_Field $field ) { + $hash = $field->hash_id(); + if ( ! isset( self::$fields[ $hash ] ) ) { + self::$fields[ $hash ] = $field->js_data(); + } + } + + /** + * Enqueue the CMB2 JS + * + * @since 2.0.7 + */ + public static function enqueue() { + // Filter required script dependencies. + $dependencies = self::$dependencies = apply_filters( 'cmb2_script_dependencies', self::$dependencies ); + + // Only use minified files if SCRIPT_DEBUG is off. + $debug = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG; + + $min = $debug ? '' : '.min'; + + // if colorpicker. + if ( isset( $dependencies['wp-color-picker'] ) ) { + if ( ! is_admin() ) { + self::colorpicker_frontend(); + } + + if ( isset( $dependencies['wp-color-picker-alpha'] ) ) { + self::register_colorpicker_alpha(); + } + } + + // if file/file_list. + if ( isset( $dependencies['media-editor'] ) ) { + wp_enqueue_media(); + CMB2_Type_File_Base::output_js_underscore_templates(); + } + + // if timepicker. + if ( isset( $dependencies['jquery-ui-datetimepicker'] ) ) { + self::register_datetimepicker(); + } + + // if cmb2-wysiwyg. + $enqueue_wysiwyg = isset( $dependencies['cmb2-wysiwyg'] ) && $debug; + unset( $dependencies['cmb2-wysiwyg'] ); + + // Enqueue cmb JS. + wp_enqueue_script( self::$handle, CMB2_Utils::url( "js/cmb2{$min}.js" ), $dependencies, CMB2_VERSION, true ); + + // if SCRIPT_DEBUG, we need to enqueue separately. + if ( $enqueue_wysiwyg ) { + wp_enqueue_script( 'cmb2-wysiwyg', CMB2_Utils::url( 'js/cmb2-wysiwyg.js' ), array( 'jquery', 'wp-util' ), CMB2_VERSION ); + } + + self::localize( $debug ); + + do_action( 'cmb2_footer_enqueue' ); + } + + /** + * Register or enqueue the wp-color-picker-alpha script. + * + * @since 2.2.7 + * + * @param boolean $enqueue Whether or not to enqueue. + * + * @return void + */ + public static function register_colorpicker_alpha( $enqueue = false ) { + // Only use minified files if SCRIPT_DEBUG is off. + $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; + $func = $enqueue ? 'wp_enqueue_script' : 'wp_register_script'; + $func( 'wp-color-picker-alpha', CMB2_Utils::url( "js/wp-color-picker-alpha{$min}.js" ), array( 'wp-color-picker' ), '2.1.3' ); + } + + /** + * Register or enqueue the jquery-ui-datetimepicker script. + * + * @since 2.2.7 + * + * @param boolean $enqueue Whether or not to enqueue. + * + * @return void + */ + public static function register_datetimepicker( $enqueue = false ) { + $func = $enqueue ? 'wp_enqueue_script' : 'wp_register_script'; + $func( 'jquery-ui-datetimepicker', CMB2_Utils::url( 'js/jquery-ui-timepicker-addon.min.js' ), array( 'jquery-ui-slider' ), '1.5.0' ); + } + + /** + * We need to register colorpicker on the front-end + * + * @since 2.0.7 + */ + protected static function colorpicker_frontend() { + wp_register_script( 'iris', admin_url( 'js/iris.min.js' ), array( 'jquery-ui-draggable', 'jquery-ui-slider', 'jquery-touch-punch' ), CMB2_VERSION ); + wp_register_script( 'wp-color-picker', admin_url( 'js/color-picker.min.js' ), array( 'iris' ), CMB2_VERSION ); + wp_localize_script( 'wp-color-picker', 'wpColorPickerL10n', array( + 'clear' => esc_html__( 'Clear', 'cmb2' ), + 'defaultString' => esc_html__( 'Default', 'cmb2' ), + 'pick' => esc_html__( 'Select Color', 'cmb2' ), + 'current' => esc_html__( 'Current Color', 'cmb2' ), + ) ); + } + + /** + * Localize the php variables for CMB2 JS + * + * @since 2.0.7 + * + * @param mixed $debug Whether or not we are debugging. + */ + protected static function localize( $debug ) { + static $localized = false; + if ( $localized ) { + return; + } + + $localized = true; + $l10n = array( + 'fields' => self::$fields, + 'ajax_nonce' => wp_create_nonce( 'ajax_nonce' ), + 'ajaxurl' => admin_url( '/admin-ajax.php' ), + 'script_debug' => $debug, + 'up_arrow_class' => 'dashicons dashicons-arrow-up-alt2', + 'down_arrow_class' => 'dashicons dashicons-arrow-down-alt2', + 'user_can_richedit' => user_can_richedit(), + 'defaults' => array( + 'code_editor' => false, + 'color_picker' => false, + 'date_picker' => array( + 'changeMonth' => true, + 'changeYear' => true, + 'dateFormat' => _x( 'mm/dd/yy', 'Valid formatDate string for jquery-ui datepicker', 'cmb2' ), + 'dayNames' => explode( ',', esc_html__( 'Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday', 'cmb2' ) ), + 'dayNamesMin' => explode( ',', esc_html__( 'Su, Mo, Tu, We, Th, Fr, Sa', 'cmb2' ) ), + 'dayNamesShort' => explode( ',', esc_html__( 'Sun, Mon, Tue, Wed, Thu, Fri, Sat', 'cmb2' ) ), + 'monthNames' => explode( ',', esc_html__( 'January, February, March, April, May, June, July, August, September, October, November, December', 'cmb2' ) ), + 'monthNamesShort' => explode( ',', esc_html__( 'Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec', 'cmb2' ) ), + 'nextText' => esc_html__( 'Next', 'cmb2' ), + 'prevText' => esc_html__( 'Prev', 'cmb2' ), + 'currentText' => esc_html__( 'Today', 'cmb2' ), + 'closeText' => esc_html__( 'Done', 'cmb2' ), + 'clearText' => esc_html__( 'Clear', 'cmb2' ), + ), + 'time_picker' => array( + 'timeOnlyTitle' => esc_html__( 'Choose Time', 'cmb2' ), + 'timeText' => esc_html__( 'Time', 'cmb2' ), + 'hourText' => esc_html__( 'Hour', 'cmb2' ), + 'minuteText' => esc_html__( 'Minute', 'cmb2' ), + 'secondText' => esc_html__( 'Second', 'cmb2' ), + 'currentText' => esc_html__( 'Now', 'cmb2' ), + 'closeText' => esc_html__( 'Done', 'cmb2' ), + 'timeFormat' => _x( 'hh:mm TT', 'Valid formatting string, as per http://trentrichardson.com/examples/timepicker/', 'cmb2' ), + 'controlType' => 'select', + 'stepMinute' => 5, + ), + ), + 'strings' => array( + 'upload_file' => esc_html__( 'Use this file', 'cmb2' ), + 'upload_files' => esc_html__( 'Use these files', 'cmb2' ), + 'remove_image' => esc_html__( 'Remove Image', 'cmb2' ), + 'remove_file' => esc_html__( 'Remove', 'cmb2' ), + 'file' => esc_html__( 'File:', 'cmb2' ), + 'download' => esc_html__( 'Download', 'cmb2' ), + 'check_toggle' => esc_html__( 'Select / Deselect All', 'cmb2' ), + ), + ); + + if ( isset( self::$dependencies['code-editor'] ) && function_exists( 'wp_enqueue_code_editor' ) ) { + $l10n['defaults']['code_editor'] = wp_enqueue_code_editor( array( + 'type' => 'text/html', + ) ); + } + + wp_localize_script( self::$handle, self::$js_variable, apply_filters( 'cmb2_localized_data', $l10n ) ); + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Options.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Options.php new file mode 100755 index 00000000..3aa18ce2 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Options.php @@ -0,0 +1,250 @@ +key = ! empty( $option_key ) ? $option_key : ''; + } + + /** + * Delete the option from the db + * + * @since 2.0.0 + * @return mixed Delete success or failure + */ + public function delete_option() { + $deleted = $this->key ? delete_option( $this->key ) : true; + $this->options = $deleted ? array() : $this->options; + return $this->options; + } + + /** + * Removes an option from an option array + * + * @since 1.0.1 + * @param string $field_id Option array field key. + * @param bool $resave Whether or not to resave. + * @return array Modified options + */ + public function remove( $field_id, $resave = false ) { + + $this->get_options(); + + if ( isset( $this->options[ $field_id ] ) ) { + unset( $this->options[ $field_id ] ); + } + + if ( $resave ) { + $this->set(); + } + + return $this->options; + } + + /** + * Retrieves an option from an option array + * + * @since 1.0.1 + * @param string $field_id Option array field key. + * @param mixed $default Fallback value for the option. + * @return array Requested field or default + */ + public function get( $field_id, $default = false ) { + $opts = $this->get_options(); + + if ( 'all' == $field_id ) { + return $opts; + } elseif ( array_key_exists( $field_id, $opts ) ) { + return false !== $opts[ $field_id ] ? $opts[ $field_id ] : $default; + } + + return $default; + } + + /** + * Updates Option data + * + * @since 1.0.1 + * @param string $field_id Option array field key. + * @param mixed $value Value to update data with. + * @param bool $resave Whether to re-save the data. + * @param bool $single Whether data should not be an array. + * @return boolean Return status of update. + */ + public function update( $field_id, $value = '', $resave = false, $single = true ) { + $this->get_options(); + + if ( true !== $field_id ) { + + if ( ! $single ) { + // If multiple, add to array. + $this->options[ $field_id ][] = $value; + } else { + $this->options[ $field_id ] = $value; + } + } + + if ( $resave || true === $field_id ) { + return $this->set(); + } + + return true; + } + + /** + * Saves the option array + * Needs to be run after finished using remove/update_option + * + * @uses apply_filters() Calls 'cmb2_override_option_save_{$this->key}' hook + * to allow overwriting the option value to be stored. + * + * @since 1.0.1 + * @param array $options Optional options to override. + * @return bool Success/Failure + */ + public function set( $options = array() ) { + if ( ! empty( $options ) || empty( $options ) && empty( $this->key ) ) { + $this->options = $options; + } + + $this->options = wp_unslash( $this->options ); // get rid of those evil magic quotes. + + if ( empty( $this->key ) ) { + return false; + } + + $test_save = apply_filters( "cmb2_override_option_save_{$this->key}", 'cmb2_no_override_option_save', $this->options, $this ); + + if ( 'cmb2_no_override_option_save' !== $test_save ) { + // If override, do not proceed to update the option, just return result. + return $test_save; + } + + /** + * Whether to auto-load the option when WordPress starts up. + * + * The dynamic portion of the hook name, $this->key, refers to the option key. + * + * @since 2.4.0 + * + * @param bool $autoload Whether to load the option when WordPress starts up. + * @param CMB2_Option $cmb_option This object. + */ + $autoload = apply_filters( "cmb2_should_autoload_{$this->key}", true, $this ); + + return update_option( + $this->key, + $this->options, + ! $autoload || 'no' === $autoload ? false : true + ); + } + + /** + * Retrieve option value based on name of option. + * + * @uses apply_filters() Calls 'cmb2_override_option_get_{$this->key}' hook to allow + * overwriting the option value to be retrieved. + * + * @since 1.0.1 + * @param mixed $default Optional. Default value to return if the option does not exist. + * @return mixed Value set for the option. + */ + public function get_options( $default = null ) { + if ( empty( $this->options ) && ! empty( $this->key ) ) { + + $test_get = apply_filters( "cmb2_override_option_get_{$this->key}", 'cmb2_no_override_option_get', $default, $this ); + + if ( 'cmb2_no_override_option_get' !== $test_get ) { + $this->options = $test_get; + } else { + // If no override, get the option. + $this->options = get_option( $this->key, $default ); + } + } + + $this->options = (array) $this->options; + + return $this->options; + } + + /** + * Magic getter for our object. + * + * @since 2.6.0 + * + * @param string $field Requested property. + * @throws Exception Throws an exception if the field is invalid. + * @return mixed + */ + public function __get( $field ) { + switch ( $field ) { + case 'options': + case 'key': + return $this->{$field}; + default: + throw new Exception( sprintf( esc_html__( 'Invalid %1$s property: %2$s', 'cmb2' ), __CLASS__, $field ) ); + } + } +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Options_Hookup.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Options_Hookup.php new file mode 100755 index 00000000..8eacca31 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Options_Hookup.php @@ -0,0 +1,360 @@ +cmb = $cmb; + $this->option_key = $option_key; + } + + public function hooks() { + if ( empty( $this->option_key ) ) { + return; + } + + if ( ! $this->cmb->prop( 'autoload', true ) ) { + // Disable option autoload if requested. + add_filter( "cmb2_should_autoload_{$this->option_key}", '__return_false' ); + } + + /** + * For WP < 4.7. Ensure the register_setting function exists. + */ + if ( ! CMB2_Utils::wp_at_least( '4.7' ) && ! function_exists( 'register_setting' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + // Register setting to cmb2 group. + register_setting( 'cmb2', $this->option_key ); + + // Handle saving the data. + add_action( 'admin_post_' . $this->option_key, array( $this, 'save_options' ) ); + + // Optionally network_admin_menu. + $hook = $this->cmb->prop( 'admin_menu_hook' ); + + // Hook in to add our menu. + add_action( $hook, array( $this, 'options_page_menu_hooks' ) ); + + // If in the network admin, need to use get/update_site_option. + if ( 'network_admin_menu' === $hook ) { + // Override CMB's getter. + add_filter( "cmb2_override_option_get_{$this->option_key}", array( $this, 'network_get_override' ), 10, 2 ); + // Override CMB's setter. + add_filter( "cmb2_override_option_save_{$this->option_key}", array( $this, 'network_update_override' ), 10, 2 ); + } + } + + /** + * Hook up our admin menu item and admin page. + * + * @since 2.2.5 + * + * @return void + */ + public function options_page_menu_hooks() { + $parent_slug = $this->cmb->prop( 'parent_slug' ); + $title = $this->cmb->prop( 'title' ); + $menu_title = $this->cmb->prop( 'menu_title', $title ); + $capability = $this->cmb->prop( 'capability' ); + $callback = array( $this, 'options_page_output' ); + + if ( $parent_slug ) { + $page_hook = add_submenu_page( + $parent_slug, + $title, + $menu_title, + $capability, + $this->option_key, + $callback + ); + } else { + $page_hook = add_menu_page( + $title, + $menu_title, + $capability, + $this->option_key, + $callback, + $this->cmb->prop( 'icon_url' ), + $this->cmb->prop( 'position' ) + ); + } + + if ( $this->cmb->prop( 'cmb_styles' ) ) { + // Include CMB CSS in the head to avoid FOUC. + add_action( "admin_print_styles-{$page_hook}", array( 'CMB2_hookup', 'enqueue_cmb_css' ) ); + } + + $this->maybe_register_message(); + } + + /** + * If there is a message callback, let it determine how to register the message, + * else add a settings message if on this settings page. + * + * @since 2.2.6 + * + * @return void + */ + public function maybe_register_message() { + $is_options_page = self::is_page( $this->option_key ); + $should_notify = ! $this->cmb->prop( 'disable_settings_errors' ) && isset( $_GET['settings-updated'] ) && $is_options_page; + $is_updated = $should_notify && 'true' === $_GET['settings-updated']; + $setting = "{$this->option_key}-notices"; + $code = ''; + $message = esc_html__( 'Nothing to update.', 'cmb2' ); + $type = 'notice-warning'; + + if ( $is_updated ) { + $message = esc_html__( 'Settings updated.', 'cmb2' ); + $type = 'updated'; + } + + // Check if parameter has registered a callback. + if ( $cb = $this->cmb->maybe_callback( 'message_cb' ) ) { + + /** + * The 'message_cb' callback will receive the following parameters. + * Unless there are other reasons for notifications, the callback should only + * `add_settings_error()` if `$args['should_notify']` is truthy. + * + * @param CMB2 $cmb The CMB2 object. + * @param array $args { + * An array of message arguments + * + * @type bool $is_options_page Whether current page is this options page. + * @type bool $should_notify Whether options were saved and we should be notified. + * @type bool $is_updated Whether options were updated with save (or stayed the same). + * @type string $setting For add_settings_error(), Slug title of the setting to which + * this error applies. + * @type string $code For add_settings_error(), Slug-name to identify the error. + * Used as part of 'id' attribute in HTML output. + * @type string $message For add_settings_error(), The formatted message text to display + * to the user (will be shown inside styled `
              ` and `

              ` tags). + * Will be 'Settings updated.' if $is_updated is true, else 'Nothing to update.' + * @type string $type For add_settings_error(), Message type, controls HTML class. + * Accepts 'error', 'updated', '', 'notice-warning', etc. + * Will be 'updated' if $is_updated is true, else 'notice-warning'. + * } + */ + $args = compact( 'is_options_page', 'should_notify', 'is_updated', 'setting', 'code', 'message', 'type' ); + + $this->cmb->do_callback( $cb, $args ); + + } elseif ( $should_notify ) { + + add_settings_error( $setting, $code, $message, $type ); + } + } + + /** + * Display options-page output. To override, set 'display_cb' box property. + * + * @since 2.2.5 + */ + public function options_page_output() { + $this->maybe_output_settings_notices(); + + $callback = $this->cmb->prop( 'display_cb' ); + if ( is_callable( $callback ) ) { + return call_user_func( $callback, $this ); + } + + $tabs = $this->get_tab_group_tabs(); + ?> +

              + cmb->prop( 'title' ) ) : ?> +

              cmb->prop( 'title' ) ); ?>

              + + + + +
              + + options_page_metabox(); ?> + cmb->prop( 'save_button' ) ), 'primary', 'submit-cmb' ); ?> +
              +
              + option_key}-notices" ); + } + } + + /** + * Gets navigation tabs array for CMB2 options pages which share the + * same tab_group property. + * + * @since 2.4.0 + * @return array Array of tab information ($option_key => $tab_title) + */ + public function get_tab_group_tabs() { + $tab_group = $this->cmb->prop( 'tab_group' ); + $tabs = array(); + + if ( $tab_group ) { + $boxes = CMB2_Boxes::get_by( 'tab_group', $tab_group ); + + foreach ( $boxes as $cmb_id => $cmb ) { + $option_key = $cmb->options_page_keys(); + + // Must have an option key, must be an options page box. + if ( ! isset( $option_key[0] ) || 'options-page' !== $cmb->mb_object_type() ) { + continue; + } + + $tabs[ $option_key[0] ] = $cmb->prop( 'tab_title', $cmb->prop( 'title' ) ); + } + } + + return $tabs; + } + + /** + * Display metaboxes for an options-page object. + * + * @since 2.2.5 + */ + public function options_page_metabox() { + $this->show_form_for_type( 'options-page' ); + } + + /** + * Save data from options page, then redirects back. + * + * @since 2.2.5 + * @return void + */ + public function save_options() { + $url = wp_get_referer(); + if ( ! $url ) { + $url = admin_url(); + } + + if ( + $this->can_save( 'options-page' ) + // check params. + && isset( $_POST['submit-cmb'], $_POST['action'] ) + && $this->option_key === $_POST['action'] + ) { + + $updated = $this->cmb + ->save_fields( $this->option_key, $this->cmb->object_type(), $_POST ) + ->was_updated(); // Will be false if no values were changed/updated. + + $url = add_query_arg( 'settings-updated', $updated ? 'true' : 'false', $url ); + } + + wp_safe_redirect( esc_url_raw( $url ), 303 /* WP_Http::SEE_OTHER */ ); + exit; + } + + /** + * Replaces get_option with get_site_option. + * + * @since 2.2.5 + * + * @param mixed $test Not used. + * @param mixed $default Default value to use. + * @return mixed Value set for the network option. + */ + public function network_get_override( $test, $default = false ) { + return get_site_option( $this->option_key, $default ); + } + + /** + * Replaces update_option with update_site_option. + * + * @since 2.2.5 + * + * @param mixed $test Not used. + * @param mixed $option_value Value to use. + * @return bool Success/Failure + */ + public function network_update_override( $test, $option_value ) { + return update_site_option( $this->option_key, $option_value ); + } + + /** + * Determines if given page slug matches the 'page' GET query variable. + * + * @since 2.4.0 + * + * @param string $page Page slug. + * @return boolean + */ + public static function is_page( $page ) { + return isset( $_GET['page'] ) && $page === $_GET['page']; + } + + /** + * Magic getter for our object. + * + * @param string $field Property to retrieve. + * + * @throws Exception Throws an exception if the field is invalid. + * @return mixed + */ + public function __get( $field ) { + switch ( $field ) { + case 'object_type': + case 'option_key': + case 'cmb': + return $this->{$field}; + default: + throw new Exception( sprintf( esc_html__( 'Invalid %1$s property: %2$s', 'cmb2' ), __CLASS__, $field ) ); + } + } +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Sanitize.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Sanitize.php new file mode 100755 index 00000000..b5ef8567 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Sanitize.php @@ -0,0 +1,587 @@ +field = $field; + $this->value = $value; + } + + /** + * Catchall method if field's 'sanitization_cb' is NOT defined, + * or field type does not have a corresponding validation method. + * + * @since 1.0.0 + * + * @param string $name Non-existent method name. + * @param array $arguments All arguments passed to the method. + * @return mixed + */ + public function __call( $name, $arguments ) { + return $this->default_sanitization(); + } + + /** + * Default fallback sanitization method. Applies filters. + * + * @since 1.0.2 + */ + public function default_sanitization() { + $field_type = $this->field->type(); + + /** + * This exists for back-compatibility, but validation + * is not what happens here. + * + * @deprecated See documentation for "cmb2_sanitize_{$field_type}". + */ + if ( function_exists( 'apply_filters_deprecated' ) ) { + $override_value = apply_filters_deprecated( "cmb2_validate_{$field_type}", array( null, $this->value, $this->field->object_id, $this->field->args(), $this ), '2.0.0', "cmb2_sanitize_{$field_type}" ); + } else { + $override_value = apply_filters( "cmb2_validate_{$field_type}", null, $this->value, $this->field->object_id, $this->field->args(), $this ); + } + + if ( null !== $override_value ) { + return $override_value; + } + + $sanitized_value = ''; + switch ( $field_type ) { + case 'wysiwyg': + case 'textarea_small': + case 'oembed': + $sanitized_value = $this->textarea(); + break; + case 'taxonomy_select': + case 'taxonomy_radio': + case 'taxonomy_radio_inline': + case 'taxonomy_radio_hierarchical': + case 'taxonomy_multicheck': + case 'taxonomy_multicheck_hierarchical': + case 'taxonomy_multicheck_inline': + $sanitized_value = $this->taxonomy(); + break; + case 'multicheck': + case 'multicheck_inline': + case 'file_list': + case 'group': + // no filtering + $sanitized_value = $this->value; + break; + default: + // Handle repeatable fields array + // We'll fallback to 'sanitize_text_field' + $sanitized_value = $this->_default_sanitization(); + break; + } + + return $this->_is_empty_array( $sanitized_value ) ? '' : $sanitized_value; + } + + /** + * Default sanitization method, sanitize_text_field. Checks if value is array. + * + * @since 2.2.4 + * @return mixed Sanitized value. + */ + protected function _default_sanitization() { + // Handle repeatable fields array. + return is_array( $this->value ) ? array_map( 'sanitize_text_field', $this->value ) : sanitize_text_field( $this->value ); + } + + /** + * Sets the object terms to the object (if not options-page) and optionally returns the sanitized term values. + * + * @since 2.2.4 + * @return mixed Blank value, or sanitized term values if "cmb2_return_taxonomy_values_{$cmb_id}" is true. + */ + public function taxonomy() { + $sanitized_value = ''; + + if ( ! $this->field->args( 'taxonomy' ) ) { + CMB2_Utils::log_if_debug( __METHOD__, __LINE__, "{$this->field->type()} {$this->field->_id()} is missing the 'taxonomy' parameter." ); + } else { + + if ( in_array( $this->field->object_type, array( 'options-page', 'term' ), true ) ) { + $return_values = true; + } else { + wp_set_object_terms( $this->field->object_id, $this->value, $this->field->args( 'taxonomy' ) ); + $return_values = false; + } + + $cmb_id = $this->field->cmb_id; + + /** + * Filter whether 'taxonomy_*' fields should return their value when being sanitized. + * + * By default, these fields do not return a value as we do not want them stored to meta + * (as they are stored as terms). This allows overriding that and is used by CMB2::get_sanitized_values(). + * + * The dynamic portion of the hook, $cmb_id, refers to the this field's CMB2 box id. + * + * @since 2.2.4 + * + * @param bool $return_values By default, this is only true for 'options-page' boxes. To enable: + * `add_filter( "cmb2_return_taxonomy_values_{$cmb_id}", '__return_true' );` + * @param CMB2_Sanitize $sanitizer This object. + */ + if ( apply_filters( "cmb2_return_taxonomy_values_{$cmb_id}", $return_values, $this ) ) { + $sanitized_value = $this->_default_sanitization(); + } + } + + return $sanitized_value; + } + + /** + * Simple checkbox validation + * + * @since 1.0.1 + * @return string|false 'on' or false + */ + public function checkbox() { + return $this->value === 'on' ? 'on' : false; + } + + /** + * Validate url in a meta value. + * + * @since 1.0.1 + * @return string Empty string or escaped url + */ + public function text_url() { + $protocols = $this->field->args( 'protocols' ); + // for repeatable. + if ( is_array( $this->value ) ) { + foreach ( $this->value as $key => $val ) { + $this->value[ $key ] = $val ? esc_url_raw( $val, $protocols ) : $this->field->get_default(); + } + } else { + $this->value = $this->value ? esc_url_raw( $this->value, $protocols ) : $this->field->get_default(); + } + + return $this->value; + } + + public function colorpicker() { + // for repeatable. + if ( is_array( $this->value ) ) { + $check = $this->value; + $this->value = array(); + foreach ( $check as $key => $val ) { + if ( $val && '#' != $val ) { + $this->value[ $key ] = esc_attr( $val ); + } + } + } else { + $this->value = ! $this->value || '#' == $this->value ? '' : esc_attr( $this->value ); + } + return $this->value; + } + + /** + * Validate email in a meta value + * + * @since 1.0.1 + * @return string Empty string or sanitized email + */ + public function text_email() { + // for repeatable. + if ( is_array( $this->value ) ) { + foreach ( $this->value as $key => $val ) { + $val = trim( $val ); + $this->value[ $key ] = is_email( $val ) ? $val : ''; + } + } else { + $this->value = trim( $this->value ); + $this->value = is_email( $this->value ) ? $this->value : ''; + } + + return $this->value; + } + + /** + * Validate money in a meta value + * + * @since 1.0.1 + * @return string Empty string or sanitized money value + */ + public function text_money() { + if ( ! $this->value ) { + return ''; + } + + global $wp_locale; + + $search = array( $wp_locale->number_format['thousands_sep'], $wp_locale->number_format['decimal_point'] ); + $replace = array( '', '.' ); + + // Strip slashes. Example: 2\'180.00. + // See https://github.com/CMB2/CMB2/issues/1014. + $this->value = wp_unslash( $this->value ); + + // for repeatable. + if ( is_array( $this->value ) ) { + foreach ( $this->value as $key => $val ) { + if ( $val ) { + $this->value[ $key ] = number_format_i18n( (float) str_ireplace( $search, $replace, $val ), 2 ); + } + } + } else { + $this->value = number_format_i18n( (float) str_ireplace( $search, $replace, $this->value ), 2 ); + } + + return $this->value; + } + + /** + * Converts text date to timestamp + * + * @since 1.0.2 + * @return string Timestring + */ + public function text_date_timestamp() { + // date_create_from_format if there is a slash in the value. + $this->value = wp_unslash( $this->value ); + + return is_array( $this->value ) + ? array_map( array( $this->field, 'get_timestamp_from_value' ), $this->value ) + : $this->field->get_timestamp_from_value( $this->value ); + } + + /** + * Datetime to timestamp + * + * @since 1.0.1 + * + * @param bool $repeat Whether or not to repeat. + * @return string|array Timestring + */ + public function text_datetime_timestamp( $repeat = false ) { + // date_create_from_format if there is a slash in the value. + $this->value = wp_unslash( $this->value ); + + $test = is_array( $this->value ) ? array_filter( $this->value ) : ''; + if ( empty( $test ) ) { + return ''; + } + + $repeat_value = $this->_check_repeat( __FUNCTION__, $repeat ); + if ( false !== $repeat_value ) { + return $repeat_value; + } + + if ( isset( $this->value['date'], $this->value['time'] ) ) { + $this->value = $this->field->get_timestamp_from_value( $this->value['date'] . ' ' . $this->value['time'] ); + } + + if ( $tz_offset = $this->field->field_timezone_offset() ) { + $this->value += (int) $tz_offset; + } + + return $this->value; + } + + /** + * Datetime to timestamp with timezone + * + * @since 1.0.1 + * + * @param bool $repeat Whether or not to repeat. + * @return string Timestring + */ + public function text_datetime_timestamp_timezone( $repeat = false ) { + static $utc_values = array(); + + $test = is_array( $this->value ) ? array_filter( $this->value ) : ''; + if ( empty( $test ) ) { + return ''; + } + + // date_create_from_format if there is a slash in the value. + $this->value = wp_unslash( $this->value ); + + $utc_key = $this->field->_id() . '_utc'; + + $repeat_value = $this->_check_repeat( __FUNCTION__, $repeat ); + if ( false !== $repeat_value ) { + if ( ! empty( $utc_values[ $utc_key ] ) ) { + $this->_save_utc_value( $utc_key, $utc_values[ $utc_key ] ); + unset( $utc_values[ $utc_key ] ); + } + + return $repeat_value; + } + + $tzstring = null; + + if ( is_array( $this->value ) && array_key_exists( 'timezone', $this->value ) ) { + $tzstring = $this->value['timezone']; + } + + if ( empty( $tzstring ) ) { + $tzstring = CMB2_Utils::timezone_string(); + } + + $offset = CMB2_Utils::timezone_offset( $tzstring ); + + if ( 'UTC' === substr( $tzstring, 0, 3 ) ) { + $tzstring = timezone_name_from_abbr( '', $offset, 0 ); + /** + * The timezone_name_from_abbr() returns false if not found based on offset. + * Since there are currently some invalid timezones in wp_timezone_dropdown(), + * fallback to an offset of 0 (UTC+0) + * https://core.trac.wordpress.org/ticket/29205 + */ + $tzstring = false !== $tzstring ? $tzstring : timezone_name_from_abbr( '', 0, 0 ); + } + + $full_format = $this->field->args['date_format'] . ' ' . $this->field->args['time_format']; + $full_date = $this->value['date'] . ' ' . $this->value['time']; + + try { + + $datetime = date_create_from_format( $full_format, $full_date ); + + if ( ! is_object( $datetime ) ) { + $this->value = $utc_stamp = ''; + } else { + $datetime->setTimezone( new DateTimeZone( $tzstring ) ); + $utc_stamp = date_timestamp_get( $datetime ) - $offset; + $this->value = serialize( $datetime ); + } + + if ( $this->field->group ) { + $this->value = array( + 'supporting_field_value' => $utc_stamp, + 'supporting_field_id' => $utc_key, + 'value' => $this->value, + ); + } else { + // Save the utc timestamp supporting field. + if ( $repeat ) { + $utc_values[ $utc_key ][] = $utc_stamp; + } else { + $this->_save_utc_value( $utc_key, $utc_stamp ); + } + } + } catch ( Exception $e ) { + $this->value = ''; + CMB2_Utils::log_if_debug( __METHOD__, __LINE__, $e->getMessage() ); + } + + return $this->value; + } + + /** + * Sanitize textareas and wysiwyg fields + * + * @since 1.0.1 + * @return string Sanitized data + */ + public function textarea() { + return is_array( $this->value ) ? array_map( 'wp_kses_post', $this->value ) : wp_kses_post( $this->value ); + } + + /** + * Sanitize code textareas + * + * @since 1.0.2 + * + * @param bool $repeat Whether or not to repeat. + * @return string Sanitized data + */ + public function textarea_code( $repeat = false ) { + $repeat_value = $this->_check_repeat( __FUNCTION__, $repeat ); + if ( false !== $repeat_value ) { + return $repeat_value; + } + + return htmlspecialchars_decode( stripslashes( $this->value ) ); + } + + /** + * Handles saving of attachment post ID and sanitizing file url + * + * @since 1.1.0 + * @return string Sanitized url + */ + public function file() { + $file_id_key = $this->field->_id() . '_id'; + + if ( $this->field->group ) { + // Return an array with url/id if saving a group field. + $this->value = $this->_get_group_file_value_array( $file_id_key ); + } else { + $this->_save_file_id_value( $file_id_key ); + $this->text_url(); + } + + return $this->value; + } + + /** + * Gets the values for the `file` field type from the data being saved. + * + * @since 2.2.0 + * + * @param mixed $id_key ID key to use. + * @return array + */ + public function _get_group_file_value_array( $id_key ) { + $alldata = $this->field->group->data_to_save; + $base_id = $this->field->group->_id(); + $i = $this->field->group->index; + + // Check group $alldata data. + $id_val = isset( $alldata[ $base_id ][ $i ][ $id_key ] ) + ? absint( $alldata[ $base_id ][ $i ][ $id_key ] ) + : ''; + + // We don't want to save 0 to the DB for file fields. + if ( 0 === $id_val ) { + $id_val = ''; + } + + return array( + 'value' => $this->text_url(), + 'supporting_field_value' => $id_val, + 'supporting_field_id' => $id_key, + ); + } + + /** + * Peforms saving of `file` attachement's ID + * + * @since 1.1.0 + * + * @param mixed $file_id_key ID key to use. + * @return mixed + */ + public function _save_file_id_value( $file_id_key ) { + $id_field = $this->_new_supporting_field( $file_id_key ); + + // Check standard data_to_save data. + $id_val = isset( $this->field->data_to_save[ $file_id_key ] ) + ? $this->field->data_to_save[ $file_id_key ] + : null; + + // If there is no ID saved yet, try to get it from the url. + if ( $this->value && ! $id_val ) { + $id_val = CMB2_Utils::image_id_from_url( $this->value ); + + // If there is an ID but user emptied the input value, remove the ID. + } elseif ( ! $this->value && $id_val ) { + $id_val = null; + } + + return $id_field->save_field( $id_val ); + } + + /** + * Peforms saving of `text_datetime_timestamp_timezone` utc timestamp + * + * @since 2.2.0 + * + * @param mixed $utc_key UTC key. + * @param mixed $utc_stamp UTC timestamp. + * @return mixed + */ + public function _save_utc_value( $utc_key, $utc_stamp ) { + return $this->_new_supporting_field( $utc_key )->save_field( $utc_stamp ); + } + + /** + * Returns a new, supporting, CMB2_Field object based on a new field id. + * + * @since 2.2.0 + * + * @param mixed $new_field_id New field ID. + * @return CMB2_Field + */ + public function _new_supporting_field( $new_field_id ) { + return $this->field->get_field_clone( array( + 'id' => $new_field_id, + 'sanitization_cb' => false, + ) ); + } + + /** + * If repeating, loop through and re-apply sanitization method + * + * @since 1.1.0 + * @param string $method Class method. + * @param bool $repeat Whether repeating or not. + * @return mixed Sanitized value + */ + public function _check_repeat( $method, $repeat ) { + if ( $repeat || ! $this->field->args( 'repeatable' ) ) { + return false; + } + + $values_array = $this->value; + + $new_value = array(); + foreach ( $values_array as $iterator => $this->value ) { + if ( $this->value ) { + $val = $this->$method( true ); + if ( ! empty( $val ) ) { + $new_value[] = $val; + } + } + } + + $this->value = $new_value; + + return empty( $this->value ) ? null : $this->value; + } + + /** + * Determine if passed value is an empty array + * + * @since 2.0.6 + * @param mixed $to_check Value to check. + * @return boolean Whether value is an array that's empty + */ + public function _is_empty_array( $to_check ) { + if ( is_array( $to_check ) ) { + $cleaned_up = array_filter( $to_check ); + return empty( $cleaned_up ); + } + return false; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Show_Filters.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Show_Filters.php new file mode 100755 index 00000000..5fb257e6 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Show_Filters.php @@ -0,0 +1,179 @@ +object_id() : get_the_ID(); + + if ( ! $object_id ) { + return false; + } + + // If current page id is in the included array, display the metabox. + return in_array( $object_id, (array) self::get_show_on_value( $meta_box_args ) ); + } + + /** + * Add metaboxes for an specific Page Template + * + * @since 1.0.0 + * @param bool $display To display or not. + * @param array $meta_box_args Metabox config array. + * @param CMB2 $cmb CMB2 object. + * @return bool Whether to display this metabox on the current page. + */ + public static function check_page_template( $display, $meta_box_args, $cmb ) { + + $key = self::get_show_on_key( $meta_box_args ); + if ( ! $key || 'page-template' !== $key ) { + return $display; + } + + $object_id = $cmb->object_id(); + + if ( ! $object_id || 'post' !== $cmb->object_type() ) { + return false; + } + + // Get current template. + $current_template = get_post_meta( $object_id, '_wp_page_template', true ); + + // See if there's a match. + if ( $current_template && in_array( $current_template, (array) self::get_show_on_value( $meta_box_args ) ) ) { + return true; + } + + return false; + } + + /** + * Only show options-page metaboxes on their options page (but only enforce on the admin side) + * + * @since 1.0.0 + * @param bool $display To display or not. + * @param array $meta_box_args Metabox config array. + * @return bool Whether to display this metabox on the current page. + */ + public static function check_admin_page( $display, $meta_box_args ) { + + $key = self::get_show_on_key( $meta_box_args ); + // check if this is a 'options-page' metabox. + if ( ! $key || 'options-page' !== $key ) { + return $display; + } + + // Enforce 'show_on' filter in the admin. + if ( is_admin() ) { + + // If there is no 'page' query var, our filter isn't applicable. + if ( ! isset( $_GET['page'] ) ) { + return $display; + } + + $show_on = self::get_show_on_value( $meta_box_args ); + + if ( empty( $show_on ) ) { + return false; + } + + if ( is_array( $show_on ) ) { + foreach ( $show_on as $page ) { + if ( $_GET['page'] == $page ) { + return true; + } + } + } else { + if ( $_GET['page'] == $show_on ) { + return true; + } + } + + return false; + + } + + // Allow options-page metaboxes to be displayed anywhere on the front-end. + return true; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Types.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Types.php new file mode 100755 index 00000000..aaeed6e8 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Types.php @@ -0,0 +1,662 @@ +field = $field; + } + + /** + * Default fallback. Allows rendering fields via "cmb2_render_$fieldtype" hook + * + * @since 1.0.0 + * @param string $fieldtype Non-existent field type name + * @param array $arguments All arguments passed to the method + */ + public function __call( $fieldtype, $arguments ) { + + // Check for methods to be proxied to the CMB2_Type_Base object. + if ( $exists = $this->maybe_proxy_method( $fieldtype, $arguments ) ) { + return $exists['value']; + } + + // Check for custom field type class. + if ( $object = $this->maybe_custom_field_object( $fieldtype, $arguments ) ) { + return $object->render(); + } + + /** + * Pass non-existent field types through an action. + * + * The dynamic portion of the hook name, $fieldtype, refers to the field type. + * + * @param array $field The passed in `CMB2_Field` object + * @param mixed $escaped_value The value of this field escaped. + * It defaults to `sanitize_text_field`. + * If you need the unescaped value, you can access it + * via `$field->value()` + * @param int $object_id The ID of the current object + * @param string $object_type The type of object you are working with. + * Most commonly, `post` (this applies to all post-types), + * but could also be `comment`, `user` or `options-page`. + * @param object $field_type_object This `CMB2_Types` object + */ + do_action( "cmb2_render_{$fieldtype}", $this->field, $this->field->escaped_value(), $this->field->object_id, $this->field->object_type, $this ); + } + + /** + * Render a field (and handle repeatable) + * + * @since 1.1.0 + */ + public function render() { + if ( $this->field->args( 'repeatable' ) ) { + $this->render_repeatable_field(); + } else { + $this->_render(); + } + } + + /** + * Render a field type + * + * @since 1.1.0 + */ + protected function _render() { + $this->field->peform_param_callback( 'before_field' ); + echo $this->{$this->field->type()}(); + $this->field->peform_param_callback( 'after_field' ); + } + + /** + * Proxies the method call to the CMB2_Type_Base object, if it exists, otherwise returns a default fallback value. + * + * @since 2.2.2 + * + * @param string $method Method to call on the CMB2_Type_Base object. + * @param mixed $default Default fallback value if method is not found. + * @param array $args Optional arguments to pass to proxy method. + * + * @return mixed Results from called method. + */ + protected function proxy_method( $method, $default, $args = array() ) { + if ( ! is_object( $this->type ) ) { + $this->guess_type_object( $method ); + } + + if ( is_object( $this->type ) && method_exists( $this->type, $method ) ) { + + return empty( $args ) + ? $this->type->$method() + : call_user_func_array( array( $this->type, $method ), $args ); + } + + return $default; + } + + /** + * If no CMB2_Types::$type object is initiated when a proxy method is called, it means + * it's a custom field type (which SHOULD be instantiating a Type), but let's try and + * guess the type object for them and instantiate it. + * + * @since 2.2.3 + * + * @param string $method Method attempting to be called on the CMB2_Type_Base object. + * @return bool + */ + protected function guess_type_object( $method ) { + $fieldtype = $this->field->type(); + + // Try to "guess" the Type object based on the method requested. + switch ( $method ) { + case 'select_option': + case 'list_input': + case 'list_input_checkbox': + case 'concat_items': + $this->get_new_render_type( $fieldtype, 'CMB2_Type_Select' ); + break; + case 'is_valid_img_ext': + case 'img_status_output': + case 'file_status_output': + $this->get_new_render_type( $fieldtype, 'CMB2_Type_File_Base' ); + break; + case 'parse_picker_options': + $this->get_new_render_type( $fieldtype, 'CMB2_Type_Text_Date' ); + break; + case 'get_object_terms': + case 'get_terms': + $this->get_new_render_type( $fieldtype, 'CMB2_Type_Taxonomy_Multicheck' ); + break; + case 'date_args': + case 'time_args': + $this->get_new_render_type( $fieldtype, 'CMB2_Type_Text_Datetime_Timestamp' ); + break; + case 'parse_args': + $this->get_new_render_type( $fieldtype, 'CMB2_Type_Text' ); + break; + } + + return null !== $this->type; + } + + /** + * Check for methods to be proxied to the CMB2_Type_Base object. + * + * @since 2.2.4 + * @param string $method The possible method to proxy. + * @param array $arguments All arguments passed to the method. + * @return bool|array False if not proxied, else array with 'value' key being the return of the method. + */ + public function maybe_proxy_method( $method, $arguments ) { + $exists = false; + + $proxied = array( + 'get_object_terms' => array(), + 'is_valid_img_ext' => false, + 'parse_args' => array(), + 'concat_items' => '', + 'select_option' => '', + 'list_input' => '', + 'list_input_checkbox' => '', + 'img_status_output' => '', + 'file_status_output' => '', + 'parse_picker_options' => array(), + ); + if ( isset( $proxied[ $method ] ) ) { + $exists = array( + // Ok, proxy the method call to the CMB2_Type_Base object. + 'value' => $this->proxy_method( $method, $proxied[ $method ], $arguments ), + ); + } + + return $exists; + } + + /** + * Checks for a custom field CMB2_Type_Base class to use for rendering. + * + * @since 2.2.4 + * + * @param string $fieldtype Non-existent field type name. + * @param array $args Optional field arguments. + * + * @return bool|CMB2_Type_Base Type object if custom field is an object, false if field was added with + * `cmb2_render_{$field_type}` action. + * @throws Exception if custom field type class does not extend CMB2_Type_Base. + */ + public function maybe_custom_field_object( $fieldtype, $args = array() ) { + if ( $render_class_name = $this->get_render_type_class( $fieldtype ) ) { + $this->type = new $render_class_name( $this, $args ); + + if ( ! ( $this->type instanceof CMB2_Type_Base ) ) { + throw new Exception( esc_html__( 'Custom CMB2 field type classes must extend CMB2_Type_Base.', 'cmb2' ) ); + } + + return $this->type; + } + + return false; + } + + /** + * Gets the render type CMB2_Type_Base object to use for rendering the field. + * + * @since 2.2.4 + * @param string $fieldtype The type of field being rendered. + * @param string $render_class_name The default field type class to use. Defaults to null. + * @param array $args Optional arguments to pass to type class. + * @param mixed $additional Optional additional argument to pass to type class. + * @return CMB2_Type_Base Type object. + */ + public function get_new_render_type( $fieldtype, $render_class_name = null, $args = array(), $additional = '' ) { + $render_class_name = $this->get_render_type_class( $fieldtype, $render_class_name ); + $this->type = new $render_class_name( $this, $args, $additional ); + + return $this->type; + } + + /** + * Checks for the render type class to use for rendering the field. + * + * @since 2.2.4 + * @param string $fieldtype The type of field being rendered. + * @param string $render_class_name The default field type class to use. Defaults to null. + * @return string The field type class to use. + */ + public function get_render_type_class( $fieldtype, $render_class_name = null ) { + $render_class_name = $this->field->args( 'render_class' ) ? $this->field->args( 'render_class' ) : $render_class_name; + + if ( has_action( "cmb2_render_class_{$fieldtype}" ) ) { + + /** + * Filters the custom field type class used for rendering the field. Class is required to extend CMB2_Type_Base. + * + * The dynamic portion of the hook name, $fieldtype, refers to the (custom) field type. + * + * @since 2.2.4 + * + * @param string $render_class_name The custom field type class to use. Default null. + * @param object $field_type_object This `CMB2_Types` object. + */ + $render_class_name = apply_filters( "cmb2_render_class_{$fieldtype}", $render_class_name, $this ); + } + + return $render_class_name && class_exists( $render_class_name ) ? $render_class_name : false; + } + + /** + * Retrieve text parameter from field's options array (if it has one), or use fallback text + * + * @since 2.0.0 + * @param string $text_key Key in field's options array. + * @param string $fallback Fallback text. + * @return string + */ + public function _text( $text_key, $fallback = '' ) { + return $this->field->get_string( $text_key, $fallback ); + } + + /** + * Determine a file's extension + * + * @since 1.0.0 + * @param string $file File url + * @return string|false File extension or false + */ + public function get_file_ext( $file ) { + return CMB2_Utils::get_file_ext( $file ); + } + + /** + * Get the file name from a url + * + * @since 2.0.0 + * @param string $value File url or path + * @return string File name + */ + public function get_file_name_from_path( $value ) { + return CMB2_Utils::get_file_name_from_path( $value ); + } + + /** + * Combines attributes into a string for a form element + * + * @since 1.1.0 + * @param array $attrs Attributes to concatenate + * @param array $attr_exclude Attributes that should NOT be concatenated + * @return string String of attributes for form element + */ + public function concat_attrs( $attrs, $attr_exclude = array() ) { + return CMB2_Utils::concat_attrs( $attrs, $attr_exclude ); + } + + /** + * Generates repeatable field table markup + * + * @since 1.0.0 + */ + public function render_repeatable_field() { + $table_id = $this->field->id() . '_repeat'; + + $this->_desc( true, true, true ); + ?> + +
              +
              + repeatable_rows(); ?> +
              +
              +

              + +

              + + iterator = 0; + } + + /** + * Generates repeatable field rows + * + * @since 1.1.0 + */ + public function repeatable_rows() { + $meta_value = array_filter( (array) $this->field->escaped_value() ); + // check for default content + $default = $this->field->get_default(); + + // check for saved data + if ( ! empty( $meta_value ) ) { + $meta_value = is_array( $meta_value ) ? array_filter( $meta_value ) : $meta_value; + $meta_value = ! empty( $meta_value ) ? $meta_value : $default; + } else { + $meta_value = $default; + } + + // Loop value array and add a row + if ( ! empty( $meta_value ) ) { + foreach ( (array) $meta_value as $val ) { + $this->field->escaped_value = $val; + $this->repeat_row(); + $this->iterator++; + } + } else { + + // If value is empty (including empty array), then clear the value. + $this->field->escaped_value = $this->field->value = null; + + // Otherwise add one row + $this->repeat_row(); + } + + // Then add an empty row + $this->field->escaped_value = $default; + $this->iterator = $this->iterator ? $this->iterator : 1; + $this->repeat_row( 'empty-row hidden' ); + } + + /** + * Generates a repeatable row's markup + * + * @since 1.1.0 + * @param string $class Repeatable table row's class + */ + protected function repeat_row( $class = 'cmb-repeat-row' ) { + ?> + +
              +
              + _render(); ?> +
              +
              + +
              +
              + + field->args( 'repeatable' ) || $this->iterator > 0 ) ) { + return ''; + } + + $desc = $this->field->args( 'description' ); + + if ( ! $desc ) { + return; + } + + $tag = $paragraph ? 'p' : 'span'; + $desc = sprintf( "\n" . '<%1$s class="cmb2-metabox-description">%2$s' . "\n", $tag, $desc ); + + if ( $echo ) { + echo $desc; + } + + return $desc; + } + + /** + * Generate field name attribute + * + * @since 1.1.0 + * @param string $suffix For multi-part fields + * @return string Name attribute + */ + public function _name( $suffix = '' ) { + return $this->field->args( '_name' ) . ( $this->field->args( 'repeatable' ) ? '[' . $this->iterator . ']' : '' ) . $suffix; + } + + /** + * Generate field id attribute + * + * @since 1.1.0 + * @param string $suffix For multi-part fields + * @return string Id attribute + */ + public function _id( $suffix = '' ) { + return $this->field->id() . $suffix . ( $this->field->args( 'repeatable' ) ? '_' . $this->iterator . '" data-iterator="' . $this->iterator : '' ); + } + + /** + * Handles outputting an 'input' element + * + * @since 1.1.0 + * @param array $args Override arguments + * @param string $type Field type + * @return string Form input element + */ + public function input( $args = array(), $type = __FUNCTION__ ) { + return $this->get_new_render_type( 'text', 'CMB2_Type_Text', $args, $type )->render(); + } + + /** + * Handles outputting an 'textarea' element + * + * @since 1.1.0 + * @param array $args Override arguments + * @return string Form textarea element + */ + public function textarea( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Textarea', $args )->render(); + } + + /** + * Begin Field Types + */ + + public function text() { + return $this->input(); + } + + public function hidden() { + $args = array( + 'type' => 'hidden', + 'desc' => '', + 'class' => 'cmb2-hidden', + ); + if ( $this->field->group ) { + $args['data-groupid'] = $this->field->group->id(); + $args['data-iterator'] = $this->iterator; + } + + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Text', $args, 'input' )->render(); + } + + public function text_small() { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Text', array( + 'class' => 'cmb2-text-small', + 'desc' => $this->_desc(), + ), 'input' )->render(); + } + + public function text_medium() { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Text', array( + 'class' => 'cmb2-text-medium', + 'desc' => $this->_desc(), + ), 'input' )->render(); + } + + public function text_email() { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Text', array( + 'class' => 'cmb2-text-email cmb2-text-medium', + 'type' => 'email', + ), 'input' )->render(); + } + + public function text_url() { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Text', array( + 'class' => 'cmb2-text-url cmb2-text-medium regular-text', + 'value' => $this->field->escaped_value( 'esc_url' ), + ), 'input' )->render(); + } + + public function text_money() { + $input = $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Text', array( + 'class' => 'cmb2-text-money', + 'desc' => $this->_desc(), + ), 'input' )->render(); + return ( ! $this->field->get_param_callback_result( 'before_field' ) ? '$ ' : ' ' ) . $input; + } + + public function textarea_small() { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Textarea', array( + 'class' => 'cmb2-textarea-small', + 'rows' => 4, + ) )->render(); + } + + public function textarea_code( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Textarea_Code', $args )->render(); + } + + public function wysiwyg( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Wysiwyg', $args )->render(); + } + + public function text_date( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Text_Date', $args )->render(); + } + + // Alias for text_date + public function text_date_timestamp( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Text_Date', $args )->render(); + } + + public function text_time( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Text_Time', $args )->render(); + } + + public function text_datetime_timestamp( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Text_Datetime_Timestamp', $args )->render(); + } + + public function text_datetime_timestamp_timezone( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Text_Datetime_Timestamp_Timezone', $args )->render(); + } + + public function select_timezone( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Select_Timezone', $args )->render(); + } + + public function colorpicker( $args = array(), $meta_value = '' ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Colorpicker', $args, $meta_value )->render(); + } + + public function title( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Title', $args )->render(); + } + + public function select( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Select', $args )->render(); + } + + public function taxonomy_select( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Taxonomy_Select', $args )->render(); + } + + public function radio( $args = array(), $type = __FUNCTION__ ) { + return $this->get_new_render_type( $type, 'CMB2_Type_Radio', $args, $type )->render(); + } + + public function radio_inline( $args = array() ) { + return $this->radio( $args, __FUNCTION__ ); + } + + public function multicheck( $type = 'checkbox' ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Multicheck', array(), $type )->render(); + } + + public function multicheck_inline() { + return $this->multicheck( 'multicheck_inline' ); + } + + public function checkbox( $args = array(), $is_checked = null ) { + // Avoid get_new_render_type since we need a different default for the 3rd argument than ''. + $render_class_name = $this->get_render_type_class( __FUNCTION__, 'CMB2_Type_Checkbox' ); + $this->type = new $render_class_name( $this, $args, $is_checked ); + return $this->type->render(); + } + + public function taxonomy_radio( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Taxonomy_Radio', $args )->render(); + } + + public function taxonomy_radio_hierarchical( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Taxonomy_Radio_Hierarchical', $args )->render(); + } + + public function taxonomy_radio_inline( $args = array() ) { + return $this->taxonomy_radio( $args ); + } + + public function taxonomy_multicheck( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Taxonomy_Multicheck', $args )->render(); + } + + public function taxonomy_multicheck_hierarchical( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Taxonomy_Multicheck_Hierarchical', $args )->render(); + } + + public function taxonomy_multicheck_inline( $args = array() ) { + return $this->taxonomy_multicheck( $args ); + } + + public function oembed( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_Oembed', $args )->render(); + } + + public function file_list( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_File_List', $args )->render(); + } + + public function file( $args = array() ) { + return $this->get_new_render_type( __FUNCTION__, 'CMB2_Type_File', $args )->render(); + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Utils.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Utils.php new file mode 100755 index 00000000..b7b00a46 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_Utils.php @@ -0,0 +1,669 @@ + 'attachment', + 'post_status' => 'inherit', + 'fields' => 'ids', + 'meta_query' => array( + array( + 'value' => $file, + 'compare' => 'LIKE', + 'key' => '_wp_attachment_metadata', + ), + ), + ); + + $query = new WP_Query( $query_args ); + + if ( $query->have_posts() ) { + + foreach ( $query->posts as $post_id ) { + $meta = wp_get_attachment_metadata( $post_id ); + $original_file = basename( $meta['file'] ); + $cropped_image_files = isset( $meta['sizes'] ) ? wp_list_pluck( $meta['sizes'], 'file' ) : array(); + if ( $original_file === $file || in_array( $file, $cropped_image_files ) ) { + $attachment_id = $post_id; + break; + } + } + } + + return 0 === $attachment_id ? false : $attachment_id; + } + + /** + * Utility method to get a combined list of default and custom registered image sizes + * + * @since 2.2.4 + * @link http://core.trac.wordpress.org/ticket/18947 + * @global array $_wp_additional_image_sizes + * @return array The image sizes + */ + public static function get_available_image_sizes() { + global $_wp_additional_image_sizes; + + $default_image_sizes = array( 'thumbnail', 'medium', 'large' ); + foreach ( $default_image_sizes as $size ) { + $image_sizes[ $size ] = array( + 'height' => intval( get_option( "{$size}_size_h" ) ), + 'width' => intval( get_option( "{$size}_size_w" ) ), + 'crop' => get_option( "{$size}_crop" ) ? get_option( "{$size}_crop" ) : false, + ); + } + + if ( isset( $_wp_additional_image_sizes ) && count( $_wp_additional_image_sizes ) ) { + $image_sizes = array_merge( $image_sizes, $_wp_additional_image_sizes ); + } + + return $image_sizes; + } + + /** + * Utility method to return the closest named size from an array of values + * + * Based off of WordPress's image_get_intermediate_size() + * If the size matches an existing size then it will be used. If there is no + * direct match, then the nearest image size larger than the specified size + * will be used. If nothing is found, then the function will return false. + * Uses get_available_image_sizes() to get all available sizes. + * + * @since 2.2.4 + * @param array|string $size Image size. Accepts an array of width and height (in that order). + * @return false|string Named image size e.g. 'thumbnail' + */ + public static function get_named_size( $size ) { + $data = array(); + + // Find the best match when '$size' is an array. + if ( is_array( $size ) ) { + $image_sizes = self::get_available_image_sizes(); + $candidates = array(); + + foreach ( $image_sizes as $_size => $data ) { + + // If there's an exact match to an existing image size, short circuit. + if ( $data['width'] == $size[0] && $data['height'] == $size[1] ) { + $candidates[ $data['width'] * $data['height'] ] = array( $_size, $data ); + break; + } + + // If it's not an exact match, consider larger sizes with the same aspect ratio. + if ( $data['width'] >= $size[0] && $data['height'] >= $size[1] ) { + + /** + * To test for varying crops, we constrain the dimensions of the larger image + * to the dimensions of the smaller image and see if they match. + */ + if ( $data['width'] > $size[0] ) { + $constrained_size = wp_constrain_dimensions( $data['width'], $data['height'], $size[0] ); + $expected_size = array( $size[0], $size[1] ); + } else { + $constrained_size = wp_constrain_dimensions( $size[0], $size[1], $data['width'] ); + $expected_size = array( $data['width'], $data['height'] ); + } + + // If the image dimensions are within 1px of the expected size, we consider it a match. + $matched = ( abs( $constrained_size[0] - $expected_size[0] ) <= 1 && abs( $constrained_size[1] - $expected_size[1] ) <= 1 ); + + if ( $matched ) { + $candidates[ $data['width'] * $data['height'] ] = array( $_size, $data ); + } + } + } + + if ( ! empty( $candidates ) ) { + // Sort the array by size if we have more than one candidate. + if ( 1 < count( $candidates ) ) { + ksort( $candidates ); + } + + $data = array_shift( $candidates ); + $data = $data[0]; + } elseif ( ! empty( $image_sizes['thumbnail'] ) && $image_sizes['thumbnail']['width'] >= $size[0] && $image_sizes['thumbnail']['width'] >= $size[1] ) { + /* + * When the size requested is smaller than the thumbnail dimensions, we + * fall back to the thumbnail size. + */ + $data = 'thumbnail'; + } else { + return false; + } + } elseif ( ! empty( $image_sizes[ $size ] ) ) { + $data = $size; + }// End if. + + // If we still don't have a match at this point, return false. + if ( empty( $data ) ) { + return false; + } + + return $data; + } + + /** + * Utility method that returns time string offset by timezone + * + * @since 1.0.0 + * @param string $tzstring Time string. + * @return string Offset time string + */ + public static function timezone_offset( $tzstring ) { + $tz_offset = 0; + + if ( ! empty( $tzstring ) && is_string( $tzstring ) ) { + if ( 'UTC' === substr( $tzstring, 0, 3 ) ) { + $tzstring = str_replace( array( ':15', ':30', ':45' ), array( '.25', '.5', '.75' ), $tzstring ); + return intval( floatval( substr( $tzstring, 3 ) ) * HOUR_IN_SECONDS ); + } + + try { + $date_time_zone_selected = new DateTimeZone( $tzstring ); + $tz_offset = timezone_offset_get( $date_time_zone_selected, date_create() ); + } catch ( Exception $e ) { + self::log_if_debug( __METHOD__, __LINE__, $e->getMessage() ); + } + } + + return $tz_offset; + } + + /** + * Utility method that returns a timezone string representing the default timezone for the site. + * + * Roughly copied from WordPress, as get_option('timezone_string') will return + * an empty string if no value has been set on the options page. + * A timezone string is required by the wp_timezone_choice() used by the + * select_timezone field. + * + * @since 1.0.0 + * @return string Timezone string + */ + public static function timezone_string() { + $current_offset = get_option( 'gmt_offset' ); + $tzstring = get_option( 'timezone_string' ); + + // Remove old Etc mappings. Fallback to gmt_offset. + if ( false !== strpos( $tzstring, 'Etc/GMT' ) ) { + $tzstring = ''; + } + + if ( empty( $tzstring ) ) { // Create a UTC+- zone if no timezone string exists. + if ( 0 == $current_offset ) { + $tzstring = 'UTC+0'; + } elseif ( $current_offset < 0 ) { + $tzstring = 'UTC' . $current_offset; + } else { + $tzstring = 'UTC+' . $current_offset; + } + } + + return $tzstring; + } + + /** + * Returns a timestamp, first checking if value already is a timestamp. + * + * @since 2.0.0 + * @param string|int $string Possible timestamp string. + * @return int Time stamp. + */ + public static function make_valid_time_stamp( $string ) { + if ( ! $string ) { + return 0; + } + + return self::is_valid_time_stamp( $string ) + ? (int) $string : + strtotime( (string) $string ); + } + + /** + * Determine if a value is a valid timestamp + * + * @since 2.0.0 + * @param mixed $timestamp Value to check. + * @return boolean Whether value is a valid timestamp + */ + public static function is_valid_time_stamp( $timestamp ) { + return (string) (int) $timestamp === (string) $timestamp + && $timestamp <= PHP_INT_MAX + && $timestamp >= ~PHP_INT_MAX; + } + + /** + * Checks if a value is 'empty'. Still accepts 0. + * + * @since 2.0.0 + * @param mixed $value Value to check. + * @return bool True or false + */ + public static function isempty( $value ) { + return null === $value || '' === $value || false === $value || array() === $value; + } + + /** + * Checks if a value is not 'empty'. 0 doesn't count as empty. + * + * @since 2.2.2 + * @param mixed $value Value to check. + * @return bool True or false + */ + public static function notempty( $value ) { + return null !== $value && '' !== $value && false !== $value && array() !== $value; + } + + /** + * Filters out empty values (not including 0). + * + * @since 2.2.2 + * @param mixed $value Value to check. + * @return array True or false. + */ + public static function filter_empty( $value ) { + return array_filter( $value, array( __CLASS__, 'notempty' ) ); + } + + /** + * Insert a single array item inside another array at a set position + * + * @since 2.0.2 + * @param array $array Array to modify. Is passed by reference, and no return is needed. Passed by reference. + * @param array $new New array to insert. + * @param int $position Position in the main array to insert the new array. + */ + public static function array_insert( &$array, $new, $position ) { + $before = array_slice( $array, 0, $position - 1 ); + $after = array_diff_key( $array, $before ); + $array = array_merge( $before, $new, $after ); + } + + /** + * Defines the url which is used to load local resources. + * This may need to be filtered for local Window installations. + * If resources do not load, please check the wiki for details. + * + * @since 1.0.1 + * + * @param string $path URL path. + * @return string URL to CMB2 resources + */ + public static function url( $path = '' ) { + if ( self::$url ) { + return self::$url . $path; + } + + $cmb2_url = self::get_url_from_dir( cmb2_dir() ); + + /** + * Filter the CMB location url. + * + * @param string $cmb2_url Currently registered url. + */ + self::$url = trailingslashit( apply_filters( 'cmb2_meta_box_url', $cmb2_url, CMB2_VERSION ) ); + + return self::$url . $path; + } + + /** + * Converts a system path to a URL + * + * @since 2.2.2 + * @param string $dir Directory path to convert. + * @return string Converted URL. + */ + public static function get_url_from_dir( $dir ) { + $dir = self::normalize_path( $dir ); + + // Let's test if We are in the plugins or mu-plugins dir. + $test_dir = trailingslashit( $dir ) . 'unneeded.php'; + if ( + 0 === strpos( $test_dir, self::normalize_path( WPMU_PLUGIN_DIR ) ) + || 0 === strpos( $test_dir, self::normalize_path( WP_PLUGIN_DIR ) ) + ) { + // Ok, then use plugins_url, as it is more reliable. + return trailingslashit( plugins_url( '', $test_dir ) ); + } + + // Ok, now let's test if we are in the theme dir. + $theme_root = self::normalize_path( get_theme_root() ); + if ( 0 === strpos( $dir, $theme_root ) ) { + // Ok, then use get_theme_root_uri. + return set_url_scheme( + trailingslashit( + str_replace( + untrailingslashit( $theme_root ), + untrailingslashit( get_theme_root_uri() ), + $dir + ) + ) + ); + } + + // Check to see if it's anywhere in the root directory. + $site_dir = self::get_normalized_abspath(); + $site_url = trailingslashit( is_multisite() ? network_site_url() : site_url() ); + + $url = str_replace( + array( $site_dir, WP_PLUGIN_DIR ), + array( $site_url, WP_PLUGIN_URL ), + $dir + ); + + return set_url_scheme( $url ); + } + + /** + * Get the normalized absolute path defined by WordPress. + * + * @since 2.2.6 + * + * @return string Normalized absolute path. + */ + protected static function get_normalized_abspath() { + return self::normalize_path( self::$ABSPATH ); + } + + /** + * `wp_normalize_path` wrapper for back-compat. Normalize a filesystem path. + * + * On windows systems, replaces backslashes with forward slashes + * and forces upper-case drive letters. + * Allows for two leading slashes for Windows network shares, but + * ensures that all other duplicate slashes are reduced to a single. + * + * @since 2.2.0 + * + * @param string $path Path to normalize. + * @return string Normalized path. + */ + protected static function normalize_path( $path ) { + if ( function_exists( 'wp_normalize_path' ) ) { + return wp_normalize_path( $path ); + } + + // Replace newer WP's version of wp_normalize_path. + $path = str_replace( '\\', '/', $path ); + $path = preg_replace( '|(?<=.)/+|', '/', $path ); + if ( ':' === substr( $path, 1, 1 ) ) { + $path = ucfirst( $path ); + } + + return $path; + } + + /** + * Get timestamp from text date + * + * @since 2.2.0 + * @param string $value Date value. + * @param string $date_format Expected date format. + * @return mixed Unix timestamp representing the date. + */ + public static function get_timestamp_from_value( $value, $date_format ) { + $date_object = date_create_from_format( $date_format, $value ); + return $date_object ? $date_object->setTime( 0, 0, 0 )->getTimeStamp() : strtotime( $value ); + } + + /** + * Takes a php date() format string and returns a string formatted to suit for the date/time pickers + * It will work only with the following subset of date() options: + * + * Formats: d, l, j, z, m, F, n, y, and Y. + * + * A slight effort is made to deal with escaped characters. + * + * Other options are ignored, because they would either bring compatibility problems between PHP and JS, or + * bring even more translation troubles. + * + * @since 2.2.0 + * @param string $format PHP date format. + * @return string reformatted string + */ + public static function php_to_js_dateformat( $format ) { + + // order is relevant here, since the replacement will be done sequentially. + $supported_options = array( + 'd' => 'dd', // Day, leading 0. + 'j' => 'd', // Day, no 0. + 'z' => 'o', // Day of the year, no leading zeroes. + // 'D' => 'D', // Day name short, not sure how it'll work with translations. + 'l ' => 'DD ', // Day name full, idem before. + 'l, ' => 'DD, ', // Day name full, idem before. + 'm' => 'mm', // Month of the year, leading 0. + 'n' => 'm', // Month of the year, no leading 0. + // 'M' => 'M', // Month, Short name. + 'F ' => 'MM ', // Month, full name. + 'F, ' => 'MM, ', // Month, full name. + 'y' => 'y', // Year, two digit. + 'Y' => 'yy', // Year, full. + 'H' => 'HH', // Hour with leading 0 (24 hour). + 'G' => 'H', // Hour with no leading 0 (24 hour). + 'h' => 'hh', // Hour with leading 0 (12 hour). + 'g' => 'h', // Hour with no leading 0 (12 hour). + 'i' => 'mm', // Minute with leading 0. + 's' => 'ss', // Second with leading 0. + 'a' => 'tt', // am/pm. + 'A' => 'TT', // AM/PM. + ); + + foreach ( $supported_options as $php => $js ) { + // replaces every instance of a supported option, but skips escaped characters. + $format = preg_replace( "~(? 'DD', // Day name full, idem before. + 'F' => 'MM', // Month, full name. + ); + + if ( isset( $supported_options[ $format ] ) ) { + $format = $supported_options[ $format ]; + } + + $format = preg_replace_callback( '~(?:\\\.)+~', array( __CLASS__, 'wrap_escaped_chars' ), $format ); + + return $format; + } + + /** + * Helper function for CMB_Utils::php_to_js_dateformat(). + * + * @since 2.2.0 + * @param string $value Value to wrap/escape. + * @return string Modified value + */ + public static function wrap_escaped_chars( $value ) { + return ''' . str_replace( '\\', '', $value[0] ) . '''; + } + + /** + * Send to debug.log if WP_DEBUG is defined and true + * + * @since 2.2.0 + * + * @param string $function Function name. + * @param int $line Line number. + * @param mixed $msg Message to output. + * @param mixed $debug Variable to print_r. + */ + public static function log_if_debug( $function, $line, $msg, $debug = null ) { + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + error_log( "In $function, $line:" . print_r( $msg, true ) . ( $debug ? print_r( $debug, true ) : '' ) ); + } + } + + /** + * Determine a file's extension + * + * @since 1.0.0 + * @param string $file File url. + * @return string|false File extension or false + */ + public static function get_file_ext( $file ) { + $parsed = parse_url( $file, PHP_URL_PATH ); + return $parsed ? strtolower( pathinfo( $parsed, PATHINFO_EXTENSION ) ) : false; + } + + /** + * Get the file name from a url + * + * @since 2.0.0 + * @param string $value File url or path. + * @return string File name + */ + public static function get_file_name_from_path( $value ) { + $parts = explode( '/', $value ); + return is_array( $parts ) ? end( $parts ) : $value; + } + + /** + * Check if WP version is at least $version. + * + * @since 2.2.2 + * @param string $version WP version string to compare. + * @return bool Result of comparison check. + */ + public static function wp_at_least( $version ) { + return version_compare( get_bloginfo( 'version' ), $version, '>=' ); + } + + /** + * Combines attributes into a string for a form element. + * + * @since 1.1.0 + * @param array $attrs Attributes to concatenate. + * @param array $attr_exclude Attributes that should NOT be concatenated. + * @return string String of attributes for form element. + */ + public static function concat_attrs( $attrs, $attr_exclude = array() ) { + $attr_exclude[] = 'rendered'; + $attr_exclude[] = 'js_dependencies'; + + $attributes = ''; + foreach ( $attrs as $attr => $val ) { + $excluded = in_array( $attr, (array) $attr_exclude, true ); + $empty = false === $val && 'value' !== $attr; + if ( ! $excluded && ! $empty ) { + // if data attribute, use single quote wraps, else double. + $quotes = self::is_data_attribute( $attr ) ? "'" : '"'; + $attributes .= sprintf( ' %1$s=%3$s%2$s%3$s', $attr, $val, $quotes ); + } + } + return $attributes; + } + + /** + * Check if given attribute is a data attribute. + * + * @since 2.2.5 + * + * @param string $att HTML attribute. + * @return boolean + */ + public static function is_data_attribute( $att ) { + return 0 === stripos( $att, 'data-' ); + } + + /** + * Ensures value is an array. + * + * @since 2.2.3 + * + * @param mixed $value Value to ensure is array. + * @param array $default Default array. Defaults to empty array. + * + * @return array The array. + */ + public static function ensure_array( $value, $default = array() ) { + if ( empty( $value ) ) { + return $default; + } + + if ( is_array( $value ) || is_object( $value ) ) { + return (array) $value; + } + + // Not sure anything would be non-scalar that is not an array or object? + if ( ! is_scalar( $value ) ) { + return $default; + } + + return (array) $value; + } + + /** + * If number is numeric, normalize it with floatval or intval, depending on if decimal is found. + * + * @since 2.2.6 + * + * @param mixed $value Value to normalize (if numeric). + * @return mixed Possibly normalized value. + */ + public static function normalize_if_numeric( $value ) { + if ( is_numeric( $value ) ) { + $value = false !== strpos( $value, '.' ) ? floatval( $value ) : intval( $value ); + } + + return $value; + } + + /** + * Generates a 12 character unique hash from a string. + * + * @since 2.4.0 + * + * @param string $string String to create a hash from. + * + * @return string + */ + public static function generate_hash( $string ) { + return substr( base_convert( md5( $string ), 16, 32 ), 0, 12 ); + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_hookup.php b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_hookup.php new file mode 100755 index 00000000..51a9be66 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/CMB2_hookup.php @@ -0,0 +1,933 @@ +prop( 'hookup' ) ) { + + $hookup = new self( $cmb ); + + // Hook in the hookup... how meta. + return $hookup->universal_hooks(); + } + + return false; + } + + public function universal_hooks() { + foreach ( get_class_methods( 'CMB2_Show_Filters' ) as $filter ) { + add_filter( 'cmb2_show_on', array( 'CMB2_Show_Filters', $filter ), 10, 3 ); + } + + if ( is_admin() ) { + // Register our scripts and styles for cmb. + $this->once( 'admin_enqueue_scripts', array( __CLASS__, 'register_scripts' ), 8 ); + $this->once( 'admin_enqueue_scripts', array( $this, 'do_scripts' ) ); + + $this->maybe_enqueue_column_display_styles(); + + switch ( $this->object_type ) { + case 'post': + return $this->post_hooks(); + case 'comment': + return $this->comment_hooks(); + case 'user': + return $this->user_hooks(); + case 'term': + return $this->term_hooks(); + case 'options-page': + return $this->options_page_hooks(); + } + } + + return $this; + } + + public function post_hooks() { + + // Fetch the context we set in our call. + $context = $this->cmb->prop( 'context' ) ? $this->cmb->prop( 'context' ) : 'normal'; + + // Call the proper hook based on the context provided. + switch ( $context ) { + + case 'form_top': + add_action( 'edit_form_top', array( $this, 'add_context_metaboxes' ) ); + break; + + case 'before_permalink': + add_action( 'edit_form_before_permalink', array( $this, 'add_context_metaboxes' ) ); + break; + + case 'after_title': + add_action( 'edit_form_after_title', array( $this, 'add_context_metaboxes' ) ); + break; + + case 'after_editor': + add_action( 'edit_form_after_editor', array( $this, 'add_context_metaboxes' ) ); + break; + + default: + add_action( 'add_meta_boxes', array( $this, 'add_metaboxes' ) ); + } + + add_action( 'add_meta_boxes', array( $this, 'remove_default_tax_metaboxes' ) ); + add_action( 'add_attachment', array( $this, 'save_post' ) ); + add_action( 'edit_attachment', array( $this, 'save_post' ) ); + add_action( 'save_post', array( $this, 'save_post' ), 10, 2 ); + + if ( $this->cmb->has_columns ) { + foreach ( $this->cmb->box_types() as $post_type ) { + add_filter( "manage_{$post_type}_posts_columns", array( $this, 'register_column_headers' ) ); + add_action( "manage_{$post_type}_posts_custom_column", array( $this, 'column_display' ), 10, 2 ); + } + } + + return $this; + } + + public function comment_hooks() { + add_action( 'add_meta_boxes_comment', array( $this, 'add_metaboxes' ) ); + add_action( 'edit_comment', array( $this, 'save_comment' ) ); + + if ( $this->cmb->has_columns ) { + add_filter( 'manage_edit-comments_columns', array( $this, 'register_column_headers' ) ); + add_action( 'manage_comments_custom_column', array( $this, 'column_display' ), 10, 3 ); + } + + return $this; + } + + public function user_hooks() { + $priority = $this->get_priority(); + + add_action( 'show_user_profile', array( $this, 'user_metabox' ), $priority ); + add_action( 'edit_user_profile', array( $this, 'user_metabox' ), $priority ); + add_action( 'user_new_form', array( $this, 'user_new_metabox' ), $priority ); + + add_action( 'personal_options_update', array( $this, 'save_user' ) ); + add_action( 'edit_user_profile_update', array( $this, 'save_user' ) ); + add_action( 'user_register', array( $this, 'save_user' ) ); + + if ( $this->cmb->has_columns ) { + add_filter( 'manage_users_columns', array( $this, 'register_column_headers' ) ); + add_filter( 'manage_users_custom_column', array( $this, 'return_column_display' ), 10, 3 ); + } + + return $this; + } + + public function term_hooks() { + if ( ! function_exists( 'get_term_meta' ) ) { + wp_die( esc_html__( 'Term Metadata is a WordPress 4.4+ feature. Please upgrade your WordPress install.', 'cmb2' ) ); + } + + if ( ! $this->cmb->prop( 'taxonomies' ) ) { + wp_die( esc_html__( 'Term metaboxes configuration requires a "taxonomies" parameter.', 'cmb2' ) ); + } + + $this->taxonomies = (array) $this->cmb->prop( 'taxonomies' ); + $show_on_term_add = $this->cmb->prop( 'new_term_section' ); + $priority = $this->get_priority( 8 ); + + foreach ( $this->taxonomies as $taxonomy ) { + // Display our form data. + add_action( "{$taxonomy}_edit_form", array( $this, 'term_metabox' ), $priority, 2 ); + + $show_on_add = is_array( $show_on_term_add ) + ? in_array( $taxonomy, $show_on_term_add ) + : (bool) $show_on_term_add; + + /** + * Filter to determine if the term's fields should show in the "Add term" section. + * + * The dynamic portion of the hook name, $cmb_id, is the metabox id. + * + * @param bool $show_on_add Default is the value of the new_term_section cmb parameter. + * @param object $cmb The CMB2 instance + */ + $show_on_add = apply_filters( "cmb2_show_on_term_add_form_{$this->cmb->cmb_id}", $show_on_add, $this->cmb ); + + // Display form in add-new section (unless specified not to). + if ( $show_on_add ) { + add_action( "{$taxonomy}_add_form_fields", array( $this, 'term_metabox' ), $priority, 2 ); + } + + if ( $this->cmb->has_columns ) { + add_filter( "manage_edit-{$taxonomy}_columns", array( $this, 'register_column_headers' ) ); + add_filter( "manage_{$taxonomy}_custom_column", array( $this, 'return_column_display' ), 10, 3 ); + } + } + + add_action( 'created_term', array( $this, 'save_term' ), 10, 3 ); + add_action( 'edited_terms', array( $this, 'save_term' ), 10, 2 ); + add_action( 'delete_term', array( $this, 'delete_term' ), 10, 3 ); + + return $this; + } + + public function options_page_hooks() { + $option_keys = $this->cmb->options_page_keys(); + + if ( ! empty( $option_keys ) ) { + foreach ( $option_keys as $option_key ) { + $this->options_hookup[ $option_key ] = new CMB2_Options_Hookup( $this->cmb, $option_key ); + $this->options_hookup[ $option_key ]->hooks(); + } + } + + return $this; + } + + /** + * Registers styles for CMB2 + * + * @since 2.0.7 + */ + protected static function register_styles() { + if ( self::$css_registration_done ) { + return; + } + + // Only use minified files if SCRIPT_DEBUG is off. + $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; + $front = is_admin() ? '' : '-front'; + $rtl = is_rtl() ? '-rtl' : ''; + + /** + * Filters the registered style dependencies for the cmb2 stylesheet. + * + * @param array $dependencies The registered style dependencies for the cmb2 stylesheet. + */ + $dependencies = apply_filters( 'cmb2_style_dependencies', array() ); + wp_register_style( 'cmb2-styles', CMB2_Utils::url( "css/cmb2{$front}{$rtl}{$min}.css" ), $dependencies ); + wp_register_style( 'cmb2-display-styles', CMB2_Utils::url( "css/cmb2-display{$rtl}{$min}.css" ), $dependencies ); + + self::$css_registration_done = true; + } + + /** + * Registers scripts for CMB2 + * + * @since 2.0.7 + */ + protected static function register_js() { + if ( self::$js_registration_done ) { + return; + } + + $hook = is_admin() ? 'admin_footer' : 'wp_footer'; + add_action( $hook, array( 'CMB2_JS', 'enqueue' ), 8 ); + + self::$js_registration_done = true; + } + + /** + * Registers scripts and styles for CMB2 + * + * @since 1.0.0 + */ + public static function register_scripts() { + self::register_styles(); + self::register_js(); + } + + /** + * Enqueues scripts and styles for CMB2 in admin_head. + * + * @since 1.0.0 + * + * @param string $hook Current hook for the admin page. + */ + public function do_scripts( $hook ) { + $hooks = array( + 'post.php', + 'post-new.php', + 'page-new.php', + 'page.php', + 'comment.php', + 'edit-tags.php', + 'term.php', + 'user-new.php', + 'profile.php', + 'user-edit.php', + ); + // only pre-enqueue our scripts/styles on the proper pages + // show_form_for_type will have us covered if we miss something here. + if ( in_array( $hook, $hooks, true ) ) { + if ( $this->cmb->prop( 'cmb_styles' ) ) { + self::enqueue_cmb_css(); + } + if ( $this->cmb->prop( 'enqueue_js' ) ) { + self::enqueue_cmb_js(); + } + } + } + + /** + * Register the CMB2 field column headers. + * + * @since 2.2.2 + * + * @param array $columns Array of columns available for the admin page. + */ + public function register_column_headers( $columns ) { + $fields = $this->cmb->prop( 'fields' ); + + foreach ( $fields as $key => $field ) { + if ( ! isset( $field['column'] ) ) { + continue; + } + + $column = $field['column']; + + if ( false === $column['position'] ) { + + $columns[ $field['id'] ] = $column['name']; + + } else { + + $before = array_slice( $columns, 0, absint( $column['position'] ) ); + $before[ $field['id'] ] = $column['name']; + $columns = $before + $columns; + } + + $column['field'] = $field; + $this->columns[ $field['id'] ] = $column; + } + + return $columns; + } + + /** + * The CMB2 field column display output. + * + * @since 2.2.2 + * + * @param string $column_name Current column name. + * @param mixed $object_id Current object ID. + */ + public function column_display( $column_name, $object_id ) { + if ( isset( $this->columns[ $column_name ] ) ) { + $field = new CMB2_Field( array( + 'field_args' => $this->columns[ $column_name ]['field'], + 'object_type' => $this->object_type, + 'object_id' => $this->cmb->object_id( $object_id ), + 'cmb_id' => $this->cmb->cmb_id, + ) ); + + $this->cmb->get_field( $field )->render_column(); + } + } + + /** + * Returns the column display. + * + * @since 2.2.2 + */ + public function return_column_display( $empty, $custom_column, $object_id ) { + ob_start(); + $this->column_display( $custom_column, $object_id ); + $column = ob_get_clean(); + + return $column ? $column : $empty; + } + + /** + * Output the CMB2 box/fields in an alternate context (not in a standard metabox area). + * + * @since 2.2.4 + */ + public function add_context_metaboxes() { + + if ( ! $this->show_on() ) { + return; + } + + $page = get_current_screen()->id; + + foreach ( $this->cmb->box_types() as $object_type ) { + $screen = convert_to_screen( $object_type ); + + // If we're on the right post-type/object... + if ( isset( $screen->id ) && $screen->id === $page ) { + + // Show the box. + $this->output_context_metabox(); + } + } + } + + /** + * Output the CMB2 box/fields in an alternate context (not in a standard metabox area). + * + * @since 2.2.4 + */ + public function output_context_metabox() { + $title = $this->cmb->prop( 'title' ); + + /* + * To keep from outputting the open/close markup, do not include + * a 'title' property in your metabox registration array. + * + * To output the fields 'naked' (without a postbox wrapper/style), then + * add a `'remove_box_wrap' => true` to your metabox registration array. + */ + $add_wrap = ! empty( $title ) || ! $this->cmb->prop( 'remove_box_wrap' ); + $add_handle = $add_wrap && ! empty( $title ); + + // Open the context-box wrap. + $this->context_box_title_markup_open( $add_handle ); + + // Show the form fields. + $this->cmb->show_form(); + + // Close the context-box wrap. + $this->context_box_title_markup_close( $add_handle ); + } + + /** + * Output the opening markup for a context box. + * + * @since 2.2.4 + * @param bool $add_handle Whether to add the metabox handle and opening div for .inside. + */ + public function context_box_title_markup_open( $add_handle = true ) { + $title = $this->cmb->prop( 'title' ); + + $page = get_current_screen()->id; + add_filter( "postbox_classes_{$page}_{$this->cmb->cmb_id}", array( $this, 'postbox_classes' ) ); + + echo '
              ' . "\n"; + + if ( $add_handle ) { + + echo ''; + + echo '

              ' . esc_attr( $title ) . '

              ' . "\n"; + echo '
              ' . "\n"; + } + } + + /** + * Output the closing markup for a context box. + * + * @since 2.2.4 + * @param bool $add_inside_close Whether to add closing div for .inside. + */ + public function context_box_title_markup_close( $add_inside_close = true ) { + + // Load the closing divs for a title box. + if ( $add_inside_close ) { + echo '
              ' . "\n"; // .inside + } + + echo '
              ' . "\n"; // .context-box + } + + /** + * Add metaboxes (to 'post' or 'comment' object types) + * + * @since 1.0.0 + */ + public function add_metaboxes() { + + if ( ! $this->show_on() ) { + return; + } + + /* + * To keep from registering an actual post-screen metabox, + * omit the 'title' property from the metabox registration array. + * + * (WordPress will not display metaboxes without titles anyway) + * + * This is a good solution if you want to handle outputting your + * metaboxes/fields elsewhere in the post-screen. + */ + if ( ! $this->cmb->prop( 'title' ) ) { + return; + } + + $page = get_current_screen()->id; + add_filter( "postbox_classes_{$page}_{$this->cmb->cmb_id}", array( $this, 'postbox_classes' ) ); + + foreach ( $this->cmb->box_types() as $object_type ) { + add_meta_box( + $this->cmb->cmb_id, + $this->cmb->prop( 'title' ), + array( $this, 'metabox_callback' ), + $object_type, + $this->cmb->prop( 'context' ), + $this->cmb->prop( 'priority' ), + $this->cmb->prop( 'mb_callback_args' ) + ); + } + } + + /** + * Remove the specified default taxonomy metaboxes for a post-type. + * + * @since 2.2.3 + * + */ + public function remove_default_tax_metaboxes() { + $to_remove = array_filter( (array) $this->cmb->tax_metaboxes_to_remove, 'taxonomy_exists' ); + if ( empty( $to_remove ) ) { + return; + } + + foreach ( $this->cmb->box_types() as $post_type ) { + foreach ( $to_remove as $taxonomy ) { + $mb_id = is_taxonomy_hierarchical( $taxonomy ) ? "{$taxonomy}div" : "tagsdiv-{$taxonomy}"; + remove_meta_box( $mb_id, $post_type, 'side' ); + } + } + } + + /** + * Modify metabox postbox classes. + * + * @since 2.2.4 + * @param array $classes Array of classes. + * @return array Modified array of classes + */ + public function postbox_classes( $classes ) { + if ( $this->cmb->prop( 'closed' ) && ! in_array( 'closed', $classes ) ) { + $classes[] = 'closed'; + } + + if ( $this->cmb->is_alternate_context_box() ) { + $classes = $this->alternate_context_postbox_classes( $classes ); + } else { + $classes[] = 'cmb2-postbox'; + } + + return $classes; + } + + /** + * Modify metabox altnernate context postbox classes. + * + * @since 2.2.4 + * @param array $classes Array of classes. + * @return array Modified array of classes + */ + protected function alternate_context_postbox_classes( $classes ) { + $classes[] = 'context-box'; + $classes[] = 'context-' . $this->cmb->prop( 'context' ) . '-box'; + + if ( in_array( $this->cmb->cmb_id, get_hidden_meta_boxes( get_current_screen() ) ) ) { + $classes[] = 'hide-if-js'; + } + + $add_wrap = $this->cmb->prop( 'title' ) || ! $this->cmb->prop( 'remove_box_wrap' ); + + if ( $add_wrap ) { + $classes[] = 'cmb2-postbox postbox'; + } else { + $classes[] = 'cmb2-no-box-wrap'; + } + + return $classes; + } + + /** + * Display metaboxes for a post or comment object. + * + * @since 1.0.0 + */ + public function metabox_callback() { + $object_id = 'comment' == $this->object_type ? get_comment_ID() : get_the_ID(); + $this->cmb->show_form( $object_id, $this->object_type ); + } + + /** + * Display metaboxes for new user page. + * + * @since 1.0.0 + * + * @param mixed $section User section metabox. + */ + public function user_new_metabox( $section ) { + if ( $section == $this->cmb->prop( 'new_user_section' ) ) { + $object_id = $this->cmb->object_id(); + $this->cmb->object_id( isset( $_REQUEST['user_id'] ) ? intval( $_REQUEST['user_id'] ) : $object_id ); + $this->user_metabox(); + } + } + + /** + * Display metaboxes for a user object. + * + * @since 1.0.0 + */ + public function user_metabox() { + $this->show_form_for_type( 'user' ); + } + + /** + * Display metaboxes for a taxonomy term object. + * + * @since 2.2.0 + */ + public function term_metabox() { + $this->show_form_for_type( 'term' ); + } + + /** + * Display metaboxes for an object type. + * + * @since 2.2.0 + * @param string $type Object type. + * @return void + */ + public function show_form_for_type( $type ) { + if ( $type != $this->object_type ) { + return; + } + + if ( ! $this->show_on() ) { + return; + } + + if ( $this->cmb->prop( 'cmb_styles' ) ) { + self::enqueue_cmb_css(); + } + if ( $this->cmb->prop( 'enqueue_js' ) ) { + self::enqueue_cmb_js(); + } + + $this->cmb->show_form( 0, $type ); + } + + /** + * Determines if metabox should be shown in current context. + * + * @since 2.0.0 + * @return bool Whether metabox should be added/shown. + */ + public function show_on() { + // If metabox is requesting to be conditionally shown. + $show = $this->cmb->should_show(); + + /** + * Filter to determine if metabox should show. Default is true. + * + * @param array $show Default is true, show the metabox. + * @param mixed $meta_box_args Array of the metabox arguments. + * @param mixed $cmb The CMB2 instance. + */ + $show = (bool) apply_filters( 'cmb2_show_on', $show, $this->cmb->meta_box, $this->cmb ); + + return $show; + } + + /** + * Get the CMB priority property set to numeric hook priority. + * + * @since 2.2.0 + * + * @param integer $default Default display hook priority. + * @return integer Hook priority. + */ + public function get_priority( $default = 10 ) { + $priority = $this->cmb->prop( 'priority' ); + + if ( ! is_numeric( $priority ) ) { + switch ( $priority ) { + + case 'high': + $priority = 5; + break; + + case 'low': + $priority = 20; + break; + + default: + $priority = $default; + break; + } + } + + return $priority; + } + + /** + * Save data from post metabox + * + * @since 1.0.0 + * @param int $post_id Post ID. + * @param mixed $post Post object. + * @return void + */ + public function save_post( $post_id, $post = false ) { + + $post_type = $post ? $post->post_type : get_post_type( $post_id ); + + $do_not_pass_go = ( + ! $this->can_save( $post_type ) + // Check user editing permissions. + || ( 'page' == $post_type && ! current_user_can( 'edit_page', $post_id ) ) + || ! current_user_can( 'edit_post', $post_id ) + ); + + if ( $do_not_pass_go ) { + return; + } + + $this->cmb->save_fields( $post_id, 'post', $_POST ); + } + + /** + * Save data from comment metabox. + * + * @since 2.0.9 + * @param int $comment_id Comment ID. + * @return void + */ + public function save_comment( $comment_id ) { + + $can_edit = current_user_can( 'moderate_comments', $comment_id ); + + if ( $this->can_save( get_comment_type( $comment_id ) ) && $can_edit ) { + $this->cmb->save_fields( $comment_id, 'comment', $_POST ); + } + } + + /** + * Save data from user fields. + * + * @since 1.0.x + * @param int $user_id User ID. + * @return void + */ + public function save_user( $user_id ) { + // check permissions. + if ( $this->can_save( 'user' ) ) { + $this->cmb->save_fields( $user_id, 'user', $_POST ); + } + } + + /** + * Save data from term fields + * + * @since 2.2.0 + * @param int $term_id Term ID. + * @param int $tt_id Term Taxonomy ID. + * @param string $taxonomy Taxonomy. + * @return void + */ + public function save_term( $term_id, $tt_id, $taxonomy = '' ) { + $taxonomy = $taxonomy ? $taxonomy : $tt_id; + + // check permissions. + if ( $this->taxonomy_can_save( $taxonomy ) && $this->can_save( 'term' ) ) { + $this->cmb->save_fields( $term_id, 'term', $_POST ); + } + } + + /** + * Delete term meta when a term is deleted. + * + * @since 2.2.0 + * @param int $term_id Term ID. + * @param int $tt_id Term Taxonomy ID. + * @param string $taxonomy Taxonomy. + * @return void + */ + public function delete_term( $term_id, $tt_id, $taxonomy = '' ) { + if ( $this->taxonomy_can_save( $taxonomy ) ) { + + $data_to_delete = array(); + foreach ( $this->cmb->prop( 'fields' ) as $field ) { + $data_to_delete[ $field['id'] ] = ''; + } + + $this->cmb->save_fields( $term_id, 'term', $data_to_delete ); + } + } + + /** + * Determines if the current object is able to be saved. + * + * @since 2.0.9 + * @param string $type Current object type. + * @return bool Whether object can be saved. + */ + public function can_save( $type = '' ) { + + $can_save = ( + $this->cmb->prop( 'save_fields' ) + // check nonce. + && isset( $_POST[ $this->cmb->nonce() ] ) + && wp_verify_nonce( $_POST[ $this->cmb->nonce() ], $this->cmb->nonce() ) + // check if autosave. + && ! ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) + // get the metabox types & compare it to this type. + && ( $type && in_array( $type, $this->cmb->box_types() ) ) + // Don't do updates during a switch-to-blog instance. + && ! ( is_multisite() && ms_is_switched() ) + ); + + /** + * Filter to determine if metabox is allowed to save. + * + * @param bool $can_save Whether the current metabox can save. + * @param object $cmb The CMB2 instance. + */ + return apply_filters( 'cmb2_can_save', $can_save, $this->cmb ); + } + + /** + * Determine if taxonomy of term being modified is cmb2-editable. + * + * @since 2.2.0 + * + * @param string $taxonomy Taxonomy of term being modified. + * @return bool Whether taxonomy is editable. + */ + public function taxonomy_can_save( $taxonomy ) { + if ( empty( $this->taxonomies ) || ! in_array( $taxonomy, $this->taxonomies ) ) { + return false; + } + + $taxonomy_object = get_taxonomy( $taxonomy ); + // Can the user edit this term? + if ( ! isset( $taxonomy_object->cap ) || ! current_user_can( $taxonomy_object->cap->edit_terms ) ) { + return false; + } + + return true; + } + + /** + * Enqueues the 'cmb2-display-styles' if the conditions match (has columns, on the right page, etc). + * + * @since 2.2.2.1 + */ + protected function maybe_enqueue_column_display_styles() { + global $pagenow; + if ( + $pagenow + && $this->cmb->has_columns + && $this->cmb->prop( 'cmb_styles' ) + && in_array( $pagenow, array( 'edit.php', 'users.php', 'edit-comments.php', 'edit-tags.php' ), 1 ) + ) { + self::enqueue_cmb_css( 'cmb2-display-styles' ); + } + } + + /** + * Includes CMB2 styles. + * + * @since 2.0.0 + * + * @param string $handle CSS handle. + * @return mixed + */ + public static function enqueue_cmb_css( $handle = 'cmb2-styles' ) { + + /** + * Filter to determine if CMB2'S css should be enqueued. + * + * @param bool $enqueue_css Default is true. + */ + if ( ! apply_filters( 'cmb2_enqueue_css', true ) ) { + return false; + } + + self::register_styles(); + + /* + * White list the options as this method can be used as a hook callback + * and have a different argument passed. + */ + return wp_enqueue_style( 'cmb2-display-styles' === $handle ? $handle : 'cmb2-styles' ); + } + + /** + * Includes CMB2 JS. + * + * @since 2.0.0 + */ + public static function enqueue_cmb_js() { + + /** + * Filter to determine if CMB2'S JS should be enqueued. + * + * @param bool $enqueue_js Default is true. + */ + if ( ! apply_filters( 'cmb2_enqueue_js', true ) ) { + return false; + } + + self::register_js(); + return true; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/helper-functions.php b/inc/vendors/cmb2-plugins/cmb2/includes/helper-functions.php new file mode 100755 index 00000000..d0a87760 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/helper-functions.php @@ -0,0 +1,426 @@ +get_oembed_no_edit( $args ); + + // Send back our embed. + if ( $oembed['embed'] && $oembed['embed'] != $oembed['fallback'] ) { + return '
              ' . $oembed['embed'] . '
              '; + } + + $error = sprintf( + /* translators: 1: results for. 2: link to codex.wordpress.org/Embeds */ + esc_html__( 'No oEmbed Results Found for %1$s. View more info at %2$s.', 'cmb2' ), + $oembed['fallback'], + 'codex.wordpress.org/Embeds' + ); + + if ( isset( $args['wp_error'] ) && $args['wp_error'] ) { + return new WP_Error( 'cmb2_get_oembed_result', $error, compact( 'oembed', 'args' ) ); + } + + // Otherwise, send back error info that no oEmbeds were found. + return '

              ' . $error . '

              '; +} + +/** + * Outputs the return of cmb2_get_oembed. + * + * @since 2.2.2 + * @see cmb2_get_oembed + * + * @param array $args oEmbed args. + */ +function cmb2_do_oembed( $args = array() ) { + echo cmb2_get_oembed( $args ); +} +add_action( 'cmb2_do_oembed', 'cmb2_do_oembed' ); + +/** + * A helper function to get an option from a CMB2 options array + * + * @since 1.0.1 + * @param string $option_key Option key. + * @param string $field_id Option array field key. + * @param mixed $default Optional default fallback value. + * @return array Options array or specific field + */ +function cmb2_get_option( $option_key, $field_id = '', $default = false ) { + return cmb2_options( $option_key )->get( $field_id, $default ); +} + +/** + * A helper function to update an option in a CMB2 options array + * + * @since 2.0.0 + * @param string $option_key Option key. + * @param string $field_id Option array field key. + * @param mixed $value Value to update data with. + * @param boolean $single Whether data should not be an array. + * @return boolean Success/Failure + */ +function cmb2_update_option( $option_key, $field_id, $value, $single = true ) { + if ( cmb2_options( $option_key )->update( $field_id, $value, false, $single ) ) { + return cmb2_options( $option_key )->set(); + } + + return false; +} + +/** + * Get a CMB2 field object. + * + * @since 1.1.0 + * @param array $meta_box Metabox ID or Metabox config array. + * @param array $field_id Field ID or all field arguments. + * @param int $object_id Object ID. + * @param string $object_type Type of object being saved. (e.g., post, user, comment, or options-page). + * Defaults to metabox object type. + * @return CMB2_Field|null CMB2_Field object unless metabox config cannot be found + */ +function cmb2_get_field( $meta_box, $field_id, $object_id = 0, $object_type = '' ) { + + $object_id = $object_id ? $object_id : get_the_ID(); + $cmb = $meta_box instanceof CMB2 ? $meta_box : cmb2_get_metabox( $meta_box, $object_id ); + + if ( ! $cmb ) { + return; + } + + $cmb->object_type( $object_type ? $object_type : $cmb->mb_object_type() ); + + return $cmb->get_field( $field_id ); +} + +/** + * Get a field's value. + * + * @since 1.1.0 + * @param array $meta_box Metabox ID or Metabox config array. + * @param array $field_id Field ID or all field arguments. + * @param int $object_id Object ID. + * @param string $object_type Type of object being saved. (e.g., post, user, comment, or options-page). + * Defaults to metabox object type. + * @return mixed Maybe escaped value + */ +function cmb2_get_field_value( $meta_box, $field_id, $object_id = 0, $object_type = '' ) { + $field = cmb2_get_field( $meta_box, $field_id, $object_id, $object_type ); + return $field->escaped_value(); +} + +/** + * Because OOP can be scary + * + * @since 2.0.2 + * @param array $meta_box_config Metabox Config array. + * @return CMB2 object Instantiated CMB2 object + */ +function new_cmb2_box( array $meta_box_config ) { + return cmb2_get_metabox( $meta_box_config ); +} + +/** + * Retrieve a CMB2 instance by the metabox ID + * + * @since 2.0.0 + * @param mixed $meta_box Metabox ID or Metabox config array. + * @param int $object_id Object ID. + * @param string $object_type Type of object being saved. (e.g., post, user, comment, or options-page). + * Defaults to metabox object type. + * @return CMB2 object + */ +function cmb2_get_metabox( $meta_box, $object_id = 0, $object_type = '' ) { + + if ( $meta_box instanceof CMB2 ) { + return $meta_box; + } + + if ( is_string( $meta_box ) ) { + $cmb = CMB2_Boxes::get( $meta_box ); + } else { + // See if we already have an instance of this metabox. + $cmb = CMB2_Boxes::get( $meta_box['id'] ); + // If not, we'll initate a new metabox. + $cmb = $cmb ? $cmb : new CMB2( $meta_box, $object_id ); + } + + if ( $cmb && $object_id ) { + $cmb->object_id( $object_id ); + } + + if ( $cmb && $object_type ) { + $cmb->object_type( $object_type ); + } + + return $cmb; +} + +/** + * Returns array of sanitized field values from a metabox (without saving them) + * + * @since 2.0.3 + * @param mixed $meta_box Metabox ID or Metabox config array. + * @param array $data_to_sanitize Array of field_id => value data for sanitizing (likely $_POST data). + * @return mixed Array of sanitized values or false if no CMB2 object found + */ +function cmb2_get_metabox_sanitized_values( $meta_box, array $data_to_sanitize ) { + $cmb = cmb2_get_metabox( $meta_box ); + return $cmb ? $cmb->get_sanitized_values( $data_to_sanitize ) : false; +} + +/** + * Retrieve a metabox form + * + * @since 2.0.0 + * @param mixed $meta_box Metabox config array or Metabox ID. + * @param int $object_id Object ID. + * @param array $args Optional arguments array. + * @return string CMB2 html form markup + */ +function cmb2_get_metabox_form( $meta_box, $object_id = 0, $args = array() ) { + + $object_id = $object_id ? $object_id : get_the_ID(); + $cmb = cmb2_get_metabox( $meta_box, $object_id ); + + ob_start(); + // Get cmb form. + cmb2_print_metabox_form( $cmb, $object_id, $args ); + $form = ob_get_clean(); + + return apply_filters( 'cmb2_get_metabox_form', $form, $object_id, $cmb ); +} + +/** + * Display a metabox form & save it on submission + * + * @since 1.0.0 + * @param mixed $meta_box Metabox config array or Metabox ID. + * @param int $object_id Object ID. + * @param array $args Optional arguments array. + */ +function cmb2_print_metabox_form( $meta_box, $object_id = 0, $args = array() ) { + + $object_id = $object_id ? $object_id : get_the_ID(); + $cmb = cmb2_get_metabox( $meta_box, $object_id ); + + // if passing a metabox ID, and that ID was not found. + if ( ! $cmb ) { + return; + } + + $args = wp_parse_args( $args, array( + 'form_format' => '
              %3$s
              ', + 'save_button' => esc_html__( 'Save', 'cmb2' ), + 'object_type' => $cmb->mb_object_type(), + 'cmb_styles' => $cmb->prop( 'cmb_styles' ), + 'enqueue_js' => $cmb->prop( 'enqueue_js' ), + ) ); + + // Set object type explicitly (rather than trying to guess from context). + $cmb->object_type( $args['object_type'] ); + + // Save the metabox if it's been submitted + // check permissions + // @todo more hardening? + if ( + $cmb->prop( 'save_fields' ) + // check nonce. + && isset( $_POST['submit-cmb'], $_POST['object_id'], $_POST[ $cmb->nonce() ] ) + && wp_verify_nonce( $_POST[ $cmb->nonce() ], $cmb->nonce() ) + && $object_id && $_POST['object_id'] == $object_id + ) { + $cmb->save_fields( $object_id, $cmb->object_type(), $_POST ); + } + + // Enqueue JS/CSS. + if ( $args['cmb_styles'] ) { + CMB2_hookup::enqueue_cmb_css(); + } + + if ( $args['enqueue_js'] ) { + CMB2_hookup::enqueue_cmb_js(); + } + + $form_format = apply_filters( 'cmb2_get_metabox_form_format', $args['form_format'], $object_id, $cmb ); + + $format_parts = explode( '%3$s', $form_format ); + + // Show cmb form. + printf( $format_parts[0], $cmb->cmb_id, $object_id ); + $cmb->show_form(); + + if ( isset( $format_parts[1] ) && $format_parts[1] ) { + printf( str_ireplace( '%4$s', '%1$s', $format_parts[1] ), $args['save_button'] ); + } + +} + +/** + * Display a metabox form (or optionally return it) & save it on submission. + * + * @since 1.0.0 + * @param mixed $meta_box Metabox config array or Metabox ID. + * @param int $object_id Object ID. + * @param array $args Optional arguments array. + * @return string + */ +function cmb2_metabox_form( $meta_box, $object_id = 0, $args = array() ) { + if ( ! isset( $args['echo'] ) || $args['echo'] ) { + cmb2_print_metabox_form( $meta_box, $object_id, $args ); + } else { + return cmb2_get_metabox_form( $meta_box, $object_id, $args ); + } +} + +if ( ! function_exists( 'date_create_from_format' ) ) { + + /** + * Reimplementation of DateTime::createFromFormat for PHP < 5.3. :( + * Borrowed from http://stackoverflow.com/questions/5399075/php-datetimecreatefromformat-in-5-2 + * + * @param string $date_format Date format. + * @param string $date_value Date value. + * + * @return DateTime + */ + function date_create_from_format( $date_format, $date_value ) { + + $schedule_format = str_replace( + array( 'M', 'Y', 'm', 'd', 'H', 'i', 'a' ), + array( '%b', '%Y', '%m', '%d', '%H', '%M', '%p' ), + $date_format + ); + + /* + * %Y, %m and %d correspond to date()'s Y m and d. + * %I corresponds to H, %M to i and %p to a + */ + $parsed_time = strptime( $date_value, $schedule_format ); + + $ymd = sprintf( + /** + * This is a format string that takes six total decimal + * arguments, then left-pads them with zeros to either + * 4 or 2 characters, as needed + */ + '%04d-%02d-%02d %02d:%02d:%02d', + $parsed_time['tm_year'] + 1900, // This will be "111", so we need to add 1900. + $parsed_time['tm_mon'] + 1, // This will be the month minus one, so we add one. + $parsed_time['tm_mday'], + $parsed_time['tm_hour'], + $parsed_time['tm_min'], + $parsed_time['tm_sec'] + ); + + return new DateTime( $ymd ); + } +}// End if. + +if ( ! function_exists( 'date_timestamp_get' ) ) { + + /** + * Returns the Unix timestamp representing the date. + * Reimplementation of DateTime::getTimestamp for PHP < 5.3. :( + * + * @param DateTime $date DateTime instance. + * + * @return int + */ + function date_timestamp_get( DateTime $date ) { + return $date->format( 'U' ); + } +}// End if. diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/index.php b/inc/vendors/cmb2-plugins/cmb2/includes/index.php new file mode 100755 index 00000000..eea59b98 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/index.php @@ -0,0 +1,2 @@ + array(), + 'user' => array(), + 'comment' => array(), + 'term' => array(), + ); + + /** + * Array of readable field objects. + * + * @var CMB2_Field[] + * @since 2.2.3 + */ + protected $read_fields = array(); + + /** + * Array of editable field objects. + * + * @var CMB2_Field[] + * @since 2.2.3 + */ + protected $edit_fields = array(); + + /** + * Whether CMB2 object is readable via the rest api. + * + * @var boolean + */ + protected $rest_read = false; + + /** + * Whether CMB2 object is editable via the rest api. + * + * @var boolean + */ + protected $rest_edit = false; + + /** + * A functionalized constructor, used for the hookup action callbacks. + * + * @since 2.2.6 + * + * @param CMB2 $cmb The CMB2 object to hookup + * + * @return CMB2_Hookup_Base $hookup The hookup object. + */ + public static function maybe_init_and_hookup( CMB2 $cmb ) { + if ( $cmb->prop( 'show_in_rest' ) && function_exists( 'rest_get_server' ) ) { + + $hookup = new self( $cmb ); + + return $hookup->universal_hooks(); + } + + return false; + } + + /** + * Constructor + * + * @since 2.2.3 + * + * @param CMB2 $cmb The CMB2 object to be registered for the API. + */ + public function __construct( CMB2 $cmb ) { + $this->cmb = $cmb; + self::$boxes[ $cmb->cmb_id ] = $this; + + $show_value = $this->cmb->prop( 'show_in_rest' ); + + $this->rest_read = self::is_readable( $show_value ); + $this->rest_edit = self::is_editable( $show_value ); + } + + /** + * Hooks to register on frontend and backend. + * + * @since 2.2.3 + * + * @return void + */ + public function universal_hooks() { + // hook up the CMB rest endpoint classes + $this->once( 'rest_api_init', array( __CLASS__, 'init_routes' ), 0 ); + + if ( function_exists( 'register_rest_field' ) ) { + $this->once( 'rest_api_init', array( __CLASS__, 'register_cmb2_fields' ), 50 ); + } + + $this->declare_read_edit_fields(); + + add_filter( 'is_protected_meta', array( $this, 'is_protected_meta' ), 10, 3 ); + + return $this; + } + + /** + * Initiate the CMB2 Boxes and Fields routes + * + * @since 2.2.3 + * + * @return void + */ + public static function init_routes() { + $wp_rest_server = rest_get_server(); + + $boxes_controller = new CMB2_REST_Controller_Boxes( $wp_rest_server ); + $boxes_controller->register_routes(); + + $fields_controller = new CMB2_REST_Controller_Fields( $wp_rest_server ); + $fields_controller->register_routes(); + } + + /** + * Loop through REST boxes and call register_rest_field for each object type. + * + * @since 2.2.3 + * + * @return void + */ + public static function register_cmb2_fields() { + $alltypes = $taxonomies = array(); + + foreach ( self::$boxes as $cmb_id => $rest_box ) { + $types = array_flip( $rest_box->cmb->box_types( array( 'post' ) ) ); + + if ( isset( $types['user'] ) ) { + unset( $types['user'] ); + self::$type_boxes['user'][ $cmb_id ] = $cmb_id; + } + + if ( isset( $types['comment'] ) ) { + unset( $types['comment'] ); + self::$type_boxes['comment'][ $cmb_id ] = $cmb_id; + } + + if ( isset( $types['term'] ) ) { + unset( $types['term'] ); + + $taxonomies = array_merge( + $taxonomies, + CMB2_Utils::ensure_array( $rest_box->cmb->prop( 'taxonomies' ) ) + ); + + self::$type_boxes['term'][ $cmb_id ] = $cmb_id; + } + + if ( ! empty( $types ) ) { + $alltypes = array_merge( $alltypes, array_flip( $types ) ); + self::$type_boxes['post'][ $cmb_id ] = $cmb_id; + } + } + + $alltypes = array_unique( $alltypes ); + + if ( ! empty( $alltypes ) ) { + self::register_rest_field( $alltypes, 'post' ); + } + + if ( ! empty( self::$type_boxes['user'] ) ) { + self::register_rest_field( 'user', 'user' ); + } + + if ( ! empty( self::$type_boxes['comment'] ) ) { + self::register_rest_field( 'comment', 'comment' ); + } + + if ( ! empty( self::$type_boxes['term'] ) ) { + self::register_rest_field( $taxonomies, 'term' ); + } + } + + /** + * Wrapper for register_rest_field. + * + * @since 2.2.3 + * + * @param string|array $object_types Object(s) the field is being registered + * to, "post"|"term"|"comment" etc. + * @param string $object_types Canonical object type for callbacks. + * + * @return void + */ + protected static function register_rest_field( $object_types, $object_type ) { + register_rest_field( $object_types, 'cmb2', array( + 'get_callback' => array( __CLASS__, "get_{$object_type}_rest_values" ), + 'update_callback' => array( __CLASS__, "update_{$object_type}_rest_values" ), + 'schema' => null, // @todo add schema + ) ); + } + + /** + * Setup readable and editable fields. + * + * @since 2.2.3 + * + * @return void + */ + protected function declare_read_edit_fields() { + foreach ( $this->cmb->prop( 'fields' ) as $field ) { + $show_in_rest = isset( $field['show_in_rest'] ) ? $field['show_in_rest'] : null; + + if ( false === $show_in_rest ) { + continue; + } + + if ( $this->can_read( $show_in_rest ) ) { + $this->read_fields[] = $field['id']; + } + + if ( $this->can_edit( $show_in_rest ) ) { + $this->edit_fields[] = $field['id']; + } + } + } + + /** + * Determines if a field is readable based on it's show_in_rest value + * and the box's show_in_rest value. + * + * @since 2.2.3 + * + * @param bool $show_in_rest Field's show_in_rest value. Default null. + * + * @return bool Whether field is readable. + */ + protected function can_read( $show_in_rest ) { + // if 'null', then use default box value. + if ( null === $show_in_rest ) { + return $this->rest_read; + } + + // Else check if the value represents readable. + return self::is_readable( $show_in_rest ); + } + + /** + * Determines if a field is editable based on it's show_in_rest value + * and the box's show_in_rest value. + * + * @since 2.2.3 + * + * @param bool $show_in_rest Field's show_in_rest value. Default null. + * + * @return bool Whether field is editable. + */ + protected function can_edit( $show_in_rest ) { + // if 'null', then use default box value. + if ( null === $show_in_rest ) { + return $this->rest_edit; + } + + // Else check if the value represents editable. + return self::is_editable( $show_in_rest ); + } + + /** + * Handler for getting post custom field data. + * + * @since 2.2.3 + * + * @param array $object The object data from the response + * @param string $field_name Name of field + * @param WP_REST_Request $request Current request + * @param string $object_type The request object type + * + * @return mixed + */ + public static function get_post_rest_values( $object, $field_name, $request, $object_type ) { + if ( 'cmb2' === $field_name ) { + return self::get_rest_values( $object, $request, $object_type, 'post' ); + } + } + + /** + * Handler for getting user custom field data. + * + * @since 2.2.3 + * + * @param array $object The object data from the response + * @param string $field_name Name of field + * @param WP_REST_Request $request Current request + * @param string $object_type The request object type + * + * @return mixed + */ + public static function get_user_rest_values( $object, $field_name, $request, $object_type ) { + if ( 'cmb2' === $field_name ) { + return self::get_rest_values( $object, $request, $object_type, 'user' ); + } + } + + /** + * Handler for getting comment custom field data. + * + * @since 2.2.3 + * + * @param array $object The object data from the response + * @param string $field_name Name of field + * @param WP_REST_Request $request Current request + * @param string $object_type The request object type + * + * @return mixed + */ + public static function get_comment_rest_values( $object, $field_name, $request, $object_type ) { + if ( 'cmb2' === $field_name ) { + return self::get_rest_values( $object, $request, $object_type, 'comment' ); + } + } + + /** + * Handler for getting term custom field data. + * + * @since 2.2.3 + * + * @param array $object The object data from the response + * @param string $field_name Name of field + * @param WP_REST_Request $request Current request + * @param string $object_type The request object type + * + * @return mixed + */ + public static function get_term_rest_values( $object, $field_name, $request, $object_type ) { + if ( 'cmb2' === $field_name ) { + return self::get_rest_values( $object, $request, $object_type, 'term' ); + } + } + + /** + * Handler for getting custom field data. + * + * @since 2.2.3 + * + * @param array $object The object data from the response + * @param WP_REST_Request $request Current request + * @param string $object_type The request object type + * @param string $main_object_type The cmb main object type + * + * @return mixed + */ + protected static function get_rest_values( $object, $request, $object_type, $main_object_type = 'post' ) { + if ( ! isset( $object['id'] ) ) { + return; + } + + $values = array(); + + if ( ! empty( self::$type_boxes[ $main_object_type ] ) ) { + foreach ( self::$type_boxes[ $main_object_type ] as $cmb_id ) { + $rest_box = self::$boxes[ $cmb_id ]; + + foreach ( $rest_box->read_fields as $field_id ) { + $rest_box->cmb->object_id( $object['id'] ); + $rest_box->cmb->object_type( $main_object_type ); + + $field = $rest_box->cmb->get_field( $field_id ); + + $field->object_id( $object['id'] ); + $field->object_type( $main_object_type ); + + $values[ $cmb_id ][ $field->id( true ) ] = $field->get_data(); + } + } + } + + return $values; + } + + /** + * Handler for updating post custom field data. + * + * @since 2.2.3 + * + * @param mixed $values The value of the field + * @param object $object The object from the response + * @param string $field_name Name of field + * @param WP_REST_Request $request Current request + * @param string $object_type The request object type + * + * @return bool|int + */ + public static function update_post_rest_values( $values, $object, $field_name, $request, $object_type ) { + if ( 'cmb2' === $field_name ) { + return self::update_rest_values( $values, $object, $request, $object_type, 'post' ); + } + } + + /** + * Handler for updating user custom field data. + * + * @since 2.2.3 + * + * @param mixed $values The value of the field + * @param object $object The object from the response + * @param string $field_name Name of field + * @param WP_REST_Request $request Current request + * @param string $object_type The request object type + * + * @return bool|int + */ + public static function update_user_rest_values( $values, $object, $field_name, $request, $object_type ) { + if ( 'cmb2' === $field_name ) { + return self::update_rest_values( $values, $object, $request, $object_type, 'user' ); + } + } + + /** + * Handler for updating comment custom field data. + * + * @since 2.2.3 + * + * @param mixed $values The value of the field + * @param object $object The object from the response + * @param string $field_name Name of field + * @param WP_REST_Request $request Current request + * @param string $object_type The request object type + * + * @return bool|int + */ + public static function update_comment_rest_values( $values, $object, $field_name, $request, $object_type ) { + if ( 'cmb2' === $field_name ) { + return self::update_rest_values( $values, $object, $request, $object_type, 'comment' ); + } + } + + /** + * Handler for updating term custom field data. + * + * @since 2.2.3 + * + * @param mixed $values The value of the field + * @param object $object The object from the response + * @param string $field_name Name of field + * @param WP_REST_Request $request Current request + * @param string $object_type The request object type + * + * @return bool|int + */ + public static function update_term_rest_values( $values, $object, $field_name, $request, $object_type ) { + if ( 'cmb2' === $field_name ) { + return self::update_rest_values( $values, $object, $request, $object_type, 'term' ); + } + } + + /** + * Handler for updating custom field data. + * + * @since 2.2.3 + * + * @param mixed $values The value of the field + * @param object $object The object from the response + * @param WP_REST_Request $request Current request + * @param string $object_type The request object type + * @param string $main_object_type The cmb main object type + * + * @return bool|int + */ + protected static function update_rest_values( $values, $object, $request, $object_type, $main_object_type = 'post' ) { + if ( empty( $values ) || ! is_array( $values ) ) { + return; + } + + $object_id = self::get_object_id( $object, $main_object_type ); + + if ( ! $object_id ) { + return; + } + + $updated = array(); + + if ( ! empty( self::$type_boxes[ $main_object_type ] ) ) { + foreach ( self::$type_boxes[ $main_object_type ] as $cmb_id ) { + $rest_box = self::$boxes[ $cmb_id ]; + + if ( ! array_key_exists( $cmb_id, $values ) ) { + continue; + } + + $rest_box->cmb->object_id( $object_id ); + $rest_box->cmb->object_type( $main_object_type ); + + $updated[ $cmb_id ] = $rest_box->sanitize_box_values( $values ); + } + } + + return $updated; + } + + /** + * Loop through box fields and sanitize the values. + * + * @since 2.2.o + * + * @param array $values Array of values being provided. + * @return array Array of updated/sanitized values. + */ + public function sanitize_box_values( array $values ) { + $updated = array(); + + $this->cmb->pre_process(); + + foreach ( $this->edit_fields as $field_id ) { + $updated[ $field_id ] = $this->sanitize_field_value( $values, $field_id ); + } + + $this->cmb->after_save(); + + return $updated; + } + + /** + * Handles returning a sanitized field value. + * + * @since 2.2.3 + * + * @param array $values Array of values being provided. + * @param string $field_id The id of the field to update. + * + * @return mixed The results of saving/sanitizing a field value. + */ + protected function sanitize_field_value( array $values, $field_id ) { + if ( ! array_key_exists( $field_id, $values[ $this->cmb->cmb_id ] ) ) { + return; + } + + $field = $this->cmb->get_field( $field_id ); + + if ( 'title' == $field->type() ) { + return; + } + + $field->object_id( $this->cmb->object_id() ); + $field->object_type( $this->cmb->object_type() ); + + if ( 'group' == $field->type() ) { + return $this->sanitize_group_value( $values, $field ); + } + + return $field->save_field( $values[ $this->cmb->cmb_id ][ $field_id ] ); + } + + /** + * Handles returning a sanitized group field value. + * + * @since 2.2.3 + * + * @param array $values Array of values being provided. + * @param CMB2_Field $field CMB2_Field object. + * + * @return mixed The results of saving/sanitizing the group field value. + */ + protected function sanitize_group_value( array $values, CMB2_Field $field ) { + $fields = $field->fields(); + if ( empty( $fields ) ) { + return; + } + + $this->cmb->data_to_save[ $field->_id() ] = $values[ $this->cmb->cmb_id ][ $field->_id() ]; + + return $this->cmb->save_group_field( $field ); + } + + /** + * Filter whether a meta key is protected. + * + * @since 2.2.3 + * + * @param bool $protected Whether the key is protected. Default false. + * @param string $meta_key Meta key. + * @param string $meta_type Meta type. + */ + public function is_protected_meta( $protected, $meta_key, $meta_type ) { + if ( $this->field_can_edit( $meta_key ) ) { + return false; + } + + return $protected; + } + + protected static function get_object_id( $object, $object_type = 'post' ) { + switch ( $object_type ) { + case 'user': + case 'post': + if ( isset( $object->ID ) ) { + return intval( $object->ID ); + } + case 'comment': + if ( isset( $object->comment_ID ) ) { + return intval( $object->comment_ID ); + } + case 'term': + if ( is_array( $object ) && isset( $object['term_id'] ) ) { + return intval( $object['term_id'] ); + } elseif ( isset( $object->term_id ) ) { + return intval( $object->term_id ); + } + } + + return 0; + } + + /** + * Checks if a given field can be read. + * + * @since 2.2.3 + * + * @param string|CMB2_Field $field_id Field ID or CMB2_Field object. + * @param boolean $return_object Whether to return the Field object. + * + * @return mixed False if field can't be read or true|CMB2_Field object. + */ + public function field_can_read( $field_id, $return_object = false ) { + return $this->field_can( 'read_fields', $field_id, $return_object ); + } + + /** + * Checks if a given field can be edited. + * + * @since 2.2.3 + * + * @param string|CMB2_Field $field_id Field ID or CMB2_Field object. + * @param boolean $return_object Whether to return the Field object. + * + * @return mixed False if field can't be edited or true|CMB2_Field object. + */ + public function field_can_edit( $field_id, $return_object = false ) { + return $this->field_can( 'edit_fields', $field_id, $return_object ); + } + + /** + * Checks if a given field can be read or edited. + * + * @since 2.2.3 + * + * @param string $type Whether we are checking for read or edit fields. + * @param string|CMB2_Field $field_id Field ID or CMB2_Field object. + * @param boolean $return_object Whether to return the Field object. + * + * @return mixed False if field can't be read or edited or true|CMB2_Field object. + */ + protected function field_can( $type = 'read_fields', $field_id, $return_object = false ) { + if ( ! in_array( $field_id instanceof CMB2_Field ? $field_id->id() : $field_id, $this->{$type}, true ) ) { + return false; + } + + return $return_object ? $this->cmb->get_field( $field_id ) : true; + } + + /** + * Get a CMB2_REST instance object from the registry by a CMB2 id. + * + * @since 2.2.3 + * + * @param string $cmb_id CMB2 config id + * + * @return CMB2_REST|false The CMB2_REST object or false. + */ + public static function get_rest_box( $cmb_id ) { + return isset( self::$boxes[ $cmb_id ] ) ? self::$boxes[ $cmb_id ] : false; + } + + /** + * Remove a CMB2_REST instance object from the registry. + * + * @since 2.2.3 + * + * @param string $cmb_id A CMB2 instance id. + */ + public static function remove( $cmb_id ) { + if ( array_key_exists( $cmb_id, self::$boxes ) ) { + unset( self::$boxes[ $cmb_id ] ); + } + } + + /** + * Retrieve all CMB2_REST instances from the registry. + * + * @since 2.2.3 + * @return CMB2[] Array of all registered CMB2_REST instances. + */ + public static function get_all() { + return self::$boxes; + } + + /** + * Checks if given value is readable. + * + * Value is considered readable if it is not empty and if it does not match the editable blacklist. + * + * @since 2.2.3 + * + * @param mixed $value Value to check. + * + * @return boolean Whether value is considered readable. + */ + public static function is_readable( $value ) { + return ! empty( $value ) && ! in_array( $value, array( + WP_REST_Server::CREATABLE, + WP_REST_Server::EDITABLE, + WP_REST_Server::DELETABLE, + ), true ); + } + + /** + * Checks if given value is editable. + * + * Value is considered editable if matches the editable whitelist. + * + * @since 2.2.3 + * + * @param mixed $value Value to check. + * + * @return boolean Whether value is considered editable. + */ + public static function is_editable( $value ) { + return in_array( $value, array( + WP_REST_Server::EDITABLE, + WP_REST_Server::ALLMETHODS, + ), true ); + } + + /** + * Magic getter for our object. + * + * @param string $field + * @throws Exception Throws an exception if the field is invalid. + * + * @return mixed + */ + public function __get( $field ) { + switch ( $field ) { + case 'read_fields': + case 'edit_fields': + case 'rest_read': + case 'rest_edit': + return $this->{$field}; + default: + throw new Exception( 'Invalid ' . __CLASS__ . ' property: ' . $field ); + } + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/rest-api/CMB2_REST_Controller.php b/inc/vendors/cmb2-plugins/cmb2/includes/rest-api/CMB2_REST_Controller.php new file mode 100755 index 00000000..6f201702 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/rest-api/CMB2_REST_Controller.php @@ -0,0 +1,448 @@ +server = $wp_rest_server; + } + + /** + * A wrapper for `apply_filters` which checks for box/field properties to hook to the filter. + * + * Checks if a CMB object callback property exists, and if it does, + * hook it to the permissions filter. + * + * @since 2.2.3 + * + * @param string $filter The name of the filter to apply. + * @param bool $default_access The default access for this request. + * + * @return void + */ + public function maybe_hook_callback_and_apply_filters( $filter, $default_access ) { + if ( ! $this->rest_box && $this->request->get_param( 'cmb_id' ) ) { + $this->rest_box = CMB2_REST::get_rest_box( $this->request->get_param( 'cmb_id' ) ); + } + + $default_access = $this->maybe_hook_registered_callback( $filter, $default_access ); + + /** + * Apply the permissions check filter. + * + * @since 2.2.3 + * + * @param bool $default_access Whether this CMB2 endpoint can be accessed. + * @param object $controller This CMB2_REST_Controller object. + */ + $default_access = apply_filters( $filter, $default_access, $this ); + + $this->maybe_unhook_registered_callback( $filter ); + + return $default_access; + } + + /** + * Checks if the CMB2 box has any registered callback parameters for the given filter. + * + * The registered handlers will have a property name which matches the filter, except: + * - The 'cmb2_api' prefix will be removed + * - A '_cb' suffix will be added (to stay inline with other '*_cb' parameters). + * + * @since 2.2.3 + * + * @param string $filter The filter name. + * @param bool $default_val The default filter value. + * + * @return bool The possibly-modified filter value (if the '*_cb' param is non-callable). + */ + public function maybe_hook_registered_callback( $filter, $default_val ) { + if ( ! $this->rest_box || is_wp_error( $this->rest_box ) ) { + return $default_val; + } + + // Hook box specific filter callbacks. + $val = $this->rest_box->cmb->maybe_hook_parameter( $filter, $default_val ); + if ( null !== $val ) { + $default_val = $val; + } + + return $default_val; + } + + /** + * Unhooks any CMB2 box registered callback parameters for the given filter. + * + * @since 2.2.3 + * + * @param string $filter The filter name. + * + * @return void + */ + public function maybe_unhook_registered_callback( $filter ) { + if ( ! $this->rest_box || is_wp_error( $this->rest_box ) ) { + return; + } + + // Unhook box specific filter callbacks. + $this->rest_box->cmb->maybe_hook_parameter( $filter, null, 'remove_filter' ); + } + + /** + * Prepare a CMB2 object for serialization + * + * @since 2.2.3 + * + * @param mixed $data + * @return array $data + */ + public function prepare_item( $data ) { + return $this->prepare_item_for_response( $data, $this->request ); + } + + /** + * Output buffers a callback and returns the results. + * + * @since 2.2.3 + * + * @param mixed $cb Callable function/method. + * @return mixed Results of output buffer after calling function/method. + */ + public function get_cb_results( $cb ) { + $args = func_get_args(); + array_shift( $args ); // ignore $cb + ob_start(); + call_user_func_array( $cb, $args ); + + return ob_get_clean(); + } + + /** + * Prepare the CMB2 item for the REST response. + * + * @since 2.2.3 + * + * @param mixed $item WordPress representation of the item. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response + */ + public function prepare_item_for_response( $data, $request = null ) { + $data = $this->filter_response_by_context( $data, $this->request['context'] ); + + /** + * Filter the prepared CMB2 item response. + * + * @since 2.2.3 + * + * @param mixed $data Prepared data + * @param object $request The WP_REST_Request object + * @param object $cmb2_endpoints This endpoints object + */ + return apply_filters( 'cmb2_rest_prepare', rest_ensure_response( $data ), $this->request, $this ); + } + + /** + * Initiates the request property and the rest_box property if box is readable. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Request object. + * @param string $request_type A description of the type of request being made. + * + * @return void + */ + protected function initiate_rest_read_box( $request, $request_type ) { + $this->initiate_rest_box( $request, $request_type ); + + if ( ! is_wp_error( $this->rest_box ) && ! $this->rest_box->rest_read ) { + $this->rest_box = new WP_Error( 'cmb2_rest_no_read_error', esc_html__( 'This box does not have read permissions.', 'cmb2' ), array( + 'status' => 403, + ) ); + } + } + + /** + * Initiates the request property and the rest_box property if box is writeable. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Request object. + * @param string $request_type A description of the type of request being made. + * + * @return void + */ + protected function initiate_rest_edit_box( $request, $request_type ) { + $this->initiate_rest_box( $request, $request_type ); + + if ( ! is_wp_error( $this->rest_box ) && ! $this->rest_box->rest_edit ) { + $this->rest_box = new WP_Error( 'cmb2_rest_no_write_error', esc_html__( 'This box does not have write permissions.', 'cmb2' ), array( + 'status' => 403, + ) ); + } + } + + /** + * Initiates the request property and the rest_box property. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Request object. + * @param string $request_type A description of the type of request being made. + * + * @return void + */ + protected function initiate_rest_box( $request, $request_type ) { + $this->initiate_request( $request, $request_type ); + + $this->rest_box = CMB2_REST::get_rest_box( $this->request->get_param( 'cmb_id' ) ); + + if ( ! $this->rest_box ) { + + $this->rest_box = new WP_Error( 'cmb2_rest_box_not_found_error', esc_html__( 'No box found by that id. A box needs to be registered with the "show_in_rest" parameter configured.', 'cmb2' ), array( + 'status' => 403, + ) ); + + } else { + + if ( isset( $this->request['object_id'] ) ) { + $this->rest_box->cmb->object_id( sanitize_text_field( $this->request['object_id'] ) ); + } + + if ( isset( $this->request['object_type'] ) ) { + $this->rest_box->cmb->object_type( sanitize_text_field( $this->request['object_type'] ) ); + } + } + } + + /** + * Initiates the request property and sets up the initial static properties. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Request object. + * @param string $request_type A description of the type of request being made. + * + * @return void + */ + public function initiate_request( $request, $request_type ) { + $this->request = $request; + + if ( ! isset( $this->request['context'] ) || empty( $this->request['context'] ) ) { + $this->request['context'] = 'view'; + } + + if ( ! self::$request_type ) { + self::$request_type = $request_type; + } + + if ( ! self::$route ) { + self::$route = $this->request->get_route(); + } + } + + /** + * Useful when getting `_embed`-ed items + * + * @since 2.2.3 + * + * @return string Initial requested type. + */ + public static function get_intial_request_type() { + return self::$request_type; + } + + /** + * Useful when getting `_embed`-ed items + * + * @since 2.2.3 + * + * @return string Initial requested route. + */ + public static function get_intial_route() { + return self::$route; + } + + /** + * Get CMB2 fields schema, conforming to JSON Schema + * + * @since 2.2.3 + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'CMB2', + 'type' => 'object', + 'properties' => array( + 'description' => array( + 'description' => esc_html__( 'A human-readable description of the object.', 'cmb2' ), + 'type' => 'string', + 'context' => array( + 'view', + ), + ), + 'name' => array( + 'description' => esc_html__( 'The id for the object.', 'cmb2' ), + 'type' => 'integer', + 'context' => array( + 'view', + ), + ), + 'name' => array( + 'description' => esc_html__( 'The title for the object.', 'cmb2' ), + 'type' => 'string', + 'context' => array( + 'view', + ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } + + /** + * Return an array of contextual links for endpoint/object + * + * @link http://v2.wp-api.org/extending/linking/ + * @link http://www.iana.org/assignments/link-relations/link-relations.xhtml + * + * @since 2.2.3 + * + * @param mixed $object Object to build links from. + * + * @return array Array of links + */ + abstract protected function prepare_links( $object ); + + /** + * Get whitelisted query strings from URL for appending to link URLS. + * + * @since 2.2.3 + * + * @return string URL query stringl + */ + public function get_query_string() { + $defaults = array( + 'object_id' => 0, + 'object_type' => '', + '_rendered' => '', + // '_embed' => '', + ); + + $query_string = ''; + + foreach ( $defaults as $key => $value ) { + if ( isset( $this->request[ $key ] ) ) { + $query_string .= $query_string ? '&' : '?'; + $query_string .= $key; + if ( $value = sanitize_text_field( $this->request[ $key ] ) ) { + $query_string .= '=' . $value; + } + } + } + + return $query_string; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/rest-api/CMB2_REST_Controller_Boxes.php b/inc/vendors/cmb2-plugins/cmb2/includes/rest-api/CMB2_REST_Controller_Boxes.php new file mode 100755 index 00000000..d568fc27 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/rest-api/CMB2_REST_Controller_Boxes.php @@ -0,0 +1,270 @@ +namespace_base = $this->namespace . '/' . $this->rest_base; + parent::__construct( $wp_rest_server ); + } + + /** + * Register the routes for the objects of the controller. + * + * @since 2.2.3 + */ + public function register_routes() { + $args = array( + '_embed' => array( + 'description' => esc_html__( 'Includes the registered fields for the box in the response.', 'cmb2' ), + ), + ); + + // @todo determine what belongs in the context param. + // $args['context'] = $this->get_context_param(); + // $args['context']['required'] = false; + // $args['context']['default'] = 'view'; + // $args['context']['enum'] = array( 'view', 'embed' ); + // Returns all boxes data. + register_rest_route( $this->namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'callback' => array( $this, 'get_items' ), + 'args' => $args, + ), + 'schema' => array( $this, 'get_item_schema' ), + ) ); + + $args['_rendered'] = array( + 'description' => esc_html__( 'Includes the fully rendered attributes, \'form_open\', \'form_close\', as well as the enqueued \'js_dependencies\' script handles, and \'css_dependencies\' stylesheet handles.', 'cmb2' ), + ); + + // Returns specific box's data. + register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array( + array( + 'methods' => WP_REST_Server::READABLE, + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + 'callback' => array( $this, 'get_item' ), + 'args' => $args, + ), + 'schema' => array( $this, 'get_item_schema' ), + ) ); + } + + /** + * Check if a given request has access to get boxes. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|boolean + */ + public function get_items_permissions_check( $request ) { + $this->initiate_request( $request, __FUNCTION__ ); + + /** + * By default, no special permissions needed. + * + * @since 2.2.3 + * + * @param bool $can_access Whether this CMB2 endpoint can be accessed. + * @param object $controller This CMB2_REST_Controller object. + */ + return apply_filters( 'cmb2_api_get_boxes_permissions_check', true, $this ); + } + + /** + * Get all public CMB2 boxes. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + $this->initiate_request( $request, 'boxes_read' ); + + $boxes = CMB2_REST::get_all(); + if ( empty( $boxes ) ) { + return new WP_Error( 'cmb2_rest_no_boxes', esc_html__( 'No boxes found.', 'cmb2' ), array( + 'status' => 403, + ) ); + } + + $boxes_data = array(); + + // Loop and prepare boxes data. + foreach ( $boxes as $this->rest_box ) { + if ( + // Make sure this box can be read + $this->rest_box->rest_read + // And make sure current user can view this box. + && $this->get_item_permissions_check_filter( $this->request ) + ) { + $boxes_data[] = $this->server->response_to_data( + $this->get_rest_box(), + isset( $this->request['_embed'] ) + ); + } + } + + return $this->prepare_item( $boxes_data ); + } + + /** + * Check if a given request has access to a box. + * By default, no special permissions needed, but filtering return value. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_item_permissions_check( $request ) { + $this->initiate_rest_read_box( $request, 'box_read' ); + + return $this->get_item_permissions_check_filter(); + } + + /** + * Check by filter if a given request has access to a box. + * By default, no special permissions needed, but filtering return value. + * + * @since 2.2.3 + * + * @param bool $can_access Whether the current request has access to view the box by default. + * @return WP_Error|boolean + */ + public function get_item_permissions_check_filter( $can_access = true ) { + /** + * By default, no special permissions needed. + * + * @since 2.2.3 + * + * @param bool $can_access Whether this CMB2 endpoint can be accessed. + * @param object $controller This CMB2_REST_Controller object. + */ + return $this->maybe_hook_callback_and_apply_filters( 'cmb2_api_get_box_permissions_check', $can_access ); + } + + /** + * Get one CMB2 box from the collection. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|WP_REST_Response + */ + public function get_item( $request ) { + $this->initiate_rest_read_box( $request, 'box_read' ); + + if ( is_wp_error( $this->rest_box ) ) { + return $this->rest_box; + } + + return $this->prepare_item( $this->get_rest_box() ); + } + + /** + * Get a CMB2 box prepared for REST + * + * @since 2.2.3 + * + * @return array + */ + public function get_rest_box() { + $cmb = $this->rest_box->cmb; + + $boxes_data = $cmb->meta_box; + + if ( isset( $this->request['_rendered'] ) && $this->namespace_base !== ltrim( CMB2_REST_Controller::get_intial_route(), '/' ) ) { + $boxes_data['form_open'] = $this->get_cb_results( array( $cmb, 'render_form_open' ) ); + $boxes_data['form_close'] = $this->get_cb_results( array( $cmb, 'render_form_close' ) ); + + global $wp_scripts, $wp_styles; + $before_css = $wp_styles->queue; + $before_js = $wp_scripts->queue; + + CMB2_JS::enqueue(); + + $boxes_data['js_dependencies'] = array_values( array_diff( $wp_scripts->queue, $before_js ) ); + $boxes_data['css_dependencies'] = array_values( array_diff( $wp_styles->queue, $before_css ) ); + } + + // TODO: look into 'embed' parameter. + // http://demo.wp-api.org/wp-json/wp/v2/posts?_embed + unset( $boxes_data['fields'] ); + // Handle callable properties. + unset( $boxes_data['show_on_cb'] ); + + $response = rest_ensure_response( $boxes_data ); + + $response->add_links( $this->prepare_links( $cmb ) ); + + return $response; + } + + /** + * Return an array of contextual links for box/boxes. + * + * @since 2.2.3 + * + * @param CMB2_REST $cmb CMB2_REST object to build links from. + * + * @return array Array of links + */ + protected function prepare_links( $cmb ) { + $boxbase = $this->namespace_base . '/' . $cmb->cmb_id; + $query_string = $this->get_query_string(); + + return array( + // Standard Link Relations -- http://v2.wp-api.org/extending/linking/ + 'self' => array( + 'href' => rest_url( $boxbase . $query_string ), + ), + 'collection' => array( + 'href' => rest_url( $this->namespace_base . $query_string ), + ), + // Custom Link Relations -- http://v2.wp-api.org/extending/linking/ + // TODO URL should document relationship. + 'https://cmb2.io/fields' => array( + 'href' => rest_url( trailingslashit( $boxbase ) . 'fields' . $query_string ), + 'embeddable' => true, + ), + ); + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/rest-api/CMB2_REST_Controller_Fields.php b/inc/vendors/cmb2-plugins/cmb2/includes/rest-api/CMB2_REST_Controller_Fields.php new file mode 100755 index 00000000..6e52b542 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/rest-api/CMB2_REST_Controller_Fields.php @@ -0,0 +1,502 @@ + array( + 'description' => esc_html__( 'Includes the box object which the fields are registered to in the response.', 'cmb2' ), + ), + '_rendered' => array( + 'description' => esc_html__( 'When the \'_rendered\' argument is passed, the renderable field attributes will be returned fully rendered. By default, the names of the callback handers for the renderable attributes will be returned.', 'cmb2' ), + ), + 'object_id' => array( + 'description' => esc_html__( 'To view or modify the field\'s value, the \'object_id\' and \'object_type\' arguments are required.', 'cmb2' ), + ), + 'object_type' => array( + 'description' => esc_html__( 'To view or modify the field\'s value, the \'object_id\' and \'object_type\' arguments are required.', 'cmb2' ), + ), + ); + + // Returns specific box's fields. + register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)/fields/', array( + array( + 'methods' => WP_REST_Server::READABLE, + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'callback' => array( $this, 'get_items' ), + 'args' => $args, + ), + 'schema' => array( $this, 'get_item_schema' ), + ) ); + + $delete_args = $args; + $delete_args['object_id']['required'] = true; + $delete_args['object_type']['required'] = true; + + // Returns specific field data. + register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)/fields/(?P[\w-]+)', array( + array( + 'methods' => WP_REST_Server::READABLE, + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + 'callback' => array( $this, 'get_item' ), + 'args' => $args, + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'permission_callback' => array( $this, 'update_item_permissions_check' ), + 'callback' => array( $this, 'update_item' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + 'args' => $args, + ), + array( + 'methods' => WP_REST_Server::DELETABLE, + 'permission_callback' => array( $this, 'delete_item_permissions_check' ), + 'callback' => array( $this, 'delete_item' ), + 'args' => $delete_args, + ), + 'schema' => array( $this, 'get_item_schema' ), + ) ); + } + + /** + * Check if a given request has access to get fields. + * By default, no special permissions needed, but filtering return value. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|boolean + */ + public function get_items_permissions_check( $request ) { + $this->initiate_rest_read_box( $request, 'fields_read' ); + $can_access = true; + + /** + * By default, no special permissions needed. + * + * @since 2.2.3 + * + * @param bool $can_access Whether this CMB2 endpoint can be accessed. + * @param object $controller This CMB2_REST_Controller object. + */ + return $this->maybe_hook_callback_and_apply_filters( 'cmb2_api_get_fields_permissions_check', $can_access ); + } + + /** + * Get all public CMB2 box fields. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + if ( ! $this->rest_box ) { + $this->initiate_rest_read_box( $request, 'fields_read' ); + } + + if ( is_wp_error( $this->rest_box ) ) { + return $this->rest_box; + } + + $fields = array(); + foreach ( $this->rest_box->cmb->prop( 'fields', array() ) as $field ) { + + // Make sure this field can be read. + $this->field = $this->rest_box->field_can_read( $field['id'], true ); + + // And make sure current user can view this box. + if ( $this->field && $this->get_item_permissions_check_filter() ) { + $fields[ $field['id'] ] = $this->server->response_to_data( + $this->prepare_field_response(), + isset( $this->request['_embed'] ) + ); + } + } + + return $this->prepare_item( $fields ); + } + + /** + * Check if a given request has access to a field. + * By default, no special permissions needed, but filtering return value. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_item_permissions_check( $request ) { + $this->initiate_rest_read_box( $request, 'field_read' ); + if ( ! is_wp_error( $this->rest_box ) ) { + $this->field = $this->rest_box->field_can_read( $this->request->get_param( 'field_id' ), true ); + } + + return $this->get_item_permissions_check_filter(); + } + + /** + * Check by filter if a given request has access to a field. + * By default, no special permissions needed, but filtering return value. + * + * @since 2.2.3 + * + * @param bool $can_access Whether the current request has access to view the field by default. + * @return WP_Error|boolean + */ + public function get_item_permissions_check_filter( $can_access = true ) { + /** + * By default, no special permissions needed. + * + * @since 2.2.3 + * + * @param bool $can_access Whether this CMB2 endpoint can be accessed. + * @param object $controller This CMB2_REST_Controller object. + */ + return $this->maybe_hook_callback_and_apply_filters( 'cmb2_api_get_field_permissions_check', $can_access ); + } + + /** + * Get one CMB2 field from the collection. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|WP_REST_Response + */ + public function get_item( $request ) { + $this->initiate_rest_read_box( $request, 'field_read' ); + + if ( is_wp_error( $this->rest_box ) ) { + return $this->rest_box; + } + + return $this->prepare_read_field( $this->request->get_param( 'field_id' ) ); + } + + /** + * Check if a given request has access to update a field value. + * By default, requires 'edit_others_posts' capability, but filtering return value. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function update_item_permissions_check( $request ) { + $this->initiate_rest_read_box( $request, 'field_value_update' ); + if ( ! is_wp_error( $this->rest_box ) ) { + $this->field = $this->rest_box->field_can_edit( $this->request->get_param( 'field_id' ), true ); + } + + $can_update = current_user_can( 'edit_others_posts' ); + + /** + * By default, 'edit_others_posts' is required capability. + * + * @since 2.2.3 + * + * @param bool $can_update Whether this CMB2 endpoint can be accessed. + * @param object $controller This CMB2_REST_Controller object. + */ + return $this->maybe_hook_callback_and_apply_filters( 'cmb2_api_update_field_value_permissions_check', $can_update ); + } + + /** + * Update CMB2 field value. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|WP_REST_Response + */ + public function update_item( $request ) { + $this->initiate_rest_read_box( $request, 'field_value_update' ); + + if ( ! $this->request['value'] ) { + return new WP_Error( 'cmb2_rest_update_field_error', esc_html__( 'CMB2 Field value cannot be updated without the value parameter specified.', 'cmb2' ), array( + 'status' => 400, + ) ); + } + + return $this->modify_field_value( 'updated' ); + } + + /** + * Check if a given request has access to delete a field value. + * By default, requires 'delete_others_posts' capability, but filtering return value. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function delete_item_permissions_check( $request ) { + $this->initiate_rest_read_box( $request, 'field_value_delete' ); + if ( ! is_wp_error( $this->rest_box ) ) { + $this->field = $this->rest_box->field_can_edit( $this->request->get_param( 'field_id' ), true ); + } + + $can_delete = current_user_can( 'delete_others_posts' ); + + /** + * By default, 'delete_others_posts' is required capability. + * + * @since 2.2.3 + * + * @param bool $can_delete Whether this CMB2 endpoint can be accessed. + * @param object $controller This CMB2_REST_Controller object. + */ + return $this->maybe_hook_callback_and_apply_filters( 'cmb2_api_delete_field_value_permissions_check', $can_delete ); + } + + /** + * Delete CMB2 field value. + * + * @since 2.2.3 + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|WP_REST_Response + */ + public function delete_item( $request ) { + $this->initiate_rest_read_box( $request, 'field_value_delete' ); + + return $this->modify_field_value( 'deleted' ); + } + + /** + * Modify CMB2 field value. + * + * @since 2.2.3 + * + * @param string $activity The modification activity (updated or deleted). + * @return WP_Error|WP_REST_Response + */ + public function modify_field_value( $activity ) { + + if ( ! $this->request['object_id'] || ! $this->request['object_type'] ) { + return new WP_Error( 'cmb2_rest_modify_field_value_error', esc_html__( 'CMB2 Field value cannot be modified without the object_id and object_type parameters specified.', 'cmb2' ), array( + 'status' => 400, + ) ); + } + + if ( is_wp_error( $this->rest_box ) ) { + return $this->rest_box; + } + + $this->field = $this->rest_box->field_can_edit( + $this->field ? $this->field : $this->request->get_param( 'field_id' ), + true + ); + + if ( ! $this->field ) { + return new WP_Error( 'cmb2_rest_no_field_by_id_error', esc_html__( 'No field found by that id.', 'cmb2' ), array( + 'status' => 403, + ) ); + } + + $this->field->args[ "value_{$activity}" ] = (bool) 'deleted' === $activity + ? $this->field->remove_data() + : $this->field->save_field( $this->request['value'] ); + + // If options page, save the $activity options + if ( 'options-page' == $this->request['object_type'] ) { + $this->field->args[ "value_{$activity}" ] = cmb2_options( $this->request['object_id'] )->set(); + } + + return $this->prepare_read_field( $this->field ); + } + + /** + * Get a response object for a specific field ID. + * + * @since 2.2.3 + * + * @param string\CMB2_Field Field id or Field object. + * @return WP_Error|WP_REST_Response + */ + public function prepare_read_field( $field ) { + $this->field = $this->rest_box->field_can_read( $field, true ); + + if ( ! $this->field ) { + return new WP_Error( 'cmb2_rest_no_field_by_id_error', esc_html__( 'No field found by that id.', 'cmb2' ), array( + 'status' => 403, + ) ); + } + + return $this->prepare_item( $this->prepare_field_response() ); + } + + /** + * Get a specific field response. + * + * @since 2.2.3 + * + * @param CMB2_Field Field object. + * @return array Response array. + */ + public function prepare_field_response() { + $field_data = $this->prepare_field_data( $this->field ); + $response = rest_ensure_response( $field_data ); + + $response->add_links( $this->prepare_links( $this->field ) ); + + return $response; + } + + /** + * Prepare the field data array for JSON. + * + * @since 2.2.3 + * + * @param CMB2_Field $field field object. + * + * @return array Array of field data. + */ + protected function prepare_field_data( CMB2_Field $field ) { + $field_data = array(); + $params_to_ignore = array( 'show_in_rest', 'options' ); + $params_to_rename = array( + 'label_cb' => 'label', + 'options_cb' => 'options', + ); + + // Run this first so the js_dependencies arg is populated. + $rendered = ( $cb = $field->maybe_callback( 'render_row_cb' ) ) + // Ok, callback is good, let's run it. + ? $this->get_cb_results( $cb, $field->args(), $field ) + : false; + + $field_args = $field->args(); + + foreach ( $field_args as $key => $value ) { + if ( in_array( $key, $params_to_ignore, true ) ) { + continue; + } + + if ( 'options_cb' === $key ) { + $value = $field->options(); + } elseif ( in_array( $key, CMB2_Field::$callable_fields, true ) ) { + + if ( isset( $this->request['_rendered'] ) ) { + $value = $key === 'render_row_cb' ? $rendered : $field->get_param_callback_result( $key ); + } elseif ( is_array( $value ) ) { + // We need to rewrite callbacks as string as they will cause + // JSON recursion errors. + $class = is_string( $value[0] ) ? $value[0] : get_class( $value[0] ); + $value = $class . '::' . $value[1]; + } + } + + $key = isset( $params_to_rename[ $key ] ) ? $params_to_rename[ $key ] : $key; + + if ( empty( $value ) || is_scalar( $value ) || is_array( $value ) ) { + $field_data[ $key ] = $value; + } else { + $field_data[ $key ] = sprintf( esc_html__( 'Value Error for %s', 'cmb2' ), $key ); + } + } + + if ( $this->request['object_id'] && $this->request['object_type'] ) { + $field_data['value'] = $field->get_rest_value(); + } + + return $field_data; + } + + /** + * Return an array of contextual links for field/fields. + * + * @since 2.2.3 + * + * @param CMB2_Field $field Field object to build links from. + * + * @return array Array of links + */ + protected function prepare_links( $field ) { + $boxbase = $this->namespace_base . '/' . $this->rest_box->cmb->cmb_id; + $query_string = $this->get_query_string(); + + $links = array( + 'self' => array( + 'href' => rest_url( trailingslashit( $boxbase ) . 'fields/' . $field->_id() . $query_string ), + ), + 'collection' => array( + 'href' => rest_url( trailingslashit( $boxbase ) . 'fields' . $query_string ), + ), + 'up' => array( + 'embeddable' => true, + 'href' => rest_url( $boxbase . $query_string ), + ), + ); + + return $links; + } + + /** + * Checks if the CMB2 box or field has any registered callback parameters for the given filter. + * + * The registered handlers will have a property name which matches the filter, except: + * - The 'cmb2_api' prefix will be removed + * - A '_cb' suffix will be added (to stay inline with other '*_cb' parameters). + * + * @since 2.2.3 + * + * @param string $filter The filter name. + * @param bool $default_val The default filter value. + * + * @return bool The possibly-modified filter value (if the _cb param is a non-callable). + */ + public function maybe_hook_registered_callback( $filter, $default_val ) { + $default_val = parent::maybe_hook_registered_callback( $filter, $default_val ); + + if ( $this->field ) { + + // Hook field specific filter callbacks. + $val = $this->field->maybe_hook_parameter( $filter, $default_val ); + if ( null !== $val ) { + $default_val = $val; + } + } + + return $default_val; + } + + /** + * Unhooks any CMB2 box or field registered callback parameters for the given filter. + * + * @since 2.2.3 + * + * @param string $filter The filter name. + * + * @return void + */ + public function maybe_unhook_registered_callback( $filter ) { + parent::maybe_unhook_registered_callback( $filter ); + + if ( $this->field ) { + // Unhook field specific filter callbacks. + $this->field->maybe_hook_parameter( $filter, null, 'remove_filter' ); + } + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/shim/WP_REST_Controller.php b/inc/vendors/cmb2-plugins/cmb2/includes/shim/WP_REST_Controller.php new file mode 100755 index 00000000..e278235a --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/shim/WP_REST_Controller.php @@ -0,0 +1,541 @@ + 405, + ) ); + } + + /** + * Get a collection of items. + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + return new WP_Error( 'invalid-method', sprintf( esc_html__( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ), array( + 'status' => 405, + ) ); + } + + /** + * Check if a given request has access to get a specific item. + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|boolean + */ + public function get_item_permissions_check( $request ) { + return new WP_Error( 'invalid-method', sprintf( esc_html__( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ), array( + 'status' => 405, + ) ); + } + + /** + * Get one item from the collection. + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|WP_REST_Response + */ + public function get_item( $request ) { + return new WP_Error( 'invalid-method', sprintf( esc_html__( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ), array( + 'status' => 405, + ) ); + } + + /** + * Check if a given request has access to create items. + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|boolean + */ + public function create_item_permissions_check( $request ) { + return new WP_Error( 'invalid-method', sprintf( esc_html__( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ), array( + 'status' => 405, + ) ); + } + + /** + * Create one item from the collection. + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|WP_REST_Response + */ + public function create_item( $request ) { + return new WP_Error( 'invalid-method', sprintf( esc_html__( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ), array( + 'status' => 405, + ) ); + } + + /** + * Check if a given request has access to update a specific item. + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|boolean + */ + public function update_item_permissions_check( $request ) { + return new WP_Error( 'invalid-method', sprintf( esc_html__( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ), array( + 'status' => 405, + ) ); + } + + /** + * Update one item from the collection. + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|WP_REST_Response + */ + public function update_item( $request ) { + return new WP_Error( 'invalid-method', sprintf( esc_html__( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ), array( + 'status' => 405, + ) ); + } + + /** + * Check if a given request has access to delete a specific item. + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|boolean + */ + public function delete_item_permissions_check( $request ) { + return new WP_Error( 'invalid-method', sprintf( esc_html__( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ), array( + 'status' => 405, + ) ); + } + + /** + * Delete one item from the collection. + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|WP_REST_Response + */ + public function delete_item( $request ) { + return new WP_Error( 'invalid-method', sprintf( esc_html__( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ), array( + 'status' => 405, + ) ); + } + + /** + * Prepare the item for create or update operation. + * + * @param WP_REST_Request $request Request object. + * @return WP_Error|object $prepared_item + */ + protected function prepare_item_for_database( $request ) { + return new WP_Error( 'invalid-method', sprintf( esc_html__( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ), array( + 'status' => 405, + ) ); + } + + /** + * Prepare the item for the REST response. + * + * @param mixed $item WordPress representation of the item. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response + */ + public function prepare_item_for_response( $item, $request ) { + return new WP_Error( 'invalid-method', sprintf( esc_html__( "Method '%s' not implemented. Must be overridden in subclass." ), __METHOD__ ), array( + 'status' => 405, + ) ); + } + + /** + * Prepare a response for inserting into a collection. + * + * @param WP_REST_Response $response Response object. + * @return array Response data, ready for insertion into collection data. + */ + public function prepare_response_for_collection( $response ) { + if ( ! ( $response instanceof WP_REST_Response ) ) { + return $response; + } + + $data = (array) $response->get_data(); + $server = rest_get_server(); + + if ( method_exists( $server, 'get_compact_response_links' ) ) { + $links = call_user_func( array( $server, 'get_compact_response_links' ), $response ); + } else { + $links = call_user_func( array( $server, 'get_response_links' ), $response ); + } + + if ( ! empty( $links ) ) { + $data['_links'] = $links; + } + + return $data; + } + + /** + * Filter a response based on the context defined in the schema. + * + * @param array $data + * @param string $context + * @return array + */ + public function filter_response_by_context( $data, $context ) { + + $schema = $this->get_item_schema(); + foreach ( $data as $key => $value ) { + if ( empty( $schema['properties'][ $key ] ) || empty( $schema['properties'][ $key ]['context'] ) ) { + continue; + } + + if ( ! in_array( $context, $schema['properties'][ $key ]['context'] ) ) { + unset( $data[ $key ] ); + continue; + } + + if ( 'object' === $schema['properties'][ $key ]['type'] && ! empty( $schema['properties'][ $key ]['properties'] ) ) { + foreach ( $schema['properties'][ $key ]['properties'] as $attribute => $details ) { + if ( empty( $details['context'] ) ) { + continue; + } + if ( ! in_array( $context, $details['context'] ) ) { + if ( isset( $data[ $key ][ $attribute ] ) ) { + unset( $data[ $key ][ $attribute ] ); + } + } + } + } + } + + return $data; + } + + /** + * Get the item's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + return $this->add_additional_fields_schema( array() ); + } + + /** + * Get the item's schema for display / public consumption purposes. + * + * @return array + */ + public function get_public_item_schema() { + + $schema = $this->get_item_schema(); + + foreach ( $schema['properties'] as &$property ) { + if ( isset( $property['arg_options'] ) ) { + unset( $property['arg_options'] ); + } + } + + return $schema; + } + + /** + * Get the query params for collections. + * + * @return array + */ + public function get_collection_params() { + return array( + 'context' => $this->get_context_param(), + 'page' => array( + 'description' => esc_html__( 'Current page of the collection.' ), + 'type' => 'integer', + 'default' => 1, + 'sanitize_callback' => 'absint', + 'validate_callback' => 'rest_validate_request_arg', + 'minimum' => 1, + ), + 'per_page' => array( + 'description' => esc_html__( 'Maximum number of items to be returned in result set.' ), + 'type' => 'integer', + 'default' => 10, + 'minimum' => 1, + 'maximum' => 100, + 'sanitize_callback' => 'absint', + 'validate_callback' => 'rest_validate_request_arg', + ), + 'search' => array( + 'description' => esc_html__( 'Limit results to those matching a string.' ), + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + 'validate_callback' => 'rest_validate_request_arg', + ), + ); + } + + /** + * Get the magical context param. + * + * Ensures consistent description between endpoints, and populates enum from schema. + * + * @param array $args + * @return array + */ + public function get_context_param( $args = array() ) { + $param_details = array( + 'description' => esc_html__( 'Scope under which the request is made; determines fields present in response.' ), + 'type' => 'string', + 'sanitize_callback' => 'sanitize_key', + 'validate_callback' => 'rest_validate_request_arg', + ); + $schema = $this->get_item_schema(); + if ( empty( $schema['properties'] ) ) { + return array_merge( $param_details, $args ); + } + $contexts = array(); + foreach ( $schema['properties'] as $attributes ) { + if ( ! empty( $attributes['context'] ) ) { + $contexts = array_merge( $contexts, $attributes['context'] ); + } + } + if ( ! empty( $contexts ) ) { + $param_details['enum'] = array_unique( $contexts ); + rsort( $param_details['enum'] ); + } + return array_merge( $param_details, $args ); + } + + /** + * Add the values from additional fields to a data object. + * + * @param array $object + * @param WP_REST_Request $request + * @return array modified object with additional fields. + */ + protected function add_additional_fields_to_object( $object, $request ) { + + $additional_fields = $this->get_additional_fields(); + + foreach ( $additional_fields as $field_name => $field_options ) { + + if ( ! $field_options['get_callback'] ) { + continue; + } + + $object[ $field_name ] = call_user_func( $field_options['get_callback'], $object, $field_name, $request, $this->get_object_type() ); + } + + return $object; + } + + /** + * Update the values of additional fields added to a data object. + * + * @param array $object + * @param WP_REST_Request $request + */ + protected function update_additional_fields_for_object( $object, $request ) { + + $additional_fields = $this->get_additional_fields(); + + foreach ( $additional_fields as $field_name => $field_options ) { + + if ( ! $field_options['update_callback'] ) { + continue; + } + + // Don't run the update callbacks if the data wasn't passed in the request. + if ( ! isset( $request[ $field_name ] ) ) { + continue; + } + + call_user_func( $field_options['update_callback'], $request[ $field_name ], $object, $field_name, $request, $this->get_object_type() ); + } + } + + /** + * Add the schema from additional fields to an schema array. + * + * The type of object is inferred from the passed schema. + * + * @param array $schema Schema array. + */ + protected function add_additional_fields_schema( $schema ) { + if ( empty( $schema['title'] ) ) { + return $schema; + } + + /** + * Can't use $this->get_object_type otherwise we cause an inf loop. + */ + $object_type = $schema['title']; + + $additional_fields = $this->get_additional_fields( $object_type ); + + foreach ( $additional_fields as $field_name => $field_options ) { + if ( ! $field_options['schema'] ) { + continue; + } + + $schema['properties'][ $field_name ] = $field_options['schema']; + } + + return $schema; + } + + /** + * Get all the registered additional fields for a given object-type. + * + * @param string $object_type + * @return array + */ + protected function get_additional_fields( $object_type = null ) { + + if ( ! $object_type ) { + $object_type = $this->get_object_type(); + } + + if ( ! $object_type ) { + return array(); + } + + global $wp_rest_additional_fields; + + if ( ! $wp_rest_additional_fields || ! isset( $wp_rest_additional_fields[ $object_type ] ) ) { + return array(); + } + + return $wp_rest_additional_fields[ $object_type ]; + } + + /** + * Get the object type this controller is responsible for managing. + * + * @return string + */ + protected function get_object_type() { + $schema = $this->get_item_schema(); + + if ( ! $schema || ! isset( $schema['title'] ) ) { + return null; + } + + return $schema['title']; + } + + /** + * Get an array of endpoint arguments from the item schema for the controller. + * + * @param string $method HTTP method of the request. The arguments + * for `CREATABLE` requests are checked for required + * values and may fall-back to a given default, this + * is not done on `EDITABLE` requests. Default is + * WP_REST_Server::CREATABLE. + * @return array $endpoint_args + */ + public function get_endpoint_args_for_item_schema( $method = WP_REST_Server::CREATABLE ) { + + $schema = $this->get_item_schema(); + $schema_properties = ! empty( $schema['properties'] ) ? $schema['properties'] : array(); + $endpoint_args = array(); + + foreach ( $schema_properties as $field_id => $params ) { + + // Arguments specified as `readonly` are not allowed to be set. + if ( ! empty( $params['readonly'] ) ) { + continue; + } + + $endpoint_args[ $field_id ] = array( + 'validate_callback' => 'rest_validate_request_arg', + 'sanitize_callback' => 'rest_sanitize_request_arg', + ); + + if ( isset( $params['description'] ) ) { + $endpoint_args[ $field_id ]['description'] = $params['description']; + } + + if ( WP_REST_Server::CREATABLE === $method && isset( $params['default'] ) ) { + $endpoint_args[ $field_id ]['default'] = $params['default']; + } + + if ( WP_REST_Server::CREATABLE === $method && ! empty( $params['required'] ) ) { + $endpoint_args[ $field_id ]['required'] = true; + } + + foreach ( array( 'type', 'format', 'enum' ) as $schema_prop ) { + if ( isset( $params[ $schema_prop ] ) ) { + $endpoint_args[ $field_id ][ $schema_prop ] = $params[ $schema_prop ]; + } + } + + // Merge in any options provided by the schema property. + if ( isset( $params['arg_options'] ) ) { + + // Only use required / default from arg_options on CREATABLE endpoints. + if ( WP_REST_Server::CREATABLE !== $method ) { + $params['arg_options'] = array_diff_key( $params['arg_options'], array( + 'required' => '', + 'default' => '', + ) ); + } + + $endpoint_args[ $field_id ] = array_merge( $endpoint_args[ $field_id ], $params['arg_options'] ); + } + }// End foreach(). + + return $endpoint_args; + } + + /** + * Retrieves post data given a post ID or post object. + * + * This is a subset of the functionality of the `get_post()` function, with + * the additional functionality of having `the_post` action done on the + * resultant post object. This is done so that plugins may manipulate the + * post that is used in the REST API. + * + * @see get_post() + * @global WP_Query $wp_query + * + * @param int|WP_Post $post Post ID or post object. Defaults to global $post. + * @return WP_Post|null A `WP_Post` object when successful. + */ + public function get_post( $post ) { + $post_obj = get_post( $post ); + + /** + * Filter the post. + * + * Allows plugins to filter the post object as returned by `\WP_REST_Controller::get_post()`. + * + * @param WP_Post|null $post_obj The post object as returned by `get_post()`. + * @param int|WP_Post $post The original value used to obtain the post object. + */ + $post = apply_filters( 'rest_the_post', $post_obj, $post ); + + return $post; + } +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Base.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Base.php new file mode 100755 index 00000000..c79d51a8 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Base.php @@ -0,0 +1,177 @@ +types = $types; + $args['rendered'] = isset( $args['rendered'] ) ? (bool) $args['rendered'] : true; + $this->args = $args; + } + + /** + * Handles rendering this field type. + * + * @since 2.2.2 + * @return string Rendered field type. + */ + abstract public function render(); + + /** + * Stores the rendered field output. + * + * @since 2.2.2 + * @param string|CMB2_Type_Base $rendered Rendered output. + * @return string|CMB2_Type_Base Rendered output or this object. + */ + public function rendered( $rendered ) { + $this->field->register_js_data(); + + if ( $this->args['rendered'] ) { + return is_a( $rendered, __CLASS__ ) ? $rendered->rendered : $rendered; + } + + $this->rendered = is_a( $rendered, __CLASS__ ) ? $rendered->rendered : $rendered; + + return $this; + } + + /** + * Returns the stored rendered field output. + * + * @since 2.2.2 + * @return string Stored rendered output (if 'rendered' argument is set to false). + */ + public function get_rendered() { + return $this->rendered; + } + + /** + * Handles parsing and filtering attributes while preserving any passed in via field config. + * + * @since 1.1.0 + * @param string $element Element for filter + * @param array $type_defaults Type default arguments + * @param array $type_overrides Type override arguments + * @return array Parsed and filtered arguments + */ + public function parse_args( $element, $type_defaults, $type_overrides = array() ) { + $args = $this->parse_args_from_overrides( $type_overrides ); + + /** + * Filter attributes for a field type. + * The dynamic portion of the hook name, $element, refers to the field type. + * + * @since 1.1.0 + * @param array $args The array of attribute arguments. + * @param array $type_defaults The array of default values. + * @param array $field The `CMB2_Field` object. + * @param object $field_type_object This `CMB2_Types` object. + */ + $args = apply_filters( "cmb2_{$element}_attributes", $args, $type_defaults, $this->field, $this->types ); + + $args = wp_parse_args( $args, $type_defaults ); + + if ( ! empty( $args['js_dependencies'] ) ) { + $this->field->add_js_dependencies( $args['js_dependencies'] ); + } + + return $args; + } + + /** + * Handles parsing and filtering attributes while preserving any passed in via field config. + * + * @since 2.2.4 + * @param array $type_overrides Type override arguments + * @return array Parsed arguments + */ + protected function parse_args_from_overrides( $type_overrides = array() ) { + $type_overrides = empty( $type_overrides ) ? $this->args : $type_overrides; + + if ( true !== $this->field->args( 'disable_hash_data_attribute' ) ) { + $type_overrides['data-hash'] = $this->field->hash_id(); + } + + $field_overrides = $this->field->args( 'attributes' ); + + return ! empty( $field_overrides ) + ? wp_parse_args( $field_overrides, $type_overrides ) + : $type_overrides; + } + + /** + * Fall back to CMB2_Types methods + * + * @param string $method + * @param array $arguments + * @throws Exception Throws an exception if the field is invalid. + * @return mixed + */ + public function __call( $method, $arguments ) { + switch ( $method ) { + case '_id': + case '_name': + case '_desc': + case '_text': + case 'concat_attrs': + return call_user_func_array( array( $this->types, $method ), $arguments ); + default: + throw new Exception( sprintf( esc_html__( 'Invalid %1$s method: %2$s', 'cmb2' ), __CLASS__, $method ) ); + } + } + + /** + * Magic getter for our object. + * + * @param string $field + * @throws Exception Throws an exception if the field is invalid. + * @return mixed + */ + public function __get( $field ) { + switch ( $field ) { + case 'field': + return $this->types->field; + default: + throw new Exception( sprintf( esc_html__( 'Invalid %1$s property: %2$s', 'cmb2' ), __CLASS__, $field ) ); + } + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Checkbox.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Checkbox.php new file mode 100755 index 00000000..ccd4adec --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Checkbox.php @@ -0,0 +1,65 @@ +is_checked = $is_checked; + } + + public function render( $args = array() ) { + $defaults = array( + 'type' => 'checkbox', + 'class' => 'cmb2-option cmb2-list', + 'value' => 'on', + 'desc' => '', + ); + + $meta_value = $this->field->escaped_value(); + + $is_checked = null === $this->is_checked + ? ! empty( $meta_value ) + : $this->is_checked; + + if ( $is_checked ) { + $defaults['checked'] = 'checked'; + } + + $args = $this->parse_args( 'checkbox', $defaults ); + + return $this->rendered( + sprintf( + '%s ', + parent::render( $args ), + $this->_id(), + $this->_desc() + ) + ); + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Colorpicker.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Colorpicker.php new file mode 100755 index 00000000..28d00599 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Colorpicker.php @@ -0,0 +1,79 @@ +value = $value ? $value : $this->value; + } + + public function render( $args = array() ) { + $meta_value = $this->value ? $this->value : $this->field->escaped_value(); + + $hex_color = '(([a-fA-F0-9]){3}){1,2}$'; + if ( preg_match( '/^' . $hex_color . '/i', $meta_value ) ) { + // Value is just 123abc, so prepend # + $meta_value = '#' . $meta_value; + } elseif ( + // If value doesn't match #123abc... + ! preg_match( '/^#' . $hex_color . '/i', $meta_value ) + // And value doesn't match rgba()... + && 0 !== strpos( trim( $meta_value ), 'rgba' ) + ) { + // Then sanitize to just #. + $meta_value = '#'; + } + + wp_enqueue_style( 'wp-color-picker' ); + + $args = wp_parse_args( $args, array( + 'class' => 'cmb2-text-small', + ) ); + + $args['class'] .= ' cmb2-colorpicker'; + $args['value'] = $meta_value; + $args['js_dependencies'] = array( 'wp-color-picker' ); + + if ( $this->field->options( 'alpha' ) ) { + $args['js_dependencies'][] = 'wp-color-picker-alpha'; + $args['data-alpha'] = 'true'; + } + + $args = wp_parse_args( $this->args, $args ); + + return parent::render( $args ); + } + + public static function dequeue_rgba_colorpicker_script() { + if ( wp_script_is( 'jw-cmb2-rgba-picker-js', 'enqueued' ) ) { + wp_dequeue_script( 'jw-cmb2-rgba-picker-js' ); + CMB2_JS::register_colorpicker_alpha( true ); + } + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_File.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_File.php new file mode 100755 index 00000000..c17ff908 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_File.php @@ -0,0 +1,169 @@ +args : $args; + $field = $this->field; + $options = (array) $field->options(); + + $a = $this->args = $this->parse_args( 'file', array( + 'class' => 'cmb2-upload-file regular-text', + 'id' => $this->_id(), + 'name' => $this->_name(), + 'value' => $field->escaped_value(), + 'id_value' => null, + 'desc' => $this->_desc( true ), + 'size' => 45, + 'js_dependencies' => 'media-editor', + 'preview_size' => $field->args( 'preview_size' ), + 'query_args' => $field->args( 'query_args' ), + + // if options array and 'url' => false, then hide the url field + 'type' => array_key_exists( 'url', $options ) && false === $options['url'] + ? 'hidden' + : 'text', + ), $args ); + + // get an array of image size meta data, fallback to 'large' + $this->args['img_size_data'] = $img_size_data = parent::get_image_size_data( + $a['preview_size'], + 'large' + ); + + $output = ''; + + $output .= parent::render( array( + 'type' => $a['type'], + 'class' => $a['class'], + 'value' => $a['value'], + 'id' => $a['id'], + 'name' => $a['name'], + 'size' => $a['size'], + 'desc' => '', + 'data-previewsize' => sprintf( '[%d,%d]', $img_size_data['width'], $img_size_data['height'] ), + 'data-sizename' => $img_size_data['name'], + 'data-queryargs' => ! empty( $a['query_args'] ) ? json_encode( $a['query_args'] ) : '', + 'js_dependencies' => $a['js_dependencies'], + ) ); + + // Now remove the data-iterator attribute if it exists. + // (Possible if being used within a custom field) + // This is not elegant, but compensates for CMB2_Types::_id + // automagically & inelegantly adding the data-iterator attribute. + // Single responsibility principle? pffft + $parts = explode( '"', $this->args['id'] ); + $this->args['id'] = $parts[0]; + + $output .= sprintf( + '', + esc_attr( $this->_text( 'add_upload_file_text', esc_html__( 'Add or Upload File', 'cmb2' ) ) ) + ); + + $output .= $a['desc']; + $output .= $this->get_id_field_output(); + + $output .= '
              '; + if ( ! empty( $a['value'] ) ) { + $output .= $this->get_file_preview_output(); + } + $output .= '
              '; + + return $this->rendered( $output ); + } + + public function get_file_preview_output() { + if ( ! $this->is_valid_img_ext( $this->args['value'] ) ) { + + return $this->file_status_output( array( + 'value' => $this->args['value'], + 'tag' => 'div', + 'cached_id' => $this->args['id'], + ) ); + } + + if ( $this->args['id_value'] ) { + $image = wp_get_attachment_image( $this->args['id_value'], $this->args['preview_size'], null, array( + 'class' => 'cmb-file-field-image', + ) ); + } else { + $image = ''; + } + + return $this->img_status_output( array( + 'image' => $image, + 'tag' => 'div', + 'cached_id' => $this->args['id'], + ) ); + } + + public function get_id_field_output() { + $field = $this->field; + + /* + * A little bit of magic (tsk tsk) replacing the $this->types->field object, + * So that the render function is using the proper field object. + */ + $this->types->field = $this->get_id_field(); + + $output = parent::render( array( + 'type' => 'hidden', + 'class' => 'cmb2-upload-file-id', + 'value' => $this->types->field->value, + 'desc' => '', + ) ); + + // We need to put the original field object back + // or other fields in a custom field will be broken. + $this->types->field = $field; + + return $output; + } + + public function get_id_field() { + + // reset field args for attachment id + $args = array( + // if we're looking at a file in a group, we need to get the non-prefixed id + 'id' => ( $this->field->group ? $this->field->args( '_id' ) : $this->args['id'] ) . '_id', + 'disable_hash_data_attribute' => true, + ); + + // and get new field object + // (need to set it to the types field property) + $id_field = $this->field->get_field_clone( $args ); + + $id_value = absint( null !== $this->args['id_value'] ? $this->args['id_value'] : $id_field->escaped_value() ); + + // we don't want to output "0" as a value. + if ( ! $id_value ) { + $id_value = ''; + } + + // if there is no id saved yet, try to get it from the url + if ( $this->args['value'] && ! $id_value ) { + $id_value = CMB2_Utils::image_id_from_url( esc_url_raw( $this->args['value'] ) ); + } + + $id_field->value = $id_value; + + return $id_field; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_File_Base.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_File_Base.php new file mode 100755 index 00000000..5edbb21a --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_File_Base.php @@ -0,0 +1,210 @@ +field->id(); + + /** + * Filter for determining if a field value has a valid image file-type extension. + * + * The dynamic portion of the hook name, $field_id, refers to the field id attribute. + * + * @since 2.0.9 + * + * @param bool $is_valid Whether field value has a valid image file-type extension. + * @param string $file File url. + * @param string $file_ext File extension. + */ + return (bool) apply_filters( "cmb2_{$field_id}_is_valid_img_ext", $is_valid, $file, $file_ext ); + } + + /** + * file/file_list image wrap + * + * @since 2.0.2 + * @param array $args Array of arguments for output + * @return string Image wrap output + */ + public function img_status_output( $args ) { + return sprintf( '<%1$s class="img-status cmb2-media-item">%2$s

              %4$s

              %5$s', + $args['tag'], + $args['image'], + isset( $args['cached_id'] ) ? ' rel="' . $args['cached_id'] . '"' : '', + esc_html( $this->_text( 'remove_image_text', esc_html__( 'Remove Image', 'cmb2' ) ) ), + isset( $args['id_input'] ) ? $args['id_input'] : '' + ); + } + + /** + * file/file_list file wrap + * + * @since 2.0.2 + * @param array $args Array of arguments for output + * @return string File wrap output + */ + public function file_status_output( $args ) { + return sprintf( '<%1$s class="file-status cmb2-media-item">%2$s %3$s   (%5$s / %7$s)%8$s', + $args['tag'], + esc_html( $this->_text( 'file_text', esc_html__( 'File:', 'cmb2' ) ) ), + CMB2_Utils::get_file_name_from_path( $args['value'] ), + $args['value'], + esc_html( $this->_text( 'file_download_text', esc_html__( 'Download', 'cmb2' ) ) ), + isset( $args['cached_id'] ) ? ' rel="' . $args['cached_id'] . '"' : '', + esc_html( $this->_text( 'remove_text', esc_html__( 'Remove', 'cmb2' ) ) ), + isset( $args['id_input'] ) ? $args['id_input'] : '' + ); + } + + /** + * Outputs the file/file_list underscore Javascript templates in the footer. + * + * @since 2.2.4 + * @return void + */ + public static function output_js_underscore_templates() { + ?> + + + + + (int) image size width + * 'height' => (int) image size height + * 'name' => (string) e.g. 'thumbnail' + * ) + */ + static function get_image_size_data( $img_size = '', $fallback = 'thumbnail' ) { + $data = array(); + + if ( is_array( $img_size ) ) { + $data['width'] = intval( $img_size[0] ); + $data['height'] = intval( $img_size[1] ); + $data['name'] = ''; + + // Try and get the closest named size from our array of dimensions + if ( $named_size = CMB2_Utils::get_named_size( $img_size ) ) { + $data['name'] = $named_size; + } + } else { + + $image_sizes = CMB2_Utils::get_available_image_sizes(); + + // The 'thumb' alias, which works elsewhere, doesn't work in the wp.media uploader + if ( 'thumb' == $img_size ) { + $img_size = 'thumbnail'; + } + + // Named size doesn't exist, use $fallback + if ( ! array_key_exists( $img_size, $image_sizes ) ) { + $img_size = $fallback; + } + + // Get image dimensions from named sizes + $data['width'] = intval( $image_sizes[ $img_size ]['width'] ); + $data['height'] = intval( $image_sizes[ $img_size ]['height'] ); + $data['name'] = $img_size; + } + + return $data; + } + + /** + * Filters attachment data prepared for JavaScript. + * + * Adds the url, width, height, and orientation for custom sizes to the JavaScript + * object returned by the wp.media uploader. Hooked to 'wp_prepare_attachment_for_js'. + * + * @since 2.2.4 + * @param array $response Array of prepared attachment data + * @param int|object $attachment Attachment ID or object + * @param array $meta Array of attachment meta data ( from wp_get_attachment_metadata() ) + * @return array filtered $response array + */ + public static function prepare_image_sizes_for_js( $response, $attachment, $meta ) { + foreach ( CMB2_Utils::get_available_image_sizes() as $size => $info ) { + + // registered image size exists for this attachment + if ( isset( $meta['sizes'][ $size ] ) ) { + + $attachment_url = wp_get_attachment_url( $attachment->ID ); + $base_url = str_replace( wp_basename( $attachment_url ), '', $attachment_url ); + $size_meta = $meta['sizes'][ $size ]; + + $response['sizes'][ $size ] = array( + 'url' => $base_url . $size_meta['file'], + 'height' => $size_meta['height'], + 'width' => $size_meta['width'], + 'orientation' => $size_meta['height'] > $size_meta['width'] ? 'portrait' : 'landscape', + ); + } + } + + return $response; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_File_List.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_File_List.php new file mode 100755 index 00000000..4a6b3ef5 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_File_List.php @@ -0,0 +1,86 @@ +field; + $meta_value = $field->escaped_value(); + $name = $this->_name(); + $img_size = $field->args( 'preview_size' ); + $query_args = $field->args( 'query_args' ); + $output = ''; + + // get an array of image size meta data, fallback to 'thumbnail' + $img_size_data = parent::get_image_size_data( $img_size, 'thumbnail' ); + + $output .= parent::render( array( + 'type' => 'hidden', + 'class' => 'cmb2-upload-file cmb2-upload-list', + 'size' => 45, + 'desc' => '', + 'value' => '', + 'data-previewsize' => sprintf( '[%d,%d]', $img_size_data['width'], $img_size_data['height'] ), + 'data-sizename' => $img_size_data['name'], + 'data-queryargs' => ! empty( $query_args ) ? json_encode( $query_args ) : '', + 'js_dependencies' => 'media-editor', + ) ); + + $output .= parent::render( array( + 'type' => 'button', + 'class' => 'cmb2-upload-button button-secondary cmb2-upload-list', + 'value' => esc_attr( $this->_text( 'add_upload_files_text', esc_html__( 'Add or Upload Files', 'cmb2' ) ) ), + 'name' => '', + 'id' => '', + ) ); + + $output .= '
                '; + + if ( $meta_value && is_array( $meta_value ) ) { + + foreach ( $meta_value as $id => $fullurl ) { + $id_input = parent::render( array( + 'type' => 'hidden', + 'value' => $fullurl, + 'name' => $name . '[' . $id . ']', + 'id' => 'filelist-' . $id, + 'data-id' => $id, + 'desc' => '', + 'class' => false, + ) ); + + if ( $this->is_valid_img_ext( $fullurl ) ) { + + $output .= $this->img_status_output( array( + 'image' => wp_get_attachment_image( $id, $img_size ), + 'tag' => 'li', + 'id_input' => $id_input, + ) ); + + } else { + + $output .= $this->file_status_output( array( + 'value' => $fullurl, + 'tag' => 'li', + 'id_input' => $id_input, + ) ); + + } + } + } + + $output .= '
              '; + + return $this->rendered( $output ); + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Multi_Base.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Multi_Base.php new file mode 100755 index 00000000..652c92c4 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Multi_Base.php @@ -0,0 +1,110 @@ +%s', $args['value'], selected( isset( $args['checked'] ) && $args['checked'], true, false ), $args['label'] ) . "\n"; + } + + /** + * Generates html for list item with input + * + * @since 1.1.0 + * @param array $args Override arguments + * @param int $i Iterator value + * @return string Gnerated list item html + */ + public function list_input( $args = array(), $i ) { + $a = $this->parse_args( 'list_input', array( + 'type' => 'radio', + 'class' => 'cmb2-option', + 'name' => $this->_name(), + 'id' => $this->_id( $i ), + 'value' => $this->field->escaped_value(), + 'label' => '', + ), $args ); + + return sprintf( "\t" . '
            • ' . "\n", $this->concat_attrs( $a, array( 'label' ) ), $a['id'], $a['label'] ); + } + + /** + * Generates html for list item with checkbox input + * + * @since 1.1.0 + * @param array $args Override arguments + * @param int $i Iterator value + * @return string Gnerated list item html + */ + public function list_input_checkbox( $args, $i ) { + $saved_value = $this->field->escaped_value(); + if ( is_array( $saved_value ) && in_array( $args['value'], $saved_value ) ) { + $args['checked'] = 'checked'; + } + $args['type'] = 'checkbox'; + return $this->list_input( $args, $i ); + } + + /** + * Generates html for concatenated items + * + * @since 1.1.0 + * @param array $args Optional arguments + * @return string Concatenated html items + */ + public function concat_items( $args = array() ) { + $field = $this->field; + + $method = isset( $args['method'] ) ? $args['method'] : 'select_option'; + unset( $args['method'] ); + + $value = null !== $field->escaped_value() + ? $field->escaped_value() + : $field->get_default(); + + $value = CMB2_Utils::normalize_if_numeric( $value ); + + $concatenated_items = ''; + $i = 1; + + $options = array(); + if ( $option_none = $field->args( 'show_option_none' ) ) { + $options[''] = $option_none; + } + $options = $options + (array) $field->options(); + foreach ( $options as $opt_value => $opt_label ) { + + // Clone args & modify for just this item + $a = $args; + + $a['value'] = $opt_value; + $a['label'] = $opt_label; + + // Check if this option is the value of the input + if ( $value === CMB2_Utils::normalize_if_numeric( $opt_value ) ) { + $a['checked'] = 'checked'; + } + + $concatenated_items .= $this->$method( $a, $i++ ); + } + + return $concatenated_items; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Multicheck.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Multicheck.php new file mode 100755 index 00000000..a9c078be --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Multicheck.php @@ -0,0 +1,39 @@ +field->args( 'select_all_button' ) + ? 'cmb2-checkbox-list no-select-all cmb2-list' + : 'cmb2-checkbox-list cmb2-list'; + + $args = $this->parse_args( $this->type, array( + 'class' => $classes, + 'options' => $this->concat_items( array( + 'name' => $this->_name() . '[]', + 'method' => 'list_input_checkbox', + ) ), + 'desc' => $this->_desc( true ), + ) ); + + return $this->rendered( $this->ul( $args ) ); + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Oembed.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Oembed.php new file mode 100755 index 00000000..9d10fa13 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Oembed.php @@ -0,0 +1,41 @@ +field; + + $meta_value = trim( $field->escaped_value() ); + + $oembed = ! empty( $meta_value ) + ? cmb2_ajax()->get_oembed( array( + 'url' => $field->escaped_value(), + 'object_id' => $field->object_id, + 'object_type' => $field->object_type, + 'oembed_args' => array( + 'width' => '640', + ), + 'field_id' => $this->_id(), + ) ) + : ''; + + return parent::render( array( + 'class' => 'cmb2-oembed regular-text', + 'data-objectid' => $field->object_id, + 'data-objecttype' => $field->object_type, + ) ) + . '

              ' + . '
              ' . $oembed . '
              '; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Picker_Base.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Picker_Base.php new file mode 100755 index 00000000..581ecb85 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Picker_Base.php @@ -0,0 +1,56 @@ +field->args['attributes']) + * @return array Array of field attributes + */ + public function parse_picker_options( $arg = 'date', $args = array() ) { + $att = 'data-' . $arg . 'picker'; + $update = empty( $args ); + $atts = array(); + $format = $this->field->args( $arg . '_format' ); + + if ( $js_format = CMB2_Utils::php_to_js_dateformat( $format ) ) { + + if ( $update ) { + $atts = $this->field->args( 'attributes' ); + } else { + $atts = isset( $args['attributes'] ) + ? $args['attributes'] + : $atts; + } + + // Don't override user-provided datepicker values + $data = isset( $atts[ $att ] ) + ? json_decode( $atts[ $att ], true ) + : array(); + + $data[ $arg . 'Format' ] = $js_format; + $atts[ $att ] = function_exists( 'wp_json_encode' ) + ? wp_json_encode( $data ) + : json_encode( $data ); + } + + if ( $update ) { + $this->field->args['attributes'] = $atts; + } + + return array_merge( $args, $atts ); + } +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Radio.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Radio.php new file mode 100755 index 00000000..d91bcc39 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Radio.php @@ -0,0 +1,52 @@ +type = $type ? $type : $this->type; + } + + public function render() { + $args = $this->parse_args( $this->type, array( + 'class' => 'cmb2-radio-list cmb2-list', + 'options' => $this->concat_items( array( + 'label' => 'test', + 'method' => 'list_input', + ) ), + 'desc' => $this->_desc( true ), + ) ); + + return $this->rendered( $this->ul( $args ) ); + } + + protected function ul( $a ) { + return sprintf( '
                %s
              %s', $a['class'], $a['options'], $a['desc'] ); + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Select.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Select.php new file mode 100755 index 00000000..655cf11b --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Select.php @@ -0,0 +1,30 @@ +parse_args( 'select', array( + 'class' => 'cmb2_select', + 'name' => $this->_name(), + 'id' => $this->_id(), + 'desc' => $this->_desc( true ), + 'options' => $this->concat_items(), + ) ); + + $attrs = $this->concat_attrs( $a, array( 'desc', 'options' ) ); + + return $this->rendered( + sprintf( '%s%s', $attrs, $a['options'], $a['desc'] ) + ); + } +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Select_Timezone.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Select_Timezone.php new file mode 100755 index 00000000..5a333a38 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Select_Timezone.php @@ -0,0 +1,29 @@ +field->args['default'] = $this->field->get_default() + ? $this->field->get_default() + : CMB2_Utils::timezone_string(); + + $this->args = wp_parse_args( $this->args, array( + 'class' => 'cmb2_select cmb2-select-timezone', + 'options' => wp_timezone_choice( $this->field->escaped_value() ), + 'desc' => $this->_desc(), + ) ); + + return parent::render(); + } +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Base.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Base.php new file mode 100755 index 00000000..fa09bd40 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Base.php @@ -0,0 +1,173 @@ +field->object_type ) { + case 'options-page': + case 'term': + return $this->options_terms(); + case 'post': + // WP caches internally so it's better to use + return get_the_terms( $this->field->object_id, $this->field->args( 'taxonomy' ) ); + + default: + return $this->non_post_object_terms(); + } + } + + /** + * Gets the term objects for the terms stored via options boxes. + * + * @since 2.2.4 + * @return mixed Array of terms on success + */ + public function options_terms() { + if ( empty( $this->field->value ) ) { + return array(); + } + + $terms = (array) $this->field->value; + + foreach ( $terms as $index => $term ) { + $terms[ $index ] = get_term_by( 'slug', $term, $this->field->args( 'taxonomy' ) ); + } + + return $terms; + } + + /** + * For non-post objects, wraps the call to wp_get_object_terms with transient caching. + * + * @since 2.2.4 + * @return mixed Array of terms on success + */ + public function non_post_object_terms() { + $object_id = $this->field->object_id; + $taxonomy = $this->field->args( 'taxonomy' ); + + $cache_key = "cmb-cache-{$taxonomy}-{$object_id}"; + + // Check cache + $cached = get_transient( $cache_key ); + + if ( ! $cached ) { + $cached = wp_get_object_terms( $object_id, $taxonomy ); + // Do our own (minimal) caching. Long enough for a page-load. + set_transient( $cache_key, $cached, 60 ); + } + + return $cached; + } + + /** + * Wrapper for `get_terms` to account for changes in WP 4.6 where taxonomy is expected + * as part of the arguments. + * + * @since 2.2.2 + * @return mixed Array of terms on success + */ + public function get_terms() { + $args = array( + 'taxonomy' => $this->field->args( 'taxonomy' ), + 'hide_empty' => false, + ); + + if ( null !== $this->parent ) { + $args['parent'] = $this->parent; + } + + $args = wp_parse_args( $this->field->prop( 'query_args', array() ), $args ); + + return CMB2_Utils::wp_at_least( '4.5.0' ) + ? get_terms( $args ) + : get_terms( $this->field->args( 'taxonomy' ), http_build_query( $args ) ); + } + + protected function no_terms_result( $error, $tag = 'li' ) { + if ( is_wp_error( $error ) ) { + $message = $error->get_error_message(); + $data = 'data-error="' . esc_attr( $error->get_error_code() ) . '"'; + } else { + $message = $this->_text( 'no_terms_text', esc_html__( 'No terms', 'cmb2' ) ); + $data = ''; + } + + $this->field->args['select_all_button'] = false; + + return sprintf( '<%3$s>', $data, esc_html( $message ), $tag ); + } + + public function get_object_term_or_default() { + $saved_terms = $this->get_object_terms(); + + return is_wp_error( $saved_terms ) || empty( $saved_terms ) + ? $this->field->get_default() + : array_shift( $saved_terms )->slug; + } + + /** + * Takes a list of all tax terms and outputs. + * + * @since 2.2.5 + * + * @param array $all_terms Array of all terms. + * @param array|string $saved Array of terms set to the object, or single term slug. + * + * @return string List of terms. + */ + protected function loop_terms( $all_terms, $saved_terms ) { + return ''; + } + + /** + * Build children hierarchy. + * + * @param object $parent_term The parent term object. + * @param array|string $saved Array of terms set to the object, or single term slug. + * + * @return string List of terms. + */ + protected function build_children( $parent_term, $saved ) { + if ( empty( $parent_term->term_id ) ) { + return ''; + } + + $this->parent = $parent_term->term_id; + + $terms = $this->get_terms(); + $options = ''; + + if ( ! empty( $terms ) && is_array( $terms ) ) { + $options = '
              • '; + $options .= $this->loop_terms( $terms, $saved ); + $options .= '
            • '; + } + + return $options; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Multicheck.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Multicheck.php new file mode 100755 index 00000000..ce5a3ef5 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Multicheck.php @@ -0,0 +1,76 @@ +rendered( + $this->types->radio( array( + 'class' => $this->get_wrapper_classes(), + 'options' => $this->get_term_options(), + ), 'taxonomy_multicheck' ) + ); + } + + protected function get_term_options() { + $all_terms = $this->get_terms(); + + if ( ! $all_terms || is_wp_error( $all_terms ) ) { + return $this->no_terms_result( $all_terms ); + } + + return $this->loop_terms( $all_terms, $this->get_object_term_or_default() ); + } + + protected function loop_terms( $all_terms, $saved_terms ) { + $options = ''; + foreach ( $all_terms as $term ) { + $options .= $this->list_term_input( $term, $saved_terms ); + } + + return $options; + } + + protected function list_term_input( $term, $saved_terms ) { + $args = array( + 'value' => $term->slug, + 'label' => $term->name, + 'type' => 'checkbox', + 'name' => $this->_name() . '[]', + ); + + if ( is_array( $saved_terms ) && in_array( $term->slug, $saved_terms ) ) { + $args['checked'] = 'checked'; + } + + return $this->list_input( $args, ++$this->counter ); + } + + public function get_object_term_or_default() { + $saved_terms = $this->get_object_terms(); + + return is_wp_error( $saved_terms ) || empty( $saved_terms ) + ? $this->field->get_default() + : wp_list_pluck( $saved_terms, 'slug' ); + } + + protected function get_wrapper_classes() { + $classes = 'cmb2-checkbox-list cmb2-list'; + if ( false === $this->field->args( 'select_all_button' ) ) { + $classes .= ' no-select-all'; + } + + return $classes; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Multicheck_Hierarchical.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Multicheck_Hierarchical.php new file mode 100755 index 00000000..9fdadeaa --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Multicheck_Hierarchical.php @@ -0,0 +1,42 @@ +rendered( + $this->types->radio( array( + 'class' => $this->get_wrapper_classes(), + 'options' => $this->get_term_options(), + ), 'taxonomy_multicheck_hierarchical' ) + ); + } + + protected function list_term_input( $term, $saved_terms ) { + $options = parent::list_term_input( $term, $saved_terms ); + $children = $this->build_children( $term, $saved_terms ); + + if ( ! empty( $children ) ) { + $options .= $children; + } + + return $options; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Radio.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Radio.php new file mode 100755 index 00000000..410519ab --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Radio.php @@ -0,0 +1,92 @@ +rendered( + $this->types->radio( array( + 'options' => $this->get_term_options(), + ), 'taxonomy_radio' ) + ); + } + + protected function get_term_options() { + $all_terms = $this->get_terms(); + + if ( ! $all_terms || is_wp_error( $all_terms ) ) { + return $this->no_terms_result( $all_terms ); + } + + $saved_term = $this->get_object_term_or_default(); + $option_none = $this->field->args( 'show_option_none' ); + $options = ''; + + if ( ! empty( $option_none ) ) { + + $field_id = $this->_id(); + + /** + * Default (option-none) taxonomy-radio value. + * + * @since 1.3.0 + * + * @param string $option_none_value Default (option-none) taxonomy-radio value. + */ + $option_none_value = apply_filters( 'cmb2_taxonomy_radio_default_value', '' ); + + /** + * Default (option-none) taxonomy-radio value. + * + * The dynamic portion of the hook name, $field_id, refers to the field id attribute. + * + * @since 1.3.0 + * + * @param string $option_none_value Default (option-none) taxonomy-radio value. + */ + $option_none_value = apply_filters( "cmb2_taxonomy_radio_{$field_id}_default_value", $option_none_value ); + + $options .= $this->list_term_input( (object) array( + 'slug' => $option_none_value, + 'name' => $option_none, + ), $saved_term ); + } + + $options .= $this->loop_terms( $all_terms, $saved_term ); + + return $options; + } + + protected function loop_terms( $all_terms, $saved_term ) { + $options = ''; + foreach ( $all_terms as $term ) { + $options .= $this->list_term_input( $term, $saved_term ); + } + + return $options; + } + + protected function list_term_input( $term, $saved_term ) { + $args = array( + 'value' => $term->slug, + 'label' => $term->name, + ); + + if ( $saved_term == $term->slug ) { + $args['checked'] = 'checked'; + } + + return $this->list_input( $args, ++$this->counter ); + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Radio_Hierarchical.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Radio_Hierarchical.php new file mode 100755 index 00000000..90a1d82c --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Radio_Hierarchical.php @@ -0,0 +1,41 @@ +rendered( + $this->types->radio( array( + 'options' => $this->get_term_options(), + ), 'taxonomy_radio_hierarchical' ) + ); + } + + protected function list_term_input( $term, $saved_term ) { + $options = parent::list_term_input( $term, $saved_term ); + $children = $this->build_children( $term, $saved_term ); + + if ( ! empty( $children ) ) { + $options .= $children; + } + + return $options; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Select.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Select.php new file mode 100755 index 00000000..76921470 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Taxonomy_Select.php @@ -0,0 +1,79 @@ +get_terms(); + + if ( ! $all_terms || is_wp_error( $all_terms ) ) { + return $this->no_terms_result( $all_terms, 'strong' ); + } + + $saved_term = $this->get_object_term_or_default(); + $option_none = $this->field->args( 'show_option_none' ); + $options = ''; + + if ( ! empty( $option_none ) ) { + + $field_id = $this->_id(); + + /** + * Default (option-none) taxonomy-select value. + * + * @since 1.3.0 + * + * @param string $option_none_value Default (option-none) taxonomy-select value. + */ + $option_none_value = apply_filters( 'cmb2_taxonomy_select_default_value', '' ); + + /** + * Default (option-none) taxonomy-select value. + * + * The dynamic portion of the hook name, $field_id, refers to the field id attribute. + * + * @since 1.3.0 + * + * @param string $option_none_value Default (option-none) taxonomy-select value. + */ + $option_none_value = apply_filters( "cmb2_taxonomy_select_{$field_id}_default_value", $option_none_value ); + + $options .= $this->select_option( array( + 'label' => $option_none, + 'value' => $option_none_value, + 'checked' => $saved_term == $option_none_value, + ) ); + } + + $options .= $this->loop_terms( $all_terms, $saved_term ); + + return $this->rendered( + $this->types->select( array( + 'options' => $options, + ) ) + ); + } + + protected function loop_terms( $all_terms, $saved_term ) { + $options = ''; + + foreach ( $all_terms as $term ) { + $options .= $this->select_option( array( + 'label' => $term->name, + 'value' => $term->slug, + 'checked' => $saved_term === $term->slug, + ) ); + } + + return $options; + } +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text.php new file mode 100755 index 00000000..5416b9e7 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text.php @@ -0,0 +1,58 @@ +type = $type ? $type : $this->type; + } + + /** + * Handles outputting an 'input' element + * + * @since 1.1.0 + * @param array $args Override arguments + * @return string Form input element + */ + public function render( $args = array() ) { + $args = empty( $args ) ? $this->args : $args; + $a = $this->parse_args( $this->type, array( + 'type' => 'text', + 'class' => 'regular-text', + 'name' => $this->_name(), + 'id' => $this->_id(), + 'value' => $this->field->escaped_value(), + 'desc' => $this->_desc( true ), + 'js_dependencies' => array(), + ), $args ); + + return $this->rendered( + sprintf( '%s', $this->concat_attrs( $a, array( 'desc' ) ), $a['desc'] ) + ); + } +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Date.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Date.php new file mode 100755 index 00000000..225c643f --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Date.php @@ -0,0 +1,30 @@ +parse_args( 'text_date', array( + 'class' => 'cmb2-text-small cmb2-datepicker', + 'value' => $this->field->get_timestamp_format(), + 'desc' => $this->_desc(), + 'js_dependencies' => array( 'jquery-ui-core', 'jquery-ui-datepicker' ), + ) ); + + if ( false === strpos( $args['class'], 'timepicker' ) ) { + $this->parse_picker_options( 'date' ); + } + + return parent::render( $args ); + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Datetime_Timestamp.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Datetime_Timestamp.php new file mode 100755 index 00000000..3608e090 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Datetime_Timestamp.php @@ -0,0 +1,73 @@ +field; + + $args = wp_parse_args( $this->args, array( + 'value' => $field->escaped_value(), + 'desc' => $this->_desc(), + 'datepicker' => array(), + 'timepicker' => array(), + ) ); + + if ( empty( $args['value'] ) ) { + $args['value'] = $field->escaped_value(); + // This will be used if there is a select_timezone set for this field + $tz_offset = $field->field_timezone_offset(); + if ( ! empty( $tz_offset ) ) { + $args['value'] -= $tz_offset; + } + } + + $has_good_value = ! empty( $args['value'] ) && ! is_array( $args['value'] ); + + $date_input = parent::render( $this->date_args( $args, $has_good_value ) ); + $time_input = parent::render( $this->time_args( $args, $has_good_value ) ); + + return $this->rendered( $date_input . "\n" . $time_input ); + } + + public function date_args( $args, $has_good_value ) { + $date_args = wp_parse_args( $args['datepicker'], array( + 'class' => 'cmb2-text-small cmb2-datepicker', + 'name' => $this->_name( '[date]' ), + 'id' => $this->_id( '_date' ), + 'value' => $has_good_value ? $this->field->get_timestamp_format( 'date_format', $args['value'] ) : '', + 'desc' => '', + ) ); + + $date_args['rendered'] = true; + + // Let's get the date-format, and set it up as a data attr for the field. + return $this->parse_picker_options( 'date', $date_args ); + } + + public function time_args( $args, $has_good_value ) { + $time_args = wp_parse_args( $args['timepicker'], array( + 'class' => 'cmb2-timepicker text-time', + 'name' => $this->_name( '[time]' ), + 'id' => $this->_id( '_time' ), + 'value' => $has_good_value ? $this->field->get_timestamp_format( 'time_format', $args['value'] ) : '', + 'desc' => $args['desc'], + 'js_dependencies' => array( 'jquery-ui-core', 'jquery-ui-datepicker', 'jquery-ui-datetimepicker' ), + ) ); + + $time_args['rendered'] = true; + + // Let's get the time-format, and set it up as a data attr for the field. + return $this->parse_picker_options( 'time', $time_args ); + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Datetime_Timestamp_Timezone.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Datetime_Timestamp_Timezone.php new file mode 100755 index 00000000..d0942932 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Datetime_Timestamp_Timezone.php @@ -0,0 +1,61 @@ +field; + + $args = wp_parse_args( $this->args, array( + 'value' => $field->escaped_value(), + 'desc' => $this->_desc( true ), + 'text_datetime_timestamp' => array(), + 'select_timezone' => array(), + ) ); + + $args['value'] = $field->escaped_value(); + if ( is_array( $args['value'] ) ) { + $args['value'] = ''; + } + + $datetime = maybe_unserialize( $args['value'] ); + $value = $tzstring = ''; + + if ( $datetime && $datetime instanceof DateTime ) { + $tz = $datetime->getTimezone(); + $tzstring = $tz->getName(); + $value = $datetime->getTimestamp(); + } + + $timestamp_args = wp_parse_args( $args['text_datetime_timestamp'], array( + 'desc' => '', + 'value' => $value, + 'rendered' => true, + ) ); + $datetime_timestamp = $this->types->text_datetime_timestamp( $timestamp_args ); + + $timezone_select_args = wp_parse_args( $args['select_timezone'], array( + 'class' => 'cmb2_select cmb2-select-timezone', + 'name' => $this->_name( '[timezone]' ), + 'id' => $this->_id( '_timezone' ), + 'options' => wp_timezone_choice( $tzstring ), + 'desc' => $args['desc'], + 'rendered' => true, + ) ); + $select = $this->types->select( $timezone_select_args ); + + return $this->rendered( + $datetime_timestamp . "\n" . $select + ); + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Time.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Time.php new file mode 100755 index 00000000..8ce6b1fa --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Text_Time.php @@ -0,0 +1,25 @@ +args = $this->parse_picker_options( 'time', wp_parse_args( $this->args, array( + 'class' => 'cmb2-timepicker text-time', + 'value' => $this->field->get_timestamp_format( 'time_format' ), + 'js_dependencies' => array( 'jquery-ui-core', 'jquery-ui-datepicker', 'jquery-ui-datetimepicker' ), + ) ) ); + + return parent::render(); + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Textarea.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Textarea.php new file mode 100755 index 00000000..227a5322 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Textarea.php @@ -0,0 +1,38 @@ +args : $args; + $a = $this->parse_args( 'textarea', array( + 'class' => 'cmb2_textarea', + 'name' => $this->_name(), + 'id' => $this->_id(), + 'cols' => 60, + 'rows' => 10, + 'value' => $this->field->escaped_value( 'esc_textarea' ), + 'desc' => $this->_desc( true ), + ), $args ); + + return $this->rendered( + sprintf( '%s%s', $this->concat_attrs( $a, array( 'desc', 'value' ) ), $a['value'], $a['desc'] ) + ); + } +} diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Textarea_Code.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Textarea_Code.php new file mode 100755 index 00000000..ee36c01c --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Textarea_Code.php @@ -0,0 +1,39 @@ + 'cmb2-textarea-code', + 'desc' => '
              ' . $this->_desc( true ), + ) ); + + if ( true !== $this->field->options( 'disable_codemirror' ) + && function_exists( 'wp_enqueue_code_editor' ) ) { + $args['js_dependencies'] = array( 'code-editor' ); + } else { + $args['class'] = rtrim( $args['class'] ) . ' disable-codemirror'; + } + + return $this->rendered( + sprintf( '
              %s', parent::render( $args ) )
              +		);
              +	}
              +}
              diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Title.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Title.php
              new file mode 100755
              index 00000000..a90fdb52
              --- /dev/null
              +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Title.php
              @@ -0,0 +1,47 @@
              +field->args( 'name' );
              +		$tag  = 'span';
              +
              +		if ( ! empty( $name ) ) {
              +			$tag = $this->field->object_type == 'post' ? 'h5' : 'h3';
              +		}
              +
              +		$a = $this->parse_args( 'title', array(
              +			'tag'   => $tag,
              +			'class' => empty( $name ) ? 'cmb2-metabox-title-anchor' : 'cmb2-metabox-title',
              +			'name'  => $name,
              +			'desc'  => $this->_desc( true ),
              +			'id'    => str_replace( '_', '-', sanitize_html_class( $this->field->id() ) ),
              +		) );
              +
              +		return $this->rendered(
              +			sprintf(
              +				'<%1$s %2$s>%3$s%4$s',
              +				$a['tag'],
              +				$this->concat_attrs( $a, array( 'tag', 'name', 'desc' ) ),
              +				$a['name'],
              +				$a['desc']
              +			)
              +		);
              +	}
              +
              +}
              diff --git a/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Wysiwyg.php b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Wysiwyg.php
              new file mode 100755
              index 00000000..f9f49e08
              --- /dev/null
              +++ b/inc/vendors/cmb2-plugins/cmb2/includes/types/CMB2_Type_Wysiwyg.php
              @@ -0,0 +1,93 @@
              +field;
              +		$a = $this->parse_args( 'wysiwyg', array(
              +			'id'      => $this->_id(),
              +			'value'   => $field->escaped_value( 'stripslashes' ),
              +			'desc'    => $this->_desc( true ),
              +			'options' => $field->options(),
              +		) );
              +
              +		if ( ! $field->group ) {
              +			return $this->rendered( $this->get_wp_editor( $a ) . $a['desc'] );
              +		}
              +
              +		// wysiwyg fields in a group need some special handling.
              +
              +		$field->add_js_dependencies( 'wp-util' );
              +		$field->add_js_dependencies( 'cmb2-wysiwyg' );
              +
              +		// Hook in our template-output to the footer.
              +		add_action( is_admin() ? 'admin_footer' : 'wp_footer', array( $this, 'add_wysiwyg_template_for_group' ) );
              +
              +		return $this->rendered(
              +			sprintf( '
              %s', parent::render( array( + 'class' => 'cmb2_textarea cmb2-wysiwyg-placeholder', + 'data-groupid' => $field->group->id(), + 'data-iterator' => $field->group->index, + 'data-fieldid' => $field->id( true ), + 'desc' => '
              ' . $this->_desc( true ), + ) ) ) + ); + } + + protected function get_wp_editor( $args ) { + ob_start(); + wp_editor( $args['value'], $args['id'], $args['options'] ); + return ob_get_clean(); + } + + public function add_wysiwyg_template_for_group() { + $group_id = $this->field->group->id(); + $field_id = $this->field->id( true ); + $hash = $this->field->hash_id(); + $options = $this->field->options(); + $options['textarea_name'] = 'cmb2_n_' . $group_id . $field_id; + + // Initate the editor with special id/value/name so we can retrieve the options in JS. + $editor = $this->get_wp_editor( array( + 'value' => 'cmb2_v_' . $group_id . $field_id, + 'id' => 'cmb2_i_' . $group_id . $field_id, + 'options' => $options, + ) ); + + // Then replace the special id/value/name with underscore placeholders. + $editor = str_replace( array( + 'cmb2_n_' . $group_id . $field_id, + 'cmb2_v_' . $group_id . $field_id, + 'cmb2_i_' . $group_id . $field_id, + ), array( + '{{ data.name }}', + '{{{ data.value }}}', + '{{ data.id }}', + ), $editor ); + + // And put the editor instance in a JS template wrapper. + echo ''; + } + +} diff --git a/inc/vendors/cmb2-plugins/cmb2/index.php b/inc/vendors/cmb2-plugins/cmb2/index.php new file mode 100755 index 00000000..49d255dd --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/index.php @@ -0,0 +1 @@ +l10ni18n(); + + // Include helper functions. + require_once CMB2_DIR . 'includes/CMB2_Base.php'; + require_once CMB2_DIR . 'includes/CMB2.php'; + require_once CMB2_DIR . 'includes/helper-functions.php'; + + // Now kick off the class autoloader. + spl_autoload_register( 'cmb2_autoload_classes' ); + + // Kick the whole thing off. + require_once( cmb2_dir( 'bootstrap.php' ) ); + cmb2_bootstrap(); + } + + /** + * Registers CMB2 text domain path + * + * @since 2.0.0 + */ + public function l10ni18n() { + + $loaded = load_plugin_textdomain( 'cmb2', false, '/languages/' ); + + if ( ! $loaded ) { + $loaded = load_muplugin_textdomain( 'cmb2', '/languages/' ); + } + + if ( ! $loaded ) { + $loaded = load_theme_textdomain( 'cmb2', get_stylesheet_directory() . '/languages/' ); + } + + if ( ! $loaded ) { + $locale = apply_filters( 'plugin_locale', get_locale(), 'cmb2' ); + $mofile = dirname( __FILE__ ) . '/languages/cmb2-' . $locale . '.mo'; + load_textdomain( 'cmb2', $mofile ); + } + + } + + } + + // Make it so... + CMB2_Bootstrap_260::initiate(); + +}// End if(). diff --git a/inc/vendors/cmb2-plugins/cmb2/js/cmb2-wysiwyg.js b/inc/vendors/cmb2-plugins/cmb2/js/cmb2-wysiwyg.js new file mode 100755 index 00000000..111e7ea0 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/js/cmb2-wysiwyg.js @@ -0,0 +1,345 @@ +/** + * Used for WYSIWYG logic + */ +window.CMB2 = window.CMB2 || {}; +window.CMB2.wysiwyg = window.CMB2.wysiwyg || {}; + +( function(window, document, $, cmb, wysiwyg, undefined ) { + 'use strict'; + + // Private variables + var toBeDestroyed = []; + var toBeInitialized = []; + var all = wysiwyg.all = {}; + + // Private functions + + /** + * Initializes any editors that weren't initialized because they didn't exist yet. + * + * @since 2.2.3 + * + * @return {void} + */ + function delayedInit() { + + // Don't initialize until they've all been destroyed. + if ( 0 === toBeDestroyed.length ) { + toBeInitialized.forEach( function ( toInit ) { + toBeInitialized.splice( toBeInitialized.indexOf( toInit ), 1 ); + wysiwyg.init.apply( wysiwyg, toInit ); + } ); + } else { + window.setTimeout( delayedInit, 100 ); + } + } + + /** + * Destroys any editors that weren't destroyed because they didn't exist yet. + * + * @since 2.2.3 + * + * @return {void} + */ + function delayedDestroy() { + toBeDestroyed.forEach( function( id ) { + toBeDestroyed.splice( toBeDestroyed.indexOf( id ), 1 ); + wysiwyg.destroy( id ); + } ); + } + + /** + * Gets the option data for a group (and initializes that data if it doesn't exist). + * + * @since 2.2.3 + * + * @param {object} data The group/field data. + * + * @return {object} Options data object for a group. + */ + function getGroupData( data ) { + var groupid = data.groupid; + var fieldid = data.fieldid; + + if ( ! all[ groupid ] || ! all[ groupid ][ fieldid ] ) { + all[ groupid ] = all[ groupid ] || {}; + all[ groupid ][ fieldid ] = { + template : wp.template( 'cmb2-wysiwyg-' + groupid + '-' + fieldid ), + defaults : { + + // Get the data from the template-wysiwyg initiation. + mce : $.extend( {}, tinyMCEPreInit.mceInit[ 'cmb2_i_' + groupid + fieldid ] ), + qt : $.extend( {}, tinyMCEPreInit.qtInit[ 'cmb2_i_' + groupid + fieldid ] ) + } + }; + // This is the template-wysiwyg data, and we do not want that to be initiated. + delete tinyMCEPreInit.mceInit[ 'cmb2_i_' + groupid + fieldid ]; + delete tinyMCEPreInit.qtInit[ 'cmb2_i_' + groupid + fieldid ]; + } + + return all[ groupid ][ fieldid ]; + } + + /** + * Initiates the tinyMCEPreInit options for a wysiwyg editor instance. + * + * @since 2.2.3 + * + * @param {object} options Options data object for the wysiwyg editor instance. + * + * @return {void} + */ + function initOptions( options ) { + var nameRegex = new RegExp( 'cmb2_n_' + options.groupid + options.fieldid, 'g' ); + var idRegex = new RegExp( 'cmb2_i_' + options.groupid + options.fieldid, 'g' ); + var prop, newSettings, newQTS; + + // If no settings for this field. Clone from placeholder. + if ( 'undefined' === typeof( tinyMCEPreInit.mceInit[ options.id ] ) ) { + newSettings = $.extend( {}, options.defaults.mce ); + for ( prop in newSettings ) { + if ( 'string' === typeof( newSettings[ prop ] ) ) { + newSettings[ prop ] = newSettings[ prop ] + .replace( idRegex, options.id ) + .replace( nameRegex, options.name ); + } + } + tinyMCEPreInit.mceInit[ options.id ] = newSettings; + } + + // If no Quicktag settings for this field. Clone from placeholder. + if ( 'undefined' === typeof( tinyMCEPreInit.qtInit[ options.id ] ) ) { + newQTS = $.extend( {}, options.defaults.qt ); + for ( prop in newQTS ) { + if ( 'string' === typeof( newQTS[ prop ] ) ) { + newQTS[ prop ] = newQTS[ prop ] + .replace( idRegex, options.id ) + .replace( nameRegex, options.name ); + } + } + tinyMCEPreInit.qtInit[ options.id ] = newQTS; + } + } + + /** + * Initializes all group wysiwyg editors. Hooked to cmb_init. + * + * @since 2.2.3 + * + * @return {void} + */ + wysiwyg.initAll = function() { + var $this,data,initiated; + + $( '.cmb2-wysiwyg-placeholder' ).each( function() { + $this = $( this ); + data = $this.data(); + + if ( data.groupid ) { + + data.id = $this.attr( 'id' ); + data.name = $this.attr( 'name' ); + data.value = $this.val(); + + wysiwyg.init( $this, data, false ); + initiated = true; + } + } ); + + if ( true === initiated ) { + if ( 'undefined' !== typeof window.QTags ) { + window.QTags._buttonsInit(); + } + + // Hook in our event callbacks. + $( document ) + .on( 'cmb2_add_row', wysiwyg.addRow ) + .on( 'cmb2_remove_group_row_start', wysiwyg.destroyRowEditors ) + .on( 'cmb2_shift_rows_start', wysiwyg.shiftStart ) + .on( 'cmb2_shift_rows_complete', wysiwyg.shiftComplete ); + } + }; + + /** + * Initiates wysiwyg editors in a new group row. Hooked to cmb2_add_row. + * + * @since 2.2.3 + * + * @param {object} evt A jQuery-normalized event object. + * @param {object} $row A jQuery dom element object for the group row. + * + * @return {void} + */ + wysiwyg.addRow = function( evt, $row ) { + wysiwyg.initRow( $row, evt ); + }; + + /** + * Destroys wysiwyg editors in a group row when that row is removed. Hooked to cmb2_remove_group_row_start. + * + * @since 2.2.3 + * + * @param {object} evt A jQuery-normalized event object. + * @param {object} $btn A jQuery dom element object for the remove-row button. + * + * @return {void} + */ + wysiwyg.destroyRowEditors = function( evt, $btn ) { + wysiwyg.destroy( $btn.parents( '.cmb-repeatable-grouping' ).find( '.wp-editor-area' ).attr( 'id' ) ); + }; + + /** + * When a row-shift starts, we need to destroy the wysiwyg editors for the group-rows being shuffled. + * + * @since 2.2.3 + * + * @param {object} evt A jQuery-normalized event object. + * @param {object} $btn A jQuery dom element object for the remove-row button. + * @param {object} $from A jQuery dom element object for the row being shifted from. + * @param {object} $to A jQuery dom element object for the row being shifted to. + * + * @return {void} + */ + wysiwyg.shiftStart = function( evt, $btn, $from, $to ) { + $from.add( $to ).find( '.wp-editor-wrap textarea' ).each( function() { + wysiwyg.destroy( $( this ).attr( 'id' ) ); + } ); + }; + + /** + * When a row-shift completes, we need to re-init the wysiwyg editors for the group-rows being shuffled. + * + * @since 2.2.3 + * + * @param {object} evt A jQuery-normalized event object. + * @param {object} $btn A jQuery dom element object for the remove-row button. + * @param {object} $from A jQuery dom element object for the row being shifted from. + * @param {object} $to A jQuery dom element object for the row being shifted to. + * + * @return {void} + */ + wysiwyg.shiftComplete = function( evt, $btn, $from, $to ) { + $from.add( $to ).each( function() { + wysiwyg.initRow( $( this ), evt ); + } ); + }; + + /** + * Initializes editors for a new CMB row. + * + * @since 2.2.3 + * + * @param {object} $row A jQuery dom element object for the group row. + * @param {object} evt A jQuery-normalized event object. + * + * @return {void} + */ + wysiwyg.initRow = function( $row, evt ) { + var $toReplace, data, defVal; + + $row.find( '.cmb2-wysiwyg-inner-wrap' ).each( function() { + $toReplace = $( this ); + data = $toReplace.data(); + defVal = cmb.getFieldArg( data.hash, 'default', '' ); + defVal = 'undefined' !== typeof defVal && false !== defVal ? defVal : ''; + + data.iterator = $row.data( 'iterator' ); + data.fieldid = data.id; + data.id = data.groupid + '_' + data.iterator + '_' + data.fieldid; + data.name = data.groupid + '[' + data.iterator + '][' + data.fieldid + ']'; + data.value = 'cmb2_add_row' !== evt.type && $toReplace.find( '.wp-editor-area' ).length ? $toReplace.find( '.wp-editor-area' ).val() : defVal; + + // The destroys might not have happened yet. Don't init until they have. + if ( 0 === toBeDestroyed.length ) { + + wysiwyg.init( $toReplace, data ); + + } else { + toBeInitialized.push( [$toReplace, data] ); + window.setTimeout( delayedInit, 100 ); + } + } ); + + }; + + /** + * Initiates a wysiwyg editor instance and replaces the passed dom element w/ the editor html. + * + * @since 2.2.3 + * + * @param {object} $toReplace A jQuery dom element which will be replaced with the wysiwyg editor. + * @param {object} data Data used to initate the editor. + * @param {bool} buttonsInit Whether to run QTags._buttonsInit() + * + * @return {void} + */ + wysiwyg.init = function( $toReplace, data, buttonsInit ) { + if ( ! data.groupid ) { + return false; + } + + var mceActive = cmb.canTinyMCE(); + var qtActive = 'function' === typeof window.quicktags; + $.extend( data, getGroupData( data ) ); + + initOptions( data ); + + $toReplace.replaceWith( data.template( data ) ); + + if ( mceActive ) { + window.tinyMCE.init( tinyMCEPreInit.mceInit[ data.id ] ); + } + + if ( qtActive ) { + window.quicktags( tinyMCEPreInit.qtInit[ data.id ] ); + } + + if ( mceActive ) { + $( document.getElementById( data.id ) ).parents( '.wp-editor-wrap' ).removeClass( 'html-active' ).addClass( 'tmce-active' ); + } + + if ( false !== buttonsInit && 'undefined' !== typeof window.QTags ) { + window.QTags._buttonsInit(); + } + + }; + + /** + * Destroys a wysiwyg editor instance. + * + * @since 2.2.3 + * + * @param {string} id Editor id. + * + * @return {void} + */ + wysiwyg.destroy = function( id ) { + if ( ! cmb.canTinyMCE() ) { + // Nothing to see here. + return; + } + + // The editor might not be initialized yet. But we need to destroy it once it is. + var editor = tinyMCE.get( id ); + + if ( editor !== null && typeof( editor ) !== 'undefined' ) { + editor.destroy(); + + if ( 'undefined' === typeof( tinyMCEPreInit.mceInit[ id ] ) ) { + delete tinyMCEPreInit.mceInit[ id ]; + } + + if ( 'undefined' === typeof( tinyMCEPreInit.qtInit[ id ] ) ) { + delete tinyMCEPreInit.qtInit[ id ]; + } + + } else if ( -1 === toBeDestroyed.indexOf( id ) ) { + toBeDestroyed.push( id ); + window.setTimeout( delayedDestroy, 100 ); + } + }; + + // Hook in our event callbacks. + $( document ).on( 'cmb_init', wysiwyg.initAll ); + +} )( window, document, jQuery, window.CMB2, window.CMB2.wysiwyg ); diff --git a/inc/vendors/cmb2-plugins/cmb2/js/cmb2.js b/inc/vendors/cmb2-plugins/cmb2/js/cmb2.js new file mode 100755 index 00000000..96c78e23 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/js/cmb2.js @@ -0,0 +1,1344 @@ +/** + * Controls the behaviours of custom metabox fields. + * + * @author CMB2 team + * @see https://github.com/CMB2/CMB2 + */ + +/** + * Custom jQuery for Custom Metaboxes and Fields + */ +window.CMB2 = window.CMB2 || {}; +(function(window, document, $, cmb, undefined){ + 'use strict'; + + // localization strings + var l10n = window.cmb2_l10; + var setTimeout = window.setTimeout; + var $document; + var $id = function( selector ) { + return $( document.getElementById( selector ) ); + }; + var defaults = { + idNumber : false, + repeatEls : 'input:not([type="button"],[id^=filelist]),select,textarea,.cmb2-media-status', + noEmpty : 'input:not([type="button"]):not([type="radio"]):not([type="checkbox"]),textarea', + repeatUpdate : 'input:not([type="button"]),select,textarea,label', + styleBreakPoint : 450, + mediaHandlers : {}, + defaults : { + time_picker : l10n.defaults.time_picker, + date_picker : l10n.defaults.date_picker, + color_picker : l10n.defaults.color_picker || {}, + code_editor : l10n.defaults.code_editor, + }, + media : { + frames : {}, + }, + }; + + cmb.init = function() { + $document = $( document ); + + // Setup the CMB2 object defaults. + $.extend( cmb, defaults ); + + cmb.trigger( 'cmb_pre_init' ); + + var $metabox = cmb.metabox(); + var $repeatGroup = $metabox.find('.cmb-repeatable-group'); + + // Init time/date/color pickers + cmb.initPickers( $metabox.find('input[type="text"].cmb2-timepicker'), $metabox.find('input[type="text"].cmb2-datepicker'), $metabox.find('input[type="text"].cmb2-colorpicker') ); + + // Init code editors. + cmb.initCodeEditors( $metabox.find( '.cmb2-textarea-code:not(.disable-codemirror)' ) ); + + // Insert toggle button into DOM wherever there is multicheck. credit: Genesis Framework + $( '

              ' + l10n.strings.check_toggle + '

              ' ).insertBefore( '.cmb2-checkbox-list:not(.no-select-all)' ); + + // Make File List drag/drop sortable: + cmb.makeListSortable(); + // Make Repeatable fields drag/drop sortable: + cmb.makeRepeatableSortable(); + + $metabox + .on( 'change', '.cmb2_upload_file', function() { + cmb.media.field = $( this ).attr( 'id' ); + $id( cmb.media.field + '_id' ).val(''); + }) + // Media/file management + .on( 'click', '.cmb-multicheck-toggle', cmb.toggleCheckBoxes ) + .on( 'click', '.cmb2-upload-button', cmb.handleMedia ) + .on( 'click', '.cmb-attach-list li, .cmb2-media-status .img-status img, .cmb2-media-status .file-status > span', cmb.handleFileClick ) + .on( 'click', '.cmb2-remove-file-button', cmb.handleRemoveMedia ) + // Repeatable content + .on( 'click', '.cmb-add-group-row', cmb.addGroupRow ) + .on( 'click', '.cmb-add-row-button', cmb.addAjaxRow ) + .on( 'click', '.cmb-remove-group-row', cmb.removeGroupRow ) + .on( 'click', '.cmb-remove-row-button', cmb.removeAjaxRow ) + // Ajax oEmbed display + .on( 'keyup paste focusout', '.cmb2-oembed', cmb.maybeOembed ) + // Reset titles when removing a row + .on( 'cmb2_remove_row', '.cmb-repeatable-group', cmb.resetTitlesAndIterator ) + .on( 'click', '.cmbhandle, .cmbhandle + .cmbhandle-title', cmb.toggleHandle ); + + if ( $repeatGroup.length ) { + $repeatGroup + .on( 'cmb2_add_row', cmb.emptyValue ) + .on( 'cmb2_add_row', cmb.setDefaults ) + .filter('.sortable').each( function() { + // Add sorting arrows + $( this ).find( '.cmb-remove-group-row-button' ).before( ' ' ); + }) + .on( 'click', '.cmb-shift-rows', cmb.shiftRows ); + } + + // on pageload + setTimeout( cmb.resizeoEmbeds, 500); + // and on window resize + $( window ).on( 'resize', cmb.resizeoEmbeds ); + + if ( $id( 'addtag' ).length ) { + cmb.listenTagAdd(); + } + + $( document ).on( 'cmb_init', cmb.mceEnsureSave ); + + cmb.trigger( 'cmb_init' ); + }; + + // Handles updating tiny mce instances when saving a gutenberg post. + // https://github.com/CMB2/CMB2/issues/1156 + cmb.mceEnsureSave = function() { + // If no wp.data, do not proceed (no gutenberg) + if ( ! wp.data || ! wp.data.hasOwnProperty('subscribe') ) { + return; + } + + // If the current user cannot richedit, or MCE is not available, bail. + if ( ! cmb.canTinyMCE() ) { + return; + } + + wp.data.subscribe( function() { + var editor = wp.data.hasOwnProperty('select') ? wp.data.select( 'core/editor' ) : null; + + // the post is currently being saved && we have tinymce editors + if ( editor && editor.isSavingPost && editor.isSavingPost() && window.tinyMCE.editors.length ) { + for ( var i = 0; i < window.tinyMCE.editors.length; i++ ) { + if ( window.tinyMCE.activeEditor !== window.tinyMCE.editors[i] ) { + window.tinyMCE.editors[i].save(); + } + } + } + }); + }; + + cmb.canTinyMCE = function() { + return l10n.user_can_richedit && window.tinyMCE; + }; + + cmb.listenTagAdd = function() { + $document.ajaxSuccess( function( evt, xhr, settings ) { + if ( settings.data && settings.data.length && -1 !== settings.data.indexOf( 'action=add-tag' ) ) { + cmb.resetBoxes( $id( 'addtag' ).find( '.cmb2-wrap > .cmb2-metabox' ) ); + } + }); + }; + + cmb.resetBoxes = function( $boxes ) { + $.each( $boxes, function() { + cmb.resetBox( $( this ) ); + }); + }; + + cmb.resetBox = function( $box ) { + $box.find( '.wp-picker-clear' ).trigger( 'click' ); + $box.find( '.cmb2-remove-file-button' ).trigger( 'click' ); + $box.find( '.cmb-row.cmb-repeatable-grouping:not(:first-of-type) .cmb-remove-group-row' ).click(); + $box.find( '.cmb-repeat-row:not(:first-child)' ).remove(); + + $box.find( 'input:not([type="button"]),select,textarea' ).each( function() { + var $element = $( this ); + var tagName = $element.prop('tagName'); + + if ( 'INPUT' === tagName ) { + var elType = $element.attr( 'type' ); + if ( 'checkbox' === elType || 'radio' === elType ) { + $element.prop( 'checked', false ); + } else { + $element.val( '' ); + } + } + if ( 'SELECT' === tagName ) { + $( 'option:selected', this ).prop( 'selected', false ); + } + if ( 'TEXTAREA' === tagName ) { + $element.html( '' ); + } + }); + }; + + cmb.resetTitlesAndIterator = function( evt ) { + if ( ! evt.group ) { + return; + } + + // Loop repeatable group tables + $( '.cmb-repeatable-group.repeatable' ).each( function() { + var $table = $( this ); + var groupTitle = $table.find( '.cmb-add-group-row' ).data( 'grouptitle' ); + + // Loop repeatable group table rows + $table.find( '.cmb-repeatable-grouping' ).each( function( rowindex ) { + var $row = $( this ); + var $rowTitle = $row.find( 'h3.cmb-group-title' ); + // Reset rows iterator + $row.data( 'iterator', rowindex ); + // Reset rows title + if ( $rowTitle.length ) { + $rowTitle.text( groupTitle.replace( '{#}', ( rowindex + 1 ) ) ); + } + }); + }); + }; + + cmb.toggleHandle = function( evt ) { + evt.preventDefault(); + cmb.trigger( 'postbox-toggled', $( this ).parent('.postbox').toggleClass('closed') ); + }; + + cmb.toggleCheckBoxes = function( evt ) { + evt.preventDefault(); + var $this = $( this ); + var $multicheck = $this.closest( '.cmb-td' ).find( 'input[type=checkbox]:not([disabled])' ); + + // If the button has already been clicked once... + if ( $this.data( 'checked' ) ) { + // clear the checkboxes and remove the flag + $multicheck.prop( 'checked', false ); + $this.data( 'checked', false ); + } + // Otherwise mark the checkboxes and add a flag + else { + $multicheck.prop( 'checked', true ); + $this.data( 'checked', true ); + } + }; + + cmb.handleMedia = function( evt ) { + evt.preventDefault(); + + var $el = $( this ); + cmb.attach_id = ! $el.hasClass( 'cmb2-upload-list' ) ? $el.closest( '.cmb-td' ).find( '.cmb2-upload-file-id' ).val() : false; + // Clean up default 0 value + cmb.attach_id = '0' !== cmb.attach_id ? cmb.attach_id : false; + + cmb._handleMedia( $el.prev('input.cmb2-upload-file').attr('id'), $el.hasClass( 'cmb2-upload-list' ) ); + }; + + cmb.handleFileClick = function( evt ) { + if ( $( evt.target ).is( 'a' ) ) { + return; + } + + evt.preventDefault(); + + var $el = $( this ); + var $td = $el.closest( '.cmb-td' ); + var isList = $td.find( '.cmb2-upload-button' ).hasClass( 'cmb2-upload-list' ); + cmb.attach_id = isList ? $el.find( 'input[type="hidden"]' ).data( 'id' ) : $td.find( '.cmb2-upload-file-id' ).val(); + + if ( cmb.attach_id ) { + cmb._handleMedia( $td.find( 'input.cmb2-upload-file' ).attr( 'id' ), isList, cmb.attach_id ); + } + }; + + cmb._handleMedia = function( id, isList ) { + if ( ! wp ) { + return; + } + + var media, handlers; + + handlers = cmb.mediaHandlers; + media = cmb.media; + media.field = id; + media.$field = $id( media.field ); + media.fieldData = media.$field.data(); + media.previewSize = media.fieldData.previewsize; + media.sizeName = media.fieldData.sizename; + media.fieldName = media.$field.attr('name'); + media.isList = isList; + + // If this field's media frame already exists, reopen it. + if ( id in media.frames ) { + return media.frames[ id ].open(); + } + + // Create the media frame. + media.frames[ id ] = wp.media( { + title: cmb.metabox().find('label[for="' + id + '"]').text(), + library : media.fieldData.queryargs || {}, + button: { + text: l10n.strings[ isList ? 'upload_files' : 'upload_file' ] + }, + multiple: isList ? 'add' : false + } ); + + // Enable the additional media filters: https://github.com/CMB2/CMB2/issues/873 + media.frames[ id ].states.first().set( 'filterable', 'all' ); + + cmb.trigger( 'cmb_media_modal_init', media ); + + handlers.list = function( selection, returnIt ) { + + // Setup our fileGroup array + var fileGroup = []; + var attachmentHtml; + + if ( ! handlers.list.templates ) { + handlers.list.templates = { + image : wp.template( 'cmb2-list-image' ), + file : wp.template( 'cmb2-list-file' ), + }; + } + + // Loop through each attachment + selection.each( function( attachment ) { + + // Image preview or standard generic output if it's not an image. + attachmentHtml = handlers.getAttachmentHtml( attachment, 'list' ); + + // Add our file to our fileGroup array + fileGroup.push( attachmentHtml ); + }); + + if ( ! returnIt ) { + // Append each item from our fileGroup array to .cmb2-media-status + media.$field.siblings( '.cmb2-media-status' ).append( fileGroup ); + } else { + return fileGroup; + } + + }; + + handlers.single = function( selection ) { + if ( ! handlers.single.templates ) { + handlers.single.templates = { + image : wp.template( 'cmb2-single-image' ), + file : wp.template( 'cmb2-single-file' ), + }; + } + + // Only get one file from the uploader + var attachment = selection.first(); + + media.$field.val( attachment.get( 'url' ) ); + $id( media.field +'_id' ).val( attachment.get( 'id' ) ); + + // Image preview or standard generic output if it's not an image. + var attachmentHtml = handlers.getAttachmentHtml( attachment, 'single' ); + + // add/display our output + media.$field.siblings( '.cmb2-media-status' ).slideDown().html( attachmentHtml ); + }; + + handlers.getAttachmentHtml = function( attachment, templatesId ) { + var isImage = 'image' === attachment.get( 'type' ); + var data = handlers.prepareData( attachment, isImage ); + + // Image preview or standard generic output if it's not an image. + return handlers[ templatesId ].templates[ isImage ? 'image' : 'file' ]( data ); + }; + + handlers.prepareData = function( data, image ) { + if ( image ) { + // Set the correct image size data + handlers.getImageData.call( data, 50 ); + } + + data = data.toJSON(); + data.mediaField = media.field; + data.mediaFieldName = media.fieldName; + data.stringRemoveImage = l10n.strings.remove_image; + data.stringFile = l10n.strings.file; + data.stringDownload = l10n.strings.download; + data.stringRemoveFile = l10n.strings.remove_file; + + return data; + }; + + handlers.getImageData = function( fallbackSize ) { + + // Preview size dimensions + var previewW = media.previewSize[0] || fallbackSize; + var previewH = media.previewSize[1] || fallbackSize; + + // Image dimensions and url + var url = this.get( 'url' ); + var width = this.get( 'width' ); + var height = this.get( 'height' ); + var sizes = this.get( 'sizes' ); + + // Get the correct dimensions and url if a named size is set and exists + // fallback to the 'large' size + if ( sizes ) { + if ( sizes[ media.sizeName ] ) { + url = sizes[ media.sizeName ].url; + width = sizes[ media.sizeName ].width; + height = sizes[ media.sizeName ].height; + } else if ( sizes.large ) { + url = sizes.large.url; + width = sizes.large.width; + height = sizes.large.height; + } + } + + // Fit the image in to the preview size, keeping the correct aspect ratio + if ( width > previewW ) { + height = Math.floor( previewW * height / width ); + width = previewW; + } + + if ( height > previewH ) { + width = Math.floor( previewH * width / height ); + height = previewH; + } + + if ( ! width ) { + width = previewW; + } + + if ( ! height ) { + height = 'svg' === this.get( 'filename' ).split( '.' ).pop() ? '100%' : previewH; + } + + this.set( 'sizeUrl', url ); + this.set( 'sizeWidth', width ); + this.set( 'sizeHeight', height ); + + return this; + }; + + handlers.selectFile = function() { + var selection = media.frames[ id ].state().get( 'selection' ); + var type = isList ? 'list' : 'single'; + + if ( cmb.attach_id && isList ) { + $( '[data-id="'+ cmb.attach_id +'"]' ).parents( 'li' ).replaceWith( handlers.list( selection, true ) ); + } else { + handlers[type]( selection ); + } + + cmb.trigger( 'cmb_media_modal_select', selection, media ); + }; + + handlers.openModal = function() { + var selection = media.frames[ id ].state().get( 'selection' ); + var attach; + + if ( ! cmb.attach_id ) { + selection.reset(); + } else { + attach = wp.media.attachment( cmb.attach_id ); + attach.fetch(); + selection.set( attach ? [ attach ] : [] ); + } + + cmb.trigger( 'cmb_media_modal_open', selection, media ); + }; + + // When a file is selected, run a callback. + media.frames[ id ] + .on( 'select', handlers.selectFile ) + .on( 'open', handlers.openModal ); + + // Finally, open the modal + media.frames[ id ].open(); + }; + + cmb.handleRemoveMedia = function( evt ) { + evt.preventDefault(); + var $this = $( this ); + if ( $this.is( '.cmb-attach-list .cmb2-remove-file-button' ) ) { + $this.parents( '.cmb2-media-item' ).remove(); + return false; + } + + cmb.media.field = $this.attr('rel'); + + cmb.metabox().find( document.getElementById( cmb.media.field ) ).val(''); + cmb.metabox().find( document.getElementById( cmb.media.field + '_id' ) ).val(''); + $this.parents('.cmb2-media-status').html(''); + + return false; + }; + + cmb.cleanRow = function( $row, prevNum, group ) { + var $elements = $row.find( cmb.repeatUpdate ); + if ( group ) { + + var $other = $row.find( '[id]' ).not( cmb.repeatUpdate ); + + // Remove extra ajaxed rows + $row.find('.cmb-repeat-table .cmb-repeat-row:not(:first-child)').remove(); + + // Update all elements w/ an ID + if ( $other.length ) { + $other.each( function() { + var $_this = $( this ); + var oldID = $_this.attr( 'id' ); + var newID = oldID.replace( '_'+ prevNum, '_'+ cmb.idNumber ); + var $buttons = $row.find('[data-selector="'+ oldID +'"]'); + $_this.attr( 'id', newID ); + + // Replace data-selector vars + if ( $buttons.length ) { + $buttons.attr( 'data-selector', newID ).data( 'selector', newID ); + } + }); + } + } + + $elements.filter( ':checked' ).removeAttr( 'checked' ); + $elements.find( ':checked' ).removeAttr( 'checked' ); + $elements.filter( ':selected' ).removeAttr( 'selected' ); + $elements.find( ':selected' ).removeAttr( 'selected', false ); + + if ( $row.find('h3.cmb-group-title').length ) { + $row.find( 'h3.cmb-group-title' ).text( $row.data( 'title' ).replace( '{#}', ( cmb.idNumber + 1 ) ) ); + } + + $elements.each( function() { + cmb.elReplacements( $( this ), prevNum, group ); + } ); + + return cmb; + }; + + cmb.elReplacements = function( $newInput, prevNum, group ) { + var oldFor = $newInput.attr( 'for' ); + var oldVal = $newInput.val(); + var type = $newInput.prop( 'type' ); + var defVal = cmb.getFieldArg( $newInput, 'default' ); + var newVal = 'undefined' !== typeof defVal && false !== defVal ? defVal : ''; + var tagName = $newInput.prop('tagName'); + var checkable = 'radio' === type || 'checkbox' === type ? oldVal : false; + var attrs = {}; + var newID, oldID; + if ( oldFor ) { + attrs = { 'for' : oldFor.replace( '_'+ prevNum, '_'+ cmb.idNumber ) }; + } else { + var oldName = $newInput.attr( 'name' ); + var newName; + oldID = $newInput.attr( 'id' ); + + // Handle adding groups vs rows. + if ( group ) { + // Expect another bracket after group's index closing bracket. + newName = oldName ? oldName.replace( '['+ prevNum +'][', '['+ cmb.idNumber +'][' ) : ''; + // Expect another underscore after group's index trailing underscore. + newID = oldID ? oldID.replace( '_' + prevNum + '_', '_' + cmb.idNumber + '_' ) : ''; + } + else { + // Row indexes are at the very end of the string. + newName = oldName ? cmb.replaceLast( oldName, '[' + prevNum + ']', '[' + cmb.idNumber + ']' ) : ''; + newID = oldID ? cmb.replaceLast( oldID, '_' + prevNum, '_' + cmb.idNumber ) : ''; + } + + attrs = { + id: newID, + name: newName + }; + + } + + // Clear out textarea values + if ( 'TEXTAREA' === tagName ) { + $newInput.html( newVal ); + } + + if ( 'SELECT' === tagName && 'undefined' !== typeof defVal ) { + var $toSelect = $newInput.find( '[value="'+ defVal + '"]' ); + if ( $toSelect.length ) { + $toSelect.attr( 'selected', 'selected' ).prop( 'selected', 'selected' ); + } + } + + if ( checkable ) { + $newInput.removeAttr( 'checked' ); + if ( 'undefined' !== typeof defVal && oldVal === defVal ) { + $newInput.attr( 'checked', 'checked' ).prop( 'checked', 'checked' ); + } + } + + if ( ! group && $newInput[0].hasAttribute( 'data-iterator' ) ) { + attrs['data-iterator'] = cmb.idNumber; + } + + $newInput + .removeClass( 'hasDatepicker' ) + .val( checkable ? checkable : newVal ).attr( attrs ); + + return $newInput; + }; + + cmb.newRowHousekeeping = function( $row ) { + var $colorPicker = $row.find( '.wp-picker-container' ); + var $list = $row.find( '.cmb2-media-status' ); + + if ( $colorPicker.length ) { + // Need to clean-up colorpicker before appending + $colorPicker.each( function() { + var $td = $( this ).parent(); + $td.html( $td.find( 'input[type="text"].cmb2-colorpicker' ).attr('style', '') ); + }); + } + + // Need to clean-up colorpicker before appending + if ( $list.length ) { + $list.empty(); + } + + return cmb; + }; + + cmb.afterRowInsert = function( $row ) { + // Init pickers from new row + cmb.initPickers( $row.find('input[type="text"].cmb2-timepicker'), $row.find('input[type="text"].cmb2-datepicker'), $row.find('input[type="text"].cmb2-colorpicker') ); + }; + + cmb.updateNameAttr = function () { + var $this = $( this ); + var name = $this.attr( 'name' ); // get current name + + // If name is defined + if ( 'undefined' !== typeof name ) { + var prevNum = parseInt( $this.parents( '.cmb-repeatable-grouping' ).data( 'iterator' ), 10 ); + var newNum = prevNum - 1; // Subtract 1 to get new iterator number + + // Update field name attributes so data is not orphaned when a row is removed and post is saved + var $newName = name.replace( '[' + prevNum + ']', '[' + newNum + ']' ); + + // New name with replaced iterator + $this.attr( 'name', $newName ); + } + }; + + cmb.emptyValue = function( evt, row ) { + $( cmb.noEmpty, row ).val( '' ); + }; + + cmb.setDefaults = function( evt, row ) { + $( cmb.noEmpty, row ).each( function() { + var $el = $(this); + var defVal = cmb.getFieldArg( $el, 'default' ); + if ( 'undefined' !== typeof defVal && false !== defVal ) { + $el.val( defVal ); + } + }); + }; + + cmb.addGroupRow = function( evt ) { + evt.preventDefault(); + + var $this = $( this ); + + // before anything significant happens + cmb.triggerElement( $this, 'cmb2_add_group_row_start', $this ); + + var $table = $id( $this.data('selector') ); + var $oldRow = $table.find('.cmb-repeatable-grouping').last(); + var prevNum = parseInt( $oldRow.data('iterator'), 10 ); + cmb.idNumber = parseInt( prevNum, 10 ) + 1; + var $row = $oldRow.clone(); + var nodeName = $row.prop('nodeName') || 'div'; + var getRowId = function( id ) { + id = id.split('-'); + id.splice(id.length - 1, 1); + id.push( cmb.idNumber ); + return id.join('-'); + }; + + // Make sure the next number doesn't exist. + while ( $table.find( '.cmb-repeatable-grouping[data-iterator="'+ cmb.idNumber +'"]' ).length > 0 ) { + cmb.idNumber++; + } + + cmb.newRowHousekeeping( $row.data( 'title', $this.data( 'grouptitle' ) ) ).cleanRow( $row, prevNum, true ); + $row.find( '.cmb-add-row-button' ).prop( 'disabled', false ); + + var $newRow = $( '<' + nodeName + ' id="'+ getRowId( $oldRow.attr('id') ) +'" class="postbox cmb-row cmb-repeatable-grouping" data-iterator="'+ cmb.idNumber +'">'+ $row.html() +'' ); + $oldRow.after( $newRow ); + + cmb.afterRowInsert( $newRow ); + + cmb.triggerElement( $table, { type: 'cmb2_add_row', group: true }, $newRow ); + + }; + + cmb.addAjaxRow = function( evt ) { + evt.preventDefault(); + + var $this = $( this ); + var $table = $id( $this.data('selector') ); + var $emptyrow = $table.find('.empty-row'); + var prevNum = parseInt( $emptyrow.find('[data-iterator]').data('iterator'), 10 ); + cmb.idNumber = parseInt( prevNum, 10 ) + 1; + var $row = $emptyrow.clone(); + + cmb.newRowHousekeeping( $row ).cleanRow( $row, prevNum ); + + $emptyrow.removeClass('empty-row hidden').addClass('cmb-repeat-row'); + $emptyrow.after( $row ); + + cmb.afterRowInsert( $row ); + + cmb.triggerElement( $table, { type: 'cmb2_add_row', group: false }, $row ); + + }; + + cmb.removeGroupRow = function( evt ) { + evt.preventDefault(); + + var $this = $( this ); + var confirmation = $this.data('confirm'); + + // Process further only if deletion confirmation enabled and user agreed. + if ( confirmation && ! window.confirm( confirmation ) ) { + return; + } + + var $table = $id( $this.data('selector') ); + var $parent = $this.parents('.cmb-repeatable-grouping'); + var number = $table.find('.cmb-repeatable-grouping').length; + + if ( number < 2 ) { + return cmb.resetRow( $parent.parents('.cmb-repeatable-group').find( '.cmb-add-group-row' ), $this ); + } + + cmb.triggerElement( $table, 'cmb2_remove_group_row_start', $this ); + + // When a group is removed, loop through all next groups and update fields names. + $parent.nextAll( '.cmb-repeatable-grouping' ).find( cmb.repeatEls ).each( cmb.updateNameAttr ); + + $parent.remove(); + + cmb.triggerElement( $table, { type: 'cmb2_remove_row', group: true } ); + }; + + cmb.removeAjaxRow = function( evt ) { + evt.preventDefault(); + + var $this = $( this ); + + // Check if disabled + if ( $this.hasClass( 'button-disabled' ) ) { + return; + } + + var $parent = $this.parents('.cmb-row'); + var $table = $this.parents('.cmb-repeat-table'); + var number = $table.find('.cmb-row').length; + + if ( number <= 2 ) { + return cmb.resetRow( $parent.find( '.cmb-add-row-button' ), $this ); + } + + if ( $parent.hasClass('empty-row') ) { + $parent.prev().addClass( 'empty-row' ).removeClass('cmb-repeat-row'); + } + + $this.parents('.cmb-repeat-table .cmb-row').remove(); + + + cmb.triggerElement( $table, { type: 'cmb2_remove_row', group: false } ); + }; + + cmb.resetRow = function( $addNewBtn, $removeBtn ) { + // Click the "add new" button followed by the "remove this" button + // in order to reset the repeat row to empty values. + $addNewBtn.trigger( 'click' ); + $removeBtn.trigger( 'click' ); + }; + + cmb.shiftRows = function( evt ) { + + evt.preventDefault(); + + var $this = $( this ); + var $from = $this.parents( '.cmb-repeatable-grouping' ); + var $goto = $this.hasClass( 'move-up' ) ? $from.prev( '.cmb-repeatable-grouping' ) : $from.next( '.cmb-repeatable-grouping' ); + + // Before shift occurs. + cmb.triggerElement( $this, 'cmb2_shift_rows_enter', $this, $from, $goto ); + + if ( ! $goto.length ) { + return; + } + + // About to shift + cmb.triggerElement( $this, 'cmb2_shift_rows_start', $this, $from, $goto ); + + var inputVals = []; + // Loop this item's fields + $from.find( cmb.repeatEls ).each( function() { + var $element = $( this ); + var elType = $element.attr( 'type' ); + var val; + + if ( $element.hasClass('cmb2-media-status') ) { + // special case for image previews + val = $element.html(); + } else if ( 'checkbox' === elType || 'radio' === elType ) { + val = $element.is(':checked'); + } else if ( 'select' === $element.prop('tagName') ) { + val = $element.is(':selected'); + } else { + val = $element.val(); + } + + // Get all the current values per element + inputVals.push( { val: val, $: $element } ); + }); + // And swap them all + $goto.find( cmb.repeatEls ).each( function( index ) { + var $element = $( this ); + var elType = $element.attr( 'type' ); + var val; + + if ( $element.hasClass('cmb2-media-status') ) { + var toRowId = $element.closest('.cmb-repeatable-grouping').attr('data-iterator'); + var fromRowId = inputVals[ index ].$.closest('.cmb-repeatable-grouping').attr('data-iterator'); + + // special case for image previews + val = $element.html(); + $element.html( inputVals[ index ].val ); + inputVals[ index ].$.html( val ); + + inputVals[ index ].$.find( 'input' ).each(function() { + var name = $( this ).attr( 'name' ); + name = name.replace( '['+toRowId+']', '['+fromRowId+']' ); + $( this ).attr( 'name', name ); + }); + $element.find('input').each(function() { + var name = $( this ).attr('name'); + name = name.replace('['+fromRowId+']', '['+toRowId+']'); + $( this ).attr('name', name); + }); + + } + // handle checkbox swapping + else if ( 'checkbox' === elType ) { + inputVals[ index ].$.prop( 'checked', $element.is(':checked') ); + $element.prop( 'checked', inputVals[ index ].val ); + } + // handle radio swapping + else if ( 'radio' === elType ) { + if ( $element.is( ':checked' ) ) { + inputVals[ index ].$.attr( 'data-checked', 'true' ); + } + if ( inputVals[ index ].$.is( ':checked' ) ) { + $element.attr( 'data-checked', 'true' ); + } + } + // handle select swapping + else if ( 'select' === $element.prop('tagName') ) { + inputVals[ index ].$.prop( 'selected', $element.is(':selected') ); + $element.prop( 'selected', inputVals[ index ].val ); + } + // handle normal input swapping + else { + inputVals[ index ].$.val( $element.val() ); + $element.val( inputVals[ index ].val ); + } + }); + + $from.find( 'input[data-checked=true]' ).prop( 'checked', true ).removeAttr( 'data-checked' ); + $goto.find( 'input[data-checked=true]' ).prop( 'checked', true ).removeAttr( 'data-checked' ); + + // trigger color picker change event + $from.find( 'input[type="text"].cmb2-colorpicker' ).trigger( 'change' ); + $goto.find( 'input[type="text"].cmb2-colorpicker' ).trigger( 'change' ); + + // shift done + cmb.triggerElement( $this, 'cmb2_shift_rows_complete', $this, $from, $goto ); + }; + + cmb.initPickers = function( $timePickers, $datePickers, $colorPickers ) { + cmb.trigger( 'cmb_init_pickers', { + time: $timePickers, + date: $datePickers, + color: $colorPickers + } ); + + // Initialize jQuery UI timepickers + cmb.initDateTimePickers( $timePickers, 'timepicker', 'time_picker' ); + // Initialize jQuery UI datepickers + cmb.initDateTimePickers( $datePickers, 'datepicker', 'date_picker' ); + // Initialize color picker + cmb.initColorPickers( $colorPickers ); + }; + + cmb.initDateTimePickers = function( $selector, method, defaultKey ) { + if ( $selector.length ) { + $selector[ method ]( 'destroy' ).each( function() { + var $this = $( this ); + var fieldOpts = $this.data( method ) || {}; + var options = $.extend( {}, cmb.defaults[ defaultKey ], fieldOpts ); + $this[ method ]( cmb.datePickerSetupOpts( fieldOpts, options, method ) ); + } ); + } + }; + + cmb.datePickerSetupOpts = function( fieldOpts, options, method ) { + var existing = $.extend( {}, options ); + + options.beforeShow = function( input, inst ) { + if ( 'timepicker' === method ) { + cmb.addTimePickerClasses( inst.dpDiv ); + } + + // Wrap datepicker w/ class to narrow the scope of jQuery UI CSS and prevent conflicts + $id( 'ui-datepicker-div' ).addClass( 'cmb2-element' ); + + // Let's be sure to call beforeShow if it was added + if ( 'function' === typeof existing.beforeShow ) { + existing.beforeShow( input, inst ); + } + }; + + if ( 'timepicker' === method ) { + options.onChangeMonthYear = function( year, month, inst, picker ) { + cmb.addTimePickerClasses( inst.dpDiv ); + + // Let's be sure to call onChangeMonthYear if it was added + if ( 'function' === typeof existing.onChangeMonthYear ) { + existing.onChangeMonthYear( year, month, inst, picker ); + } + }; + } + + options.onClose = function( dateText, inst ) { + // Remove the class when we're done with it (and hide to remove FOUC). + var $picker = $id( 'ui-datepicker-div' ).removeClass( 'cmb2-element' ).hide(); + if ( 'timepicker' === method && ! $( inst.input ).val() ) { + // Set the timepicker field value if it's empty. + inst.input.val( $picker.find( '.ui_tpicker_time' ).text() ); + } + + // Let's be sure to call onClose if it was added + if ( 'function' === typeof existing.onClose ) { + existing.onClose( dateText, inst ); + } + }; + + return options; + }; + + // Adds classes to timepicker buttons. + cmb.addTimePickerClasses = function( $picker ) { + var func = cmb.addTimePickerClasses; + func.count = func.count || 0; + + // Wait a bit to let the timepicker render, since these are pre-render events. + setTimeout( function() { + if ( $picker.find( '.ui-priority-secondary' ).length ) { + $picker.find( '.ui-priority-secondary' ).addClass( 'button-secondary' ); + $picker.find( '.ui-priority-primary' ).addClass( 'button-primary' ); + func.count = 0; + } else if ( func.count < 5 ) { + func.count++; + func( $picker ); + } + }, 10 ); + }; + + cmb.initColorPickers = function( $selector ) { + if ( ! $selector.length ) { + return; + } + if ( 'object' === typeof jQuery.wp && 'function' === typeof jQuery.wp.wpColorPicker ) { + + $selector.each( function() { + var $this = $( this ); + var fieldOpts = $this.data( 'colorpicker' ) || {}; + $this.wpColorPicker( $.extend( {}, cmb.defaults.color_picker, fieldOpts ) ); + } ); + + } else { + $selector.each( function( i ) { + $( this ).after( '
              ' ); + $id( 'picker-' + i ).hide().farbtastic( $( this ) ); + } ) + .focus( function() { + $( this ).next().show(); + } ) + .blur( function() { + $( this ).next().hide(); + } ); + } + }; + + cmb.initCodeEditors = function( $selector ) { + cmb.trigger( 'cmb_init_code_editors', $selector ); + + if ( ! cmb.defaults.code_editor || ! wp || ! wp.codeEditor || ! $selector.length ) { + return; + } + + $selector.each( function() { + wp.codeEditor.initialize( + this.id, + cmb.codeEditorArgs( $( this ).data( 'codeeditor' ) ) + ); + } ); + }; + + cmb.codeEditorArgs = function( overrides ) { + var props = [ 'codemirror', 'csslint', 'jshint', 'htmlhint' ]; + var args = $.extend( {}, cmb.defaults.code_editor ); + overrides = overrides || {}; + + for ( var i = props.length - 1; i >= 0; i-- ) { + if ( overrides.hasOwnProperty( props[i] ) ) { + args[ props[i] ] = $.extend( {}, args[ props[i] ] || {}, overrides[ props[i] ] ); + } + } + + return args; + }; + + cmb.makeListSortable = function() { + var $filelist = cmb.metabox().find( '.cmb2-media-status.cmb-attach-list' ); + if ( $filelist.length ) { + $filelist.sortable({ cursor: 'move' }).disableSelection(); + } + }; + + cmb.makeRepeatableSortable = function() { + var $repeatables = cmb.metabox().find( '.cmb-repeat-table .cmb-field-list' ); + + if ( $repeatables.length ) { + $repeatables.sortable({ + items : '.cmb-repeat-row', + cursor: 'move' + }); + } + }; + + cmb.maybeOembed = function( evt ) { + var $this = $( this ); + + var m = { + focusout : function() { + setTimeout( function() { + // if it's been 2 seconds, hide our spinner + cmb.spinner( '.cmb2-metabox', true ); + }, 2000); + }, + keyup : function() { + var betw = function( min, max ) { + return ( evt.which <= max && evt.which >= min ); + }; + // Only Ajax on normal keystrokes + if ( betw( 48, 90 ) || betw( 96, 111 ) || betw( 8, 9 ) || evt.which === 187 || evt.which === 190 ) { + // fire our ajax function + cmb.doAjax( $this, evt ); + } + }, + paste : function() { + // paste event is fired before the value is filled, so wait a bit + setTimeout( function() { cmb.doAjax( $this ); }, 100); + } + }; + + m[ evt.type ](); + }; + + /** + * Resize oEmbed videos to fit in their respective metaboxes + * + * @since 0.9.4 + * + * @return {return} + */ + cmb.resizeoEmbeds = function() { + cmb.metabox().each( function() { + var $this = $( this ); + var $tableWrap = $this.parents('.inside'); + var isSide = $this.parents('.inner-sidebar').length || $this.parents( '#side-sortables' ).length; + var isSmall = isSide; + var isSmallest = false; + if ( ! $tableWrap.length ) { + return true; // continue + } + + // Calculate new width + var tableW = $tableWrap.width(); + + if ( cmb.styleBreakPoint > tableW ) { + isSmall = true; + isSmallest = ( cmb.styleBreakPoint - 62 ) > tableW; + } + + tableW = isSmall ? tableW : Math.round(($tableWrap.width() * 0.82)*0.97); + var newWidth = tableW - 30; + if ( isSmall && ! isSide && ! isSmallest ) { + newWidth = newWidth - 75; + } + if ( newWidth > 639 ) { + return true; // continue + } + + var $embeds = $this.find('.cmb-type-oembed .embed-status'); + var $children = $embeds.children().not('.cmb2-remove-wrapper'); + if ( ! $children.length ) { + return true; // continue + } + + $children.each( function() { + var $this = $( this ); + var iwidth = $this.width(); + var iheight = $this.height(); + var _newWidth = newWidth; + if ( $this.parents( '.cmb-repeat-row' ).length && ! isSmall ) { + // Make room for our repeatable "remove" button column + _newWidth = newWidth - 91; + _newWidth = 785 > tableW ? _newWidth - 15 : _newWidth; + } + // Calc new height + var newHeight = Math.round((_newWidth * iheight)/iwidth); + $this.width(_newWidth).height(newHeight); + }); + }); + }; + + // function for running our ajax + cmb.doAjax = function( $obj ) { + // get typed value + var oembed_url = $obj.val(); + // only proceed if the field contains more than 6 characters + if ( oembed_url.length < 6 ) { + return; + } + + // get field id + var field_id = $obj.attr('id'); + var $context = $obj.closest( '.cmb-td' ); + var $embed_container = $context.find( '.embed-status' ); + var $embed_wrap = $context.find( '.embed_wrap' ); + var $child_el = $embed_container.find( ':first-child' ); + var oembed_width = $embed_container.length && $child_el.length ? $child_el.width() : $obj.width(); + + cmb.log( 'oembed_url', oembed_url, field_id ); + + // show our spinner + cmb.spinner( $context ); + // clear out previous results + $embed_wrap.html(''); + // and run our ajax function + setTimeout( function() { + // if they haven't typed in 500 ms + if ( $( '.cmb2-oembed:focus' ).val() !== oembed_url ) { + return; + } + $.ajax({ + type : 'post', + dataType : 'json', + url : l10n.ajaxurl, + data : { + 'action' : 'cmb2_oembed_handler', + 'oembed_url' : oembed_url, + 'oembed_width' : oembed_width > 300 ? oembed_width : 300, + 'field_id' : field_id, + 'object_id' : $obj.data( 'objectid' ), + 'object_type' : $obj.data( 'objecttype' ), + 'cmb2_ajax_nonce' : l10n.ajax_nonce + }, + success: function(response) { + cmb.log( response ); + // hide our spinner + cmb.spinner( $context, true ); + // and populate our results from ajax response + $embed_wrap.html( response.data ); + } + }); + + }, 500); + + }; + + /** + * Gets jQuery object containing all CMB metaboxes. Caches the result. + * + * @since 1.0.2 + * + * @return {Object} jQuery object containing all CMB metaboxes. + */ + cmb.metabox = function() { + if ( cmb.$metabox ) { + return cmb.$metabox; + } + cmb.$metabox = $('.cmb2-wrap > .cmb2-metabox'); + return cmb.$metabox; + }; + + /** + * Starts/stops contextual spinner. + * + * @since 1.0.1 + * + * @param {object} $context The jQuery parent/context object. + * @param {bool} hide Whether to hide the spinner (will show by default). + * + * @return {void} + */ + cmb.spinner = function( $context, hide ) { + var m = hide ? 'removeClass' : 'addClass'; + $('.cmb-spinner', $context )[ m ]( 'is-active' ); + }; + + /** + * Triggers a jQuery event on the document object. + * + * @since 2.2.3 + * + * @param {string} evtName The name of the event to trigger. + * + * @return {void} + */ + cmb.trigger = function( evtName ) { + var args = Array.prototype.slice.call( arguments, 1 ); + args.push( cmb ); + $document.trigger( evtName, args ); + }; + + /** + * Triggers a jQuery event on the given jQuery object. + * + * @since 2.2.3 + * + * @param {object} $el The jQuery element object. + * @param {string} evtName The name of the event to trigger. + * + * @return {void} + */ + cmb.triggerElement = function( $el, evtName ) { + var args = Array.prototype.slice.call( arguments, 2 ); + args.push( cmb ); + $el.trigger( evtName, args ); + }; + + /** + * Get an argument for a given field. + * + * @since 2.5.0 + * + * @param {string|object} hash The field hash, id, or a jQuery object for a field. + * @param {string} arg The argument to get on the field. + * + * @return {mixed} The argument value. + */ + cmb.getFieldArg = function( hash, arg ) { + return cmb.getField( hash )[ arg ]; + }; + + /** + * Get a field object instances. Can be filtered by passing in a filter callback function. + * e.g. `const fileFields = CMB2.getFields(f => 'file' === f.type);` + * + * @since 2.5.0 + * + * @param {mixed} filterCb An optional filter callback function. + * + * @return array An array of field object instances. + */ + cmb.getFields = function( filterCb ) { + if ( 'function' === typeof filterCb ) { + var fields = []; + $.each( l10n.fields, function( hash, field ) { + if ( filterCb( field, hash ) ) { + fields.push( field ); + } + }); + return fields; + } + + return l10n.fields; + }; + + /** + * Get a field object instance by hash or id. + * + * @since 2.5.0 + * + * @param {string|object} hash The field hash, id, or a jQuery object for a field. + * + * @return {object} The field object or an empty object. + */ + cmb.getField = function( hash ) { + var field = {}; + hash = hash instanceof jQuery ? hash.data( 'hash' ) : hash; + if ( hash ) { + try { + if ( l10n.fields[ hash ] ) { + throw new Error( hash ); + } + + cmb.getFields( function( field ) { + if ( 'function' === typeof hash ) { + if ( hash( field ) ) { + throw new Error( field.hash ); + } + } else if ( field.id && field.id === hash ) { + throw new Error( field.hash ); + } + }); + } catch( e ) { + field = l10n.fields[ e.message ]; + } + } + + return field; + }; + + /** + * Safely log things if query var is set. Accepts same parameters as console.log. + * + * @since 1.0.0 + * + * @return {void} + */ + cmb.log = function() { + if ( l10n.script_debug && console && 'function' === typeof console.log ) { + console.log.apply(console, arguments); + } + }; + + /** + * Replace the last occurrence of a string. + * + * @since 2.2.6 + * + * @param {string} string String to search/replace. + * @param {string} search String to search. + * @param {string} replace String to replace search with. + * + * @return {string} Possibly modified string. + */ + cmb.replaceLast = function( string, search, replace ) { + // find the index of last time word was used + var n = string.lastIndexOf( search ); + + // slice the string in 2, one from the start to the lastIndexOf + // and then replace the word in the rest + return string.slice( 0, n ) + string.slice( n ).replace( search, replace ); + }; + + // Kick it off! + $( cmb.init ); + +})(window, document, jQuery, window.CMB2); diff --git a/inc/vendors/cmb2-plugins/cmb2/js/cmb2.min.js b/inc/vendors/cmb2-plugins/cmb2/js/cmb2.min.js new file mode 100755 index 00000000..4edf2e59 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/js/cmb2.min.js @@ -0,0 +1 @@ +window.CMB2=window.CMB2||{},function(window,document,$,cmb,undefined){"use strict";var $document,l10n=window.cmb2_l10,setTimeout=window.setTimeout,$id=function(selector){return $(document.getElementById(selector))},defaults={idNumber:!1,repeatEls:'input:not([type="button"],[id^=filelist]),select,textarea,.cmb2-media-status',noEmpty:'input:not([type="button"]):not([type="radio"]):not([type="checkbox"]),textarea',repeatUpdate:'input:not([type="button"]),select,textarea,label',styleBreakPoint:450,mediaHandlers:{},defaults:{time_picker:l10n.defaults.time_picker,date_picker:l10n.defaults.date_picker,color_picker:l10n.defaults.color_picker||{},code_editor:l10n.defaults.code_editor},media:{frames:{}}};cmb.init=function(){$document=$(document),$.extend(cmb,defaults),cmb.trigger("cmb_pre_init");var $metabox=cmb.metabox(),$repeatGroup=$metabox.find(".cmb-repeatable-group");cmb.initPickers($metabox.find('input[type="text"].cmb2-timepicker'),$metabox.find('input[type="text"].cmb2-datepicker'),$metabox.find('input[type="text"].cmb2-colorpicker')),cmb.initCodeEditors($metabox.find(".cmb2-textarea-code:not(.disable-codemirror)")),$('

              '+l10n.strings.check_toggle+"

              ").insertBefore(".cmb2-checkbox-list:not(.no-select-all)"),cmb.makeListSortable(),cmb.makeRepeatableSortable(),$metabox.on("change",".cmb2_upload_file",function(){cmb.media.field=$(this).attr("id"),$id(cmb.media.field+"_id").val("")}).on("click",".cmb-multicheck-toggle",cmb.toggleCheckBoxes).on("click",".cmb2-upload-button",cmb.handleMedia).on("click",".cmb-attach-list li, .cmb2-media-status .img-status img, .cmb2-media-status .file-status > span",cmb.handleFileClick).on("click",".cmb2-remove-file-button",cmb.handleRemoveMedia).on("click",".cmb-add-group-row",cmb.addGroupRow).on("click",".cmb-add-row-button",cmb.addAjaxRow).on("click",".cmb-remove-group-row",cmb.removeGroupRow).on("click",".cmb-remove-row-button",cmb.removeAjaxRow).on("keyup paste focusout",".cmb2-oembed",cmb.maybeOembed).on("cmb2_remove_row",".cmb-repeatable-group",cmb.resetTitlesAndIterator).on("click",".cmbhandle, .cmbhandle + .cmbhandle-title",cmb.toggleHandle),$repeatGroup.length&&$repeatGroup.on("cmb2_add_row",cmb.emptyValue).on("cmb2_add_row",cmb.setDefaults).filter(".sortable").each(function(){$(this).find(".cmb-remove-group-row-button").before(' ')}).on("click",".cmb-shift-rows",cmb.shiftRows),setTimeout(cmb.resizeoEmbeds,500),$(window).on("resize",cmb.resizeoEmbeds),$id("addtag").length&&cmb.listenTagAdd(),$(document).on("cmb_init",cmb.mceEnsureSave),cmb.trigger("cmb_init")},cmb.mceEnsureSave=function(){wp.data&&wp.data.hasOwnProperty("subscribe")&&cmb.canTinyMCE()&&wp.data.subscribe(function(){var editor=wp.data.hasOwnProperty("select")?wp.data.select("core/editor"):null;if(editor&&editor.isSavingPost&&editor.isSavingPost()&&window.tinyMCE.editors.length)for(var i=0;i .cmb2-metabox"))})},cmb.resetBoxes=function($boxes){$.each($boxes,function(){cmb.resetBox($(this))})},cmb.resetBox=function($box){$box.find(".wp-picker-clear").trigger("click"),$box.find(".cmb2-remove-file-button").trigger("click"),$box.find(".cmb-row.cmb-repeatable-grouping:not(:first-of-type) .cmb-remove-group-row").click(),$box.find(".cmb-repeat-row:not(:first-child)").remove(),$box.find('input:not([type="button"]),select,textarea').each(function(){var $element=$(this),tagName=$element.prop("tagName");if("INPUT"===tagName){var elType=$element.attr("type");"checkbox"===elType||"radio"===elType?$element.prop("checked",!1):$element.val("")}"SELECT"===tagName&&$("option:selected",this).prop("selected",!1),"TEXTAREA"===tagName&&$element.html("")})},cmb.resetTitlesAndIterator=function(evt){evt.group&&$(".cmb-repeatable-group.repeatable").each(function(){var $table=$(this),groupTitle=$table.find(".cmb-add-group-row").data("grouptitle");$table.find(".cmb-repeatable-grouping").each(function(rowindex){var $row=$(this),$rowTitle=$row.find("h3.cmb-group-title");$row.data("iterator",rowindex),$rowTitle.length&&$rowTitle.text(groupTitle.replace("{#}",rowindex+1))})})},cmb.toggleHandle=function(evt){evt.preventDefault(),cmb.trigger("postbox-toggled",$(this).parent(".postbox").toggleClass("closed"))},cmb.toggleCheckBoxes=function(evt){evt.preventDefault();var $this=$(this),$multicheck=$this.closest(".cmb-td").find("input[type=checkbox]:not([disabled])");$this.data("checked")?($multicheck.prop("checked",!1),$this.data("checked",!1)):($multicheck.prop("checked",!0),$this.data("checked",!0))},cmb.handleMedia=function(evt){evt.preventDefault();var $el=$(this);cmb.attach_id=!$el.hasClass("cmb2-upload-list")&&$el.closest(".cmb-td").find(".cmb2-upload-file-id").val(),cmb.attach_id="0"!==cmb.attach_id&&cmb.attach_id,cmb._handleMedia($el.prev("input.cmb2-upload-file").attr("id"),$el.hasClass("cmb2-upload-list"))},cmb.handleFileClick=function(evt){if(!$(evt.target).is("a")){evt.preventDefault();var $el=$(this),$td=$el.closest(".cmb-td"),isList=$td.find(".cmb2-upload-button").hasClass("cmb2-upload-list");cmb.attach_id=isList?$el.find('input[type="hidden"]').data("id"):$td.find(".cmb2-upload-file-id").val(),cmb.attach_id&&cmb._handleMedia($td.find("input.cmb2-upload-file").attr("id"),isList,cmb.attach_id)}},cmb._handleMedia=function(id,isList){if(wp){var media,handlers;if(handlers=cmb.mediaHandlers,media=cmb.media,media.field=id,media.$field=$id(media.field),media.fieldData=media.$field.data(),media.previewSize=media.fieldData.previewsize,media.sizeName=media.fieldData.sizename,media.fieldName=media.$field.attr("name"),media.isList=isList,id in media.frames)return media.frames[id].open();media.frames[id]=wp.media({title:cmb.metabox().find('label[for="'+id+'"]').text(),library:media.fieldData.queryargs||{},button:{text:l10n.strings[isList?"upload_files":"upload_file"]},multiple:!!isList&&"add"}),media.frames[id].states.first().set("filterable","all"),cmb.trigger("cmb_media_modal_init",media),handlers.list=function(selection,returnIt){var attachmentHtml,fileGroup=[];if(handlers.list.templates||(handlers.list.templates={image:wp.template("cmb2-list-image"),file:wp.template("cmb2-list-file")}),selection.each(function(attachment){attachmentHtml=handlers.getAttachmentHtml(attachment,"list"),fileGroup.push(attachmentHtml)}),returnIt)return fileGroup;media.$field.siblings(".cmb2-media-status").append(fileGroup)},handlers.single=function(selection){handlers.single.templates||(handlers.single.templates={image:wp.template("cmb2-single-image"),file:wp.template("cmb2-single-file")});var attachment=selection.first();media.$field.val(attachment.get("url")),$id(media.field+"_id").val(attachment.get("id"));var attachmentHtml=handlers.getAttachmentHtml(attachment,"single");media.$field.siblings(".cmb2-media-status").slideDown().html(attachmentHtml)},handlers.getAttachmentHtml=function(attachment,templatesId){var isImage="image"===attachment.get("type"),data=handlers.prepareData(attachment,isImage);return handlers[templatesId].templates[isImage?"image":"file"](data)},handlers.prepareData=function(data,image){return image&&handlers.getImageData.call(data,50),data=data.toJSON(),data.mediaField=media.field,data.mediaFieldName=media.fieldName,data.stringRemoveImage=l10n.strings.remove_image,data.stringFile=l10n.strings.file,data.stringDownload=l10n.strings.download,data.stringRemoveFile=l10n.strings.remove_file,data},handlers.getImageData=function(fallbackSize){var previewW=media.previewSize[0]||fallbackSize,previewH=media.previewSize[1]||fallbackSize,url=this.get("url"),width=this.get("width"),height=this.get("height"),sizes=this.get("sizes");return sizes&&(sizes[media.sizeName]?(url=sizes[media.sizeName].url,width=sizes[media.sizeName].width,height=sizes[media.sizeName].height):sizes.large&&(url=sizes.large.url,width=sizes.large.width,height=sizes.large.height)),width>previewW&&(height=Math.floor(previewW*height/width),width=previewW),height>previewH&&(width=Math.floor(previewH*width/height),height=previewH),width||(width=previewW),height||(height="svg"===this.get("filename").split(".").pop()?"100%":previewH),this.set("sizeUrl",url),this.set("sizeWidth",width),this.set("sizeHeight",height),this},handlers.selectFile=function(){var selection=media.frames[id].state().get("selection"),type=isList?"list":"single";cmb.attach_id&&isList?$('[data-id="'+cmb.attach_id+'"]').parents("li").replaceWith(handlers.list(selection,!0)):handlers[type](selection),cmb.trigger("cmb_media_modal_select",selection,media)},handlers.openModal=function(){var attach,selection=media.frames[id].state().get("selection");cmb.attach_id?(attach=wp.media.attachment(cmb.attach_id),attach.fetch(),selection.set(attach?[attach]:[])):selection.reset(),cmb.trigger("cmb_media_modal_open",selection,media)},media.frames[id].on("select",handlers.selectFile).on("open",handlers.openModal),media.frames[id].open()}},cmb.handleRemoveMedia=function(evt){evt.preventDefault();var $this=$(this);return $this.is(".cmb-attach-list .cmb2-remove-file-button")?($this.parents(".cmb2-media-item").remove(),!1):(cmb.media.field=$this.attr("rel"),cmb.metabox().find(document.getElementById(cmb.media.field)).val(""),cmb.metabox().find(document.getElementById(cmb.media.field+"_id")).val(""),$this.parents(".cmb2-media-status").html(""),!1)},cmb.cleanRow=function($row,prevNum,group){var $elements=$row.find(cmb.repeatUpdate);if(group){var $other=$row.find("[id]").not(cmb.repeatUpdate);$row.find(".cmb-repeat-table .cmb-repeat-row:not(:first-child)").remove(),$other.length&&$other.each(function(){var $_this=$(this),oldID=$_this.attr("id"),newID=oldID.replace("_"+prevNum,"_"+cmb.idNumber),$buttons=$row.find('[data-selector="'+oldID+'"]');$_this.attr("id",newID),$buttons.length&&$buttons.attr("data-selector",newID).data("selector",newID)})}return $elements.filter(":checked").removeAttr("checked"),$elements.find(":checked").removeAttr("checked"),$elements.filter(":selected").removeAttr("selected"),$elements.find(":selected").removeAttr("selected",!1),$row.find("h3.cmb-group-title").length&&$row.find("h3.cmb-group-title").text($row.data("title").replace("{#}",cmb.idNumber+1)),$elements.each(function(){cmb.elReplacements($(this),prevNum,group)}),cmb},cmb.elReplacements=function($newInput,prevNum,group){var newID,oldID,oldFor=$newInput.attr("for"),oldVal=$newInput.val(),type=$newInput.prop("type"),defVal=cmb.getFieldArg($newInput,"default"),newVal=void 0!==defVal&&!1!==defVal?defVal:"",tagName=$newInput.prop("tagName"),checkable=("radio"===type||"checkbox"===type)&&oldVal,attrs={};if(oldFor)attrs={for:oldFor.replace("_"+prevNum,"_"+cmb.idNumber)};else{var newName,oldName=$newInput.attr("name");oldID=$newInput.attr("id"),group?(newName=oldName?oldName.replace("["+prevNum+"][","["+cmb.idNumber+"]["):"",newID=oldID?oldID.replace("_"+prevNum+"_","_"+cmb.idNumber+"_"):""):(newName=oldName?cmb.replaceLast(oldName,"["+prevNum+"]","["+cmb.idNumber+"]"):"",newID=oldID?cmb.replaceLast(oldID,"_"+prevNum,"_"+cmb.idNumber):""),attrs={id:newID,name:newName}}if("TEXTAREA"===tagName&&$newInput.html(newVal),"SELECT"===tagName&&void 0!==defVal){var $toSelect=$newInput.find('[value="'+defVal+'"]');$toSelect.length&&$toSelect.attr("selected","selected").prop("selected","selected")}return checkable&&($newInput.removeAttr("checked"),void 0!==defVal&&oldVal===defVal&&$newInput.attr("checked","checked").prop("checked","checked")),!group&&$newInput[0].hasAttribute("data-iterator")&&(attrs["data-iterator"]=cmb.idNumber),$newInput.removeClass("hasDatepicker").val(checkable||newVal).attr(attrs),$newInput},cmb.newRowHousekeeping=function($row){var $colorPicker=$row.find(".wp-picker-container"),$list=$row.find(".cmb2-media-status");return $colorPicker.length&&$colorPicker.each(function(){var $td=$(this).parent();$td.html($td.find('input[type="text"].cmb2-colorpicker').attr("style",""))}),$list.length&&$list.empty(),cmb},cmb.afterRowInsert=function($row){cmb.initPickers($row.find('input[type="text"].cmb2-timepicker'),$row.find('input[type="text"].cmb2-datepicker'),$row.find('input[type="text"].cmb2-colorpicker'))},cmb.updateNameAttr=function(){var $this=$(this),name=$this.attr("name");if(void 0!==name){var prevNum=parseInt($this.parents(".cmb-repeatable-grouping").data("iterator"),10),newNum=prevNum-1,$newName=name.replace("["+prevNum+"]","["+newNum+"]");$this.attr("name",$newName)}},cmb.emptyValue=function(evt,row){$(cmb.noEmpty,row).val("")},cmb.setDefaults=function(evt,row){$(cmb.noEmpty,row).each(function(){var $el=$(this),defVal=cmb.getFieldArg($el,"default");void 0!==defVal&&!1!==defVal&&$el.val(defVal)})},cmb.addGroupRow=function(evt){evt.preventDefault();var $this=$(this);cmb.triggerElement($this,"cmb2_add_group_row_start",$this);var $table=$id($this.data("selector")),$oldRow=$table.find(".cmb-repeatable-grouping").last(),prevNum=parseInt($oldRow.data("iterator"),10);cmb.idNumber=parseInt(prevNum,10)+1;for(var $row=$oldRow.clone(),nodeName=$row.prop("nodeName")||"div",getRowId=function(id){return id=id.split("-"),id.splice(id.length-1,1),id.push(cmb.idNumber),id.join("-")};$table.find('.cmb-repeatable-grouping[data-iterator="'+cmb.idNumber+'"]').length>0;)cmb.idNumber++;cmb.newRowHousekeeping($row.data("title",$this.data("grouptitle"))).cleanRow($row,prevNum,!0),$row.find(".cmb-add-row-button").prop("disabled",!1);var $newRow=$("<"+nodeName+' id="'+getRowId($oldRow.attr("id"))+'" class="postbox cmb-row cmb-repeatable-grouping" data-iterator="'+cmb.idNumber+'">'+$row.html()+"");$oldRow.after($newRow),cmb.afterRowInsert($newRow),cmb.triggerElement($table,{type:"cmb2_add_row",group:!0},$newRow)},cmb.addAjaxRow=function(evt){evt.preventDefault();var $this=$(this),$table=$id($this.data("selector")),$emptyrow=$table.find(".empty-row"),prevNum=parseInt($emptyrow.find("[data-iterator]").data("iterator"),10);cmb.idNumber=parseInt(prevNum,10)+1;var $row=$emptyrow.clone();cmb.newRowHousekeeping($row).cleanRow($row,prevNum),$emptyrow.removeClass("empty-row hidden").addClass("cmb-repeat-row"),$emptyrow.after($row),cmb.afterRowInsert($row),cmb.triggerElement($table,{type:"cmb2_add_row",group:!1},$row)},cmb.removeGroupRow=function(evt){evt.preventDefault();var $this=$(this),confirmation=$this.data("confirm");if(!confirmation||window.confirm(confirmation)){var $table=$id($this.data("selector")),$parent=$this.parents(".cmb-repeatable-grouping");if($table.find(".cmb-repeatable-grouping").length<2)return cmb.resetRow($parent.parents(".cmb-repeatable-group").find(".cmb-add-group-row"),$this);cmb.triggerElement($table,"cmb2_remove_group_row_start",$this),$parent.nextAll(".cmb-repeatable-grouping").find(cmb.repeatEls).each(cmb.updateNameAttr),$parent.remove(),cmb.triggerElement($table,{type:"cmb2_remove_row",group:!0})}},cmb.removeAjaxRow=function(evt){evt.preventDefault();var $this=$(this);if(!$this.hasClass("button-disabled")){var $parent=$this.parents(".cmb-row"),$table=$this.parents(".cmb-repeat-table");if($table.find(".cmb-row").length<=2)return cmb.resetRow($parent.find(".cmb-add-row-button"),$this);$parent.hasClass("empty-row")&&$parent.prev().addClass("empty-row").removeClass("cmb-repeat-row"),$this.parents(".cmb-repeat-table .cmb-row").remove(),cmb.triggerElement($table,{type:"cmb2_remove_row",group:!1})}},cmb.resetRow=function($addNewBtn,$removeBtn){$addNewBtn.trigger("click"),$removeBtn.trigger("click")},cmb.shiftRows=function(evt){evt.preventDefault();var $this=$(this),$from=$this.parents(".cmb-repeatable-grouping"),$goto=$this.hasClass("move-up")?$from.prev(".cmb-repeatable-grouping"):$from.next(".cmb-repeatable-grouping");if(cmb.triggerElement($this,"cmb2_shift_rows_enter",$this,$from,$goto),$goto.length){cmb.triggerElement($this,"cmb2_shift_rows_start",$this,$from,$goto);var inputVals=[];$from.find(cmb.repeatEls).each(function(){var val,$element=$(this),elType=$element.attr("type");val=$element.hasClass("cmb2-media-status")?$element.html():"checkbox"===elType||"radio"===elType?$element.is(":checked"):"select"===$element.prop("tagName")?$element.is(":selected"):$element.val(),inputVals.push({val:val,$:$element})}),$goto.find(cmb.repeatEls).each(function(index){var val,$element=$(this),elType=$element.attr("type");if($element.hasClass("cmb2-media-status")){var toRowId=$element.closest(".cmb-repeatable-grouping").attr("data-iterator"),fromRowId=inputVals[index].$.closest(".cmb-repeatable-grouping").attr("data-iterator");val=$element.html(),$element.html(inputVals[index].val),inputVals[index].$.html(val),inputVals[index].$.find("input").each(function(){var name=$(this).attr("name");name=name.replace("["+toRowId+"]","["+fromRowId+"]"),$(this).attr("name",name)}),$element.find("input").each(function(){var name=$(this).attr("name");name=name.replace("["+fromRowId+"]","["+toRowId+"]"),$(this).attr("name",name)})}else"checkbox"===elType?(inputVals[index].$.prop("checked",$element.is(":checked")),$element.prop("checked",inputVals[index].val)):"radio"===elType?($element.is(":checked")&&inputVals[index].$.attr("data-checked","true"),inputVals[index].$.is(":checked")&&$element.attr("data-checked","true")):"select"===$element.prop("tagName")?(inputVals[index].$.prop("selected",$element.is(":selected")),$element.prop("selected",inputVals[index].val)):(inputVals[index].$.val($element.val()),$element.val(inputVals[index].val))}),$from.find("input[data-checked=true]").prop("checked",!0).removeAttr("data-checked"),$goto.find("input[data-checked=true]").prop("checked",!0).removeAttr("data-checked"),$from.find('input[type="text"].cmb2-colorpicker').trigger("change"),$goto.find('input[type="text"].cmb2-colorpicker').trigger("change"),cmb.triggerElement($this,"cmb2_shift_rows_complete",$this,$from,$goto)}},cmb.initPickers=function($timePickers,$datePickers,$colorPickers){cmb.trigger("cmb_init_pickers",{time:$timePickers,date:$datePickers,color:$colorPickers}),cmb.initDateTimePickers($timePickers,"timepicker","time_picker"),cmb.initDateTimePickers($datePickers,"datepicker","date_picker"),cmb.initColorPickers($colorPickers)},cmb.initDateTimePickers=function($selector,method,defaultKey){$selector.length&&$selector[method]("destroy").each(function(){var $this=$(this),fieldOpts=$this.data(method)||{},options=$.extend({},cmb.defaults[defaultKey],fieldOpts);$this[method](cmb.datePickerSetupOpts(fieldOpts,options,method))})},cmb.datePickerSetupOpts=function(fieldOpts,options,method){var existing=$.extend({},options);return options.beforeShow=function(input,inst){"timepicker"===method&&cmb.addTimePickerClasses(inst.dpDiv),$id("ui-datepicker-div").addClass("cmb2-element"),"function"==typeof existing.beforeShow&&existing.beforeShow(input,inst)},"timepicker"===method&&(options.onChangeMonthYear=function(year,month,inst,picker){cmb.addTimePickerClasses(inst.dpDiv),"function"==typeof existing.onChangeMonthYear&&existing.onChangeMonthYear(year,month,inst,picker)}),options.onClose=function(dateText,inst){var $picker=$id("ui-datepicker-div").removeClass("cmb2-element").hide();"timepicker"!==method||$(inst.input).val()||inst.input.val($picker.find(".ui_tpicker_time").text()),"function"==typeof existing.onClose&&existing.onClose(dateText,inst)},options},cmb.addTimePickerClasses=function($picker){var func=cmb.addTimePickerClasses;func.count=func.count||0,setTimeout(function(){$picker.find(".ui-priority-secondary").length?($picker.find(".ui-priority-secondary").addClass("button-secondary"),$picker.find(".ui-priority-primary").addClass("button-primary"),func.count=0):func.count<5&&(func.count++,func($picker))},10)},cmb.initColorPickers=function($selector){$selector.length&&("object"==typeof jQuery.wp&&"function"==typeof jQuery.wp.wpColorPicker?$selector.each(function(){var $this=$(this),fieldOpts=$this.data("colorpicker")||{};$this.wpColorPicker($.extend({},cmb.defaults.color_picker,fieldOpts))}):$selector.each(function(i){$(this).after('
              '),$id("picker-"+i).hide().farbtastic($(this))}).focus(function(){$(this).next().show()}).blur(function(){$(this).next().hide()}))},cmb.initCodeEditors=function($selector){cmb.trigger("cmb_init_code_editors",$selector),cmb.defaults.code_editor&&wp&&wp.codeEditor&&$selector.length&&$selector.each(function(){wp.codeEditor.initialize(this.id,cmb.codeEditorArgs($(this).data("codeeditor")))})},cmb.codeEditorArgs=function(overrides){var props=["codemirror","csslint","jshint","htmlhint"],args=$.extend({},cmb.defaults.code_editor);overrides=overrides||{};for(var i=props.length-1;i>=0;i--)overrides.hasOwnProperty(props[i])&&(args[props[i]]=$.extend({},args[props[i]]||{},overrides[props[i]]));return args},cmb.makeListSortable=function(){var $filelist=cmb.metabox().find(".cmb2-media-status.cmb-attach-list");$filelist.length&&$filelist.sortable({cursor:"move"}).disableSelection()},cmb.makeRepeatableSortable=function(){var $repeatables=cmb.metabox().find(".cmb-repeat-table .cmb-field-list");$repeatables.length&&$repeatables.sortable({items:".cmb-repeat-row",cursor:"move"})},cmb.maybeOembed=function(evt){var $this=$(this);({focusout:function(){setTimeout(function(){cmb.spinner(".cmb2-metabox",!0)},2e3)},keyup:function(){var betw=function(min,max){return evt.which<=max&&evt.which>=min};(betw(48,90)||betw(96,111)||betw(8,9)||187===evt.which||190===evt.which)&&cmb.doAjax($this,evt)},paste:function(){setTimeout(function(){cmb.doAjax($this)},100)}})[evt.type]()},cmb.resizeoEmbeds=function(){cmb.metabox().each(function(){var $this=$(this),$tableWrap=$this.parents(".inside"),isSide=$this.parents(".inner-sidebar").length||$this.parents("#side-sortables").length,isSmall=isSide,isSmallest=!1;if(!$tableWrap.length)return!0;var tableW=$tableWrap.width();cmb.styleBreakPoint>tableW&&(isSmall=!0,isSmallest=cmb.styleBreakPoint-62>tableW),tableW=isSmall?tableW:Math.round(.82*$tableWrap.width()*.97);var newWidth=tableW-30;if(!isSmall||isSide||isSmallest||(newWidth-=75),newWidth>639)return!0;var $embeds=$this.find(".cmb-type-oembed .embed-status"),$children=$embeds.children().not(".cmb2-remove-wrapper");if(!$children.length)return!0;$children.each(function(){var $this=$(this),iwidth=$this.width(),iheight=$this.height(),_newWidth=newWidth;$this.parents(".cmb-repeat-row").length&&!isSmall&&(_newWidth=newWidth-91,_newWidth=785>tableW?_newWidth-15:_newWidth);var newHeight=Math.round(_newWidth*iheight/iwidth);$this.width(_newWidth).height(newHeight)})})},cmb.doAjax=function($obj){var oembed_url=$obj.val();if(!(oembed_url.length<6)){var field_id=$obj.attr("id"),$context=$obj.closest(".cmb-td"),$embed_container=$context.find(".embed-status"),$embed_wrap=$context.find(".embed_wrap"),$child_el=$embed_container.find(":first-child"),oembed_width=$embed_container.length&&$child_el.length?$child_el.width():$obj.width();cmb.log("oembed_url",oembed_url,field_id),cmb.spinner($context),$embed_wrap.html(""),setTimeout(function(){$(".cmb2-oembed:focus").val()===oembed_url&&$.ajax({type:"post",dataType:"json",url:l10n.ajaxurl,data:{action:"cmb2_oembed_handler",oembed_url:oembed_url,oembed_width:oembed_width>300?oembed_width:300,field_id:field_id,object_id:$obj.data("objectid"),object_type:$obj.data("objecttype"),cmb2_ajax_nonce:l10n.ajax_nonce},success:function(response){cmb.log(response),cmb.spinner($context,!0),$embed_wrap.html(response.data)}})},500)}},cmb.metabox=function(){return cmb.$metabox?cmb.$metabox:(cmb.$metabox=$(".cmb2-wrap > .cmb2-metabox"),cmb.$metabox)},cmb.spinner=function($context,hide){var m=hide?"removeClass":"addClass";$(".cmb-spinner",$context)[m]("is-active")},cmb.trigger=function(evtName){var args=Array.prototype.slice.call(arguments,1);args.push(cmb),$document.trigger(evtName,args)},cmb.triggerElement=function($el,evtName){var args=Array.prototype.slice.call(arguments,2);args.push(cmb),$el.trigger(evtName,args)},cmb.getFieldArg=function(hash,arg){return cmb.getField(hash)[arg]},cmb.getFields=function(filterCb){if("function"==typeof filterCb){var fields=[];return $.each(l10n.fields,function(hash,field){filterCb(field,hash)&&fields.push(field)}),fields}return l10n.fields},cmb.getField=function(hash){var field={};if(hash=hash instanceof jQuery?hash.data("hash"):hash)try{if(l10n.fields[hash])throw new Error(hash);cmb.getFields(function(field){if("function"==typeof hash){if(hash(field))throw new Error(field.hash)}else if(field.id&&field.id===hash)throw new Error(field.hash)})}catch(e){field=l10n.fields[e.message]}return field},cmb.log=function(){l10n.script_debug&&console&&"function"==typeof console.log&&console.log.apply(console,arguments)},cmb.replaceLast=function(string,search,replace){var n=string.lastIndexOf(search);return string.slice(0,n)+string.slice(n).replace(search,replace)},$(cmb.init)}(window,document,jQuery,window.CMB2),window.CMB2=window.CMB2||{},window.CMB2.wysiwyg=window.CMB2.wysiwyg||{},function(window,document,$,cmb,wysiwyg,undefined){"use strict";function delayedInit(){0===toBeDestroyed.length?toBeInitialized.forEach(function(toInit){toBeInitialized.splice(toBeInitialized.indexOf(toInit),1),wysiwyg.init.apply(wysiwyg,toInit)}):window.setTimeout(delayedInit,100)}function delayedDestroy(){toBeDestroyed.forEach(function(id){toBeDestroyed.splice(toBeDestroyed.indexOf(id),1),wysiwyg.destroy(id)})}function getGroupData(data){var groupid=data.groupid,fieldid=data.fieldid;return all[groupid]&&all[groupid][fieldid]||(all[groupid]=all[groupid]||{},all[groupid][fieldid]={template:wp.template("cmb2-wysiwyg-"+groupid+"-"+fieldid),defaults:{mce:$.extend({},tinyMCEPreInit.mceInit["cmb2_i_"+groupid+fieldid]),qt:$.extend({},tinyMCEPreInit.qtInit["cmb2_i_"+groupid+fieldid])}},delete tinyMCEPreInit.mceInit["cmb2_i_"+groupid+fieldid],delete tinyMCEPreInit.qtInit["cmb2_i_"+groupid+fieldid]),all[groupid][fieldid]}function initOptions(options){var prop,newSettings,newQTS,nameRegex=new RegExp("cmb2_n_"+options.groupid+options.fieldid,"g"),idRegex=new RegExp("cmb2_i_"+options.groupid+options.fieldid,"g");if(void 0===tinyMCEPreInit.mceInit[options.id]){newSettings=$.extend({},options.defaults.mce);for(prop in newSettings)"string"==typeof newSettings[prop]&&(newSettings[prop]=newSettings[prop].replace(idRegex,options.id).replace(nameRegex,options.name));tinyMCEPreInit.mceInit[options.id]=newSettings}if(void 0===tinyMCEPreInit.qtInit[options.id]){newQTS=$.extend({},options.defaults.qt);for(prop in newQTS)"string"==typeof newQTS[prop]&&(newQTS[prop]=newQTS[prop].replace(idRegex,options.id).replace(nameRegex,options.name));tinyMCEPreInit.qtInit[options.id]=newQTS}}var toBeDestroyed=[],toBeInitialized=[],all=wysiwyg.all={};wysiwyg.initAll=function(){var $this,data,initiated;$(".cmb2-wysiwyg-placeholder").each(function(){$this=$(this),data=$this.data(),data.groupid&&(data.id=$this.attr("id"),data.name=$this.attr("name"),data.value=$this.val(),wysiwyg.init($this,data,!1),initiated=!0)}),!0===initiated&&(void 0!==window.QTags&&window.QTags._buttonsInit(),$(document).on("cmb2_add_row",wysiwyg.addRow).on("cmb2_remove_group_row_start",wysiwyg.destroyRowEditors).on("cmb2_shift_rows_start",wysiwyg.shiftStart).on("cmb2_shift_rows_complete",wysiwyg.shiftComplete))},wysiwyg.addRow=function(evt,$row){wysiwyg.initRow($row,evt)},wysiwyg.destroyRowEditors=function(evt,$btn){wysiwyg.destroy($btn.parents(".cmb-repeatable-grouping").find(".wp-editor-area").attr("id"))},wysiwyg.shiftStart=function(evt,$btn,$from,$to){$from.add($to).find(".wp-editor-wrap textarea").each(function(){wysiwyg.destroy($(this).attr("id"))})},wysiwyg.shiftComplete=function(evt,$btn,$from,$to){$from.add($to).each(function(){wysiwyg.initRow($(this),evt)})},wysiwyg.initRow=function($row,evt){var $toReplace,data,defVal;$row.find(".cmb2-wysiwyg-inner-wrap").each(function(){$toReplace=$(this),data=$toReplace.data(),defVal=cmb.getFieldArg(data.hash,"default",""),defVal=void 0!==defVal&&!1!==defVal?defVal:"",data.iterator=$row.data("iterator"),data.fieldid=data.id,data.id=data.groupid+"_"+data.iterator+"_"+data.fieldid,data.name=data.groupid+"["+data.iterator+"]["+data.fieldid+"]",data.value="cmb2_add_row"!==evt.type&&$toReplace.find(".wp-editor-area").length?$toReplace.find(".wp-editor-area").val():defVal,0===toBeDestroyed.length?wysiwyg.init($toReplace,data):(toBeInitialized.push([$toReplace,data]),window.setTimeout(delayedInit,100))})},wysiwyg.init=function($toReplace,data,buttonsInit){if(!data.groupid)return!1;var mceActive=cmb.canTinyMCE(),qtActive="function"==typeof window.quicktags;$.extend(data,getGroupData(data)),initOptions(data),$toReplace.replaceWith(data.template(data)),mceActive&&window.tinyMCE.init(tinyMCEPreInit.mceInit[data.id]),qtActive&&window.quicktags(tinyMCEPreInit.qtInit[data.id]),mceActive&&$(document.getElementById(data.id)).parents(".wp-editor-wrap").removeClass("html-active").addClass("tmce-active"),!1!==buttonsInit&&void 0!==window.QTags&&window.QTags._buttonsInit()},wysiwyg.destroy=function(id){if(cmb.canTinyMCE()){var editor=tinyMCE.get(id);null!==editor&&void 0!==editor?(editor.destroy(),void 0===tinyMCEPreInit.mceInit[id]&&delete tinyMCEPreInit.mceInit[id],void 0===tinyMCEPreInit.qtInit[id]&&delete tinyMCEPreInit.qtInit[id]):-1===toBeDestroyed.indexOf(id)&&(toBeDestroyed.push(id),window.setTimeout(delayedDestroy,100))}},$(document).on("cmb_init",wysiwyg.initAll)}(window,document,jQuery,window.CMB2,window.CMB2.wysiwyg); \ No newline at end of file diff --git a/inc/vendors/cmb2-plugins/cmb2/js/index.php b/inc/vendors/cmb2-plugins/cmb2/js/index.php new file mode 100755 index 00000000..eea59b98 --- /dev/null +++ b/inc/vendors/cmb2-plugins/cmb2/js/index.php @@ -0,0 +1,2 @@ +0&&"object"!=typeof timezoneList[0])for(;tzl>tzi;tzi++)tzv=timezoneList[tzi],timezoneList[tzi]={value:tzv,label:$.timepicker.timezoneOffsetString(tzv,tp_inst.support.iso8601)};return tp_inst._defaults.timezoneList=timezoneList,tp_inst.timezone=null!==tp_inst._defaults.timezone?$.timepicker.timezoneOffsetNumber(tp_inst._defaults.timezone):-1*(new Date).getTimezoneOffset(),tp_inst.hour=tp_inst._defaults.hourtp_inst._defaults.hourMax?tp_inst._defaults.hourMax:tp_inst._defaults.hour,tp_inst.minute=tp_inst._defaults.minutetp_inst._defaults.minuteMax?tp_inst._defaults.minuteMax:tp_inst._defaults.minute,tp_inst.second=tp_inst._defaults.secondtp_inst._defaults.secondMax?tp_inst._defaults.secondMax:tp_inst._defaults.second,tp_inst.millisec=tp_inst._defaults.millisectp_inst._defaults.millisecMax?tp_inst._defaults.millisecMax:tp_inst._defaults.millisec,tp_inst.microsec=tp_inst._defaults.microsectp_inst._defaults.microsecMax?tp_inst._defaults.microsecMax:tp_inst._defaults.microsec,tp_inst.ampm="",tp_inst.$input=$input,tp_inst._defaults.altField&&(tp_inst.$altInput=$(tp_inst._defaults.altField),tp_inst._defaults.altRedirectFocus===!0&&tp_inst.$altInput.css({cursor:"pointer"}).focus(function(){$input.trigger("focus")})),(0===tp_inst._defaults.minDate||0===tp_inst._defaults.minDateTime)&&(tp_inst._defaults.minDate=new Date),(0===tp_inst._defaults.maxDate||0===tp_inst._defaults.maxDateTime)&&(tp_inst._defaults.maxDate=new Date),void 0!==tp_inst._defaults.minDate&&tp_inst._defaults.minDate instanceof Date&&(tp_inst._defaults.minDateTime=new Date(tp_inst._defaults.minDate.getTime())),void 0!==tp_inst._defaults.minDateTime&&tp_inst._defaults.minDateTime instanceof Date&&(tp_inst._defaults.minDate=new Date(tp_inst._defaults.minDateTime.getTime())),void 0!==tp_inst._defaults.maxDate&&tp_inst._defaults.maxDate instanceof Date&&(tp_inst._defaults.maxDateTime=new Date(tp_inst._defaults.maxDate.getTime())),void 0!==tp_inst._defaults.maxDateTime&&tp_inst._defaults.maxDateTime instanceof Date&&(tp_inst._defaults.maxDate=new Date(tp_inst._defaults.maxDateTime.getTime())),tp_inst.$input.bind("focus",function(){tp_inst._onFocus()}),tp_inst},_addTimePicker:function(e){var t=this.$altInput&&this._defaults.altFieldTimeOnly?this.$input.val()+" "+this.$altInput.val():this.$input.val();this.timeDefined=this._parseTime(t),this._limitMinMaxDateTime(e,!1),this._injectTimePicker()},_parseTime:function(e,t){if(this.inst||(this.inst=$.datepicker._getInst(this.$input[0])),t||!this._defaults.timeOnly){var i=$.datepicker._get(this.inst,"dateFormat");try{var s=parseDateTimeInternal(i,this._defaults.timeFormat,e,$.datepicker._getFormatConfig(this.inst),this._defaults);if(!s.timeObj)return!1;$.extend(this,s.timeObj)}catch(a){return $.timepicker.log("Error parsing the date/time string: "+a+"\ndate/time string = "+e+"\ntimeFormat = "+this._defaults.timeFormat+"\ndateFormat = "+i),!1}return!0}var n=$.datepicker.parseTime(this._defaults.timeFormat,e,this._defaults);return n?($.extend(this,n),!0):!1},_injectTimePicker:function(){var e=this.inst.dpDiv,t=this.inst.settings,i=this,s="",a="",n=null,r={},l={},o=null,c=0,u=0;if(0===e.find("div.ui-timepicker-div").length&&t.showTimepicker){var m=' style="display:none;"',d='
              '+'
              "+t.timeText+"
              "+'
              ";for(c=0,u=this.units.length;u>c;c++){if(s=this.units[c],a=s.substr(0,1).toUpperCase()+s.substr(1),n=null!==t["show"+a]?t["show"+a]:this.support[s],r[s]=parseInt(t[s+"Max"]-(t[s+"Max"]-t[s+"Min"])%t["step"+a],10),l[s]=0,d+='
              "+t[s+"Text"]+"
              "+'
              ",n&&t[s+"Grid"]>0){if(d+='
              ',"hour"===s)for(var h=t[s+"Min"];r[s]>=h;h+=parseInt(t[s+"Grid"],10)){l[s]++;var p=$.datepicker.formatTime(this.support.ampm?"hht":"HH",{hour:h},t);d+='"}else for(var _=t[s+"Min"];r[s]>=_;_+=parseInt(t[s+"Grid"],10))l[s]++,d+='";d+="
              '+p+"'+(10>_?"0":"")+_+"
              "}d+="
              "}var f=null!==t.showTimezone?t.showTimezone:this.support.timezone;d+='
              "+t.timezoneText+"
              ",d+='
              ",d+="
              ";var g=$(d);for(t.timeOnly===!0&&(g.prepend('
              '+t.timeOnlyTitle+"
              "+"
              "),e.find(".ui-datepicker-header, .ui-datepicker-calendar").hide()),c=0,u=i.units.length;u>c;c++)s=i.units[c],a=s.substr(0,1).toUpperCase()+s.substr(1),n=null!==t["show"+a]?t["show"+a]:this.support[s],i[s+"_slider"]=i.control.create(i,g.find(".ui_tpicker_"+s+"_slider"),s,i[s],t[s+"Min"],r[s],t["step"+a]),n&&t[s+"Grid"]>0&&(o=100*l[s]*t[s+"Grid"]/(r[s]-t[s+"Min"]),g.find(".ui_tpicker_"+s+" table").css({width:o+"%",marginLeft:t.isRTL?"0":o/(-2*l[s])+"%",marginRight:t.isRTL?o/(-2*l[s])+"%":"0",borderCollapse:"collapse"}).find("td").click(function(){var e=$(this),t=e.html(),a=parseInt(t.replace(/[^0-9]/g),10),n=t.replace(/[^apm]/gi),r=e.data("for");"hour"===r&&(-1!==n.indexOf("p")&&12>a?a+=12:-1!==n.indexOf("a")&&12===a&&(a=0)),i.control.value(i,i[r+"_slider"],s,a),i._onTimeChange(),i._onSelectHandler()}).css({cursor:"pointer",width:100/l[s]+"%",textAlign:"center",overflow:"hidden"}));if(this.timezone_select=g.find(".ui_tpicker_timezone").append("").find("select"),$.fn.append.apply(this.timezone_select,$.map(t.timezoneList,function(e){return $("
              ', + _wrap = '
              ', + _button = '', + // Prevent CSS issues in < WordPress 4.9 + _deprecated = ( wpColorPickerL10n.current !== undefined ); + // Declare some global variables when is deprecated or not + if ( _deprecated ) { + var _before = ''; + } else { + var _before = '', + _wrappingLabel = '', + _wrappingLabelText = ''; + } + /** + * Overwrite Color + * for enable support rbga + */ + Color.fn.toString = function() { + if ( this._alpha < 1 ) + return this.toCSS( 'rgba', this._alpha ).replace( /\s+/g, '' ); + + var hex = parseInt( this._color, 10 ).toString( 16 ); + + if ( this.error ) + return ''; + + if ( hex.length < 6 ) + hex = ( '00000' + hex ).substr( -6 ); + + return '#' + hex; + }; + + /** + * Overwrite wpColorPicker + */ + $.widget( 'wp.wpColorPicker', $.wp.wpColorPicker, { + _hasAlpha: true, + /** + * @summary Creates the color picker. + * + * Creates the color picker, sets default values, css classes and wraps it all in HTML. + * + * @since 3.5.0 + * + * @access private + * + * @returns {void} + */ + _create: function() { + // Return early if Iris support is missing. + if ( ! $.support.iris ) { + return; + } + + var self = this, + el = self.element; + + // Override default options with options bound to the element. + $.extend( self.options, el.data() ); + + // Create a color picker which only allows adjustments to the hue. + if ( self.options.type === 'hue' ) { + return self._createHueOnly(); + } + + // Bind the close event. + self.close = $.proxy( self.close, self ); + + self.initialValue = el.val(); + + // Add a CSS class to the input field. + el.addClass( 'wp-color-picker' ); + + if ( _deprecated ) { + el.hide().wrap( _wrap ); + self.wrap = el.parent(); + self.toggler = $( _before ) + .insertBefore( el ) + .css( { backgroundColor : self.initialValue } ) + .attr( 'title', wpColorPickerL10n.pick ) + .attr( 'data-current', wpColorPickerL10n.current ); + self.pickerContainer = $( _after ).insertAfter( el ); + self.button = $( _button ).addClass('hidden'); + } else { + /* + * Check if there's already a wrapping label, e.g. in the Customizer. + * If there's no label, add a default one to match the Customizer template. + */ + if ( ! el.parent( 'label' ).length ) { + // Wrap the input field in the default label. + el.wrap( _wrappingLabel ); + // Insert the default label text. + self.wrappingLabelText = $( _wrappingLabelText ) + .insertBefore( el ) + .text( wpColorPickerL10n.defaultLabel ); + } + + /* + * At this point, either it's the standalone version or the Customizer + * one, we have a wrapping label to use as hook in the DOM, let's store it. + */ + self.wrappingLabel = el.parent(); + + // Wrap the label in the main wrapper. + self.wrappingLabel.wrap( _wrap ); + // Store a reference to the main wrapper. + self.wrap = self.wrappingLabel.parent(); + // Set up the toggle button and insert it before the wrapping label. + self.toggler = $( _before ) + .insertBefore( self.wrappingLabel ) + .css( { backgroundColor: self.initialValue } ); + // Set the toggle button span element text. + self.toggler.find( '.wp-color-result-text' ).text( wpColorPickerL10n.pick ); + // Set up the Iris container and insert it after the wrapping label. + self.pickerContainer = $( _after ).insertAfter( self.wrappingLabel ); + // Store a reference to the Clear/Default button. + self.button = $( _button ); + } + + // Set up the Clear/Default button. + if ( self.options.defaultColor ) { + self.button.addClass( 'wp-picker-default' ).val( wpColorPickerL10n.defaultString ); + if ( ! _deprecated ) { + self.button.attr( 'aria-label', wpColorPickerL10n.defaultAriaLabel ); + } + } else { + self.button.addClass( 'wp-picker-clear' ).val( wpColorPickerL10n.clear ); + if ( ! _deprecated ) { + self.button.attr( 'aria-label', wpColorPickerL10n.clearAriaLabel ); + } + } + + if ( _deprecated ) { + el.wrap( '' ).after( self.button ); + } else { + // Wrap the wrapping label in its wrapper and append the Clear/Default button. + self.wrappingLabel + .wrap( '
              ',d='
              ',e='',f=void 0!==wpColorPickerL10n.current;if(f)var g='';else var g='',h="",i='';Color.fn.toString=function(){if(this._alpha<1)return this.toCSS("rgba",this._alpha).replace(/\s+/g,"");var a=parseInt(this._color,10).toString(16);return this.error?"":(a.length<6&&(a=("00000"+a).substr(-6)),"#"+a)},a.widget("wp.wpColorPicker",a.wp.wpColorPicker,{_hasAlpha:!0,_create:function(){if(a.support.iris){var j=this,k=j.element;if(a.extend(j.options,k.data()),"hue"===j.options.type)return j._createHueOnly();j.close=a.proxy(j.close,j),j.initialValue=k.val(),k.addClass("wp-color-picker"),f?(k.hide().wrap(d),j.wrap=k.parent(),j.toggler=a(g).insertBefore(k).css({backgroundColor:j.initialValue}).attr("title",wpColorPickerL10n.pick).attr("data-current",wpColorPickerL10n.current),j.pickerContainer=a(c).insertAfter(k),j.button=a(e).addClass("hidden")):(k.parent("label").length||(k.wrap(h),j.wrappingLabelText=a(i).insertBefore(k).text(wpColorPickerL10n.defaultLabel)),j.wrappingLabel=k.parent(),j.wrappingLabel.wrap(d),j.wrap=j.wrappingLabel.parent(),j.toggler=a(g).insertBefore(j.wrappingLabel).css({backgroundColor:j.initialValue}),j.toggler.find(".wp-color-result-text").text(wpColorPickerL10n.pick),j.pickerContainer=a(c).insertAfter(j.wrappingLabel),j.button=a(e)),j.options.defaultColor?(j.button.addClass("wp-picker-default").val(wpColorPickerL10n.defaultString),f||j.button.attr("aria-label",wpColorPickerL10n.defaultAriaLabel)):(j.button.addClass("wp-picker-clear").val(wpColorPickerL10n.clear),f||j.button.attr("aria-label",wpColorPickerL10n.clearAriaLabel)),f?k.wrap('').after(j.button):(j.wrappingLabel.wrap('Menus screen to manage your menus.', 'opalestate-pro' ), admin_url( 'nav-menus.php' ) ), + 'condition' => [ 'enable_custom_menu' => 'yes' ], + ] + ); + } + + $this->end_controls_section(); + + $this->start_controls_section( + 'section_general_style_content', + [ + 'label' => esc_html__( 'General', 'opalestate-pro' ), + 'tab' => Controls_Manager::TAB_STYLE, + ] + ); + + $this->add_control( + 'toggle_align', + [ + 'label' => esc_html__( 'Alignment', 'opalestate-pro' ), + 'type' => Controls_Manager::CHOOSE, + 'options' => [ + 'left' => [ + 'title' => esc_html__( 'Left', 'opalestate-pro' ), + 'icon' => 'eicon-h-align-left', + ], + 'center' => [ + 'title' => esc_html__( 'Center', 'opalestate-pro' ), + 'icon' => 'eicon-h-align-center', + ], + 'right' => [ + 'title' => esc_html__( 'Right', 'opalestate-pro' ), + 'icon' => 'eicon-h-align-right', + ], + ], + 'selectors' => [ + '{{WRAPPER}} .elementor-widget-container' => 'text-align: {{VALUE}}', + ], + + ] + ); + + $this->end_controls_section(); + + + $this->start_controls_section( + 'section_label_style_content', + [ + 'label' => esc_html__( 'Label', 'opalestate-pro' ), + 'tab' => Controls_Manager::TAB_STYLE, + ] + ); + + $this->add_control( + 'title_color', + [ + 'label' => esc_html__( 'Color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .site-header-account .account-label' => 'color: {{VALUE}};', + ], + 'scheme' => [ + 'type' => Scheme_Color::get_type(), + 'value' => Scheme_Color::COLOR_1, + ], + ] + ); + + $this->add_group_control( + Group_Control_Typography::get_type(), + [ + 'name' => 'title_typography', + 'selector' => '{{WRAPPER}} .site-header-account .account-label', + 'scheme' => Scheme_Typography::TYPOGRAPHY_1, + ] + ); + + $this->end_controls_section(); + + $this->start_controls_section( + 'section_icon_style_content', + [ + 'label' => esc_html__( 'Icon', 'opalestate-pro' ), + 'tab' => Controls_Manager::TAB_STYLE, + ] + ); + $this->start_controls_tabs( 'tabs_icon_style' ); + + $this->start_controls_tab( + 'tab_icon_normal', + [ + 'label' => esc_html__( 'Normal', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'icon_color', + [ + 'label' => esc_html__( 'Icon Color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .site-header-account i' => 'color: {{VALUE}};', + ], + 'scheme' => [ + 'type' => Scheme_Color::get_type(), + 'value' => Scheme_Color::COLOR_1, + ], + ] + ); + + $this->add_control( + 'background_color', + [ + 'label' => esc_html__( 'Background Color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .site-header-account i' => 'background-color: {{VALUE}};', + ], + ] + ); + + $this->add_responsive_control( + 'icon_fontsize', + [ + 'label' => esc_html__( 'Icon Font Size', 'opalestate-pro' ), + 'type' => Controls_Manager::SLIDER, + 'range' => [ + 'px' => [ + 'min' => 0, + 'max' => 100, + ], + ], + 'selectors' => [ + '{{WRAPPER}} .site-header-account i' => 'font-size: {{SIZE}}{{UNIT}};', + ], + ] + ); + + $this->add_group_control( + Group_Control_Border::get_type(), + [ + 'name' => 'icon_border', + 'placeholder' => '1px', + 'default' => '1px', + 'selector' => '{{WRAPPER}} .site-header-account i', + 'separator' => 'before', + + ] + ); + + $this->add_control( + 'icon_border_radius', + [ + 'label' => esc_html__( 'Border Radius', 'opalestate-pro' ), + 'type' => Controls_Manager::DIMENSIONS, + 'size_units' => [ 'px', '%' ], + 'selectors' => [ + '{{WRAPPER}} .site-header-account i' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', + ], + ] + ); + + $this->add_control( + 'icon_padding', + [ + 'label' => esc_html__( 'Padding', 'opalestate-pro' ), + 'type' => Controls_Manager::DIMENSIONS, + 'size_units' => [ 'px', '%' ], + 'selectors' => [ + '{{WRAPPER}} .site-header-account i' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', + ], + ] + ); + + $this->end_controls_tab(); + + $this->start_controls_tab( + 'tab_icon_hover', + [ + 'label' => esc_html__( 'Hover', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'icon_color_hover', + [ + 'label' => esc_html__( 'Icon Color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .site-header-account i:hover' => 'color: {{VALUE}};', + ], + ] + ); + + $this->add_control( + 'background_color_hover', + [ + 'label' => esc_html__( 'Background Color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .site-header-account i:hover' => 'background-color: {{VALUE}};', + ], + ] + ); + + $this->add_group_control( + Group_Control_Border::get_type(), + [ + 'name' => 'icon_border_hover', + 'placeholder' => '1px', + 'default' => '1px', + 'selector' => '{{WRAPPER}} .site-header-account i:hover', + 'separator' => 'before', + + ] + ); + + $this->end_controls_tab(); + + $this->end_controls_tabs(); + + $this->end_controls_section(); + } + + protected function render() { + $settings = $this->get_settings(); + + $this->show_poup_hover_form( $settings ); + } + + protected function show_poup_hover_form( $settings ) { + $settings = wp_parse_args( $settings, [ + 'enable_label' => false, + 'icon' => '', + 'style' => '', + ] ); + + $account_link = opalestate_my_account_page(); + + $id = rand( 2, 9 ) . rand( 0, 9 ); + + ?> + + + + + + + + + + + + + + + + + get_name(), 'eicon-search' ); + } + + /** + * Get widget keywords. + * + * Retrieve the list of keywords the widget belongs to. + * + * @access public + * + * @return array Widget keywords. + */ + public function get_keywords() { + return [ 'opalestate-pro', 'search' ]; + } + + /** + * Register icon box widget controls. + * + * Adds different input fields to allow the user to change and customize the widget settings. + * + * @access protected + */ + protected function _register_controls() { + $this->start_controls_section( + 'agencys_search_form', + [ + 'label' => esc_html__( 'Agencies Search/Collection', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'search_form', + [ + 'label' => esc_html__('Search Form', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => '', + 'options' => array( + '' => esc_html__( 'Advanded', 'opalestate-pro' ), + 'address' => esc_html__( 'Search By Address', 'opalestate-pro' ), + ) + ] + ); + + $this->add_control( + 'enable_sortable_bar', + [ + 'label' => esc_html__('Enable Sortable Bar', 'opalestate-pro'), + 'type' => Controls_Manager::SWITCHER, + ] + ); + + $this->add_control( + 'item_layout', + [ + 'label' => esc_html__('Item Layout', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 'grid', + 'options' => array( + 'grid' => esc_html__( 'Grid', 'opalestate-pro' ), + 'list' => esc_html__( 'List', 'opalestate-pro' ), + ) + ] + ); + $this->add_responsive_control( + 'column', + [ + 'label' => esc_html__('Columns', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 3, + 'options' => [1 => 1, 2 => 2, 3 => 3, 4 => 4, 6 => 6], + 'prefix_class' => 'elementor-grid%s-', + 'condition' => [ + 'item_layout' => 'grid' + ] + + ] + ); + + + $this->add_control( + 'column_gap', + [ + 'label' => esc_html__( 'Columns Gap', 'opalestate-pro' ), + 'type' => Controls_Manager::SLIDER, + 'range' => [ + 'px' => [ + 'min' => 0, + 'max' => 100, + ], + ], + 'selectors' => [ + '{{WRAPPER}} .elementor-items-container' => 'grid-column-gap: {{SIZE}}{{UNIT}}' + + ], + 'condition' => [ + 'item_layout' => 'grid' + ] + ] + ); + + $this->add_control( + 'enable_carousel', + [ + 'label' => esc_html__('Enable', 'opalestate-pro'), + 'type' => Controls_Manager::SWITCHER, + ] + ); + $this->end_controls_section(); + + $this->add_slick_controls( array('enable_carousel' => 'yes') , ' .agency-slick-carousel ' ); + + $this->start_controls_section( + 'section_query', + [ + 'label' => esc_html__('Query', 'opalestate-pro'), + 'tab' => Controls_Manager::TAB_CONTENT, + ] + ); + + $this->add_control( + 'posts_per_page', + [ + 'label' => esc_html__('Posts Per Page', 'opalestate-pro'), + 'type' => Controls_Manager::NUMBER, + 'default' => 6, + ] + ); + + + + $this->add_control( + 'advanced', + [ + 'label' => esc_html__('Advanced', 'opalestate-pro'), + 'type' => Controls_Manager::HEADING, + ] + ); + + $this->add_control( + 'orderby', + [ + 'label' => esc_html__('Order By', 'opalestate-pro'), + 'type' => Controls_Manager::SELECT, + 'default' => 'post_date', + 'options' => [ + 'post_date' => esc_html__('Date', 'opalestate-pro'), + 'post_title' => esc_html__('Title', 'opalestate-pro'), + 'menu_order' => esc_html__('Menu Order', 'opalestate-pro'), + 'rand' => esc_html__('Random', 'opalestate-pro'), + ], + ] + ); + + $this->add_control( + 'order', + [ + 'label' => esc_html__('Order', 'opalestate-pro'), + 'type' => Controls_Manager::SELECT, + 'default' => 'desc', + 'options' => [ + 'asc' => esc_html__('ASC', 'opalestate-pro'), + 'desc' => esc_html__('DESC', 'opalestate-pro'), + ], + ] + ); + + $this->add_control( + 'categories', + [ + 'label' => esc_html__('Categories', 'opalestate-pro'), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_categories(), + 'multiple' => true, + ] + ); + + $this->add_control( + 'cat_operator', + [ + 'label' => esc_html__('Category Operator', 'opalestate-pro'), + 'type' => Controls_Manager::SELECT, + 'default' => 'IN', + 'options' => [ + 'AND' => esc_html__('AND', 'opalestate-pro'), + 'IN' => esc_html__('IN', 'opalestate-pro'), + 'NOT IN' => esc_html__('NOT IN', 'opalestate-pro'), + ], + 'condition' => [ + 'categories!' => '' + ], + ] + ); + + $this->end_controls_section(); + + $this->start_controls_section( + 'section_pagination', + [ + 'label' => esc_html__('Pagination', 'opalestate-pro'), + 'condition' => [ + 'enable_carousel!' => 'yes' + ], + ] + ); + + $this->add_control( + 'pagination_type', + [ + 'label' => esc_html__('Pagination', 'opalestate-pro'), + 'type' => Controls_Manager::SELECT, + 'default' => '', + 'options' => [ + '' => esc_html__('None', 'opalestate-pro'), + 'numbers' => esc_html__('Numbers', 'opalestate-pro'), + 'prev_next' => esc_html__('Previous/Next', 'opalestate-pro'), + 'numbers_and_prev_next' => esc_html__('Numbers', 'opalestate-pro') . ' + ' . esc_html__('Previous/Next', 'opalestate-pro'), + ] + ] + ); + + $this->add_control( + 'pagination_page_limit', + [ + 'label' => esc_html__('Page Limit', 'opalestate-pro'), + 'default' => '5', + 'condition' => [ + 'pagination_type!' => '' + ], + ] + ); + + $this->add_control( + 'pagination_numbers_shorten', + [ + 'label' => esc_html__('Shorten', 'opalestate-pro'), + 'type' => Controls_Manager::SWITCHER, + 'default' => '', + 'condition' => [ + 'pagination_type' => [ + 'numbers', + 'numbers_and_prev_next', + ], + ], + ] + ); + + $this->add_control( + 'pagination_prev_label', + [ + 'label' => esc_html__('Previous Label', 'opalestate-pro'), + 'default' => esc_html__('« Previous', 'opalestate-pro'), + 'condition' => [ + 'pagination_type' => [ + 'prev_next', + 'numbers_and_prev_next', + ], + ], + ] + ); + + $this->add_control( + 'pagination_next_label', + [ + 'label' => esc_html__('Next Label', 'opalestate-pro'), + 'default' => esc_html__('Next »', 'opalestate-pro'), + 'condition' => [ + 'pagination_type' => [ + 'prev_next', + 'numbers_and_prev_next', + ], + ], + ] + ); + + $this->add_control( + 'pagination_align', + [ + 'label' => esc_html__('Alignment', 'opalestate-pro'), + 'type' => Controls_Manager::CHOOSE, + 'options' => [ + 'flex-start' => [ + 'title' => esc_html__('Left', 'opalestate-pro'), + 'icon' => 'fa fa-align-left', + ], + 'center' => [ + 'title' => esc_html__('Center', 'opalestate-pro'), + 'icon' => 'fa fa-align-center', + ], + 'flex-end' => [ + 'title' => esc_html__('Right', 'opalestate-pro'), + 'icon' => 'fa fa-align-right', + ], + ], + 'default' => 'flex-start', + 'selectors' => [ + '{{WRAPPER}} .pagination' => 'justify-content: {{VALUE}};', + ], + 'condition' => [ + 'pagination_type!' => '', + ], + ] + ); + + + $this->end_controls_section(); + + } + + public function get_post_categories() { + $list = array(); + return $list; + } +} diff --git a/inc/vendors/elementor/widgets/opalestate-agent-collection.php b/inc/vendors/elementor/widgets/opalestate-agent-collection.php new file mode 100755 index 00000000..1229ab4f --- /dev/null +++ b/inc/vendors/elementor/widgets/opalestate-agent-collection.php @@ -0,0 +1,380 @@ +get_name(), 'eicon-search' ); + } + + /** + * Get widget keywords. + * + * Retrieve the list of keywords the widget belongs to. + * + * @access public + * + * @return array Widget keywords. + */ + public function get_keywords() { + return [ 'opalestate-pro', 'search' ]; + } + + /** + * Register icon box widget controls. + * + * Adds different input fields to allow the user to change and customize the widget settings. + * + * @access protected + */ + protected function _register_controls() { + $this->start_controls_section( + 'agents_search_form', + [ + 'label' => esc_html__( 'Agents Search Collection', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'search_form', + [ + 'label' => esc_html__('Search Form', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => '', + 'options' => array( + '' => esc_html__( 'Advanded', 'opalestate-pro' ), + 'address' => esc_html__( 'Search By Address', 'opalestate-pro' ), + ) + ] + ); + + $this->add_control( + 'enable_sortable_bar', + [ + 'label' => esc_html__('Enable Sortable Bar', 'opalestate-pro'), + 'type' => Controls_Manager::SWITCHER, + ] + ); + + $this->add_control( + 'item_layout', + [ + 'label' => esc_html__('Item Layout', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 'grid', + 'options' => array( + 'grid' => esc_html__( 'Grid', 'opalestate-pro' ), + 'list' => esc_html__( 'List', 'opalestate-pro' ), + ) + ] + ); + $this->add_responsive_control( + 'column', + [ + 'label' => esc_html__('Columns', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 3, + 'options' => [1 => 1, 2 => 2, 3 => 3, 4 => 4, 6 => 6], + 'prefix_class' => 'elementor-grid%s-', + 'condition' => [ + 'item_layout' => 'grid' + ] + + ] + ); + + + $this->add_control( + 'column_gap', + [ + 'label' => esc_html__( 'Columns Gap', 'opalestate-pro' ), + 'type' => Controls_Manager::SLIDER, + 'range' => [ + 'px' => [ + 'min' => 0, + 'max' => 100, + ], + ], + 'selectors' => [ + '{{WRAPPER}} .elementor-items-container' => 'grid-column-gap: {{SIZE}}{{UNIT}}' + + ], + 'condition' => [ + 'item_layout' => 'grid' + ] + ] + ); + + $this->add_control( + 'enable_carousel', + [ + 'label' => esc_html__('Enable', 'opalestate-pro'), + 'type' => Controls_Manager::SWITCHER, + ] + ); + $this->end_controls_section(); + + $this->add_slick_controls( array('enable_carousel' => 'yes') , ' .agent-slick-carousel ' ); + + $this->start_controls_section( + 'section_query', + [ + 'label' => esc_html__('Query', 'opalestate-pro'), + 'tab' => Controls_Manager::TAB_CONTENT, + ] + ); + + $this->add_control( + 'posts_per_page', + [ + 'label' => esc_html__('Posts Per Page', 'opalestate-pro'), + 'type' => Controls_Manager::NUMBER, + 'default' => 6, + ] + ); + + + + $this->add_control( + 'advanced', + [ + 'label' => esc_html__('Advanced', 'opalestate-pro'), + 'type' => Controls_Manager::HEADING, + ] + ); + + $this->add_control( + 'orderby', + [ + 'label' => esc_html__('Order By', 'opalestate-pro'), + 'type' => Controls_Manager::SELECT, + 'default' => 'post_date', + 'options' => [ + 'post_date' => esc_html__('Date', 'opalestate-pro'), + 'post_title' => esc_html__('Title', 'opalestate-pro'), + 'menu_order' => esc_html__('Menu Order', 'opalestate-pro'), + 'rand' => esc_html__('Random', 'opalestate-pro'), + ], + ] + ); + + $this->add_control( + 'order', + [ + 'label' => esc_html__('Order', 'opalestate-pro'), + 'type' => Controls_Manager::SELECT, + 'default' => 'desc', + 'options' => [ + 'asc' => esc_html__('ASC', 'opalestate-pro'), + 'desc' => esc_html__('DESC', 'opalestate-pro'), + ], + ] + ); + + $this->add_control( + 'categories', + [ + 'label' => esc_html__('Categories', 'opalestate-pro'), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_categories(), + 'multiple' => true, + ] + ); + + $this->add_control( + 'cat_operator', + [ + 'label' => esc_html__('Category Operator', 'opalestate-pro'), + 'type' => Controls_Manager::SELECT, + 'default' => 'IN', + 'options' => [ + 'AND' => esc_html__('AND', 'opalestate-pro'), + 'IN' => esc_html__('IN', 'opalestate-pro'), + 'NOT IN' => esc_html__('NOT IN', 'opalestate-pro'), + ], + 'condition' => [ + 'categories!' => '' + ], + ] + ); + + $this->end_controls_section(); + + $this->start_controls_section( + 'section_pagination', + [ + 'label' => esc_html__('Pagination', 'opalestate-pro'), + 'condition' => [ + 'enable_carousel!' => 'yes' + ], + ] + ); + + $this->add_control( + 'pagination_type', + [ + 'label' => esc_html__('Pagination', 'opalestate-pro'), + 'type' => Controls_Manager::SELECT, + 'default' => '', + 'options' => [ + '' => esc_html__('None', 'opalestate-pro'), + 'numbers' => esc_html__('Numbers', 'opalestate-pro'), + 'prev_next' => esc_html__('Previous/Next', 'opalestate-pro'), + 'numbers_and_prev_next' => esc_html__('Numbers', 'opalestate-pro') . ' + ' . esc_html__('Previous/Next', 'opalestate-pro'), + ] + ] + ); + + $this->add_control( + 'pagination_page_limit', + [ + 'label' => esc_html__('Page Limit', 'opalestate-pro'), + 'default' => '5', + 'condition' => [ + 'pagination_type!' => '' + ], + ] + ); + + $this->add_control( + 'pagination_numbers_shorten', + [ + 'label' => esc_html__('Shorten', 'opalestate-pro'), + 'type' => Controls_Manager::SWITCHER, + 'default' => '', + 'condition' => [ + 'pagination_type' => [ + 'numbers', + 'numbers_and_prev_next', + ], + ], + ] + ); + + $this->add_control( + 'pagination_prev_label', + [ + 'label' => esc_html__('Previous Label', 'opalestate-pro'), + 'default' => esc_html__('« Previous', 'opalestate-pro'), + 'condition' => [ + 'pagination_type' => [ + 'prev_next', + 'numbers_and_prev_next', + ], + ], + ] + ); + + $this->add_control( + 'pagination_next_label', + [ + 'label' => esc_html__('Next Label', 'opalestate-pro'), + 'default' => esc_html__('Next »', 'opalestate-pro'), + 'condition' => [ + 'pagination_type' => [ + 'prev_next', + 'numbers_and_prev_next', + ], + ], + ] + ); + + $this->add_control( + 'pagination_align', + [ + 'label' => esc_html__('Alignment', 'opalestate-pro'), + 'type' => Controls_Manager::CHOOSE, + 'options' => [ + 'flex-start' => [ + 'title' => esc_html__('Left', 'opalestate-pro'), + 'icon' => 'fa fa-align-left', + ], + 'center' => [ + 'title' => esc_html__('Center', 'opalestate-pro'), + 'icon' => 'fa fa-align-center', + ], + 'flex-end' => [ + 'title' => esc_html__('Right', 'opalestate-pro'), + 'icon' => 'fa fa-align-right', + ], + ], + 'default' => 'flex-start', + 'selectors' => [ + '{{WRAPPER}} .pagination' => 'justify-content: {{VALUE}};', + ], + 'condition' => [ + 'pagination_type!' => '', + ], + ] + ); + + + $this->end_controls_section(); + + } + + public function get_post_categories() { + $list = array(); + return $list; + } +} diff --git a/inc/vendors/elementor/widgets/opalestate-category-list.php b/inc/vendors/elementor/widgets/opalestate-category-list.php new file mode 100755 index 00000000..0f8385e0 --- /dev/null +++ b/inc/vendors/elementor/widgets/opalestate-category-list.php @@ -0,0 +1,238 @@ +get_name(), 'eicon-search' ); + } + + /** + * Get widget keywords. + * + * Retrieve the list of keywords the widget belongs to. + * + * @access public + * + * @return array Widget keywords. + */ + public function get_keywords() { + return [ 'opalestate-pro', 'search' ]; + } + + /** + * Register icon box widget controls. + * + * Adds different input fields to allow the user to change and customize the widget settings. + * + * @access protected + */ + protected function _register_controls() { + $this->start_controls_section( + 'category_search_form', + [ + 'label' => esc_html__( 'Category Collection', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'search_form', + [ + 'label' => esc_html__( 'Search Form', 'opalestate-pro' ), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => '', + 'options' => [ + '' => esc_html__( 'Advanded', 'opalestate-pro' ), + 'address' => esc_html__( 'Search By Address', 'opalestate-pro' ), + ], + ] + ); + + $this->add_responsive_control( + 'column', + [ + 'label' => esc_html__( 'Columns', 'opalestate-pro' ), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 3, + 'options' => [ 1 => 1, 2 => 2, 3 => 3, 4 => 4, 6 => 6 ], + 'prefix_class' => 'elementor-grid%s-', + 'condition' => [ + 'enable_carousel!' => 'yes', + ], + + ] + ); + + + $this->add_control( + 'column_gap', + [ + 'label' => esc_html__( 'Columns Gap', 'opalestate-pro' ), + 'type' => Controls_Manager::SLIDER, + 'range' => [ + 'px' => [ + 'min' => 0, + 'max' => 100, + ], + ], + 'selectors' => [ + '{{WRAPPER}} .elementor-items-container' => 'grid-column-gap: {{SIZE}}{{UNIT}}', + + ], + 'condition' => [ + 'enable_carousel!' => 'yes', + ], + + ] + ); + + $this->add_control( + 'enable_carousel', + [ + 'label' => esc_html__( 'Enable Carousel', 'opalestate-pro' ), + 'type' => Controls_Manager::SWITCHER, + ] + ); + $this->end_controls_section(); + + $this->add_slick_controls( [ 'enable_carousel' => 'yes' ], ' .agency-slick-carousel ' ); + + $this->start_controls_section( + 'section_query', + [ + 'label' => esc_html__( 'Query', 'opalestate-pro' ), + 'tab' => Controls_Manager::TAB_CONTENT, + ] + ); + + $this->add_control( + 'advanced', + [ + 'label' => esc_html__( 'Advanced', 'opalestate-pro' ), + 'type' => Controls_Manager::HEADING, + ] + ); + + $this->add_control( + 'orderby', + [ + 'label' => esc_html__( 'Order By', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'default' => 'post_date', + 'options' => [ + 'term_id' => esc_html__( 'ID', 'opalestate-pro' ), + 'name' => esc_html__( 'Name', 'opalestate-pro' ), + 'count' => esc_html__( 'Count', 'opalestate-pro' ), + ], + ] + ); + + $this->add_control( + 'order', + [ + 'label' => esc_html__( 'Order', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'default' => 'desc', + 'options' => [ + 'asc' => esc_html__( 'ASC', 'opalestate-pro' ), + 'desc' => esc_html__( 'DESC', 'opalestate-pro' ), + ], + ] + ); + + $this->add_control( + 'categories', + [ + 'label' => esc_html__( 'Categories', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_categories(), + 'multiple' => true, + ] + ); + + $this->add_control( + 'limit', + [ + 'label' => esc_html__( 'Limit', 'opalestate-pro' ), + 'description' => esc_html__( 'Maximum number of terms to return.', 'opalestate-pro' ), + 'type' => Controls_Manager::NUMBER, + 'default' => 5, + ] + ); + + $this->end_controls_section(); + } + + protected function get_post_categories() { + $categories = Opalestate_Taxonomy_Categories::get_list(); + + $results = []; + if ( ! is_wp_error( $categories ) ) { + foreach ( $categories as $category ) { + $results[ $category->slug ] = $category->name; + } + } + + return $results; + } +} diff --git a/inc/vendors/elementor/widgets/opalestate-city-list.php b/inc/vendors/elementor/widgets/opalestate-city-list.php new file mode 100755 index 00000000..d017d304 --- /dev/null +++ b/inc/vendors/elementor/widgets/opalestate-city-list.php @@ -0,0 +1,238 @@ +get_name(), 'eicon-search' ); + } + + /** + * Get widget keywords. + * + * Retrieve the list of keywords the widget belongs to. + * + * @access public + * + * @return array Widget keywords. + */ + public function get_keywords() { + return [ 'opalestate-pro', 'search' ]; + } + + /** + * Register icon box widget controls. + * + * Adds different input fields to allow the user to change and customize the widget settings. + * + * @access protected + */ + protected function _register_controls() { + $this->start_controls_section( + 'category_search_form', + [ + 'label' => esc_html__( 'City Collection', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'search_form', + [ + 'label' => esc_html__( 'Search Form', 'opalestate-pro' ), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => '', + 'options' => [ + '' => esc_html__( 'Advanded', 'opalestate-pro' ), + 'address' => esc_html__( 'Search By Address', 'opalestate-pro' ), + ], + ] + ); + + $this->add_responsive_control( + 'column', + [ + 'label' => esc_html__( 'Columns', 'opalestate-pro' ), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 3, + 'options' => [ 1 => 1, 2 => 2, 3 => 3, 4 => 4, 6 => 6 ], + 'prefix_class' => 'elementor-grid%s-', + 'condition' => [ + 'enable_carousel!' => 'yes', + ], + + ] + ); + + + $this->add_control( + 'column_gap', + [ + 'label' => esc_html__( 'Columns Gap', 'opalestate-pro' ), + 'type' => Controls_Manager::SLIDER, + 'range' => [ + 'px' => [ + 'min' => 0, + 'max' => 100, + ], + ], + 'selectors' => [ + '{{WRAPPER}} .elementor-items-container' => 'grid-column-gap: {{SIZE}}{{UNIT}}', + + ], + 'condition' => [ + 'enable_carousel!' => 'yes', + ], + + ] + ); + + $this->add_control( + 'enable_carousel', + [ + 'label' => esc_html__( 'Enable Carousel', 'opalestate-pro' ), + 'type' => Controls_Manager::SWITCHER, + ] + ); + $this->end_controls_section(); + + $this->add_slick_controls( [ 'enable_carousel' => 'yes' ], ' .agency-slick-carousel ' ); + + $this->start_controls_section( + 'section_query', + [ + 'label' => esc_html__( 'Query', 'opalestate-pro' ), + 'tab' => Controls_Manager::TAB_CONTENT, + ] + ); + + $this->add_control( + 'advanced', + [ + 'label' => esc_html__( 'Advanced', 'opalestate-pro' ), + 'type' => Controls_Manager::HEADING, + ] + ); + + $this->add_control( + 'orderby', + [ + 'label' => esc_html__( 'Order By', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'default' => 'post_date', + 'options' => [ + 'term_id' => esc_html__( 'ID', 'opalestate-pro' ), + 'name' => esc_html__( 'Name', 'opalestate-pro' ), + 'count' => esc_html__( 'Count', 'opalestate-pro' ), + ], + ] + ); + + $this->add_control( + 'order', + [ + 'label' => esc_html__( 'Order', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'default' => 'desc', + 'options' => [ + 'asc' => esc_html__( 'ASC', 'opalestate-pro' ), + 'desc' => esc_html__( 'DESC', 'opalestate-pro' ), + ], + ] + ); + + $this->add_control( + 'categories', + [ + 'label' => esc_html__( 'Cities', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_cities(), + 'multiple' => true, + ] + ); + + $this->add_control( + 'limit', + [ + 'label' => esc_html__( 'Limit', 'opalestate-pro' ), + 'description' => esc_html__( 'Maximum number of terms to return.', 'opalestate-pro' ), + 'type' => Controls_Manager::NUMBER, + 'default' => 5, + ] + ); + + $this->end_controls_section(); + } + + protected function get_post_cities() { + $categories = Opalestate_Taxonomy_City::get_list(); + + $results = []; + if ( ! is_wp_error( $categories ) ) { + foreach ( $categories as $category ) { + $results[ $category->slug ] = $category->name; + } + } + + return $results; + } +} diff --git a/inc/vendors/elementor/widgets/opalestate-form-builder.php b/inc/vendors/elementor/widgets/opalestate-form-builder.php new file mode 100755 index 00000000..f40c7ade --- /dev/null +++ b/inc/vendors/elementor/widgets/opalestate-form-builder.php @@ -0,0 +1,141 @@ +get_name(), 'eicon-search' ); + } + + /** + * Get widget keywords. + * + * Retrieve the list of keywords the widget belongs to. + * + * @access public + * + * @return array Widget keywords. + */ + public function get_keywords() { + return [ 'opalestate-pro', 'search' ]; + } + + /** + * Register icon box widget controls. + * + * Adds different input fields to allow the user to change and customize the widget settings. + * + * @access protected + */ + protected function _register_controls() { + $this->start_controls_section( + 'form_builder_head', + [ + 'label' => esc_html__( 'Agency/Agent Tab Form Search', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'title', + [ + 'label' => esc_html__( 'Title', 'opalestate-pro' ), + 'type' => Controls_Manager::TEXT, + ] + ); + + $this->add_control( + 'fields', + [ + 'label' => esc_html__( 'Brand Items', 'opalestate-pro' ), + 'type' => Controls_Manager::REPEATER, + 'fields' => [ + [ + 'name' => 'field', + 'label' => esc_html__( 'Field', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + + 'options' => $this->field_types() + ], + + [ + 'name' => 'column', + 'label' => esc_html__( 'Column', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'options'=> array( + '1' => 1, + '2' => 2, + '3' => 3, + '4' => 4, + '5' => 5, + '6' => 6, + '7' => 7, + '12' => 12 + ), + 'default' => 4 + ] + ] + ] + ); + $this->end_controls_section(); + } + + public function field_types() { + $files = glob( OPALESTATE_PLUGIN_DIR .'/templates/search-box/fields/*.php'); + + $output = array(); + + foreach ( $files as $field ) { + $name = str_replace(".php", "", basename( $field ) ); + $label = ucfirst( str_replace( "-", " ", $name ) ); + $output[$name] = $label; + } + + return $output; + } +} diff --git a/inc/vendors/elementor/widgets/opalestate-map-top-search.php b/inc/vendors/elementor/widgets/opalestate-map-top-search.php new file mode 100755 index 00000000..694aa6bb --- /dev/null +++ b/inc/vendors/elementor/widgets/opalestate-map-top-search.php @@ -0,0 +1,163 @@ +get_name(), 'eicon-search' ); + } + + /** + * Get widget keywords. + * + * Retrieve the list of keywords the widget belongs to. + * + * @access public + * + * @return array Widget keywords. + */ + public function get_keywords() { + return [ 'opalestate-pro', 'search' ]; + } + + /** + * Register icon box widget controls. + * + * Adds different input fields to allow the user to change and customize the widget settings. + * + * @access protected + */ + protected function _register_controls() { + $this->start_controls_section( + 'map_preview_form', + [ + 'label' => esc_html__( 'Map Preview Form', 'opalestate-pro' ), + 'description' => ' ' + ] + + ); + + $this->add_control( + 's_form_description', + [ + 'raw' => esc_html__( 'This is often used for building seach page, it combines with block => Search: Property Form, Search: Property Results.', 'opalestate-pro' ), + 'type' => Controls_Manager::RAW_HTML, + 'content_classes' => 'elementor-descriptor', + ] + ); + + + $this->add_control( + 'enable_static', + [ + 'label' => esc_html__('Enable Static Map', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SWITCHER, + 'default' => '' + ] + ); + + $this->add_control( + 'static_mode_right', + [ + 'label' => esc_html__('Map On Right?', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SWITCHER, + 'default' => 'yes', + 'condition' => [ + 'enable_static!' => '' + ] + ] + ); + + + $this->add_responsive_control( + 'map_width', + [ + 'label' => esc_html__( 'Map Width %', 'opalestate-pro' ), + 'type' => Controls_Manager::SLIDER, + 'range' => [ + 'px' => [ + 'min' => 20, + 'max' => 100, + ], + 'default'=>50 + ], + + 'selectors' => [ + '{{WRAPPER}} .opalestate-map-preview-wrap' => 'Width: {{SIZE}}%' + + ], + 'condition' => [ + 'enable_static!' => '' + ] + ] + ); + + $this->add_responsive_control( + 'map_height', + [ + 'label' => esc_html__( 'Map Height', 'opalestate-pro' ), + 'type' => Controls_Manager::SLIDER, + 'range' => [ + 'px' => [ + 'min' => 300, + 'max' => 1200, + ], + ], + + 'selectors' => [ + '{{WRAPPER}} #opalestate-map-preview' => 'min-height: {{SIZE}}{{UNIT}}!important' + + ] + ] + ); + + + $this->end_controls_section(); + } +} diff --git a/inc/vendors/elementor/widgets/opalestate-property-collection.php b/inc/vendors/elementor/widgets/opalestate-property-collection.php new file mode 100755 index 00000000..3c04e751 --- /dev/null +++ b/inc/vendors/elementor/widgets/opalestate-property-collection.php @@ -0,0 +1,483 @@ +get_name(), 'eicon-search' ); + } + + /** + * Get widget keywords. + * + * Retrieve the list of keywords the widget belongs to. + * + * @access public + * + * @return array Widget keywords. + */ + public function get_keywords() { + return [ 'opalestate-pro', 'search' ]; + } + + /** + * Register icon box widget controls. + * + * Adds different input fields to allow the user to change and customize the widget settings. + * + * @access protected + */ + protected function _register_controls() { + $this->start_controls_section( + 'head', + [ + 'label' => esc_html__( 'Property Collection', 'opalestate-pro' ), + ] + ); + + + $this->add_control( + 'style', + [ + 'label' => esc_html__( 'Style Item Layout', 'opalestate-pro' ), + 'type' => \Elementor\Controls_Manager::SELECT, + 'options' => $this->get_template_post_type(), + 'default' => 'grid', + ] + ); + + $this->add_responsive_control( + 'column', + [ + 'label' => esc_html__( 'Columns', 'opalestate-pro' ), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 3, + 'options' => [ 1 => 1, 2 => 2, 3 => 3, 4 => 4, 6 => 6 ], + 'prefix_class' => 'elementor-grid%s-', + 'condition' => [ + 'enable_carousel' => '', + ], + ] + ); + + $this->add_control( + 'column_gap', + [ + 'label' => esc_html__( 'Columns Gap', 'opalestate-pro' ), + 'type' => Controls_Manager::SLIDER, + 'range' => [ + 'px' => [ + 'min' => 0, + 'max' => 100, + ], + ], + 'selectors' => [ + '{{WRAPPER}} .elementor-items-container' => 'grid-column-gap: {{SIZE}}{{UNIT}}', + + ], + 'condition' => [ + 'enable_carousel' => '', + ], + ] + ); + + $this->add_control( + 'showmode', + [ + 'label' => esc_html__( 'Show', 'opalestate-pro' ), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => '', + 'options' => [ + 'featured' => esc_html__( 'Featured only', 'opalestate-pro' ), + 'normal' => esc_html__( 'Without Featured', 'opalestate-pro' ), + 'all' => esc_html__( 'All', 'opalestate-pro' ), + ], + ] + ); + $this->add_control( + 'enable_carousel', + [ + 'label' => esc_html__( 'Enable Carousel', 'opalestate-pro' ), + 'type' => Controls_Manager::SWITCHER, + ] + ); + + $this->end_controls_section(); + + + $this->add_slick_controls( [ 'enable_carousel' => 'yes' ], ' .product-slick-carousel ' ); + + $this->start_controls_section( + 'section_query', + [ + 'label' => esc_html__( 'Query', 'opalestate-pro' ), + 'tab' => Controls_Manager::TAB_CONTENT, + ] + ); + + $this->add_control( + 'posts_per_page', + [ + 'label' => esc_html__( 'Posts Per Page', 'opalestate-pro' ), + 'type' => Controls_Manager::NUMBER, + 'default' => 6, + ] + ); + + + $this->add_control( + 'advanced', + [ + 'label' => esc_html__( 'Advanced', 'opalestate-pro' ), + 'type' => Controls_Manager::HEADING, + ] + ); + + $this->add_control( + 'orderby', + [ + 'label' => esc_html__( 'Order By', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'default' => 'post_date', + 'options' => [ + 'post_date' => esc_html__( 'Date', 'opalestate-pro' ), + 'post_title' => esc_html__( 'Title', 'opalestate-pro' ), + 'menu_order' => esc_html__( 'Menu Order', 'opalestate-pro' ), + 'rand' => esc_html__( 'Random', 'opalestate-pro' ), + ], + ] + ); + + $this->add_control( + 'order', + [ + 'label' => esc_html__( 'Order', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'default' => 'desc', + 'options' => [ + 'asc' => esc_html__( 'ASC', 'opalestate-pro' ), + 'desc' => esc_html__( 'DESC', 'opalestate-pro' ), + ], + ] + ); + + $this->add_control( + 'categories', + [ + 'label' => esc_html__( 'Categories', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_categories(), + 'multiple' => true, + ] + ); + + $this->add_control( + 'cat_operator', + [ + 'label' => esc_html__( 'Category Operator', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'default' => 'IN', + 'options' => [ + 'AND' => esc_html__( 'AND', 'opalestate-pro' ), + 'IN' => esc_html__( 'IN', 'opalestate-pro' ), + 'NOT IN' => esc_html__( 'NOT IN', 'opalestate-pro' ), + ], + 'condition' => [ + 'categories!' => '', + ], + ] + ); + + + $this->add_control( + 'types', + [ + 'label' => esc_html__( 'Types', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_types(), + 'multiple' => true, + ] + ); + + $this->add_control( + 'labels', + [ + 'label' => esc_html__( 'Lables', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_labels(), + 'multiple' => true, + ] + ); + + $this->add_control( + 'statuses', + [ + 'label' => esc_html__( 'Status', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_statuses(), + 'multiple' => true, + ] + ); + + $this->add_control( + 'cities', + [ + 'label' => esc_html__( 'Cities', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_cities(), + 'multiple' => true, + ] + ); + + + $this->end_controls_section(); + + + $this->start_controls_section( + 'section_pagination', + [ + 'label' => esc_html__( 'Pagination', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'pagination', + [ + 'label' => esc_html__( 'Pagination', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'default' => '', + 'options' => [ + '' => esc_html__( 'None', 'opalestate-pro' ), + 'show' => esc_html__( 'Show', 'opalestate-pro' ), + ], + ] + ); + + $this->add_control( + 'pagination_page_limit', + [ + 'label' => esc_html__( 'Page Limit', 'opalestate-pro' ), + 'default' => '5', + 'condition' => [ + 'pagination_type!' => '', + ], + ] + ); + + // $this->add_control( + // 'pagination_numbers_shorten', + // [ + // 'label' => esc_html__( 'Shorten', 'opalestate-pro' ), + // 'type' => Controls_Manager::SWITCHER, + // 'default' => '', + // 'condition' => [ + // 'pagination_type' => [ + // 'numbers', + // 'numbers_and_prev_next', + // ], + // ], + // ] + // ); + // + // $this->add_control( + // 'pagination_prev_label', + // [ + // 'label' => esc_html__( 'Previous Label', 'opalestate-pro' ), + // 'default' => esc_html__( '« Previous', 'opalestate-pro' ), + // 'condition' => [ + // 'pagination_type' => [ + // 'prev_next', + // 'numbers_and_prev_next', + // ], + // ], + // ] + // ); + // + // $this->add_control( + // 'pagination_next_label', + // [ + // 'label' => esc_html__( 'Next Label', 'opalestate-pro' ), + // 'default' => esc_html__( 'Next »', 'opalestate-pro' ), + // 'condition' => [ + // 'pagination_type' => [ + // 'prev_next', + // 'numbers_and_prev_next', + // ], + // ], + // ] + // ); + + // $this->add_control( + // 'pagination_align', + // [ + // 'label' => esc_html__( 'Alignment', 'opalestate-pro' ), + // 'type' => Controls_Manager::CHOOSE, + // 'options' => [ + // 'flex-start' => [ + // 'title' => esc_html__( 'Left', 'opalestate-pro' ), + // 'icon' => 'fa fa-align-left', + // ], + // 'center' => [ + // 'title' => esc_html__( 'Center', 'opalestate-pro' ), + // 'icon' => 'fa fa-align-center', + // ], + // 'flex-end' => [ + // 'title' => esc_html__( 'Right', 'opalestate-pro' ), + // 'icon' => 'fa fa-align-right', + // ], + // ], + // 'default' => 'flex-start', + // 'selectors' => [ + // '{{WRAPPER}} .pagination' => 'justify-content: {{VALUE}};', + // ], + // 'condition' => [ + // 'pagination_type!' => '', + // ], + // ] + // ); + + $this->end_controls_section(); + } + + protected function get_post_labels() { + $categories = Opalestate_Taxonomy_Label::get_list(); + + $results = []; + if ( ! is_wp_error( $categories ) ) { + foreach ( $categories as $category ) { + $results[ $category->slug ] = $category->name; + } + } + + return $results; + } + + protected function get_post_types() { + $categories = Opalestate_Taxonomy_Type::get_list(); + + $results = []; + if ( ! is_wp_error( $categories ) ) { + foreach ( $categories as $category ) { + $results[ $category->slug ] = $category->name; + } + } + + return $results; + } + + protected function get_post_categories() { + + $categories = Opalestate_Taxonomy_Categories::get_list(); + + $results = []; + if ( ! is_wp_error( $categories ) ) { + foreach ( $categories as $category ) { + $results[ $category->slug ] = $category->name; + } + } + + return $results; + } + + + protected function get_post_statuses() { + + $categories = Opalestate_Taxonomy_Status::get_list(); + + $results = []; + if ( ! is_wp_error( $categories ) ) { + foreach ( $categories as $category ) { + $results[ $category->slug ] = $category->name; + } + } + + return $results; + } + + protected function get_post_cities() { + + $categories = Opalestate_Taxonomy_City::get_list(); + + $results = []; + if ( ! is_wp_error( $categories ) ) { + foreach ( $categories as $category ) { + $results[ $category->slug ] = $category->name; + } + } + + return $results; + } + + + private function get_template_post_type() { + $folderes = glob( OPALESTATE_PLUGIN_DIR . '/templates/content-property-*' ); + $output = []; + + foreach ( $folderes as $folder ) { + $folder = str_replace( "content-property-", '', str_replace( '.php', '', wp_basename( $folder ) ) ); + $value = str_replace( '_', ' ', str_replace( '-', ' ', ucfirst( $folder ) ) ); + $output[ $folder ] = $value; + } + + return $output; + } +} diff --git a/inc/vendors/elementor/widgets/opalestate-search-agency.php b/inc/vendors/elementor/widgets/opalestate-search-agency.php new file mode 100755 index 00000000..918e94b3 --- /dev/null +++ b/inc/vendors/elementor/widgets/opalestate-search-agency.php @@ -0,0 +1,160 @@ +get_name(), 'eicon-search' ); + } + + /** + * Get widget keywords. + * + * Retrieve the list of keywords the widget belongs to. + * + * @access public + * + * @return array Widget keywords. + */ + public function get_keywords() { + return [ 'opalestate-pro', 'search' ]; + } + + /** + * Register icon box widget controls. + * + * Adds different input fields to allow the user to change and customize the widget settings. + * + * @access protected + */ + protected function _register_controls() { + $this->start_controls_section( + 'agency_search_form', + [ + 'label' => esc_html__( 'Agency Search Form', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'search_form', + [ + 'label' => esc_html__('Search Form', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => '', + 'options' => array( + '' => esc_html__( 'Advanded', 'opalestate-pro' ), + 'address' => esc_html__( 'Search By Address', 'opalestate-pro' ), + ) + ] + ); + + $this->add_control( + 'current_uri', + [ + 'label' => esc_html__('Target Submit Page', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 1, + 'options' => array( + 1 => esc_html__( 'Current Page', 'opalestate-pro' ), + 0 => esc_html__( 'Global Agent Search Page', 'opalestate-pro' ), + ) + ] + ); + + $this->add_control( + 'item_layout', + [ + 'label' => esc_html__('Item Layout', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 'grid', + 'options' => array( + 'grid' => esc_html__( 'Grid', 'opalestate-pro' ), + 'list' => esc_html__( 'List', 'opalestate-pro' ), + ) + ] + ); + $this->add_responsive_control( + 'column', + [ + 'label' => esc_html__('Columns', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 3, + 'options' => [1 => 1, 2 => 2, 3 => 3, 4 => 4, 6 => 6], + 'prefix_class' => 'elementor-grid%s-', + 'condition' => [ + 'item_layout' => 'grid' + ] + + ] + ); + + + $this->add_control( + 'column_gap', + [ + 'label' => esc_html__( 'Columns Gap', 'opalestate-pro' ), + 'type' => Controls_Manager::SLIDER, + 'range' => [ + 'px' => [ + 'min' => 0, + 'max' => 100, + ], + ], + 'selectors' => [ + '{{WRAPPER}} .elementor-items-container' => 'grid-column-gap: {{SIZE}}{{UNIT}}' + + ], + 'condition' => [ + 'item_layout' => 'grid' + ] + ] + ); + $this->end_controls_section(); + } +} diff --git a/inc/vendors/elementor/widgets/opalestate-search-agents.php b/inc/vendors/elementor/widgets/opalestate-search-agents.php new file mode 100755 index 00000000..d809a29b --- /dev/null +++ b/inc/vendors/elementor/widgets/opalestate-search-agents.php @@ -0,0 +1,160 @@ +get_name(), 'eicon-search' ); + } + + /** + * Get widget keywords. + * + * Retrieve the list of keywords the widget belongs to. + * + * @access public + * + * @return array Widget keywords. + */ + public function get_keywords() { + return [ 'opalestate-pro', 'search' ]; + } + + /** + * Register icon box widget controls. + * + * Adds different input fields to allow the user to change and customize the widget settings. + * + * @access protected + */ + protected function _register_controls() { + $this->start_controls_section( + 'agents_search_form', + [ + 'label' => esc_html__( 'Agents Search Form', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'search_form', + [ + 'label' => esc_html__('Search Form', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => '', + 'options' => array( + '' => esc_html__( 'Advanded', 'opalestate-pro' ), + 'address' => esc_html__( 'Search By Address', 'opalestate-pro' ), + ) + ] + ); + + $this->add_control( + 'current_uri', + [ + 'label' => esc_html__('Target Submit Page', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 1, + 'options' => array( + 1 => esc_html__( 'Current Page', 'opalestate-pro' ), + 0 => esc_html__( 'Global Agent Search Page', 'opalestate-pro' ), + ) + ] + ); + + $this->add_control( + 'item_layout', + [ + 'label' => esc_html__('Item Layout', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 'grid', + 'options' => array( + 'grid' => esc_html__( 'Grid', 'opalestate-pro' ), + 'list' => esc_html__( 'List', 'opalestate-pro' ), + ) + ] + ); + $this->add_responsive_control( + 'column', + [ + 'label' => esc_html__('Columns', 'opalestate-pro'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 3, + 'options' => [1 => 1, 2 => 2, 3 => 3, 4 => 4, 6 => 6], + 'prefix_class' => 'elementor-grid%s-', + 'condition' => [ + 'item_layout' => 'grid' + ] + + ] + ); + + + $this->add_control( + 'column_gap', + [ + 'label' => esc_html__( 'Columns Gap', 'opalestate-pro' ), + 'type' => Controls_Manager::SLIDER, + 'range' => [ + 'px' => [ + 'min' => 0, + 'max' => 100, + ], + ], + 'selectors' => [ + '{{WRAPPER}} .elementor-items-container' => 'grid-column-gap: {{SIZE}}{{UNIT}}' + + ], + 'condition' => [ + 'item_layout' => 'grid' + ] + ] + ); + $this->end_controls_section(); + } +} diff --git a/inc/vendors/elementor/widgets/opalestate-search-property-results.php b/inc/vendors/elementor/widgets/opalestate-search-property-results.php new file mode 100755 index 00000000..6f4900a2 --- /dev/null +++ b/inc/vendors/elementor/widgets/opalestate-search-property-results.php @@ -0,0 +1,466 @@ +get_name(), 'eicon-search' ); + } + + /** + * Get widget keywords. + * + * Retrieve the list of keywords the widget belongs to. + * + * @access public + * + * @return array Widget keywords. + */ + public function get_keywords() { + return [ 'opalestate-pro', 'search' ]; + } + + /** + * Register icon box widget controls. + * + * Adds different input fields to allow the user to change and customize the widget settings. + * + * @access protected + */ + protected function _register_controls() { + $this->start_controls_section( + 'head', + [ + 'label' => esc_html__( 'Show Collection as Default Results', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 's_form_description', + [ + 'raw' => esc_html__( 'This is often used for building seach page, it combines with block => Search: Property Form, Search:Map Preview.', 'opalestate-pro' ), + 'type' => Controls_Manager::RAW_HTML, + 'content_classes' => 'elementor-descriptor', + ] + ); + + $this->add_control( + 'style', + [ + 'label' => esc_html__( 'Style Item Layout', 'opalestate-pro' ), + 'type' => \Elementor\Controls_Manager::SELECT, + 'options' => $this->get_template_post_type(), + 'default' => 'grid', + ] + ); + + $this->add_control( + 'column', + [ + 'label' => esc_html__( 'Columns', 'opalestate-pro' ), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 3, + 'options' => [ 1 => 1, 2 => 2, 3 => 3, 4 => 4, 6 => 6 ], + + ] + ); + + $this->add_control( + 'column_gap', + [ + 'label' => esc_html__( 'Columns Gap', 'opalestate-pro' ), + 'type' => Controls_Manager::SLIDER, + 'range' => [ + 'px' => [ + 'min' => 0, + 'max' => 100, + ], + ], + 'selectors' => [ + '{{WRAPPER}} .elementor-items-container' => 'grid-column-gap: {{SIZE}}{{UNIT}}', + + ], + 'condition' => [ + 'enable_carousel' => '', + ], + ] + ); + + $this->add_control( + 'enable_carousel', + [ + 'label' => esc_html__( 'Enable Carousel', 'opalestate-pro' ), + 'type' => Controls_Manager::SWITCHER, + ] + ); + + $this->end_controls_section(); + + + /// $this->add_slick_controls( array('enable_carousel' => 'yes') , ' .product-slick-carousel ' ); + + $this->start_controls_section( + 'section_query', + [ + 'label' => esc_html__( 'Query', 'opalestate-pro' ), + 'tab' => Controls_Manager::TAB_CONTENT, + ] + ); + + $this->add_control( + 'posts_per_page', + [ + 'label' => esc_html__( 'Posts Per Page', 'opalestate-pro' ), + 'type' => Controls_Manager::NUMBER, + 'default' => 6, + ] + ); + + + $this->add_control( + 'advanced', + [ + 'label' => esc_html__( 'Advanced', 'opalestate-pro' ), + 'type' => Controls_Manager::HEADING, + ] + ); + + $this->add_control( + 'orderby', + [ + 'label' => esc_html__( 'Order By', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'default' => 'post_date', + 'options' => [ + 'post_date' => esc_html__( 'Date', 'opalestate-pro' ), + 'post_title' => esc_html__( 'Title', 'opalestate-pro' ), + 'menu_order' => esc_html__( 'Menu Order', 'opalestate-pro' ), + 'rand' => esc_html__( 'Random', 'opalestate-pro' ), + ], + ] + ); + + $this->add_control( + 'order', + [ + 'label' => esc_html__( 'Order', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'default' => 'desc', + 'options' => [ + 'asc' => esc_html__( 'ASC', 'opalestate-pro' ), + 'desc' => esc_html__( 'DESC', 'opalestate-pro' ), + ], + ] + ); + + $this->add_control( + 'categories', + [ + 'label' => esc_html__( 'Categories', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_categories(), + 'multiple' => true, + ] + ); + + $this->add_control( + 'cat_operator', + [ + 'label' => esc_html__( 'Category Operator', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'default' => 'IN', + 'options' => [ + 'AND' => esc_html__( 'AND', 'opalestate-pro' ), + 'IN' => esc_html__( 'IN', 'opalestate-pro' ), + 'NOT IN' => esc_html__( 'NOT IN', 'opalestate-pro' ), + ], + 'condition' => [ + 'categories!' => '', + ], + ] + ); + + + $this->add_control( + 'types', + [ + 'label' => esc_html__( 'Types', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_types(), + 'multiple' => true, + ] + ); + + $this->add_control( + 'labels', + [ + 'label' => esc_html__( 'Lables', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_labels(), + 'multiple' => true, + ] + ); + + $this->add_control( + 'statuses', + [ + 'label' => esc_html__( 'Status', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_statuses(), + 'multiple' => true, + ] + ); + + $this->add_control( + 'cities', + [ + 'label' => esc_html__( 'Cities', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT2, + 'options' => $this->get_post_cities(), + 'multiple' => true, + ] + ); + + + $this->end_controls_section(); + + + $this->start_controls_section( + 'section_pagination', + [ + 'label' => esc_html__( 'Pagination', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'pagination_type', + [ + 'label' => esc_html__( 'Pagination', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'default' => '', + 'options' => [ + '' => esc_html__( 'None', 'opalestate-pro' ), + 'numbers' => esc_html__( 'Numbers', 'opalestate-pro' ), + 'prev_next' => esc_html__( 'Previous/Next', 'opalestate-pro' ), + 'numbers_and_prev_next' => esc_html__( 'Numbers', 'opalestate-pro' ) . ' + ' . esc_html__( 'Previous/Next', 'opalestate-pro' ), + ], + ] + ); + + $this->add_control( + 'pagination_page_limit', + [ + 'label' => esc_html__( 'Page Limit', 'opalestate-pro' ), + 'default' => '5', + 'condition' => [ + 'pagination_type!' => '', + ], + ] + ); + + $this->add_control( + 'pagination_numbers_shorten', + [ + 'label' => esc_html__( 'Shorten', 'opalestate-pro' ), + 'type' => Controls_Manager::SWITCHER, + 'default' => '', + 'condition' => [ + 'pagination_type' => [ + 'numbers', + 'numbers_and_prev_next', + ], + ], + ] + ); + + $this->add_control( + 'pagination_prev_label', + [ + 'label' => esc_html__( 'Previous Label', 'opalestate-pro' ), + 'default' => esc_html__( '« Previous', 'opalestate-pro' ), + 'condition' => [ + 'pagination_type' => [ + 'prev_next', + 'numbers_and_prev_next', + ], + ], + ] + ); + + $this->add_control( + 'pagination_next_label', + [ + 'label' => esc_html__( 'Next Label', 'opalestate-pro' ), + 'default' => esc_html__( 'Next »', 'opalestate-pro' ), + 'condition' => [ + 'pagination_type' => [ + 'prev_next', + 'numbers_and_prev_next', + ], + ], + ] + ); + + $this->add_control( + 'pagination_align', + [ + 'label' => esc_html__( 'Alignment', 'opalestate-pro' ), + 'type' => Controls_Manager::CHOOSE, + 'options' => [ + 'flex-start' => [ + 'title' => esc_html__( 'Left', 'opalestate-pro' ), + 'icon' => 'fa fa-align-left', + ], + 'center' => [ + 'title' => esc_html__( 'Center', 'opalestate-pro' ), + 'icon' => 'fa fa-align-center', + ], + 'flex-end' => [ + 'title' => esc_html__( 'Right', 'opalestate-pro' ), + 'icon' => 'fa fa-align-right', + ], + ], + 'default' => 'flex-start', + 'selectors' => [ + '{{WRAPPER}} .pagination' => 'justify-content: {{VALUE}};', + ], + 'condition' => [ + 'pagination_type!' => '', + ], + ] + ); + + + $this->end_controls_section(); + + } + + protected function get_post_labels() { + $categories = Opalestate_Taxonomy_Label::get_list(); + + $results = []; + if ( ! is_wp_error( $categories ) ) { + foreach ( $categories as $category ) { + $results[ $category->slug ] = $category->name; + } + } + + return $results; + } + + protected function get_post_types() { + $categories = Opalestate_Taxonomy_Type::get_list(); + + $results = []; + if ( ! is_wp_error( $categories ) ) { + foreach ( $categories as $category ) { + $results[ $category->slug ] = $category->name; + } + } + + return $results; + } + + protected function get_post_categories() { + + $categories = Opalestate_Taxonomy_Categories::get_list(); + + $results = []; + if ( ! is_wp_error( $categories ) ) { + foreach ( $categories as $category ) { + $results[ $category->slug ] = $category->name; + } + } + + return $results; + } + + + protected function get_post_statuses() { + + $categories = Opalestate_Taxonomy_Status::get_list(); + + $results = []; + if ( ! is_wp_error( $categories ) ) { + foreach ( $categories as $category ) { + $results[ $category->slug ] = $category->name; + } + } + + return $results; + } + + protected function get_post_cities() { + + $categories = Opalestate_Taxonomy_City::get_list(); + + $results = []; + if ( ! is_wp_error( $categories ) ) { + foreach ( $categories as $category ) { + $results[ $category->slug ] = $category->name; + } + } + + return $results; + } + + + private function get_template_post_type() { + $folderes = glob( OPALESTATE_PLUGIN_DIR . '/templates/content-property-*' ); + $output = []; + + foreach ( $folderes as $folder ) { + $folder = str_replace( "content-property-", '', str_replace( '.php', '', wp_basename( $folder ) ) ); + $value = str_replace( '_', ' ', str_replace( '-', ' ', ucfirst( $folder ) ) ); + $output[ $folder ] = $value; + } + + return $output; + } +} diff --git a/inc/vendors/elementor/widgets/opalestate-searchbox.php b/inc/vendors/elementor/widgets/opalestate-searchbox.php new file mode 100755 index 00000000..a63895bc --- /dev/null +++ b/inc/vendors/elementor/widgets/opalestate-searchbox.php @@ -0,0 +1,386 @@ +get_name(), 'eicon-search' ); + } + + /** + * Get widget keywords. + * + * Retrieve the list of keywords the widget belongs to. + * + * @access public + * + * @return array Widget keywords. + */ + public function get_keywords() { + return [ 'opalestate-pro', 'search' ]; + } + + /** + * Register icon box widget controls. + * + * Adds different input fields to allow the user to change and customize the widget settings. + * + * @access protected + */ + protected function _register_controls() { + $this->start_controls_section( + 'property_search_form', + [ + 'label' => esc_html__( 'Property Search Form', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 's_form_description', + [ + 'raw' => esc_html__( 'This is often used for building seach page, it combines with block => Search: Map Preview, Search: Property Results.', 'opalestate-pro' ), + 'type' => Controls_Manager::RAW_HTML, + 'content_classes' => 'elementor-descriptor', + ] + ); + + $this->add_control( + 'style', + [ + 'label' => esc_html__( 'Layout', 'opalestate-pro' ), + 'type' => Controls_Manager::SELECT, + 'options' => opalestate_search_properties_form_styles(), + 'default' => 'search-form-h', + ] + ); + + $this->add_control( + 'hidden_labels', + [ + 'label' => esc_html__( 'Disable Labels', 'opalestate-pro' ), + 'type' => Controls_Manager::SWITCHER, + 'default' => 'yes', + ] + ); + + $this->add_control( + 'nobutton', + [ + 'label' => esc_html__( 'Disable Search button', 'opalestate-pro' ), + 'type' => Controls_Manager::SWITCHER, + ] + ); + + $this->add_control( + 'display_country', + [ + 'label' => esc_html__( 'Display Country select', 'opalestate-pro' ), + 'type' => Controls_Manager::SWITCHER, + 'default' => 'yes', + 'condition' => [ + 'style' => $this->has_location_fields(), + ], + ] + ); + + $this->add_control( + 'display_state', + [ + 'label' => esc_html__( 'Display State select', 'opalestate-pro' ), + 'type' => Controls_Manager::SWITCHER, + 'condition' => [ + 'style' => $this->has_location_fields(), + ], + ] + ); + + $this->add_control( + 'display_city', + [ + 'label' => esc_html__( 'Display City select', 'opalestate-pro' ), + 'type' => Controls_Manager::SWITCHER, + 'condition' => [ + 'style' => $this->has_location_fields(), + ], + ] + ); + + $this->add_control( + 'display_more_options', + [ + 'label' => esc_html__( 'Display More Options', 'opalestate-pro' ), + 'type' => Controls_Manager::SWITCHER, + 'default' => 'yes', + ] + ); + + $this->end_controls_section(); + + $this->start_controls_section( + 'section_label_style_content', + [ + 'label' => esc_html__( 'Label', 'opalestate-pro' ), + 'tab' => Controls_Manager::TAB_STYLE, + ] + ); + + $this->start_controls_tabs( 'tabs_label_style' ); + + $this->start_controls_tab( + 'tab_label_normal', + [ + 'label' => __( 'Normal', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'title_color', + [ + 'label' => esc_html__( 'Color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .opalestate-search-form label.opalestate-label' => 'color: {{VALUE}};', + ], + ] + ); + + $this->add_group_control( + Group_Control_Typography::get_type(), + [ + 'name' => 'title_typography', + 'selector' => '{{WRAPPER}} .opalestate-search-form label.opalestate-label', + ] + ); + + $this->end_controls_tab(); + + $this->start_controls_tab( + 'tab_label_hover', + [ + 'label' => __( 'Hover', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'title_color_hover', + [ + 'label' => esc_html__( 'Color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .opalestate-search-form label.opalestate-label:hover' => 'color: {{VALUE}};', + ], + ] + ); + + $this->end_controls_tab(); + + $this->end_controls_tabs(); + + $this->end_controls_section(); + + $this->start_controls_section( + 'section_input_style_content', + [ + 'label' => esc_html__( 'Input', 'opalestate-pro' ), + 'tab' => Controls_Manager::TAB_STYLE, + ] + ); + + $this->add_control( + 'input_color', + [ + 'label' => esc_html__( 'Color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .opalestate-search-form input, {{WRAPPER}} .opalestate-search-form input::placeholder, {{WRAPPER}} .opalestate-search-form select, {{WRAPPER}} .opalestate-search-form .select2-container--default .select2-selection--single .select2-selection__rendered, {{WRAPPER}} .opalestate-search-form .opalestate-popup .popup-head > span' => 'color: {{VALUE}};', + ], + ] + ); + + $this->add_control( + 'input_background_color', + [ + 'label' => esc_html__( 'Background color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .opalestate-search-form input, {{WRAPPER}} .opalestate-search-form select, {{WRAPPER}} .opalestate-search-form .select2-container.select2-container--default .select2-selection--single' => 'background-color: {{VALUE}};', + ], + ] + ); + + $this->add_control( + 'input_border_color', + [ + 'label' => esc_html__( 'Border color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .opalestate-search-form input, {{WRAPPER}} .opalestate-search-form select, {{WRAPPER}} .opalestate-search-form .select2-container.select2-container--default .select2-selection--single' => 'border-color: {{VALUE}};', + ], + ] + ); + + $this->add_group_control( + Group_Control_Typography::get_type(), + [ + 'name' => 'input_typography', + 'selector' => '{{WRAPPER}} .opalestate-search-form input, {{WRAPPER}} .opalestate-search-form select, {{WRAPPER}} .opalestate-search-form .select2-container.select2-container--default .select2-selection--single', + ] + ); + + $this->end_controls_section(); + + + + $this->start_controls_section( + 'section_button_style_content', + [ + 'label' => esc_html__( 'Button', 'opalestate-pro' ), + 'tab' => Controls_Manager::TAB_STYLE, + ] + ); + + $this->start_controls_tabs( 'tabs_button_style' ); + + $this->start_controls_tab( + 'tab_button_normal', + [ + 'label' => __( 'Normal', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'button_color', + [ + 'label' => esc_html__( 'Color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .opalestate-search-form .btn' => 'color: {{VALUE}};', + ], + ] + ); + + $this->add_control( + 'button_background_color', + [ + 'label' => esc_html__( 'Background color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .opalestate-search-form .btn' => 'background-color: {{VALUE}};', + ], + ] + ); + + $this->add_group_control( + Group_Control_Typography::get_type(), + [ + 'name' => 'button_typography', + 'selector' => '{{WRAPPER}} .opalestate-search-form .btn.btn-search', + ] + ); + + $this->end_controls_tab(); + + $this->start_controls_tab( + 'tab_button_hover', + [ + 'label' => __( 'Hover', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'button_color_hover', + [ + 'label' => esc_html__( 'Color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .opalestate-search-form .btn:hover' => 'color: {{VALUE}};', + ], + ] + ); + + $this->add_control( + 'button_background_color_hover', + [ + 'label' => esc_html__( 'Background color', 'opalestate-pro' ), + 'type' => Controls_Manager::COLOR, + 'default' => '', + 'selectors' => [ + '{{WRAPPER}} .opalestate-search-form .btn:hover' => 'background-color: {{VALUE}};', + ], + ] + ); + + $this->end_controls_tab(); + + $this->end_controls_tabs(); + + $this->end_controls_section(); + } + + protected function has_location_fields() { + return [ + 'search-form-h', + 'advanced-v2', + 'advanced-v3', + 'advanced-v4', + 'search-form-v', + 'search-form-v3', + 'collapse-keyword', + ]; + } +} diff --git a/inc/vendors/elementor/widgets/opalestate-split-maps-search.php b/inc/vendors/elementor/widgets/opalestate-split-maps-search.php new file mode 100755 index 00000000..636fdd7f --- /dev/null +++ b/inc/vendors/elementor/widgets/opalestate-split-maps-search.php @@ -0,0 +1,131 @@ +get_name(), 'eicon-search' ); + } + + /** + * Get widget keywords. + * + * Retrieve the list of keywords the widget belongs to. + * + * @access public + * + * @return array Widget keywords. + */ + public function get_keywords() { + return [ 'opalestate-pro', 'search' ]; + } + + /** + * Register icon box widget controls. + * + * Adds different input fields to allow the user to change and customize the widget settings. + * + * @access protected + */ + protected function _register_controls() { + $this->start_controls_section( + 'agents_search_form', + [ + 'label' => esc_html__( 'Search Form', 'opalestate-pro' ), + ] + ); + + $this->add_control( + 'search_form', + [ + 'label' => esc_html__( 'Search Form', 'opalestate-pro' ), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 'advanced-v2', + 'options' => opalestate_search_properties_form_styles(), + ] + ); + + $this->add_responsive_control( + 'column', + [ + 'label' => esc_html__( 'Columns', 'opalestate-pro' ), + 'type' => \Elementor\Controls_Manager::SELECT, + 'default' => 3, + 'options' => [ 1 => 1, 2 => 2, 3 => 3, 4 => 4, 6 => 6 ], + 'prefix_class' => 'elementor-grid%s-', + 'condition' => [ + 'item_layout' => 'grid', + ], + + ] + ); + + $this->add_control( + 'column_gap', + [ + 'label' => esc_html__( 'Columns Gap', 'opalestate-pro' ), + 'type' => Controls_Manager::SLIDER, + 'range' => [ + 'px' => [ + 'min' => 0, + 'max' => 100, + ], + ], + 'selectors' => [ + '{{WRAPPER}} .elementor-items-container' => 'grid-column-gap: {{SIZE}}{{UNIT}}', + + ], + 'condition' => [ + 'item_layout' => 'grid', + ], + ] + ); + $this->end_controls_section(); + } +} diff --git a/inc/vendors/index.html b/inc/vendors/index.html new file mode 100755 index 00000000..e69de29b diff --git a/inc/vendors/opalmembership/free-package.php b/inc/vendors/opalmembership/free-package.php new file mode 100755 index 00000000..893aa5bc --- /dev/null +++ b/inc/vendors/opalmembership/free-package.php @@ -0,0 +1,114 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +function opalestate_membership_settings_submission( $fields ) { + $tmp = [ + [ + 'name' => esc_html__( 'Free Submission', 'opalestate-pro' ), + 'id' => 'opalestate_title_free_submission_settings', + 'type' => 'title', + 'before_row' => '
              ', + 'after_row' => '
              ', + ], + [ + 'name' => esc_html__( 'Enable Free Submission', 'opalestate-pro' ), + 'desc' => esc_html__( 'Allow set automatic a free package.', 'opalestate-pro' ), + 'id' => 'enabel_free_submission', + 'type' => 'switch', + 'options' => [ + 1 => esc_html__( 'Yes', 'opalestate-pro' ), + 0 => esc_html__( 'No', 'opalestate-pro' ), + ], + ], + [ + 'name' => esc_html__( 'Number Free Listing', 'opalestate-pro' ), + 'desc' => esc_html__( 'Maximum number of Free Listing that users can submit.', 'opalestate-pro' ), + 'id' => 'free_number_listing', + 'type' => 'text_small', + 'attributes' => [ + 'type' => 'number', + ], + 'default' => 3, + ], + [ + 'name' => esc_html__( 'Number Free Featured', 'opalestate-pro' ), + 'desc' => esc_html__( 'Maximum number of Free Featured that users can set.', 'opalestate-pro' ), + 'id' => 'free_number_featured', + 'type' => 'text_small', + 'attributes' => [ + 'type' => 'number', + ], + 'default' => 3, + ], + ]; + + return array_merge( $fields, $tmp ); +} + +add_filter( 'opalestate_settings_submission', 'opalestate_membership_settings_submission' ); + +if ( opalestate_options( 'enabel_free_submission' ) ) { + function opalestate_check_is_membership_valid( $status, $package_id, $user_id ) { + if ( $package_id != -1 ) { + return false; + } + $package_expired = get_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_ . 'package_expired', true ); + + if ( ! is_numeric( $package_expired ) ) { + $package_expired = strtotime( $package_expired ); + } + if ( ! $package_expired || $package_expired <= time() ) { + return false; + } + + return true; + } + + add_filter( 'opalmembership_check_is_membership_valid', 'opalestate_check_is_membership_valid', 3, 3 ); + + /** + * + */ + function opalestate_get_freepackage_obj() { + + $object = new Opalmembership_Package(); + $object->post_title = esc_html__( 'Free membership', 'opalestate-pro' ); + + return $object; + + } + + add_filter( 'opalmembership_get_object_membership', 'opalestate_get_freepackage_obj' ); + + /// free account + add_action( 'user_register', 'opalestate_on_create_user', 10, 1 ); + add_action( 'profile_update', 'opalestate_on_update_user' ); + function opalestate_on_create_user( $user_id ) { + if ( $user_id ) { + opalestate_reset_user_free_package( $user_id ); + } + } + + function opalestate_on_update_user( $user_id ) { + $package_id = get_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_ . 'package_id', true ); + if ( empty( $package_id ) ) { + opalestate_reset_user_free_package( $user_id ); + } + } +} +?> diff --git a/inc/vendors/opalmembership/functions.php b/inc/vendors/opalmembership/functions.php new file mode 100755 index 00000000..a5fec3cb --- /dev/null +++ b/inc/vendors/opalmembership/functions.php @@ -0,0 +1,201 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + + +/** + * Count Number of listing following user + */ +function opalesate_get_user_current_listings( $user_id ){ + $args = array( + 'post_type' => 'opalestate_property', + 'post_status' => array( 'pending', 'publish' ), + 'author' => $user_id, + + ); + $posts = new WP_Query( $args ); + return $posts->found_posts; + wp_reset_postdata(); +} + +/** + * Count Number of featured listing following user + */ +function opalesate_get_user_current_featured_listings( $user_id ){ + + $args = array( + 'post_type' => 'opalestate_property', + 'post_status' => array( 'pending', 'publish' ), + 'author' => $user_id, + 'meta_query' => array( + array( + 'key' => OPALESTATE_PROPERTY_PREFIX.'featured', + 'value' => 1, + 'meta_compare '=>'=' + ) + ) + ); + $posts = new WP_Query( $args ); + return $posts->found_posts; + wp_reset_postdata(); +} + +/** + * Check current package is downgrade package or not via current number of featured, listing lesser + */ +function opalesate_check_package_downgrade_status( $user_id, $package_id ){ + + $pack_listings = get_post_meta( $package_id, OPALMEMBERSHIP_PACKAGES_PREFIX.'package_listings', true ); + $pack_featured_listings = get_post_meta( $package_id, OPALMEMBERSHIP_PACKAGES_PREFIX.'package_featured_listings', true ); + $is_unlimited = get_post_meta( $package_id, OPALMEMBERSHIP_PACKAGES_PREFIX.'unlimited_listings', true ); + $pack_unlimited_listings = $is_unlimited == 'on' ? 0 : 1; + + $user_current_listings = opalesate_get_user_current_listings( $user_id ); + $user_current_featured_listings = opalesate_get_user_current_featured_listings( $user_id ); + + $current_listings = get_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_listings',true); + + if( $pack_unlimited_listings == 1 ) { + return false; + } + + // if is unlimited and go to non unlimited pack + if ( $current_listings == -1 && $pack_unlimited_listings != 1 ) { + return true; + } + + return ( $user_current_listings > $pack_listings ) || ( $user_current_featured_listings > $pack_featured_listings ) ; +} + +/** + * Check Current User having permission to add new property or not? + */ +function opalesate_check_has_add_listing( $user_id, $package_id=null ){ + + if( !$package_id ){ + $package_id = (int)get_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_id', true ); + } + + $package_listings = (int) get_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_listings', true ); + + + $unlimited_listings = get_post_meta( $package_id, OPALMEMBERSHIP_PACKAGES_PREFIX.'unlimited_listings', true ); + + $unlimited_listings = !empty( $unlimited_listings ) && $unlimited_listings == 'on' ? 0 : 1; + + if( $package_id > 0 && $unlimited_listings ){ + return true; + } + + if( $package_listings > 0 ){ + return true; + } + return false; +} + +/** + * Check current package is downgrade package or not via current number of featured, listing lesser + */ +function opalesate_get_user_featured_remaining_listing( $user_id ){ + + $count = get_the_author_meta( OPALMEMBERSHIP_USER_PREFIX_.'package_featured_listings' , $user_id ); + + return $count; +} + +/** + * + */ +function opalestate_reset_user_free_package( $user_id ){ + + $duration = opalestate_options('free_expired_month', 12); + update_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_id', -1 ); + update_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_listings', opalestate_options('free_number_listing', 3) ); + update_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_featured_listings', opalestate_options('free_number_featured', 3) ); + + update_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_activation', time() ); + update_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_expired', time() + ($duration*60*60*24*30) ); + + return true; +} + +/** + * Update remaining featured listings + */ +function opalesate_update_package_number_featured_listings( $user_id ) { + + $current = get_the_author_meta( OPALMEMBERSHIP_USER_PREFIX_.'package_featured_listings' , $user_id ); + + if( $current-1 >= 0 ) { + update_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_featured_listings', $current-1 ) ; + } else { + update_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_featured_listings', 0 ); + } +} + +/** + * Update remaining featured listings + */ +function opalesate_update_package_number_listings( $user_id ) { + + $current = get_the_author_meta( OPALMEMBERSHIP_USER_PREFIX_.'package_listings' , $user_id ); + + if( $current-1 >= 0 ) { + update_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_listings', $current-1 ) ; + } else { + update_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_listings', 0 ); + } +} + + +/** + * Check + */ +function opalesate_is_membership_valid( $user_id = null ){ + // $package_id = (int)get_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_id', true ); + return Opalmembership_User::is_membership_valid( $user_id ); +} + + +/** + * + */ +function opalesate_listing_set_to_expire($post_id){ + + $prop = array( + + 'ID' => $post_id, + 'post_type' => 'opalestate_property', + 'post_status' => 'expired' + + ); + + wp_update_post($prop ); + + $post = get_post( $post_id ); + $user_id = $post->post_author; + + $user = get_user_by('id', $user_id); + $user_email = $user->user_email; + + $args = array( + 'expired_listing_url' => get_permalink($post_id), + 'expired_listing_name' => get_the_title($post_id) + ); + + opalesate_email_type( $user_email, 'listing_expired', $args ); +} \ No newline at end of file diff --git a/inc/vendors/opalmembership/membership.php b/inc/vendors/opalmembership/membership.php new file mode 100755 index 00000000..bf190bf8 --- /dev/null +++ b/inc/vendors/opalmembership/membership.php @@ -0,0 +1,630 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +if ( defined( 'OpalMembership' ) ) { + return; +} +/** + * @class OpalEstate_Membership: as vendor class is using for processing logic with update/set permission for user submitting property. + * + * @version 1.0 + */ +class OpalEstate_Membership{ + + /* + * Constructor + */ + public static function init() { + + if( get_current_user_id() ){ + /* estate */ + add_action( 'show_admin_bar' , array( __CLASS__, 'hide_admin_toolbar' ) ); // hide admin toolbar + /* cmb2 meta box hook membership information */ + add_filter( 'opalmembership_postype_membership_metaboxes_fields', array( __CLASS__, 'metabox' ), 10 ); + /* add user agent role after insert new user member */ + // add_filter( 'opalmembership_create_user_data' , array( __CLASS__, 'add_user_role_data' ), 10 ); + // add_action( 'opalmembership_create_new_user_successfully', array( __CLASS__, 'trigger_create_user_agent' ), 10, 3 ); + /** + * save user meta when save user agent post type + */ + add_action( 'cmb2_save_post_fields', array( __CLASS__, 'trigger_update_user_meta' ), 10, 4 ); + add_action( 'profile_update', array( __CLASS__, 'trigger_update_agent_meta' ), 10, 2 ); + /** + * Call Hook after updated membership information in user data. + */ + add_action( 'opalmembership_after_update_user_membership' , array( __CLASS__,'on_set_user_update_membership') , 10, 3 ); + + /** + * HOOK TO My Properties Page Set action to check when user set property as featured. + */ + add_filter( 'opalestate_set_feature_property_checked' , array( __CLASS__,'feature_property_checked') ); + add_action( 'opalestate_toggle_featured_property_before' , array( __CLASS__,'update_featured_remaining_listing'), 10, 2 ); + + /** + * HOOK to Submssion Page: Check permission before submitting + */ + // check validation before + add_action( 'opalestate_process_submission_before' , array( __CLASS__, 'check_membership_validation' ), 1 ); + + add_action( 'opalestate_submission_form_before' , array( __CLASS__ ,'show_membership_warning'), 9 ); + add_action( 'opalestate_submission_form_before' , array( __CLASS__, 'check_membership_validation_message' ) ); + + add_action( 'opalestate_process_edit_submission_before' , array( __CLASS__, 'check_edit_post' ) ); + add_action( 'opalestate_process_add_submission_before' , array( __CLASS__, 'check_add_post' ) ); + /// check before uploading image + add_action( 'opalestate_before_process_ajax_upload_file' , array( __CLASS__, 'check_ajax_upload' ) ); + add_action( 'opalestate_process_submission_after' , array( __CLASS__, 'update_remainng_listing' ) , 10, 3 ); + + /** + * HOOK to user management Menu + */ + add_filter( 'opalestate_management_user_menu' , array( __CLASS__, 'membership_menu' ) ); + + /** + * Hook to widget to show addition about current package. + */ + add_action( 'opalmembership_current_package_summary_after' , array( __CLASS__, 'render_membership_summary' ), 10, 2 ); + + /** + * Add 'opalesate_agent' role to get_users member data + */ + // add_action( 'opalmembership_member_table_arguments', array( __CLASS__, 'member_table_get_user_arguments' ) ); + // show in membership dashboard + add_action( 'opalmembership_dashboard_container_before' , array( __CLASS__, 'check_membership_validation_message' ) ); + // included logic functions + + require_once( 'free-package.php' ); + require_once( 'functions.php' ); + + add_action( 'opalmembership_current_package_summary_after' , array( __CLASS__, 'render_membership_summary' ), 10, 2 ); + + add_action( 'cmb2_admin_init', array( __CLASS__, 'register_user_package_metabox') ); + + + add_action( 'profile_update' , array( __CLASS__, 'on_update_user' ), 10, 1 ); + } + + /** + * Hook to loop of package membership + */ + add_action( 'opalmembership_content_single_before' , array( __CLASS__, 'render_membership_pricing_box' ) ); + + + } + + public static function show_membership_warning(){ + if( isset($_GET['id']) && $_GET['id'] > 0 ){ + return true; + } + if( class_exists("Opalmembership_User") ){ + return Opalmembership_User::show_membership_warning(); + } + } + + public static function render_membership_free_package(){ + echo opalestate_load_template_path( 'parts/membership-free-package', array() ); + } + + public static function render_membership_pricing_box(){ + echo opalestate_load_template_path( 'parts/membership-pricing-info', array() ); + } + + public static function member_table_get_user_arguments( $args ) { + return array_merge_recursive( $args, array( 'role__in' => array( 'opalestate_agent' ) ) ); + } + + + public static function set_properties_expired(){ + + global $current_user; + wp_get_current_user(); + $user_id = $current_user->ID; + + $args = array( + 'post_type' => 'opalestate_agent', + 'author' => $user_id, + 'post_status' => 'any' + ); + + $query = new WP_Query( $args ); + + while( $query->have_posts()) { + $query->the_post(); + + $prop = array( + 'ID' => $post->ID, + 'post_type' => 'opalestate_agent', + 'post_status' => 'expired' + ); + + wp_update_post($prop ); + } + wp_reset_query(); + + } + + /** + * Before upload any file. this is called to check user having package which allows to upload or is not expired. + * + * @return void if everything is ok, or json data if it is not valid. + */ + public static function check_ajax_upload(){ + global $current_user; + wp_get_current_user(); + $user_id = $current_user->ID; + + $has = opalesate_check_has_add_listing( $user_id ); + + + $check = opalesate_is_membership_valid( $user_id ); + + if( ! $check || ! $has ){ + $std = new stdClass(); + $std->status = false ; + $std->message = esc_html__( 'Could not allow uploading image','opalestate-pro' ); + echo json_encode( $std ); exit(); + } + } + + /** + * hide admin toolbar with user role agent + */ + public static function hide_admin_toolbar( $show ) { + if ( ! is_user_logged_in() ) { return $show; } + + $user = wp_get_current_user(); + if ( opalestate_get_option( 'hide_toolbar' ) && $user->roles && in_array( 'opalestate_agent', $user->roles ) ) { + return false; + } + return $show; + } + + /** + * Trigger to extend fields to inject into Metabox of property edit/add form. + */ + public static function metabox( $fields ) { + + if ( ! defined( 'OPALMEMBERSHIP_PACKAGES_PREFIX' ) ) return $fields; + + $prefix = OPALMEMBERSHIP_PACKAGES_PREFIX; + + $fields[] = array( + 'name' => esc_html__( 'Number Of Properties', 'opalestate-pro' ), + 'id' => $prefix . 'package_listings', + 'type' => 'text', + 'attributes' => array( + 'type' => 'number', + 'pattern' => '\d*', + 'min' => 0 + ), + 'std' => '1', + 'description' => esc_html__( 'Number of properties with this package. If not set it will be unlimited.', 'opalestate-pro' ) + ); + + $fields[] = array( + 'name' => esc_html__( 'Number Of Featured Properties', 'opalestate-pro' ), + 'id' => $prefix . 'package_featured_listings', + 'type' => 'text', + 'attributes' => array( + 'type' => 'number', + 'pattern' => '\d*', + 'min' => 0 + ), + 'std' => '1', + 'description' => esc_html__( 'Number of properties can make featured with this package.', 'opalestate-pro' ) + ); + + $fields[] = array( + 'name' => esc_html__( ' Unlimited listings ?', 'opalestate-pro' ), + 'id' => $prefix . 'unlimited_listings', + 'type' => 'checkbox', + 'std' => '1', + 'description' => esc_html__( 'No, it is not unlimited, If not set it will be unlimited. Number of properties can make featured with this package.', 'opalestate-pro' ) + ); + + return $fields; + } + + /** + * Hook Method to add more link for user management + */ + public static function membership_menu( $menu ){ + if( function_exists("opalmembership_get_dashdoard_page_uri") ){ + global $opalmembership_options; + $menu['membership'] = array( + 'icon' => 'fa fa-user', + 'link' => opalmembership_get_dashdoard_page_uri(), + 'title' => esc_html__( 'My Membership', 'opalestate-pro' ), + 'id' => isset( $opalmembership_options['dashboard_page'] ) ? $opalmembership_options['dashboard_page'] : 0 + ); + + $menu['membership_history'] = array( + 'icon' => 'fa fa-user', + 'link' => opalmembership_get_payment_history_page_uri(), + 'title' => esc_html__( 'My Invoices', 'opalestate-pro' ), + 'id' => isset( $opalmembership_options['dashboard_page'] ) ? $opalmembership_options['dashboard_page'] : 0 + ); + + $menu['packages'] = array( + 'icon' => 'fa fa-certificate', + 'link' => opalmembership_get_membership_page_uri(), + 'title' => esc_html__( 'Renew membership', 'opalestate-pro' ), + 'id' => isset( $opalmembership_options['dashboard_page'] ) ? $opalmembership_options['dashboard_page'] : 0 + ); + } + return $menu; + } + + /** + * This function add new user role in this case is add 'opalestate_agent' role to user created + */ + public static function add_user_role_data( $cred ) { + $cred['role'] = 'opalestate_agent'; + return $cred; + } + + /** + * trigger create new post type user agent + */ + public static function trigger_create_user_agent( $user_id, $user_data, $cred ) { + // create new post(opalestate_agent) + $agent_id = opalesate_insert_user_agent( array( + 'first_name' => $cred['first_name'], + 'last_name' => $cred['last_name'], + 'email' => $cred['user_email'] + ) ); + + update_post_meta( $agent_id, OPALESTATE_AGENT_PREFIX . 'user_id', $user_id ); + } + + /** + * save user meta data + */ + public static function trigger_update_user_meta( $agent_id, $cmb_id, $updated, $cmb2 ) { + + if ( $cmb_id !== 'opalestate_agt_info' || empty( $cmb2->data_to_save ) ) return; + $user_id = get_post_meta( $agent_id, OPALESTATE_AGENT_PREFIX . 'user_id', true ); + + if ( ! $user_id ) return; + foreach ( $cmb2->data_to_save as $name => $value ) { + + + if ( strpos( $name, OPALESTATE_AGENT_PREFIX ) === 0 ) { + update_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . substr( $name, strlen( OPALESTATE_AGENT_PREFIX ) ), $value ); + } + } + } + + /** + * trigger save agent post meta + */ + public static function trigger_update_agent_meta( $user_id, $old_user_meta ) { + if ( empty( $_POST ) ) return; + global $wpdb; + $sql = $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_value = %d AND meta_key = %s", $user_id, OPALESTATE_AGENT_PREFIX . 'user_id' ); + $agent_id = $wpdb->get_var( $sql ); + + if ( ! $agent_id ) return; + foreach ( $_POST as $name => $value ) { + if ( strpos( $name, OPALESTATE_USER_PROFILE_PREFIX ) === 0 ) { + update_post_meta( $agent_id, OPALESTATE_AGENT_PREFIX . substr( $name, strlen( OPALESTATE_USER_PROFILE_PREFIX ) ), $value ); + } + } + } + + /** + * This function is called when payment status is completed. It will update new number of featured, listing for user. + * + * @return void + */ + public static function on_set_user_update_membership( $package_id, $user_id=0, $payment_id=0 ){ + /** + * Get some information from selected package. + */ + $pack_listings = get_post_meta( $package_id, OPALMEMBERSHIP_PACKAGES_PREFIX.'package_listings', true ); + $pack_featured_listings = get_post_meta( $package_id, OPALMEMBERSHIP_PACKAGES_PREFIX.'package_featured_listings', true ); + $is_unlimited_listings = get_post_meta( $package_id, OPALMEMBERSHIP_PACKAGES_PREFIX.'unlimited_listings', true ); + + $pack_unlimited_listings = $is_unlimited_listings == 'on' ? 0 : 1; + /** + * Get package information with user logined + */ + $current_listings = get_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_listings',true); + $curent_featured_listings = get_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_featured_listings',true); + $current_pack = get_user_meta( $user_id,OPALMEMBERSHIP_USER_PREFIX_.'package_id', true ); + + $user_current_listings = opalesate_get_user_current_listings ( $user_id ); // get user current listings ( no expired ) + $user_current_featured_listings = opalesate_get_user_current_featured_listings( $user_id ); // get user current featured listings ( no expired ) + + if( opalesate_check_package_downgrade_status( $user_id, $package_id ) ) { + $new_listings = $pack_listings; + $new_featured_listings = $pack_featured_listings; + }else{ + $new_listings = $pack_listings - $user_current_listings ; + $new_featured_listings = $pack_featured_listings - $user_current_featured_listings ; + } + + // in case of downgrade + if( $new_listings < 0 ) { + $new_listings = 0; + } + + if( $new_featured_listings < 0 ) { + $new_featured_listings = 0; + } + + + if ( $pack_unlimited_listings == 1 ) { + $new_listings = -1; + } + + /** + * Update new number of packages listings and featured listing. + */ + update_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_listings', $new_listings) ; + update_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_featured_listings', $new_featured_listings); + } + + /** + * This function is called when user set property as featured. + * + * @return boolean. true is user having permission. + */ + public static function feature_property_checked(){ + global $current_user; + wp_get_current_user(); + $user_id = $current_user->ID; + + if( isset($_POST['property_id']) ){ + return opalesate_get_user_featured_remaining_listing( $user_id ); + } + return false; + } + + /** + * Reduce -1 when set featured status is done. + */ + public static function update_featured_remaining_listing( $user_id, $property_id ){ + opalesate_update_package_number_featured_listings( $user_id ); + } + + /** + * + */ + public static function update_remainng_listing( $user_id, $property_id , $isedit=true ){ + if( $isedit != true ){ + opalesate_update_package_number_listings( $user_id ); + } + } + + /** + * Check user having any actived package and the package is not expired. + * Auto redirect to membership packages package. + */ + public static function check_membership_validation(){ + $check = opalesate_is_membership_valid(); + if( !$check ){ + + return opalestate_output_msg_json( true, + __('Your membership package is expired or Your package has 0 left listing, please upgrade now.', 'opalestate-pro' ), + array( + 'heading' => esc_html__('Submission Information' ,'opalestate-pro'), + 'redirect' => opalmembership_get_membership_page_uri(array('warning=1')) + )) ; + } + return ; + } + + /** + * Check any action while editing page + */ + public static function check_edit_post(){ + return true; + } + + /** + * Check permission to allow creating any property. The package is not valid, it is automatic redirect to membership page. + */ + public static function check_add_post(){ + + global $current_user; + wp_get_current_user(); + $user_id = $current_user->ID; + + $has = opalesate_check_has_add_listing( $user_id ); + if( $has == false ){ + wp_redirect( opalmembership_get_membership_page_uri( array('warning=2') ) ); exit; + } + } + + /** + * Display membership warning at top of submission form. + */ + public static function check_membership_validation_message(){ + + global $current_user; + wp_get_current_user(); + $user_id = $current_user->ID; + if( isset($_GET['id']) && $_GET['id'] > 0 ){ + return ; + } + + echo opalestate_load_template_path( 'parts/membership-warning', array('user_id' => $user_id) ); + + } + + /** + * Hooked method to display more information about actived package. + */ + public static function render_membership_summary($package_id=0, $payment_id=0){ + + global $current_user; + + wp_get_current_user(); + $user_id = $current_user->ID; + + $current_listings = get_user_meta($user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_listings',true); + $curent_featured_listings = get_user_meta($user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_featured_listings',true); + + /// + $pack_listings = get_post_meta( $package_id, OPALMEMBERSHIP_PACKAGES_PREFIX.'package_listings', true ); + $pack_featured_listings = get_post_meta( $package_id, OPALMEMBERSHIP_PACKAGES_PREFIX.'package_featured_listings', true ); + $pack_unlimited_listings = get_post_meta( $package_id, OPALMEMBERSHIP_PACKAGES_PREFIX.'unlimited_listings', true ); + $unlimited_listings = $pack_unlimited_listings == 'on' ? 0 : 1; + /// + + $output = ''; + if( $unlimited_listings == 1 && $package_id > 0 ){ + $output .= '
            • '.__('(Package) Listings Included:','opalestate-pro').' '.__( 'Unlimited', 'opalestate-pro' ).'
            • '; + $output .= '
            • '.__('(Package) Featured Included:','opalestate-pro').' '.__( 'Unlimited', 'opalestate-pro' ).'
            • '; + }else { + if( $package_id > 0 ){ + $output .= '
            • '.__('(Package) Listings Included:','opalestate-pro').' '.$pack_listings.'
            • '; + $output .= '
            • '.__('(Package) Featured Included:','opalestate-pro').' '.$pack_featured_listings.'
            • '; + } + $output .= '
            • '.__('Listings Remaining:','opalestate-pro').' '.$current_listings.'
            • '; + $output .= '
            • '.__('Featured Remaining:','opalestate-pro').' '.$curent_featured_listings.'
            • '; + } + + echo $output; + } + + public static function membership_username_actions( $actions, $items ) { + $actions['edit'] = sprintf( '%s', get_edit_post_link( 0 ), esc_html__( 'Edit', 'opalestate-pro' ) ); + return $actions; + } + + /** + * Hook in and add a metabox to add fields to the user profile pages + */ + public static function register_user_package_metabox( ) { + + if( !defined("OPALMEMBERSHIP_USER_PREFIX_") || !current_user_can( 'manage_options' ) ){ + return ; + } + + $prefix = OPALMEMBERSHIP_USER_PREFIX_; + $fields = array(); + + + foreach( $fields as $field ){ + $cmb_user->add_field( $field ); + } + $fields = array(); + $date = null ; + + $current_user = wp_get_current_user(); + + if( (isset($_GET['user_id']) && $_GET['user_id']) ){ + $user_id = (int)$_GET['user_id']; + } else { + $user_id = get_current_user_id(); + } + + $date = get_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_expired', true ); + + /** + * Metabox for the user profile screen + */ + $cmb_user = new_cmb2_box( array( + 'id' => $prefix . 'package', + 'title' => esc_html__( 'Membership Package', 'opalestate-pro' ), // Doesn't output for user boxes + 'object_types' => array( 'user' ), // Tells CMB2 to use user_meta vs post_meta + 'show_names' => true, + 'new_user_section' => 'add-new-user', // where form will show on new user page. 'add-existing-user' is only other valid option. + ) ); + + $fields[] = array( + 'name' => esc_html__( 'Package', 'opalestate-pro' ), + 'id' => $prefix . 'package_id', + 'type' => 'text', + 'attributes' => array( + 'type' => 'number', + 'pattern' => '\d*', + 'min' => 0 + ), + 'std' => '1', + 'description' => esc_html__( 'Set package ID with -1 as free package.', 'opalestate-pro' ), + 'before_row' => '

              '.__( 'Membership Information', 'opalestate-pro' ).'

              ' + ); + + + $fields[] = array( + 'name' => esc_html__( 'Number Of Properties', 'opalestate-pro' ), + 'id' => $prefix . 'package_listings', + 'type' => 'text', + 'attributes' => array( + 'type' => 'number', + 'pattern' => '\d*', + 'min' => 0 + ), + 'std' => '1', + 'description' => esc_html__( 'Number of properties with this package. If not set it will be unlimited.', 'opalestate-pro' ) + ); + + $fields[] = array( + 'name' => esc_html__( 'Number Of Featured Properties', 'opalestate-pro' ), + 'id' => $prefix . 'package_featured_listings', + 'type' => 'text', + 'attributes' => array( + 'type' => 'number', + 'pattern' => '\d*', + 'min' => 0 + ), + 'std' => '1', + 'description' => esc_html__( 'Number of properties can make featured with this package.', 'opalestate-pro' ) + ); + + $fields[] = array( + 'name' => esc_html__( 'Expired', 'opalestate-pro' ), + 'id' => $prefix . 'package_expired_date', + 'type' => 'text_date', + 'default' => $date, + 'std' => '1', + 'description' => esc_html__( 'Show expired time in double format.', 'opalestate-pro' ) + ); + + $fields[] = array( + 'name' => esc_html__( 'Expired', 'opalestate-pro' ), + 'id' => $prefix . 'package_expired', + 'type' => 'text', + 'std' => '1', + 'description' => esc_html__( 'Show expired time in double format.', 'opalestate-pro' ) + ); + + + foreach( $fields as $field ){ + $cmb_user->add_field( $field ); + } + // } + } + + public static function on_update_user( $user_id ) { + if( $user_id ){ + $prefix = OPALMEMBERSHIP_USER_PREFIX_; + $field = $prefix.'package_expired_date'; + if( isset($_POST[$field]) && !empty($_POST[$field]) ) { + $expired_time = strtotime($_POST[$field]); + $_POST[$prefix . 'package_expired'] = $expired_time; + update_user_meta( $user_id, OPALMEMBERSHIP_USER_PREFIX_.'package_expired', $expired_time ); + } + } + } +} + +OpalEstate_Membership::init(); \ No newline at end of file diff --git a/inc/vendors/social-login/Facebook/Authentication/AccessToken.php b/inc/vendors/social-login/Facebook/Authentication/AccessToken.php new file mode 100755 index 00000000..5d700733 --- /dev/null +++ b/inc/vendors/social-login/Facebook/Authentication/AccessToken.php @@ -0,0 +1,160 @@ +value = $accessToken; + if ($expiresAt) { + $this->setExpiresAtFromTimeStamp($expiresAt); + } + } + + /** + * Generate an app secret proof to sign a request to Graph. + * + * @param string $appSecret The app secret. + * + * @return string + */ + public function getAppSecretProof($appSecret) + { + return hash_hmac('sha256', $this->value, $appSecret); + } + + /** + * Getter for expiresAt. + * + * @return \DateTime|null + */ + public function getExpiresAt() + { + return $this->expiresAt; + } + + /** + * Determines whether or not this is an app access token. + * + * @return bool + */ + public function isAppAccessToken() + { + return strpos($this->value, '|') !== false; + } + + /** + * Determines whether or not this is a long-lived token. + * + * @return bool + */ + public function isLongLived() + { + if ($this->expiresAt) { + return $this->expiresAt->getTimestamp() > time() + (60 * 60 * 2); + } + + if ($this->isAppAccessToken()) { + return true; + } + + return false; + } + + /** + * Checks the expiration of the access token. + * + * @return boolean|null + */ + public function isExpired() + { + if ($this->getExpiresAt() instanceof \DateTime) { + return $this->getExpiresAt()->getTimestamp() < time(); + } + + if ($this->isAppAccessToken()) { + return false; + } + + return null; + } + + /** + * Returns the access token as a string. + * + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Returns the access token as a string. + * + * @return string + */ + public function __toString() + { + return $this->getValue(); + } + + /** + * Setter for expires_at. + * + * @param int $timeStamp + */ + protected function setExpiresAtFromTimeStamp($timeStamp) + { + $dt = new \DateTime(); + $dt->setTimestamp($timeStamp); + $this->expiresAt = $dt; + } +} diff --git a/inc/vendors/social-login/Facebook/Authentication/AccessTokenMetadata.php b/inc/vendors/social-login/Facebook/Authentication/AccessTokenMetadata.php new file mode 100755 index 00000000..165433cb --- /dev/null +++ b/inc/vendors/social-login/Facebook/Authentication/AccessTokenMetadata.php @@ -0,0 +1,390 @@ +metadata = $metadata['data']; + + $this->castTimestampsToDateTime(); + } + + /** + * Returns a value from the metadata. + * + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + */ + public function getField($field, $default = null) + { + if (isset($this->metadata[$field])) { + return $this->metadata[$field]; + } + + return $default; + } + + /** + * Returns a value from the metadata. + * + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + * + * @deprecated 5.0.0 getProperty() has been renamed to getField() + * @todo v6: Remove this method + */ + public function getProperty($field, $default = null) + { + return $this->getField($field, $default); + } + + /** + * Returns a value from a child property in the metadata. + * + * @param string $parentField The parent property. + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + */ + public function getChildProperty($parentField, $field, $default = null) + { + if (!isset($this->metadata[$parentField])) { + return $default; + } + + if (!isset($this->metadata[$parentField][$field])) { + return $default; + } + + return $this->metadata[$parentField][$field]; + } + + /** + * Returns a value from the error metadata. + * + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + */ + public function getErrorProperty($field, $default = null) + { + return $this->getChildProperty('error', $field, $default); + } + + /** + * Returns a value from the "metadata" metadata. *Brain explodes* + * + * @param string $field The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + */ + public function getMetadataProperty($field, $default = null) + { + return $this->getChildProperty('metadata', $field, $default); + } + + /** + * The ID of the application this access token is for. + * + * @return string|null + */ + public function getAppId() + { + return $this->getField('app_id'); + } + + /** + * Name of the application this access token is for. + * + * @return string|null + */ + public function getApplication() + { + return $this->getField('application'); + } + + /** + * Any error that a request to the graph api + * would return due to the access token. + * + * @return bool|null + */ + public function isError() + { + return $this->getField('error') !== null; + } + + /** + * The error code for the error. + * + * @return int|null + */ + public function getErrorCode() + { + return $this->getErrorProperty('code'); + } + + /** + * The error message for the error. + * + * @return string|null + */ + public function getErrorMessage() + { + return $this->getErrorProperty('message'); + } + + /** + * The error subcode for the error. + * + * @return int|null + */ + public function getErrorSubcode() + { + return $this->getErrorProperty('subcode'); + } + + /** + * DateTime when this access token expires. + * + * @return \DateTime|null + */ + public function getExpiresAt() + { + return $this->getField('expires_at'); + } + + /** + * Whether the access token is still valid or not. + * + * @return boolean|null + */ + public function getIsValid() + { + return $this->getField('is_valid'); + } + + /** + * DateTime when this access token was issued. + * + * Note that the issued_at field is not returned + * for short-lived access tokens. + * + * @see https://developers.facebook.com/docs/facebook-login/access-tokens#debug + * + * @return \DateTime|null + */ + public function getIssuedAt() + { + return $this->getField('issued_at'); + } + + /** + * General metadata associated with the access token. + * Can contain data like 'sso', 'auth_type', 'auth_nonce'. + * + * @return array|null + */ + public function getMetadata() + { + return $this->getField('metadata'); + } + + /** + * The 'sso' child property from the 'metadata' parent property. + * + * @return string|null + */ + public function getSso() + { + return $this->getMetadataProperty('sso'); + } + + /** + * The 'auth_type' child property from the 'metadata' parent property. + * + * @return string|null + */ + public function getAuthType() + { + return $this->getMetadataProperty('auth_type'); + } + + /** + * The 'auth_nonce' child property from the 'metadata' parent property. + * + * @return string|null + */ + public function getAuthNonce() + { + return $this->getMetadataProperty('auth_nonce'); + } + + /** + * For impersonated access tokens, the ID of + * the page this token contains. + * + * @return string|null + */ + public function getProfileId() + { + return $this->getField('profile_id'); + } + + /** + * List of permissions that the user has granted for + * the app in this access token. + * + * @return array + */ + public function getScopes() + { + return $this->getField('scopes'); + } + + /** + * The ID of the user this access token is for. + * + * @return string|null + */ + public function getUserId() + { + return $this->getField('user_id'); + } + + /** + * Ensures the app ID from the access token + * metadata is what we expect. + * + * @param string $appId + * + * @throws FacebookSDKException + */ + public function validateAppId($appId) + { + if ($this->getAppId() !== $appId) { + throw new FacebookSDKException('Access token metadata contains unexpected app ID.', 401); + } + } + + /** + * Ensures the user ID from the access token + * metadata is what we expect. + * + * @param string $userId + * + * @throws FacebookSDKException + */ + public function validateUserId($userId) + { + if ($this->getUserId() !== $userId) { + throw new FacebookSDKException('Access token metadata contains unexpected user ID.', 401); + } + } + + /** + * Ensures the access token has not expired yet. + * + * @throws FacebookSDKException + */ + public function validateExpiration() + { + if (!$this->getExpiresAt() instanceof \DateTime) { + return; + } + + if ($this->getExpiresAt()->getTimestamp() < time()) { + throw new FacebookSDKException('Inspection of access token metadata shows that the access token has expired.', 401); + } + } + + /** + * Converts a unix timestamp into a DateTime entity. + * + * @param int $timestamp + * + * @return \DateTime + */ + private function convertTimestampToDateTime($timestamp) + { + $dt = new \DateTime(); + $dt->setTimestamp($timestamp); + + return $dt; + } + + /** + * Casts the unix timestamps as DateTime entities. + */ + private function castTimestampsToDateTime() + { + foreach (static::$dateProperties as $key) { + if (isset($this->metadata[$key]) && $this->metadata[$key] !== 0) { + $this->metadata[$key] = $this->convertTimestampToDateTime($this->metadata[$key]); + } + } + } +} diff --git a/inc/vendors/social-login/Facebook/Authentication/OAuth2Client.php b/inc/vendors/social-login/Facebook/Authentication/OAuth2Client.php new file mode 100755 index 00000000..94df9b7b --- /dev/null +++ b/inc/vendors/social-login/Facebook/Authentication/OAuth2Client.php @@ -0,0 +1,292 @@ +app = $app; + $this->client = $client; + $this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; + } + + /** + * Returns the last FacebookRequest that was sent. + * Useful for debugging and testing. + * + * @return FacebookRequest|null + */ + public function getLastRequest() + { + return $this->lastRequest; + } + + /** + * Get the metadata associated with the access token. + * + * @param AccessToken|string $accessToken The access token to debug. + * + * @return AccessTokenMetadata + */ + public function debugToken($accessToken) + { + $accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken; + $params = ['input_token' => $accessToken]; + + $this->lastRequest = new FacebookRequest( + $this->app, + $this->app->getAccessToken(), + 'GET', + '/debug_token', + $params, + null, + $this->graphVersion + ); + $response = $this->client->sendRequest($this->lastRequest); + $metadata = $response->getDecodedBody(); + + return new AccessTokenMetadata($metadata); + } + + /** + * Generates an authorization URL to begin the process of authenticating a user. + * + * @param string $redirectUrl The callback URL to redirect to. + * @param string $state The CSPRNG-generated CSRF value. + * @param array $scope An array of permissions to request. + * @param array $params An array of parameters to generate URL. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + public function getAuthorizationUrl($redirectUrl, $state, array $scope = [], array $params = [], $separator = '&') + { + $params += [ + 'client_id' => $this->app->getId(), + 'state' => $state, + 'response_type' => 'code', + 'sdk' => 'php-sdk-' . Facebook::VERSION, + 'redirect_uri' => $redirectUrl, + 'scope' => implode(',', $scope) + ]; + + return static::BASE_AUTHORIZATION_URL . '/' . $this->graphVersion . '/dialog/oauth?' . http_build_query($params, null, $separator); + } + + /** + * Get a valid access token from a code. + * + * @param string $code + * @param string $redirectUri + * + * @return AccessToken + * + * @throws FacebookSDKException + */ + public function getAccessTokenFromCode($code, $redirectUri = '') + { + $params = [ + 'code' => $code, + 'redirect_uri' => $redirectUri, + ]; + + return $this->requestAnAccessToken($params); + } + + /** + * Exchanges a short-lived access token with a long-lived access token. + * + * @param AccessToken|string $accessToken + * + * @return AccessToken + * + * @throws FacebookSDKException + */ + public function getLongLivedAccessToken($accessToken) + { + $accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken; + $params = [ + 'grant_type' => 'fb_exchange_token', + 'fb_exchange_token' => $accessToken, + ]; + + return $this->requestAnAccessToken($params); + } + + /** + * Get a valid code from an access token. + * + * @param AccessToken|string $accessToken + * @param string $redirectUri + * + * @return AccessToken + * + * @throws FacebookSDKException + */ + public function getCodeFromLongLivedAccessToken($accessToken, $redirectUri = '') + { + $params = [ + 'redirect_uri' => $redirectUri, + ]; + + $response = $this->sendRequestWithClientParams('/oauth/client_code', $params, $accessToken); + $data = $response->getDecodedBody(); + + if (!isset($data['code'])) { + throw new FacebookSDKException('Code was not returned from Graph.', 401); + } + + return $data['code']; + } + + /** + * Send a request to the OAuth endpoint. + * + * @param array $params + * + * @return AccessToken + * + * @throws FacebookSDKException + */ + protected function requestAnAccessToken(array $params) + { + $response = $this->sendRequestWithClientParams('/oauth/access_token', $params); + $data = $response->getDecodedBody(); + + if (!isset($data['access_token'])) { + throw new FacebookSDKException('Access token was not returned from Graph.', 401); + } + + // Graph returns two different key names for expiration time + // on the same endpoint. Doh! :/ + $expiresAt = 0; + if (isset($data['expires'])) { + // For exchanging a short lived token with a long lived token. + // The expiration time in seconds will be returned as "expires". + $expiresAt = time() + $data['expires']; + } elseif (isset($data['expires_in'])) { + // For exchanging a code for a short lived access token. + // The expiration time in seconds will be returned as "expires_in". + // See: https://developers.facebook.com/docs/facebook-login/access-tokens#long-via-code + $expiresAt = time() + $data['expires_in']; + } + + return new AccessToken($data['access_token'], $expiresAt); + } + + /** + * Send a request to Graph with an app access token. + * + * @param string $endpoint + * @param array $params + * @param AccessToken|string|null $accessToken + * + * @return FacebookResponse + * + * @throws FacebookResponseException + */ + protected function sendRequestWithClientParams($endpoint, array $params, $accessToken = null) + { + $params += $this->getClientParams(); + + $accessToken = $accessToken ?: $this->app->getAccessToken(); + + $this->lastRequest = new FacebookRequest( + $this->app, + $accessToken, + 'GET', + $endpoint, + $params, + null, + $this->graphVersion + ); + + return $this->client->sendRequest($this->lastRequest); + } + + /** + * Returns the client_* params for OAuth requests. + * + * @return array + */ + protected function getClientParams() + { + return [ + 'client_id' => $this->app->getId(), + 'client_secret' => $this->app->getSecret(), + ]; + } +} diff --git a/inc/vendors/social-login/Facebook/Exceptions/FacebookAuthenticationException.php b/inc/vendors/social-login/Facebook/Exceptions/FacebookAuthenticationException.php new file mode 100755 index 00000000..c5e45fa3 --- /dev/null +++ b/inc/vendors/social-login/Facebook/Exceptions/FacebookAuthenticationException.php @@ -0,0 +1,33 @@ +response = $response; + $this->responseData = $response->getDecodedBody(); + + $errorMessage = $this->get('message', 'Unknown error from Graph.'); + $errorCode = $this->get('code', -1); + + parent::__construct($errorMessage, $errorCode, $previousException); + } + + /** + * A factory for creating the appropriate exception based on the response from Graph. + * + * @param FacebookResponse $response The response that threw the exception. + * + * @return FacebookResponseException + */ + public static function create(FacebookResponse $response) + { + $data = $response->getDecodedBody(); + + if (!isset($data['error']['code']) && isset($data['code'])) { + $data = ['error' => $data]; + } + + $code = isset($data['error']['code']) ? $data['error']['code'] : null; + $message = isset($data['error']['message']) ? $data['error']['message'] : 'Unknown error from Graph.'; + + if (isset($data['error']['error_subcode'])) { + switch ($data['error']['error_subcode']) { + // Other authentication issues + case 458: + case 459: + case 460: + case 463: + case 464: + case 467: + return new static($response, new FacebookAuthenticationException($message, $code)); + // Video upload resumable error + case 1363030: + case 1363019: + case 1363033: + case 1363021: + case 1363041: + return new static($response, new FacebookResumableUploadException($message, $code)); + case 1363037: + $previousException = new FacebookResumableUploadException($message, $code); + + $startOffset = isset($data['error']['error_data']['start_offset']) ? (int) $data['error']['error_data']['start_offset'] : null; + $previousException->setStartOffset($startOffset); + + $endOffset = isset($data['error']['error_data']['end_offset']) ? (int) $data['error']['error_data']['end_offset'] : null; + $previousException->setEndOffset($endOffset); + + return new static($response, $previousException); + } + } + + switch ($code) { + // Login status or token expired, revoked, or invalid + case 100: + case 102: + case 190: + return new static($response, new FacebookAuthenticationException($message, $code)); + + // Server issue, possible downtime + case 1: + case 2: + return new static($response, new FacebookServerException($message, $code)); + + // API Throttling + case 4: + case 17: + case 32: + case 341: + case 613: + return new static($response, new FacebookThrottleException($message, $code)); + + // Duplicate Post + case 506: + return new static($response, new FacebookClientException($message, $code)); + } + + // Missing Permissions + if ($code == 10 || ($code >= 200 && $code <= 299)) { + return new static($response, new FacebookAuthorizationException($message, $code)); + } + + // OAuth authentication error + if (isset($data['error']['type']) && $data['error']['type'] === 'OAuthException') { + return new static($response, new FacebookAuthenticationException($message, $code)); + } + + // All others + return new static($response, new FacebookOtherException($message, $code)); + } + + /** + * Checks isset and returns that or a default value. + * + * @param string $key + * @param mixed $default + * + * @return mixed + */ + private function get($key, $default = null) + { + if (isset($this->responseData['error'][$key])) { + return $this->responseData['error'][$key]; + } + + return $default; + } + + /** + * Returns the HTTP status code + * + * @return int + */ + public function getHttpStatusCode() + { + return $this->response->getHttpStatusCode(); + } + + /** + * Returns the sub-error code + * + * @return int + */ + public function getSubErrorCode() + { + return $this->get('error_subcode', -1); + } + + /** + * Returns the error type + * + * @return string + */ + public function getErrorType() + { + return $this->get('type', ''); + } + + /** + * Returns the raw response used to create the exception. + * + * @return string + */ + public function getRawResponse() + { + return $this->response->getBody(); + } + + /** + * Returns the decoded response used to create the exception. + * + * @return array + */ + public function getResponseData() + { + return $this->responseData; + } + + /** + * Returns the response entity used to create the exception. + * + * @return FacebookResponse + */ + public function getResponse() + { + return $this->response; + } +} diff --git a/inc/vendors/social-login/Facebook/Exceptions/FacebookResumableUploadException.php b/inc/vendors/social-login/Facebook/Exceptions/FacebookResumableUploadException.php new file mode 100755 index 00000000..6d41c63c --- /dev/null +++ b/inc/vendors/social-login/Facebook/Exceptions/FacebookResumableUploadException.php @@ -0,0 +1,68 @@ +startOffset; + } + + /** + * @param int|null $startOffset + */ + public function setStartOffset($startOffset) + { + $this->startOffset = $startOffset; + } + + /** + * @return int|null + */ + public function getEndOffset() + { + return $this->endOffset; + } + + /** + * @param int|null $endOffset + */ + public function setEndOffset($endOffset) + { + $this->endOffset = $endOffset; + } +} diff --git a/inc/vendors/social-login/Facebook/Exceptions/FacebookSDKException.php b/inc/vendors/social-login/Facebook/Exceptions/FacebookSDKException.php new file mode 100755 index 00000000..d8bef1ab --- /dev/null +++ b/inc/vendors/social-login/Facebook/Exceptions/FacebookSDKException.php @@ -0,0 +1,33 @@ + getenv(static::APP_ID_ENV_NAME), + 'app_secret' => getenv(static::APP_SECRET_ENV_NAME), + 'default_graph_version' => static::DEFAULT_GRAPH_VERSION, + 'enable_beta_mode' => false, + 'http_client_handler' => null, + 'persistent_data_handler' => null, + 'pseudo_random_string_generator' => null, + 'url_detection_handler' => null, + ], $config); + + if (!$config['app_id']) { + throw new FacebookSDKException('Required "app_id" key not supplied in config and could not find fallback environment variable "' . static::APP_ID_ENV_NAME . '"'); + } + if (!$config['app_secret']) { + throw new FacebookSDKException('Required "app_secret" key not supplied in config and could not find fallback environment variable "' . static::APP_SECRET_ENV_NAME . '"'); + } + + $this->app = new FacebookApp($config['app_id'], $config['app_secret']); + $this->client = new FacebookClient( + HttpClientsFactory::createHttpClient($config['http_client_handler']), + $config['enable_beta_mode'] + ); + $this->pseudoRandomStringGenerator = PseudoRandomStringGeneratorFactory::createPseudoRandomStringGenerator( + $config['pseudo_random_string_generator'] + ); + $this->setUrlDetectionHandler($config['url_detection_handler'] ?: new FacebookUrlDetectionHandler()); + $this->persistentDataHandler = PersistentDataFactory::createPersistentDataHandler( + $config['persistent_data_handler'] + ); + + if (isset($config['default_access_token'])) { + $this->setDefaultAccessToken($config['default_access_token']); + } + + // @todo v6: Throw an InvalidArgumentException if "default_graph_version" is not set + $this->defaultGraphVersion = $config['default_graph_version']; + } + + /** + * Returns the FacebookApp entity. + * + * @return FacebookApp + */ + public function getApp() + { + return $this->app; + } + + /** + * Returns the FacebookClient service. + * + * @return FacebookClient + */ + public function getClient() + { + return $this->client; + } + + /** + * Returns the OAuth 2.0 client service. + * + * @return OAuth2Client + */ + public function getOAuth2Client() + { + if (!$this->oAuth2Client instanceof OAuth2Client) { + $app = $this->getApp(); + $client = $this->getClient(); + $this->oAuth2Client = new OAuth2Client($app, $client, $this->defaultGraphVersion); + } + + return $this->oAuth2Client; + } + + /** + * Returns the last response returned from Graph. + * + * @return FacebookResponse|FacebookBatchResponse|null + */ + public function getLastResponse() + { + return $this->lastResponse; + } + + /** + * Returns the URL detection handler. + * + * @return UrlDetectionInterface + */ + public function getUrlDetectionHandler() + { + return $this->urlDetectionHandler; + } + + /** + * Changes the URL detection handler. + * + * @param UrlDetectionInterface $urlDetectionHandler + */ + private function setUrlDetectionHandler(UrlDetectionInterface $urlDetectionHandler) + { + $this->urlDetectionHandler = $urlDetectionHandler; + } + + /** + * Returns the default AccessToken entity. + * + * @return AccessToken|null + */ + public function getDefaultAccessToken() + { + return $this->defaultAccessToken; + } + + /** + * Sets the default access token to use with requests. + * + * @param AccessToken|string $accessToken The access token to save. + * + * @throws \InvalidArgumentException + */ + public function setDefaultAccessToken($accessToken) + { + if (is_string($accessToken)) { + $this->defaultAccessToken = new AccessToken($accessToken); + + return; + } + + if ($accessToken instanceof AccessToken) { + $this->defaultAccessToken = $accessToken; + + return; + } + + throw new \InvalidArgumentException('The default access token must be of type "string" or Facebook\AccessToken'); + } + + /** + * Returns the default Graph version. + * + * @return string + */ + public function getDefaultGraphVersion() + { + return $this->defaultGraphVersion; + } + + /** + * Returns the redirect login helper. + * + * @return FacebookRedirectLoginHelper + */ + public function getRedirectLoginHelper() + { + return new FacebookRedirectLoginHelper( + $this->getOAuth2Client(), + $this->persistentDataHandler, + $this->urlDetectionHandler, + $this->pseudoRandomStringGenerator + ); + } + + /** + * Returns the JavaScript helper. + * + * @return FacebookJavaScriptHelper + */ + public function getJavaScriptHelper() + { + return new FacebookJavaScriptHelper($this->app, $this->client, $this->defaultGraphVersion); + } + + /** + * Returns the canvas helper. + * + * @return FacebookCanvasHelper + */ + public function getCanvasHelper() + { + return new FacebookCanvasHelper($this->app, $this->client, $this->defaultGraphVersion); + } + + /** + * Returns the page tab helper. + * + * @return FacebookPageTabHelper + */ + public function getPageTabHelper() + { + return new FacebookPageTabHelper($this->app, $this->client, $this->defaultGraphVersion); + } + + /** + * Sends a GET request to Graph and returns the result. + * + * @param string $endpoint + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function get($endpoint, $accessToken = null, $eTag = null, $graphVersion = null) + { + return $this->sendRequest( + 'GET', + $endpoint, + $params = [], + $accessToken, + $eTag, + $graphVersion + ); + } + + /** + * Sends a POST request to Graph and returns the result. + * + * @param string $endpoint + * @param array $params + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function post($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) + { + return $this->sendRequest( + 'POST', + $endpoint, + $params, + $accessToken, + $eTag, + $graphVersion + ); + } + + /** + * Sends a DELETE request to Graph and returns the result. + * + * @param string $endpoint + * @param array $params + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function delete($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) + { + return $this->sendRequest( + 'DELETE', + $endpoint, + $params, + $accessToken, + $eTag, + $graphVersion + ); + } + + /** + * Sends a request to Graph for the next page of results. + * + * @param GraphEdge $graphEdge The GraphEdge to paginate over. + * + * @return GraphEdge|null + * + * @throws FacebookSDKException + */ + public function next(GraphEdge $graphEdge) + { + return $this->getPaginationResults($graphEdge, 'next'); + } + + /** + * Sends a request to Graph for the previous page of results. + * + * @param GraphEdge $graphEdge The GraphEdge to paginate over. + * + * @return GraphEdge|null + * + * @throws FacebookSDKException + */ + public function previous(GraphEdge $graphEdge) + { + return $this->getPaginationResults($graphEdge, 'previous'); + } + + /** + * Sends a request to Graph for the next page of results. + * + * @param GraphEdge $graphEdge The GraphEdge to paginate over. + * @param string $direction The direction of the pagination: next|previous. + * + * @return GraphEdge|null + * + * @throws FacebookSDKException + */ + public function getPaginationResults(GraphEdge $graphEdge, $direction) + { + $paginationRequest = $graphEdge->getPaginationRequest($direction); + if (!$paginationRequest) { + return null; + } + + $this->lastResponse = $this->client->sendRequest($paginationRequest); + + // Keep the same GraphNode subclass + $subClassName = $graphEdge->getSubClassName(); + $graphEdge = $this->lastResponse->getGraphEdge($subClassName, false); + + return count($graphEdge) > 0 ? $graphEdge : null; + } + + /** + * Sends a request to Graph and returns the result. + * + * @param string $method + * @param string $endpoint + * @param array $params + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function sendRequest($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) + { + $accessToken = $accessToken ?: $this->defaultAccessToken; + $graphVersion = $graphVersion ?: $this->defaultGraphVersion; + $request = $this->request($method, $endpoint, $params, $accessToken, $eTag, $graphVersion); + + return $this->lastResponse = $this->client->sendRequest($request); + } + + /** + * Sends a batched request to Graph and returns the result. + * + * @param array $requests + * @param AccessToken|string|null $accessToken + * @param string|null $graphVersion + * + * @return FacebookBatchResponse + * + * @throws FacebookSDKException + */ + public function sendBatchRequest(array $requests, $accessToken = null, $graphVersion = null) + { + $accessToken = $accessToken ?: $this->defaultAccessToken; + $graphVersion = $graphVersion ?: $this->defaultGraphVersion; + $batchRequest = new FacebookBatchRequest( + $this->app, + $requests, + $accessToken, + $graphVersion + ); + + return $this->lastResponse = $this->client->sendBatchRequest($batchRequest); + } + + /** + * Instantiates an empty FacebookBatchRequest entity. + * + * @param AccessToken|string|null $accessToken The top-level access token. Requests with no access token + * will fallback to this. + * @param string|null $graphVersion The Graph API version to use. + * @return FacebookBatchRequest + */ + public function newBatchRequest($accessToken = null, $graphVersion = null) + { + $accessToken = $accessToken ?: $this->defaultAccessToken; + $graphVersion = $graphVersion ?: $this->defaultGraphVersion; + + return new FacebookBatchRequest( + $this->app, + [], + $accessToken, + $graphVersion + ); + } + + /** + * Instantiates a new FacebookRequest entity. + * + * @param string $method + * @param string $endpoint + * @param array $params + * @param AccessToken|string|null $accessToken + * @param string|null $eTag + * @param string|null $graphVersion + * + * @return FacebookRequest + * + * @throws FacebookSDKException + */ + public function request($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) + { + $accessToken = $accessToken ?: $this->defaultAccessToken; + $graphVersion = $graphVersion ?: $this->defaultGraphVersion; + + return new FacebookRequest( + $this->app, + $accessToken, + $method, + $endpoint, + $params, + $eTag, + $graphVersion + ); + } + + /** + * Factory to create FacebookFile's. + * + * @param string $pathToFile + * + * @return FacebookFile + * + * @throws FacebookSDKException + */ + public function fileToUpload($pathToFile) + { + return new FacebookFile($pathToFile); + } + + /** + * Factory to create FacebookVideo's. + * + * @param string $pathToFile + * + * @return FacebookVideo + * + * @throws FacebookSDKException + */ + public function videoToUpload($pathToFile) + { + return new FacebookVideo($pathToFile); + } + + /** + * Upload a video in chunks. + * + * @param int $target The id of the target node before the /videos edge. + * @param string $pathToFile The full path to the file. + * @param array $metadata The metadata associated with the video file. + * @param string|null $accessToken The access token. + * @param int $maxTransferTries The max times to retry a failed upload chunk. + * @param string|null $graphVersion The Graph API version to use. + * + * @return array + * + * @throws FacebookSDKException + */ + public function uploadVideo($target, $pathToFile, $metadata = [], $accessToken = null, $maxTransferTries = 5, $graphVersion = null) + { + $accessToken = $accessToken ?: $this->defaultAccessToken; + $graphVersion = $graphVersion ?: $this->defaultGraphVersion; + + $uploader = new FacebookResumableUploader($this->app, $this->client, $accessToken, $graphVersion); + $endpoint = '/'.$target.'/videos'; + $file = $this->videoToUpload($pathToFile); + $chunk = $uploader->start($endpoint, $file); + + do { + $chunk = $this->maxTriesTransfer($uploader, $endpoint, $chunk, $maxTransferTries); + } while (!$chunk->isLastChunk()); + + return [ + 'video_id' => $chunk->getVideoId(), + 'success' => $uploader->finish($endpoint, $chunk->getUploadSessionId(), $metadata), + ]; + } + + /** + * Attempts to upload a chunk of a file in $retryCountdown tries. + * + * @param FacebookResumableUploader $uploader + * @param string $endpoint + * @param FacebookTransferChunk $chunk + * @param int $retryCountdown + * + * @return FacebookTransferChunk + * + * @throws FacebookSDKException + */ + private function maxTriesTransfer(FacebookResumableUploader $uploader, $endpoint, FacebookTransferChunk $chunk, $retryCountdown) + { + $newChunk = $uploader->transfer($endpoint, $chunk, $retryCountdown < 1); + + if ($newChunk !== $chunk) { + return $newChunk; + } + + $retryCountdown--; + + // If transfer() returned the same chunk entity, the transfer failed but is resumable. + return $this->maxTriesTransfer($uploader, $endpoint, $chunk, $retryCountdown); + } +} diff --git a/inc/vendors/social-login/Facebook/FacebookApp.php b/inc/vendors/social-login/Facebook/FacebookApp.php new file mode 100755 index 00000000..804c9bb5 --- /dev/null +++ b/inc/vendors/social-login/Facebook/FacebookApp.php @@ -0,0 +1,110 @@ +id = (string) $id; + $this->secret = $secret; + } + + /** + * Returns the app ID. + * + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * Returns the app secret. + * + * @return string + */ + public function getSecret() + { + return $this->secret; + } + + /** + * Returns an app access token. + * + * @return AccessToken + */ + public function getAccessToken() + { + return new AccessToken($this->id . '|' . $this->secret); + } + + /** + * Serializes the FacebookApp entity as a string. + * + * @return string + */ + public function serialize() + { + return implode('|', [$this->id, $this->secret]); + } + + /** + * Unserializes a string as a FacebookApp entity. + * + * @param string $serialized + */ + public function unserialize($serialized) + { + list($id, $secret) = explode('|', $serialized); + + $this->__construct($id, $secret); + } +} diff --git a/inc/vendors/social-login/Facebook/FacebookBatchRequest.php b/inc/vendors/social-login/Facebook/FacebookBatchRequest.php new file mode 100755 index 00000000..9297e77d --- /dev/null +++ b/inc/vendors/social-login/Facebook/FacebookBatchRequest.php @@ -0,0 +1,322 @@ +add($requests); + } + + /** + * Adds a new request to the array. + * + * @param FacebookRequest|array $request + * @param string|null|array $options Array of batch request options e.g. 'name', 'omit_response_on_success'. + * If a string is given, it is the value of the 'name' option. + * + * @return FacebookBatchRequest + * + * @throws \InvalidArgumentException + */ + public function add($request, $options = null) + { + if (is_array($request)) { + foreach ($request as $key => $req) { + $this->add($req, $key); + } + + return $this; + } + + if (!$request instanceof FacebookRequest) { + throw new \InvalidArgumentException('Argument for add() must be of type array or FacebookRequest.'); + } + + if (null === $options) { + $options = []; + } elseif (!is_array($options)) { + $options = ['name' => $options]; + } + + $this->addFallbackDefaults($request); + + // File uploads + $attachedFiles = $this->extractFileAttachments($request); + + $name = isset($options['name']) ? $options['name'] : null; + + unset($options['name']); + + $requestToAdd = [ + 'name' => $name, + 'request' => $request, + 'options' => $options, + 'attached_files' => $attachedFiles, + ]; + + $this->requests[] = $requestToAdd; + + return $this; + } + + /** + * Ensures that the FacebookApp and access token fall back when missing. + * + * @param FacebookRequest $request + * + * @throws FacebookSDKException + */ + public function addFallbackDefaults(FacebookRequest $request) + { + if (!$request->getApp()) { + $app = $this->getApp(); + if (!$app) { + throw new FacebookSDKException('Missing FacebookApp on FacebookRequest and no fallback detected on FacebookBatchRequest.'); + } + $request->setApp($app); + } + + if (!$request->getAccessToken()) { + $accessToken = $this->getAccessToken(); + if (!$accessToken) { + throw new FacebookSDKException('Missing access token on FacebookRequest and no fallback detected on FacebookBatchRequest.'); + } + $request->setAccessToken($accessToken); + } + } + + /** + * Extracts the files from a request. + * + * @param FacebookRequest $request + * + * @return string|null + * + * @throws FacebookSDKException + */ + public function extractFileAttachments(FacebookRequest $request) + { + if (!$request->containsFileUploads()) { + return null; + } + + $files = $request->getFiles(); + $fileNames = []; + foreach ($files as $file) { + $fileName = uniqid(); + $this->addFile($fileName, $file); + $fileNames[] = $fileName; + } + + $request->resetFiles(); + + // @TODO Does Graph support multiple uploads on one endpoint? + return implode(',', $fileNames); + } + + /** + * Return the FacebookRequest entities. + * + * @return array + */ + public function getRequests() + { + return $this->requests; + } + + /** + * Prepares the requests to be sent as a batch request. + */ + public function prepareRequestsForBatch() + { + $this->validateBatchRequestCount(); + + $params = [ + 'batch' => $this->convertRequestsToJson(), + 'include_headers' => true, + ]; + $this->setParams($params); + } + + /** + * Converts the requests into a JSON(P) string. + * + * @return string + */ + public function convertRequestsToJson() + { + $requests = []; + foreach ($this->requests as $request) { + $options = []; + + if (null !== $request['name']) { + $options['name'] = $request['name']; + } + + $options += $request['options']; + + $requests[] = $this->requestEntityToBatchArray($request['request'], $options, $request['attached_files']); + } + + return json_encode($requests); + } + + /** + * Validate the request count before sending them as a batch. + * + * @throws FacebookSDKException + */ + public function validateBatchRequestCount() + { + $batchCount = count($this->requests); + if ($batchCount === 0) { + throw new FacebookSDKException('There are no batch requests to send.'); + } elseif ($batchCount > 50) { + // Per: https://developers.facebook.com/docs/graph-api/making-multiple-requests#limits + throw new FacebookSDKException('You cannot send more than 50 batch requests at a time.'); + } + } + + /** + * Converts a Request entity into an array that is batch-friendly. + * + * @param FacebookRequest $request The request entity to convert. + * @param string|null|array $options Array of batch request options e.g. 'name', 'omit_response_on_success'. + * If a string is given, it is the value of the 'name' option. + * @param string|null $attachedFiles Names of files associated with the request. + * + * @return array + */ + public function requestEntityToBatchArray(FacebookRequest $request, $options = null, $attachedFiles = null) + { + + if (null === $options) { + $options = []; + } elseif (!is_array($options)) { + $options = ['name' => $options]; + } + + $compiledHeaders = []; + $headers = $request->getHeaders(); + foreach ($headers as $name => $value) { + $compiledHeaders[] = $name . ': ' . $value; + } + + $batch = [ + 'headers' => $compiledHeaders, + 'method' => $request->getMethod(), + 'relative_url' => $request->getUrl(), + ]; + + // Since file uploads are moved to the root request of a batch request, + // the child requests will always be URL-encoded. + $body = $request->getUrlEncodedBody()->getBody(); + if ($body) { + $batch['body'] = $body; + } + + $batch += $options; + + if (null !== $attachedFiles) { + $batch['attached_files'] = $attachedFiles; + } + + return $batch; + } + + /** + * Get an iterator for the items. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->requests); + } + + /** + * @inheritdoc + */ + public function offsetSet($offset, $value) + { + $this->add($value, $offset); + } + + /** + * @inheritdoc + */ + public function offsetExists($offset) + { + return isset($this->requests[$offset]); + } + + /** + * @inheritdoc + */ + public function offsetUnset($offset) + { + unset($this->requests[$offset]); + } + + /** + * @inheritdoc + */ + public function offsetGet($offset) + { + return isset($this->requests[$offset]) ? $this->requests[$offset] : null; + } +} diff --git a/inc/vendors/social-login/Facebook/FacebookBatchResponse.php b/inc/vendors/social-login/Facebook/FacebookBatchResponse.php new file mode 100755 index 00000000..8e1464c9 --- /dev/null +++ b/inc/vendors/social-login/Facebook/FacebookBatchResponse.php @@ -0,0 +1,174 @@ +batchRequest = $batchRequest; + + $request = $response->getRequest(); + $body = $response->getBody(); + $httpStatusCode = $response->getHttpStatusCode(); + $headers = $response->getHeaders(); + parent::__construct($request, $body, $httpStatusCode, $headers); + + $responses = $response->getDecodedBody(); + $this->setResponses($responses); + } + + /** + * Returns an array of FacebookResponse entities. + * + * @return array + */ + public function getResponses() + { + return $this->responses; + } + + /** + * The main batch response will be an array of requests so + * we need to iterate over all the responses. + * + * @param array $responses + */ + public function setResponses(array $responses) + { + $this->responses = []; + + foreach ($responses as $key => $graphResponse) { + $this->addResponse($key, $graphResponse); + } + } + + /** + * Add a response to the list. + * + * @param int $key + * @param array|null $response + */ + public function addResponse($key, $response) + { + $originalRequestName = isset($this->batchRequest[$key]['name']) ? $this->batchRequest[$key]['name'] : $key; + $originalRequest = isset($this->batchRequest[$key]['request']) ? $this->batchRequest[$key]['request'] : null; + + $httpResponseBody = isset($response['body']) ? $response['body'] : null; + $httpResponseCode = isset($response['code']) ? $response['code'] : null; + // @TODO With PHP 5.5 support, this becomes array_column($response['headers'], 'value', 'name') + $httpResponseHeaders = isset($response['headers']) ? $this->normalizeBatchHeaders($response['headers']) : []; + + $this->responses[$originalRequestName] = new FacebookResponse( + $originalRequest, + $httpResponseBody, + $httpResponseCode, + $httpResponseHeaders + ); + } + + /** + * @inheritdoc + */ + public function getIterator() + { + return new ArrayIterator($this->responses); + } + + /** + * @inheritdoc + */ + public function offsetSet($offset, $value) + { + $this->addResponse($offset, $value); + } + + /** + * @inheritdoc + */ + public function offsetExists($offset) + { + return isset($this->responses[$offset]); + } + + /** + * @inheritdoc + */ + public function offsetUnset($offset) + { + unset($this->responses[$offset]); + } + + /** + * @inheritdoc + */ + public function offsetGet($offset) + { + return isset($this->responses[$offset]) ? $this->responses[$offset] : null; + } + + /** + * Converts the batch header array into a standard format. + * @TODO replace with array_column() when PHP 5.5 is supported. + * + * @param array $batchHeaders + * + * @return array + */ + private function normalizeBatchHeaders(array $batchHeaders) + { + $headers = []; + + foreach ($batchHeaders as $header) { + $headers[$header['name']] = $header['value']; + } + + return $headers; + } +} diff --git a/inc/vendors/social-login/Facebook/FacebookClient.php b/inc/vendors/social-login/Facebook/FacebookClient.php new file mode 100755 index 00000000..dbf75923 --- /dev/null +++ b/inc/vendors/social-login/Facebook/FacebookClient.php @@ -0,0 +1,250 @@ +httpClientHandler = $httpClientHandler ?: $this->detectHttpClientHandler(); + $this->enableBetaMode = $enableBeta; + } + + /** + * Sets the HTTP client handler. + * + * @param FacebookHttpClientInterface $httpClientHandler + */ + public function setHttpClientHandler(FacebookHttpClientInterface $httpClientHandler) + { + $this->httpClientHandler = $httpClientHandler; + } + + /** + * Returns the HTTP client handler. + * + * @return FacebookHttpClientInterface + */ + public function getHttpClientHandler() + { + return $this->httpClientHandler; + } + + /** + * Detects which HTTP client handler to use. + * + * @return FacebookHttpClientInterface + */ + public function detectHttpClientHandler() + { + return extension_loaded('curl') ? new FacebookCurlHttpClient() : new FacebookStreamHttpClient(); + } + + /** + * Toggle beta mode. + * + * @param boolean $betaMode + */ + public function enableBetaMode($betaMode = true) + { + $this->enableBetaMode = $betaMode; + } + + /** + * Returns the base Graph URL. + * + * @param boolean $postToVideoUrl Post to the video API if videos are being uploaded. + * + * @return string + */ + public function getBaseGraphUrl($postToVideoUrl = false) + { + if ($postToVideoUrl) { + return $this->enableBetaMode ? static::BASE_GRAPH_VIDEO_URL_BETA : static::BASE_GRAPH_VIDEO_URL; + } + + return $this->enableBetaMode ? static::BASE_GRAPH_URL_BETA : static::BASE_GRAPH_URL; + } + + /** + * Prepares the request for sending to the client handler. + * + * @param FacebookRequest $request + * + * @return array + */ + public function prepareRequestMessage(FacebookRequest $request) + { + $postToVideoUrl = $request->containsVideoUploads(); + $url = $this->getBaseGraphUrl($postToVideoUrl) . $request->getUrl(); + + // If we're sending files they should be sent as multipart/form-data + if ($request->containsFileUploads()) { + $requestBody = $request->getMultipartBody(); + $request->setHeaders([ + 'Content-Type' => 'multipart/form-data; boundary=' . $requestBody->getBoundary(), + ]); + } else { + $requestBody = $request->getUrlEncodedBody(); + $request->setHeaders([ + 'Content-Type' => 'application/x-www-form-urlencoded', + ]); + } + + return [ + $url, + $request->getMethod(), + $request->getHeaders(), + $requestBody->getBody(), + ]; + } + + /** + * Makes the request to Graph and returns the result. + * + * @param FacebookRequest $request + * + * @return FacebookResponse + * + * @throws FacebookSDKException + */ + public function sendRequest(FacebookRequest $request) + { + if (get_class($request) === 'Facebook\FacebookRequest') { + $request->validateAccessToken(); + } + + list($url, $method, $headers, $body) = $this->prepareRequestMessage($request); + + // Since file uploads can take a while, we need to give more time for uploads + $timeOut = static::DEFAULT_REQUEST_TIMEOUT; + if ($request->containsFileUploads()) { + $timeOut = static::DEFAULT_FILE_UPLOAD_REQUEST_TIMEOUT; + } elseif ($request->containsVideoUploads()) { + $timeOut = static::DEFAULT_VIDEO_UPLOAD_REQUEST_TIMEOUT; + } + + // Should throw `FacebookSDKException` exception on HTTP client error. + // Don't catch to allow it to bubble up. + $rawResponse = $this->httpClientHandler->send($url, $method, $body, $headers, $timeOut); + + static::$requestCount++; + + $returnResponse = new FacebookResponse( + $request, + $rawResponse->getBody(), + $rawResponse->getHttpResponseCode(), + $rawResponse->getHeaders() + ); + + if ($returnResponse->isError()) { + throw $returnResponse->getThrownException(); + } + + return $returnResponse; + } + + /** + * Makes a batched request to Graph and returns the result. + * + * @param FacebookBatchRequest $request + * + * @return FacebookBatchResponse + * + * @throws FacebookSDKException + */ + public function sendBatchRequest(FacebookBatchRequest $request) + { + $request->prepareRequestsForBatch(); + $facebookResponse = $this->sendRequest($request); + + return new FacebookBatchResponse($request, $facebookResponse); + } +} diff --git a/inc/vendors/social-login/Facebook/FacebookRequest.php b/inc/vendors/social-login/Facebook/FacebookRequest.php new file mode 100755 index 00000000..2b100899 --- /dev/null +++ b/inc/vendors/social-login/Facebook/FacebookRequest.php @@ -0,0 +1,534 @@ +setApp($app); + $this->setAccessToken($accessToken); + $this->setMethod($method); + $this->setEndpoint($endpoint); + $this->setParams($params); + $this->setETag($eTag); + $this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; + } + + /** + * Set the access token for this request. + * + * @param AccessToken|string|null + * + * @return FacebookRequest + */ + public function setAccessToken($accessToken) + { + $this->accessToken = $accessToken; + if ($accessToken instanceof AccessToken) { + $this->accessToken = $accessToken->getValue(); + } + + return $this; + } + + /** + * Sets the access token with one harvested from a URL or POST params. + * + * @param string $accessToken The access token. + * + * @return FacebookRequest + * + * @throws FacebookSDKException + */ + public function setAccessTokenFromParams($accessToken) + { + $existingAccessToken = $this->getAccessToken(); + if (!$existingAccessToken) { + $this->setAccessToken($accessToken); + } elseif ($accessToken !== $existingAccessToken) { + throw new FacebookSDKException('Access token mismatch. The access token provided in the FacebookRequest and the one provided in the URL or POST params do not match.'); + } + + return $this; + } + + /** + * Return the access token for this request. + * + * @return string|null + */ + public function getAccessToken() + { + return $this->accessToken; + } + + /** + * Return the access token for this request as an AccessToken entity. + * + * @return AccessToken|null + */ + public function getAccessTokenEntity() + { + return $this->accessToken ? new AccessToken($this->accessToken) : null; + } + + /** + * Set the FacebookApp entity used for this request. + * + * @param FacebookApp|null $app + */ + public function setApp(FacebookApp $app = null) + { + $this->app = $app; + } + + /** + * Return the FacebookApp entity used for this request. + * + * @return FacebookApp + */ + public function getApp() + { + return $this->app; + } + + /** + * Generate an app secret proof to sign this request. + * + * @return string|null + */ + public function getAppSecretProof() + { + if (!$accessTokenEntity = $this->getAccessTokenEntity()) { + return null; + } + + return $accessTokenEntity->getAppSecretProof($this->app->getSecret()); + } + + /** + * Validate that an access token exists for this request. + * + * @throws FacebookSDKException + */ + public function validateAccessToken() + { + $accessToken = $this->getAccessToken(); + if (!$accessToken) { + throw new FacebookSDKException('You must provide an access token.'); + } + } + + /** + * Set the HTTP method for this request. + * + * @param string + */ + public function setMethod($method) + { + $this->method = strtoupper($method); + } + + /** + * Return the HTTP method for this request. + * + * @return string + */ + public function getMethod() + { + return $this->method; + } + + /** + * Validate that the HTTP method is set. + * + * @throws FacebookSDKException + */ + public function validateMethod() + { + if (!$this->method) { + throw new FacebookSDKException('HTTP method not specified.'); + } + + if (!in_array($this->method, ['GET', 'POST', 'DELETE'])) { + throw new FacebookSDKException('Invalid HTTP method specified.'); + } + } + + /** + * Set the endpoint for this request. + * + * @param string + * + * @return FacebookRequest + * + * @throws FacebookSDKException + */ + public function setEndpoint($endpoint) + { + // Harvest the access token from the endpoint to keep things in sync + $params = FacebookUrlManipulator::getParamsAsArray($endpoint); + if (isset($params['access_token'])) { + $this->setAccessTokenFromParams($params['access_token']); + } + + // Clean the token & app secret proof from the endpoint. + $filterParams = ['access_token', 'appsecret_proof']; + $this->endpoint = FacebookUrlManipulator::removeParamsFromUrl($endpoint, $filterParams); + + return $this; + } + + /** + * Return the endpoint for this request. + * + * @return string + */ + public function getEndpoint() + { + // For batch requests, this will be empty + return $this->endpoint; + } + + /** + * Generate and return the headers for this request. + * + * @return array + */ + public function getHeaders() + { + $headers = static::getDefaultHeaders(); + + if ($this->eTag) { + $headers['If-None-Match'] = $this->eTag; + } + + return array_merge($this->headers, $headers); + } + + /** + * Set the headers for this request. + * + * @param array $headers + */ + public function setHeaders(array $headers) + { + $this->headers = array_merge($this->headers, $headers); + } + + /** + * Sets the eTag value. + * + * @param string $eTag + */ + public function setETag($eTag) + { + $this->eTag = $eTag; + } + + /** + * Set the params for this request. + * + * @param array $params + * + * @return FacebookRequest + * + * @throws FacebookSDKException + */ + public function setParams(array $params = []) + { + if (isset($params['access_token'])) { + $this->setAccessTokenFromParams($params['access_token']); + } + + // Don't let these buggers slip in. + unset($params['access_token'], $params['appsecret_proof']); + + // @TODO Refactor code above with this + //$params = $this->sanitizeAuthenticationParams($params); + $params = $this->sanitizeFileParams($params); + $this->dangerouslySetParams($params); + + return $this; + } + + /** + * Set the params for this request without filtering them first. + * + * @param array $params + * + * @return FacebookRequest + */ + public function dangerouslySetParams(array $params = []) + { + $this->params = array_merge($this->params, $params); + + return $this; + } + + /** + * Iterate over the params and pull out the file uploads. + * + * @param array $params + * + * @return array + */ + public function sanitizeFileParams(array $params) + { + foreach ($params as $key => $value) { + if ($value instanceof FacebookFile) { + $this->addFile($key, $value); + unset($params[$key]); + } + } + + return $params; + } + + /** + * Add a file to be uploaded. + * + * @param string $key + * @param FacebookFile $file + */ + public function addFile($key, FacebookFile $file) + { + $this->files[$key] = $file; + } + + /** + * Removes all the files from the upload queue. + */ + public function resetFiles() + { + $this->files = []; + } + + /** + * Get the list of files to be uploaded. + * + * @return array + */ + public function getFiles() + { + return $this->files; + } + + /** + * Let's us know if there is a file upload with this request. + * + * @return boolean + */ + public function containsFileUploads() + { + return !empty($this->files); + } + + /** + * Let's us know if there is a video upload with this request. + * + * @return boolean + */ + public function containsVideoUploads() + { + foreach ($this->files as $file) { + if ($file instanceof FacebookVideo) { + return true; + } + } + + return false; + } + + /** + * Returns the body of the request as multipart/form-data. + * + * @return RequestBodyMultipart + */ + public function getMultipartBody() + { + $params = $this->getPostParams(); + + return new RequestBodyMultipart($params, $this->files); + } + + /** + * Returns the body of the request as URL-encoded. + * + * @return RequestBodyUrlEncoded + */ + public function getUrlEncodedBody() + { + $params = $this->getPostParams(); + + return new RequestBodyUrlEncoded($params); + } + + /** + * Generate and return the params for this request. + * + * @return array + */ + public function getParams() + { + $params = $this->params; + + $accessToken = $this->getAccessToken(); + if ($accessToken) { + $params['access_token'] = $accessToken; + $params['appsecret_proof'] = $this->getAppSecretProof(); + } + + return $params; + } + + /** + * Only return params on POST requests. + * + * @return array + */ + public function getPostParams() + { + if ($this->getMethod() === 'POST') { + return $this->getParams(); + } + + return []; + } + + /** + * The graph version used for this request. + * + * @return string + */ + public function getGraphVersion() + { + return $this->graphVersion; + } + + /** + * Generate and return the URL for this request. + * + * @return string + */ + public function getUrl() + { + $this->validateMethod(); + + $graphVersion = FacebookUrlManipulator::forceSlashPrefix($this->graphVersion); + $endpoint = FacebookUrlManipulator::forceSlashPrefix($this->getEndpoint()); + + $url = $graphVersion . $endpoint; + + if ($this->getMethod() !== 'POST') { + $params = $this->getParams(); + $url = FacebookUrlManipulator::appendParamsToUrl($url, $params); + } + + return $url; + } + + /** + * Return the default headers that every request should use. + * + * @return array + */ + public static function getDefaultHeaders() + { + return [ + 'User-Agent' => 'fb-php-' . Facebook::VERSION, + 'Accept-Encoding' => '*', + ]; + } +} diff --git a/inc/vendors/social-login/Facebook/FacebookResponse.php b/inc/vendors/social-login/Facebook/FacebookResponse.php new file mode 100755 index 00000000..251ca2f7 --- /dev/null +++ b/inc/vendors/social-login/Facebook/FacebookResponse.php @@ -0,0 +1,410 @@ +request = $request; + $this->body = $body; + $this->httpStatusCode = $httpStatusCode; + $this->headers = $headers; + + $this->decodeBody(); + } + + /** + * Return the original request that returned this response. + * + * @return FacebookRequest + */ + public function getRequest() + { + return $this->request; + } + + /** + * Return the FacebookApp entity used for this response. + * + * @return FacebookApp + */ + public function getApp() + { + return $this->request->getApp(); + } + + /** + * Return the access token that was used for this response. + * + * @return string|null + */ + public function getAccessToken() + { + return $this->request->getAccessToken(); + } + + /** + * Return the HTTP status code for this response. + * + * @return int + */ + public function getHttpStatusCode() + { + return $this->httpStatusCode; + } + + /** + * Return the HTTP headers for this response. + * + * @return array + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Return the raw body response. + * + * @return string + */ + public function getBody() + { + return $this->body; + } + + /** + * Return the decoded body response. + * + * @return array + */ + public function getDecodedBody() + { + return $this->decodedBody; + } + + /** + * Get the app secret proof that was used for this response. + * + * @return string|null + */ + public function getAppSecretProof() + { + return $this->request->getAppSecretProof(); + } + + /** + * Get the ETag associated with the response. + * + * @return string|null + */ + public function getETag() + { + return isset($this->headers['ETag']) ? $this->headers['ETag'] : null; + } + + /** + * Get the version of Graph that returned this response. + * + * @return string|null + */ + public function getGraphVersion() + { + return isset($this->headers['Facebook-API-Version']) ? $this->headers['Facebook-API-Version'] : null; + } + + /** + * Returns true if Graph returned an error message. + * + * @return boolean + */ + public function isError() + { + return isset($this->decodedBody['error']); + } + + /** + * Throws the exception. + * + * @throws FacebookSDKException + */ + public function throwException() + { + throw $this->thrownException; + } + + /** + * Instantiates an exception to be thrown later. + */ + public function makeException() + { + $this->thrownException = FacebookResponseException::create($this); + } + + /** + * Returns the exception that was thrown for this request. + * + * @return FacebookResponseException|null + */ + public function getThrownException() + { + return $this->thrownException; + } + + /** + * Convert the raw response into an array if possible. + * + * Graph will return 2 types of responses: + * - JSON(P) + * Most responses from Graph are JSON(P) + * - application/x-www-form-urlencoded key/value pairs + * Happens on the `/oauth/access_token` endpoint when exchanging + * a short-lived access token for a long-lived access token + * - And sometimes nothing :/ but that'd be a bug. + */ + public function decodeBody() + { + $this->decodedBody = json_decode($this->body, true); + + if ($this->decodedBody === null) { + $this->decodedBody = []; + parse_str($this->body, $this->decodedBody); + } elseif (is_bool($this->decodedBody)) { + // Backwards compatibility for Graph < 2.1. + // Mimics 2.1 responses. + // @TODO Remove this after Graph 2.0 is no longer supported + $this->decodedBody = ['success' => $this->decodedBody]; + } elseif (is_numeric($this->decodedBody)) { + $this->decodedBody = ['id' => $this->decodedBody]; + } + + if (!is_array($this->decodedBody)) { + $this->decodedBody = []; + } + + if ($this->isError()) { + $this->makeException(); + } + } + + /** + * Instantiate a new GraphObject from response. + * + * @param string|null $subclassName The GraphNode subclass to cast to. + * + * @return \Facebook\GraphNodes\GraphObject + * + * @throws FacebookSDKException + * + * @deprecated 5.0.0 getGraphObject() has been renamed to getGraphNode() + * @todo v6: Remove this method + */ + public function getGraphObject($subclassName = null) + { + return $this->getGraphNode($subclassName); + } + + /** + * Instantiate a new GraphNode from response. + * + * @param string|null $subclassName The GraphNode subclass to cast to. + * + * @return \Facebook\GraphNodes\GraphNode + * + * @throws FacebookSDKException + */ + public function getGraphNode($subclassName = null) + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphNode($subclassName); + } + + /** + * Convenience method for creating a GraphAlbum collection. + * + * @return \Facebook\GraphNodes\GraphAlbum + * + * @throws FacebookSDKException + */ + public function getGraphAlbum() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphAlbum(); + } + + /** + * Convenience method for creating a GraphPage collection. + * + * @return \Facebook\GraphNodes\GraphPage + * + * @throws FacebookSDKException + */ + public function getGraphPage() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphPage(); + } + + /** + * Convenience method for creating a GraphSessionInfo collection. + * + * @return \Facebook\GraphNodes\GraphSessionInfo + * + * @throws FacebookSDKException + */ + public function getGraphSessionInfo() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphSessionInfo(); + } + + /** + * Convenience method for creating a GraphUser collection. + * + * @return \Facebook\GraphNodes\GraphUser + * + * @throws FacebookSDKException + */ + public function getGraphUser() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphUser(); + } + + /** + * Convenience method for creating a GraphEvent collection. + * + * @return \Facebook\GraphNodes\GraphEvent + * + * @throws FacebookSDKException + */ + public function getGraphEvent() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphEvent(); + } + + /** + * Convenience method for creating a GraphGroup collection. + * + * @return \Facebook\GraphNodes\GraphGroup + * + * @throws FacebookSDKException + */ + public function getGraphGroup() + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphGroup(); + } + + /** + * Instantiate a new GraphList from response. + * + * @param string|null $subclassName The GraphNode subclass to cast list items to. + * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. + * + * @return \Facebook\GraphNodes\GraphList + * + * @throws FacebookSDKException + * + * @deprecated 5.0.0 getGraphList() has been renamed to getGraphEdge() + * @todo v6: Remove this method + */ + public function getGraphList($subclassName = null, $auto_prefix = true) + { + return $this->getGraphEdge($subclassName, $auto_prefix); + } + + /** + * Instantiate a new GraphEdge from response. + * + * @param string|null $subclassName The GraphNode subclass to cast list items to. + * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. + * + * @return \Facebook\GraphNodes\GraphEdge + * + * @throws FacebookSDKException + */ + public function getGraphEdge($subclassName = null, $auto_prefix = true) + { + $factory = new GraphNodeFactory($this); + + return $factory->makeGraphEdge($subclassName, $auto_prefix); + } +} diff --git a/inc/vendors/social-login/Facebook/FileUpload/FacebookFile.php b/inc/vendors/social-login/Facebook/FileUpload/FacebookFile.php new file mode 100755 index 00000000..3c1536d4 --- /dev/null +++ b/inc/vendors/social-login/Facebook/FileUpload/FacebookFile.php @@ -0,0 +1,169 @@ +path = $filePath; + $this->maxLength = $maxLength; + $this->offset = $offset; + $this->open(); + } + + /** + * Closes the stream when destructed. + */ + public function __destruct() + { + $this->close(); + } + + /** + * Opens a stream for the file. + * + * @throws FacebookSDKException + */ + public function open() + { + if (!$this->isRemoteFile($this->path) && !is_readable($this->path)) { + throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to read resource: ' . $this->path . '.'); + } + + $this->stream = fopen($this->path, 'r'); + + if (!$this->stream) { + throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to open resource: ' . $this->path . '.'); + } + } + + /** + * Stops the file stream. + */ + public function close() + { + if (is_resource($this->stream)) { + fclose($this->stream); + } + } + + /** + * Return the contents of the file. + * + * @return string + */ + public function getContents() + { + return stream_get_contents($this->stream, $this->maxLength, $this->offset); + } + + /** + * Return the name of the file. + * + * @return string + */ + public function getFileName() + { + return basename($this->path); + } + + /** + * Return the path of the file. + * + * @return string + */ + public function getFilePath() + { + return $this->path; + } + + /** + * Return the size of the file. + * + * @return int + */ + public function getSize() + { + return filesize($this->path); + } + + /** + * Return the mimetype of the file. + * + * @return string + */ + public function getMimetype() + { + return Mimetypes::getInstance()->fromFilename($this->path) ?: 'text/plain'; + } + + /** + * Returns true if the path to the file is remote. + * + * @param string $pathToFile + * + * @return boolean + */ + protected function isRemoteFile($pathToFile) + { + return preg_match('/^(https?|ftp):\/\/.*/', $pathToFile) === 1; + } +} diff --git a/inc/vendors/social-login/Facebook/FileUpload/FacebookResumableUploader.php b/inc/vendors/social-login/Facebook/FileUpload/FacebookResumableUploader.php new file mode 100755 index 00000000..46a2727b --- /dev/null +++ b/inc/vendors/social-login/Facebook/FileUpload/FacebookResumableUploader.php @@ -0,0 +1,177 @@ +app = $app; + $this->client = $client; + $this->accessToken = $accessToken; + $this->graphVersion = $graphVersion; + } + + /** + * Upload by chunks - start phase + * + * @param string $endpoint + * @param FacebookFile $file + * + * @return FacebookTransferChunk + * + * @throws FacebookSDKException + */ + public function start($endpoint, FacebookFile $file) + { + $params = [ + 'upload_phase' => 'start', + 'file_size' => $file->getSize(), + ]; + $response = $this->sendUploadRequest($endpoint, $params); + + return new FacebookTransferChunk($file, $response['upload_session_id'], $response['video_id'], $response['start_offset'], $response['end_offset']); + } + + /** + * Upload by chunks - transfer phase + * + * @param string $endpoint + * @param FacebookTransferChunk $chunk + * @param boolean $allowToThrow + * + * @return FacebookTransferChunk + * + * @throws FacebookResponseException + */ + public function transfer($endpoint, FacebookTransferChunk $chunk, $allowToThrow = false) + { + $params = [ + 'upload_phase' => 'transfer', + 'upload_session_id' => $chunk->getUploadSessionId(), + 'start_offset' => $chunk->getStartOffset(), + 'video_file_chunk' => $chunk->getPartialFile(), + ]; + + try { + $response = $this->sendUploadRequest($endpoint, $params); + } catch (FacebookResponseException $e) { + $preException = $e->getPrevious(); + if ($allowToThrow || !$preException instanceof FacebookResumableUploadException) { + throw $e; + } + + if (null !== $preException->getStartOffset() && null !== $preException->getEndOffset()) { + return new FacebookTransferChunk( + $chunk->getFile(), + $chunk->getUploadSessionId(), + $chunk->getVideoId(), + $preException->getStartOffset(), + $preException->getEndOffset() + ); + } + + // Return the same chunk entity so it can be retried. + return $chunk; + } + + return new FacebookTransferChunk($chunk->getFile(), $chunk->getUploadSessionId(), $chunk->getVideoId(), $response['start_offset'], $response['end_offset']); + } + + /** + * Upload by chunks - finish phase + * + * @param string $endpoint + * @param string $uploadSessionId + * @param array $metadata The metadata associated with the file. + * + * @return boolean + * + * @throws FacebookSDKException + */ + public function finish($endpoint, $uploadSessionId, $metadata = []) + { + $params = array_merge($metadata, [ + 'upload_phase' => 'finish', + 'upload_session_id' => $uploadSessionId, + ]); + $response = $this->sendUploadRequest($endpoint, $params); + + return $response['success']; + } + + /** + * Helper to make a FacebookRequest and send it. + * + * @param string $endpoint The endpoint to POST to. + * @param array $params The params to send with the request. + * + * @return array + */ + private function sendUploadRequest($endpoint, $params = []) + { + $request = new FacebookRequest($this->app, $this->accessToken, 'POST', $endpoint, $params, null, $this->graphVersion); + + return $this->client->sendRequest($request)->getDecodedBody(); + } +} diff --git a/inc/vendors/social-login/Facebook/FileUpload/FacebookTransferChunk.php b/inc/vendors/social-login/Facebook/FileUpload/FacebookTransferChunk.php new file mode 100755 index 00000000..99ea7752 --- /dev/null +++ b/inc/vendors/social-login/Facebook/FileUpload/FacebookTransferChunk.php @@ -0,0 +1,141 @@ +file = $file; + $this->uploadSessionId = $uploadSessionId; + $this->videoId = $videoId; + $this->startOffset = $startOffset; + $this->endOffset = $endOffset; + } + + /** + * Return the file entity. + * + * @return FacebookFile + */ + public function getFile() + { + return $this->file; + } + + /** + * Return a FacebookFile entity with partial content. + * + * @return FacebookFile + */ + public function getPartialFile() + { + $maxLength = $this->endOffset - $this->startOffset; + + return new FacebookFile($this->file->getFilePath(), $maxLength, $this->startOffset); + } + + /** + * Return upload session Id + * + * @return int + */ + public function getUploadSessionId() + { + return $this->uploadSessionId; + } + + /** + * Check whether is the last chunk + * + * @return bool + */ + public function isLastChunk() + { + return $this->startOffset === $this->endOffset; + } + + /** + * @return int + */ + public function getStartOffset() + { + return $this->startOffset; + } + + /** + * @return int + */ + public function getEndOffset() + { + return $this->endOffset; + } + + /** + * Get uploaded video Id + * + * @return int + */ + public function getVideoId() + { + return $this->videoId; + } +} diff --git a/inc/vendors/social-login/Facebook/FileUpload/FacebookVideo.php b/inc/vendors/social-login/Facebook/FileUpload/FacebookVideo.php new file mode 100755 index 00000000..ee6dd538 --- /dev/null +++ b/inc/vendors/social-login/Facebook/FileUpload/FacebookVideo.php @@ -0,0 +1,33 @@ + 'text/vnd.in3d.3dml', + '3g2' => 'video/3gpp2', + '3gp' => 'video/3gpp', + '7z' => 'application/x-7z-compressed', + 'aab' => 'application/x-authorware-bin', + 'aac' => 'audio/x-aac', + 'aam' => 'application/x-authorware-map', + 'aas' => 'application/x-authorware-seg', + 'abw' => 'application/x-abiword', + 'ac' => 'application/pkix-attr-cert', + 'acc' => 'application/vnd.americandynamics.acc', + 'ace' => 'application/x-ace-compressed', + 'acu' => 'application/vnd.acucobol', + 'acutc' => 'application/vnd.acucorp', + 'adp' => 'audio/adpcm', + 'aep' => 'application/vnd.audiograph', + 'afm' => 'application/x-font-type1', + 'afp' => 'application/vnd.ibm.modcap', + 'ahead' => 'application/vnd.ahead.space', + 'ai' => 'application/postscript', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'air' => 'application/vnd.adobe.air-application-installer-package+zip', + 'ait' => 'application/vnd.dvb.ait', + 'ami' => 'application/vnd.amiga.ami', + 'apk' => 'application/vnd.android.package-archive', + 'application' => 'application/x-ms-application', + 'apr' => 'application/vnd.lotus-approach', + 'asa' => 'text/plain', + 'asax' => 'application/octet-stream', + 'asc' => 'application/pgp-signature', + 'ascx' => 'text/plain', + 'asf' => 'video/x-ms-asf', + 'ashx' => 'text/plain', + 'asm' => 'text/x-asm', + 'asmx' => 'text/plain', + 'aso' => 'application/vnd.accpac.simply.aso', + 'asp' => 'text/plain', + 'aspx' => 'text/plain', + 'asx' => 'video/x-ms-asf', + 'atc' => 'application/vnd.acucorp', + 'atom' => 'application/atom+xml', + 'atomcat' => 'application/atomcat+xml', + 'atomsvc' => 'application/atomsvc+xml', + 'atx' => 'application/vnd.antix.game-component', + 'au' => 'audio/basic', + 'avi' => 'video/x-msvideo', + 'aw' => 'application/applixware', + 'axd' => 'text/plain', + 'azf' => 'application/vnd.airzip.filesecure.azf', + 'azs' => 'application/vnd.airzip.filesecure.azs', + 'azw' => 'application/vnd.amazon.ebook', + 'bat' => 'application/x-msdownload', + 'bcpio' => 'application/x-bcpio', + 'bdf' => 'application/x-font-bdf', + 'bdm' => 'application/vnd.syncml.dm+wbxml', + 'bed' => 'application/vnd.realvnc.bed', + 'bh2' => 'application/vnd.fujitsu.oasysprs', + 'bin' => 'application/octet-stream', + 'bmi' => 'application/vnd.bmi', + 'bmp' => 'image/bmp', + 'book' => 'application/vnd.framemaker', + 'box' => 'application/vnd.previewsystems.box', + 'boz' => 'application/x-bzip2', + 'bpk' => 'application/octet-stream', + 'btif' => 'image/prs.btif', + 'bz' => 'application/x-bzip', + 'bz2' => 'application/x-bzip2', + 'c' => 'text/x-c', + 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', + 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', + 'c4d' => 'application/vnd.clonk.c4group', + 'c4f' => 'application/vnd.clonk.c4group', + 'c4g' => 'application/vnd.clonk.c4group', + 'c4p' => 'application/vnd.clonk.c4group', + 'c4u' => 'application/vnd.clonk.c4group', + 'cab' => 'application/vnd.ms-cab-compressed', + 'car' => 'application/vnd.curl.car', + 'cat' => 'application/vnd.ms-pki.seccat', + 'cc' => 'text/x-c', + 'cct' => 'application/x-director', + 'ccxml' => 'application/ccxml+xml', + 'cdbcmsg' => 'application/vnd.contact.cmsg', + 'cdf' => 'application/x-netcdf', + 'cdkey' => 'application/vnd.mediastation.cdkey', + 'cdmia' => 'application/cdmi-capability', + 'cdmic' => 'application/cdmi-container', + 'cdmid' => 'application/cdmi-domain', + 'cdmio' => 'application/cdmi-object', + 'cdmiq' => 'application/cdmi-queue', + 'cdx' => 'chemical/x-cdx', + 'cdxml' => 'application/vnd.chemdraw+xml', + 'cdy' => 'application/vnd.cinderella', + 'cer' => 'application/pkix-cert', + 'cfc' => 'application/x-coldfusion', + 'cfm' => 'application/x-coldfusion', + 'cgm' => 'image/cgm', + 'chat' => 'application/x-chat', + 'chm' => 'application/vnd.ms-htmlhelp', + 'chrt' => 'application/vnd.kde.kchart', + 'cif' => 'chemical/x-cif', + 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', + 'cil' => 'application/vnd.ms-artgalry', + 'cla' => 'application/vnd.claymore', + 'class' => 'application/java-vm', + 'clkk' => 'application/vnd.crick.clicker.keyboard', + 'clkp' => 'application/vnd.crick.clicker.palette', + 'clkt' => 'application/vnd.crick.clicker.template', + 'clkw' => 'application/vnd.crick.clicker.wordbank', + 'clkx' => 'application/vnd.crick.clicker', + 'clp' => 'application/x-msclip', + 'cmc' => 'application/vnd.cosmocaller', + 'cmdf' => 'chemical/x-cmdf', + 'cml' => 'chemical/x-cml', + 'cmp' => 'application/vnd.yellowriver-custom-menu', + 'cmx' => 'image/x-cmx', + 'cod' => 'application/vnd.rim.cod', + 'com' => 'application/x-msdownload', + 'conf' => 'text/plain', + 'cpio' => 'application/x-cpio', + 'cpp' => 'text/x-c', + 'cpt' => 'application/mac-compactpro', + 'crd' => 'application/x-mscardfile', + 'crl' => 'application/pkix-crl', + 'crt' => 'application/x-x509-ca-cert', + 'cryptonote' => 'application/vnd.rig.cryptonote', + 'cs' => 'text/plain', + 'csh' => 'application/x-csh', + 'csml' => 'chemical/x-csml', + 'csp' => 'application/vnd.commonspace', + 'css' => 'text/css', + 'cst' => 'application/x-director', + 'csv' => 'text/csv', + 'cu' => 'application/cu-seeme', + 'curl' => 'text/vnd.curl', + 'cww' => 'application/prs.cww', + 'cxt' => 'application/x-director', + 'cxx' => 'text/x-c', + 'dae' => 'model/vnd.collada+xml', + 'daf' => 'application/vnd.mobius.daf', + 'dataless' => 'application/vnd.fdsn.seed', + 'davmount' => 'application/davmount+xml', + 'dcr' => 'application/x-director', + 'dcurl' => 'text/vnd.curl.dcurl', + 'dd2' => 'application/vnd.oma.dd2+xml', + 'ddd' => 'application/vnd.fujixerox.ddd', + 'deb' => 'application/x-debian-package', + 'def' => 'text/plain', + 'deploy' => 'application/octet-stream', + 'der' => 'application/x-x509-ca-cert', + 'dfac' => 'application/vnd.dreamfactory', + 'dic' => 'text/x-c', + 'dir' => 'application/x-director', + 'dis' => 'application/vnd.mobius.dis', + 'dist' => 'application/octet-stream', + 'distz' => 'application/octet-stream', + 'djv' => 'image/vnd.djvu', + 'djvu' => 'image/vnd.djvu', + 'dll' => 'application/x-msdownload', + 'dmg' => 'application/octet-stream', + 'dms' => 'application/octet-stream', + 'dna' => 'application/vnd.dna', + 'doc' => 'application/msword', + 'docm' => 'application/vnd.ms-word.document.macroenabled.12', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dot' => 'application/msword', + 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'dp' => 'application/vnd.osgi.dp', + 'dpg' => 'application/vnd.dpgraph', + 'dra' => 'audio/vnd.dra', + 'dsc' => 'text/prs.lines.tag', + 'dssc' => 'application/dssc+der', + 'dtb' => 'application/x-dtbook+xml', + 'dtd' => 'application/xml-dtd', + 'dts' => 'audio/vnd.dts', + 'dtshd' => 'audio/vnd.dts.hd', + 'dump' => 'application/octet-stream', + 'dvi' => 'application/x-dvi', + 'dwf' => 'model/vnd.dwf', + 'dwg' => 'image/vnd.dwg', + 'dxf' => 'image/vnd.dxf', + 'dxp' => 'application/vnd.spotfire.dxp', + 'dxr' => 'application/x-director', + 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', + 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', + 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', + 'ecma' => 'application/ecmascript', + 'edm' => 'application/vnd.novadigm.edm', + 'edx' => 'application/vnd.novadigm.edx', + 'efif' => 'application/vnd.picsel', + 'ei6' => 'application/vnd.pg.osasli', + 'elc' => 'application/octet-stream', + 'eml' => 'message/rfc822', + 'emma' => 'application/emma+xml', + 'eol' => 'audio/vnd.digital-winds', + 'eot' => 'application/vnd.ms-fontobject', + 'eps' => 'application/postscript', + 'epub' => 'application/epub+zip', + 'es3' => 'application/vnd.eszigno3+xml', + 'esf' => 'application/vnd.epson.esf', + 'et3' => 'application/vnd.eszigno3+xml', + 'etx' => 'text/x-setext', + 'exe' => 'application/x-msdownload', + 'exi' => 'application/exi', + 'ext' => 'application/vnd.novadigm.ext', + 'ez' => 'application/andrew-inset', + 'ez2' => 'application/vnd.ezpix-album', + 'ez3' => 'application/vnd.ezpix-package', + 'f' => 'text/x-fortran', + 'f4v' => 'video/x-f4v', + 'f77' => 'text/x-fortran', + 'f90' => 'text/x-fortran', + 'fbs' => 'image/vnd.fastbidsheet', + 'fcs' => 'application/vnd.isac.fcs', + 'fdf' => 'application/vnd.fdf', + 'fe_launch' => 'application/vnd.denovo.fcselayout-link', + 'fg5' => 'application/vnd.fujitsu.oasysgp', + 'fgd' => 'application/x-director', + 'fh' => 'image/x-freehand', + 'fh4' => 'image/x-freehand', + 'fh5' => 'image/x-freehand', + 'fh7' => 'image/x-freehand', + 'fhc' => 'image/x-freehand', + 'fig' => 'application/x-xfig', + 'fli' => 'video/x-fli', + 'flo' => 'application/vnd.micrografx.flo', + 'flv' => 'video/x-flv', + 'flw' => 'application/vnd.kde.kivio', + 'flx' => 'text/vnd.fmi.flexstor', + 'fly' => 'text/vnd.fly', + 'fm' => 'application/vnd.framemaker', + 'fnc' => 'application/vnd.frogans.fnc', + 'for' => 'text/x-fortran', + 'fpx' => 'image/vnd.fpx', + 'frame' => 'application/vnd.framemaker', + 'fsc' => 'application/vnd.fsc.weblaunch', + 'fst' => 'image/vnd.fst', + 'ftc' => 'application/vnd.fluxtime.clip', + 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', + 'fvt' => 'video/vnd.fvt', + 'fxp' => 'application/vnd.adobe.fxp', + 'fxpl' => 'application/vnd.adobe.fxp', + 'fzs' => 'application/vnd.fuzzysheet', + 'g2w' => 'application/vnd.geoplan', + 'g3' => 'image/g3fax', + 'g3w' => 'application/vnd.geospace', + 'gac' => 'application/vnd.groove-account', + 'gdl' => 'model/vnd.gdl', + 'geo' => 'application/vnd.dynageo', + 'gex' => 'application/vnd.geometry-explorer', + 'ggb' => 'application/vnd.geogebra.file', + 'ggt' => 'application/vnd.geogebra.tool', + 'ghf' => 'application/vnd.groove-help', + 'gif' => 'image/gif', + 'gim' => 'application/vnd.groove-identity-message', + 'gmx' => 'application/vnd.gmx', + 'gnumeric' => 'application/x-gnumeric', + 'gph' => 'application/vnd.flographit', + 'gqf' => 'application/vnd.grafeq', + 'gqs' => 'application/vnd.grafeq', + 'gram' => 'application/srgs', + 'gre' => 'application/vnd.geometry-explorer', + 'grv' => 'application/vnd.groove-injector', + 'grxml' => 'application/srgs+xml', + 'gsf' => 'application/x-font-ghostscript', + 'gtar' => 'application/x-gtar', + 'gtm' => 'application/vnd.groove-tool-message', + 'gtw' => 'model/vnd.gtw', + 'gv' => 'text/vnd.graphviz', + 'gxt' => 'application/vnd.geonext', + 'h' => 'text/x-c', + 'h261' => 'video/h261', + 'h263' => 'video/h263', + 'h264' => 'video/h264', + 'hal' => 'application/vnd.hal+xml', + 'hbci' => 'application/vnd.hbci', + 'hdf' => 'application/x-hdf', + 'hh' => 'text/x-c', + 'hlp' => 'application/winhlp', + 'hpgl' => 'application/vnd.hp-hpgl', + 'hpid' => 'application/vnd.hp-hpid', + 'hps' => 'application/vnd.hp-hps', + 'hqx' => 'application/mac-binhex40', + 'hta' => 'application/octet-stream', + 'htc' => 'text/html', + 'htke' => 'application/vnd.kenameaapp', + 'htm' => 'text/html', + 'html' => 'text/html', + 'hvd' => 'application/vnd.yamaha.hv-dic', + 'hvp' => 'application/vnd.yamaha.hv-voice', + 'hvs' => 'application/vnd.yamaha.hv-script', + 'i2g' => 'application/vnd.intergeo', + 'icc' => 'application/vnd.iccprofile', + 'ice' => 'x-conference/x-cooltalk', + 'icm' => 'application/vnd.iccprofile', + 'ico' => 'image/x-icon', + 'ics' => 'text/calendar', + 'ief' => 'image/ief', + 'ifb' => 'text/calendar', + 'ifm' => 'application/vnd.shana.informed.formdata', + 'iges' => 'model/iges', + 'igl' => 'application/vnd.igloader', + 'igm' => 'application/vnd.insors.igm', + 'igs' => 'model/iges', + 'igx' => 'application/vnd.micrografx.igx', + 'iif' => 'application/vnd.shana.informed.interchange', + 'imp' => 'application/vnd.accpac.simply.imp', + 'ims' => 'application/vnd.ms-ims', + 'in' => 'text/plain', + 'ini' => 'text/plain', + 'ipfix' => 'application/ipfix', + 'ipk' => 'application/vnd.shana.informed.package', + 'irm' => 'application/vnd.ibm.rights-management', + 'irp' => 'application/vnd.irepository.package+xml', + 'iso' => 'application/octet-stream', + 'itp' => 'application/vnd.shana.informed.formtemplate', + 'ivp' => 'application/vnd.immervision-ivp', + 'ivu' => 'application/vnd.immervision-ivu', + 'jad' => 'text/vnd.sun.j2me.app-descriptor', + 'jam' => 'application/vnd.jam', + 'jar' => 'application/java-archive', + 'java' => 'text/x-java-source', + 'jisp' => 'application/vnd.jisp', + 'jlt' => 'application/vnd.hp-jlyt', + 'jnlp' => 'application/x-java-jnlp-file', + 'joda' => 'application/vnd.joost.joda-archive', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'jpgm' => 'video/jpm', + 'jpgv' => 'video/jpeg', + 'jpm' => 'video/jpm', + 'js' => 'text/javascript', + 'json' => 'application/json', + 'kar' => 'audio/midi', + 'karbon' => 'application/vnd.kde.karbon', + 'kfo' => 'application/vnd.kde.kformula', + 'kia' => 'application/vnd.kidspiration', + 'kml' => 'application/vnd.google-earth.kml+xml', + 'kmz' => 'application/vnd.google-earth.kmz', + 'kne' => 'application/vnd.kinar', + 'knp' => 'application/vnd.kinar', + 'kon' => 'application/vnd.kde.kontour', + 'kpr' => 'application/vnd.kde.kpresenter', + 'kpt' => 'application/vnd.kde.kpresenter', + 'ksp' => 'application/vnd.kde.kspread', + 'ktr' => 'application/vnd.kahootz', + 'ktx' => 'image/ktx', + 'ktz' => 'application/vnd.kahootz', + 'kwd' => 'application/vnd.kde.kword', + 'kwt' => 'application/vnd.kde.kword', + 'lasxml' => 'application/vnd.las.las+xml', + 'latex' => 'application/x-latex', + 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', + 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', + 'les' => 'application/vnd.hhe.lesson-player', + 'lha' => 'application/octet-stream', + 'link66' => 'application/vnd.route66.link66+xml', + 'list' => 'text/plain', + 'list3820' => 'application/vnd.ibm.modcap', + 'listafp' => 'application/vnd.ibm.modcap', + 'log' => 'text/plain', + 'lostxml' => 'application/lost+xml', + 'lrf' => 'application/octet-stream', + 'lrm' => 'application/vnd.ms-lrm', + 'ltf' => 'application/vnd.frogans.ltf', + 'lvp' => 'audio/vnd.lucent.voice', + 'lwp' => 'application/vnd.lotus-wordpro', + 'lzh' => 'application/octet-stream', + 'm13' => 'application/x-msmediaview', + 'm14' => 'application/x-msmediaview', + 'm1v' => 'video/mpeg', + 'm21' => 'application/mp21', + 'm2a' => 'audio/mpeg', + 'm2v' => 'video/mpeg', + 'm3a' => 'audio/mpeg', + 'm3u' => 'audio/x-mpegurl', + 'm3u8' => 'application/vnd.apple.mpegurl', + 'm4a' => 'audio/mp4', + 'm4u' => 'video/vnd.mpegurl', + 'm4v' => 'video/mp4', + 'ma' => 'application/mathematica', + 'mads' => 'application/mads+xml', + 'mag' => 'application/vnd.ecowin.chart', + 'maker' => 'application/vnd.framemaker', + 'man' => 'text/troff', + 'mathml' => 'application/mathml+xml', + 'mb' => 'application/mathematica', + 'mbk' => 'application/vnd.mobius.mbk', + 'mbox' => 'application/mbox', + 'mc1' => 'application/vnd.medcalcdata', + 'mcd' => 'application/vnd.mcd', + 'mcurl' => 'text/vnd.curl.mcurl', + 'mdb' => 'application/x-msaccess', + 'mdi' => 'image/vnd.ms-modi', + 'me' => 'text/troff', + 'mesh' => 'model/mesh', + 'meta4' => 'application/metalink4+xml', + 'mets' => 'application/mets+xml', + 'mfm' => 'application/vnd.mfmp', + 'mgp' => 'application/vnd.osgeo.mapguide.package', + 'mgz' => 'application/vnd.proteus.magazine', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mif' => 'application/vnd.mif', + 'mime' => 'message/rfc822', + 'mj2' => 'video/mj2', + 'mjp2' => 'video/mj2', + 'mlp' => 'application/vnd.dolby.mlp', + 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', + 'mmf' => 'application/vnd.smaf', + 'mmr' => 'image/vnd.fujixerox.edmics-mmr', + 'mny' => 'application/x-msmoney', + 'mobi' => 'application/x-mobipocket-ebook', + 'mods' => 'application/mods+xml', + 'mov' => 'video/quicktime', + 'movie' => 'video/x-sgi-movie', + 'mp2' => 'audio/mpeg', + 'mp21' => 'application/mp21', + 'mp2a' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mp4a' => 'audio/mp4', + 'mp4s' => 'application/mp4', + 'mp4v' => 'video/mp4', + 'mpc' => 'application/vnd.mophun.certificate', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpg4' => 'video/mp4', + 'mpga' => 'audio/mpeg', + 'mpkg' => 'application/vnd.apple.installer+xml', + 'mpm' => 'application/vnd.blueice.multipass', + 'mpn' => 'application/vnd.mophun.application', + 'mpp' => 'application/vnd.ms-project', + 'mpt' => 'application/vnd.ms-project', + 'mpy' => 'application/vnd.ibm.minipay', + 'mqy' => 'application/vnd.mobius.mqy', + 'mrc' => 'application/marc', + 'mrcx' => 'application/marcxml+xml', + 'ms' => 'text/troff', + 'mscml' => 'application/mediaservercontrol+xml', + 'mseed' => 'application/vnd.fdsn.mseed', + 'mseq' => 'application/vnd.mseq', + 'msf' => 'application/vnd.epson.msf', + 'msh' => 'model/mesh', + 'msi' => 'application/x-msdownload', + 'msl' => 'application/vnd.mobius.msl', + 'msty' => 'application/vnd.muvee.style', + 'mts' => 'model/vnd.mts', + 'mus' => 'application/vnd.musician', + 'musicxml' => 'application/vnd.recordare.musicxml+xml', + 'mvb' => 'application/x-msmediaview', + 'mwf' => 'application/vnd.mfer', + 'mxf' => 'application/mxf', + 'mxl' => 'application/vnd.recordare.musicxml', + 'mxml' => 'application/xv+xml', + 'mxs' => 'application/vnd.triscape.mxs', + 'mxu' => 'video/vnd.mpegurl', + 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', + 'n3' => 'text/n3', + 'nb' => 'application/mathematica', + 'nbp' => 'application/vnd.wolfram.player', + 'nc' => 'application/x-netcdf', + 'ncx' => 'application/x-dtbncx+xml', + 'ngdat' => 'application/vnd.nokia.n-gage.data', + 'nlu' => 'application/vnd.neurolanguage.nlu', + 'nml' => 'application/vnd.enliven', + 'nnd' => 'application/vnd.noblenet-directory', + 'nns' => 'application/vnd.noblenet-sealer', + 'nnw' => 'application/vnd.noblenet-web', + 'npx' => 'image/vnd.net-fpx', + 'nsf' => 'application/vnd.lotus-notes', + 'oa2' => 'application/vnd.fujitsu.oasys2', + 'oa3' => 'application/vnd.fujitsu.oasys3', + 'oas' => 'application/vnd.fujitsu.oasys', + 'obd' => 'application/x-msbinder', + 'oda' => 'application/oda', + 'odb' => 'application/vnd.oasis.opendocument.database', + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'odft' => 'application/vnd.oasis.opendocument.formula-template', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'oga' => 'audio/ogg', + 'ogg' => 'audio/ogg', + 'ogv' => 'video/ogg', + 'ogx' => 'application/ogg', + 'onepkg' => 'application/onenote', + 'onetmp' => 'application/onenote', + 'onetoc' => 'application/onenote', + 'onetoc2' => 'application/onenote', + 'opf' => 'application/oebps-package+xml', + 'oprc' => 'application/vnd.palm', + 'org' => 'application/vnd.lotus-organizer', + 'osf' => 'application/vnd.yamaha.openscoreformat', + 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', + 'otc' => 'application/vnd.oasis.opendocument.chart-template', + 'otf' => 'application/x-font-otf', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web', + 'oti' => 'application/vnd.oasis.opendocument.image-template', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'oxt' => 'application/vnd.openofficeorg.extension', + 'p' => 'text/x-pascal', + 'p10' => 'application/pkcs10', + 'p12' => 'application/x-pkcs12', + 'p7b' => 'application/x-pkcs7-certificates', + 'p7c' => 'application/pkcs7-mime', + 'p7m' => 'application/pkcs7-mime', + 'p7r' => 'application/x-pkcs7-certreqresp', + 'p7s' => 'application/pkcs7-signature', + 'p8' => 'application/pkcs8', + 'pas' => 'text/x-pascal', + 'paw' => 'application/vnd.pawaafile', + 'pbd' => 'application/vnd.powerbuilder6', + 'pbm' => 'image/x-portable-bitmap', + 'pcf' => 'application/x-font-pcf', + 'pcl' => 'application/vnd.hp-pcl', + 'pclxl' => 'application/vnd.hp-pclxl', + 'pct' => 'image/x-pict', + 'pcurl' => 'application/vnd.curl.pcurl', + 'pcx' => 'image/x-pcx', + 'pdb' => 'application/vnd.palm', + 'pdf' => 'application/pdf', + 'pfa' => 'application/x-font-type1', + 'pfb' => 'application/x-font-type1', + 'pfm' => 'application/x-font-type1', + 'pfr' => 'application/font-tdpfr', + 'pfx' => 'application/x-pkcs12', + 'pgm' => 'image/x-portable-graymap', + 'pgn' => 'application/x-chess-pgn', + 'pgp' => 'application/pgp-encrypted', + 'php' => 'text/x-php', + 'phps' => 'application/x-httpd-phps', + 'pic' => 'image/x-pict', + 'pkg' => 'application/octet-stream', + 'pki' => 'application/pkixcmp', + 'pkipath' => 'application/pkix-pkipath', + 'plb' => 'application/vnd.3gpp.pic-bw-large', + 'plc' => 'application/vnd.mobius.plc', + 'plf' => 'application/vnd.pocketlearn', + 'pls' => 'application/pls+xml', + 'pml' => 'application/vnd.ctc-posml', + 'png' => 'image/png', + 'pnm' => 'image/x-portable-anymap', + 'portpkg' => 'application/vnd.macports.portpkg', + 'pot' => 'application/vnd.ms-powerpoint', + 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', + 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', + 'ppd' => 'application/vnd.cups-ppd', + 'ppm' => 'image/x-portable-pixmap', + 'pps' => 'application/vnd.ms-powerpoint', + 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', + 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'ppt' => 'application/vnd.ms-powerpoint', + 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'pqa' => 'application/vnd.palm', + 'prc' => 'application/x-mobipocket-ebook', + 'pre' => 'application/vnd.lotus-freelance', + 'prf' => 'application/pics-rules', + 'ps' => 'application/postscript', + 'psb' => 'application/vnd.3gpp.pic-bw-small', + 'psd' => 'image/vnd.adobe.photoshop', + 'psf' => 'application/x-font-linux-psf', + 'pskcxml' => 'application/pskc+xml', + 'ptid' => 'application/vnd.pvi.ptid1', + 'pub' => 'application/x-mspublisher', + 'pvb' => 'application/vnd.3gpp.pic-bw-var', + 'pwn' => 'application/vnd.3m.post-it-notes', + 'pya' => 'audio/vnd.ms-playready.media.pya', + 'pyv' => 'video/vnd.ms-playready.media.pyv', + 'qam' => 'application/vnd.epson.quickanime', + 'qbo' => 'application/vnd.intu.qbo', + 'qfx' => 'application/vnd.intu.qfx', + 'qps' => 'application/vnd.publishare-delta-tree', + 'qt' => 'video/quicktime', + 'qwd' => 'application/vnd.quark.quarkxpress', + 'qwt' => 'application/vnd.quark.quarkxpress', + 'qxb' => 'application/vnd.quark.quarkxpress', + 'qxd' => 'application/vnd.quark.quarkxpress', + 'qxl' => 'application/vnd.quark.quarkxpress', + 'qxt' => 'application/vnd.quark.quarkxpress', + 'ra' => 'audio/x-pn-realaudio', + 'ram' => 'audio/x-pn-realaudio', + 'rar' => 'application/x-rar-compressed', + 'ras' => 'image/x-cmu-raster', + 'rb' => 'text/plain', + 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', + 'rdf' => 'application/rdf+xml', + 'rdz' => 'application/vnd.data-vision.rdz', + 'rep' => 'application/vnd.businessobjects', + 'res' => 'application/x-dtbresource+xml', + 'resx' => 'text/xml', + 'rgb' => 'image/x-rgb', + 'rif' => 'application/reginfo+xml', + 'rip' => 'audio/vnd.rip', + 'rl' => 'application/resource-lists+xml', + 'rlc' => 'image/vnd.fujixerox.edmics-rlc', + 'rld' => 'application/resource-lists-diff+xml', + 'rm' => 'application/vnd.rn-realmedia', + 'rmi' => 'audio/midi', + 'rmp' => 'audio/x-pn-realaudio-plugin', + 'rms' => 'application/vnd.jcp.javame.midlet-rms', + 'rnc' => 'application/relax-ng-compact-syntax', + 'roff' => 'text/troff', + 'rp9' => 'application/vnd.cloanto.rp9', + 'rpss' => 'application/vnd.nokia.radio-presets', + 'rpst' => 'application/vnd.nokia.radio-preset', + 'rq' => 'application/sparql-query', + 'rs' => 'application/rls-services+xml', + 'rsd' => 'application/rsd+xml', + 'rss' => 'application/rss+xml', + 'rtf' => 'application/rtf', + 'rtx' => 'text/richtext', + 's' => 'text/x-asm', + 'saf' => 'application/vnd.yamaha.smaf-audio', + 'sbml' => 'application/sbml+xml', + 'sc' => 'application/vnd.ibm.secure-container', + 'scd' => 'application/x-msschedule', + 'scm' => 'application/vnd.lotus-screencam', + 'scq' => 'application/scvp-cv-request', + 'scs' => 'application/scvp-cv-response', + 'scurl' => 'text/vnd.curl.scurl', + 'sda' => 'application/vnd.stardivision.draw', + 'sdc' => 'application/vnd.stardivision.calc', + 'sdd' => 'application/vnd.stardivision.impress', + 'sdkd' => 'application/vnd.solent.sdkm+xml', + 'sdkm' => 'application/vnd.solent.sdkm+xml', + 'sdp' => 'application/sdp', + 'sdw' => 'application/vnd.stardivision.writer', + 'see' => 'application/vnd.seemail', + 'seed' => 'application/vnd.fdsn.seed', + 'sema' => 'application/vnd.sema', + 'semd' => 'application/vnd.semd', + 'semf' => 'application/vnd.semf', + 'ser' => 'application/java-serialized-object', + 'setpay' => 'application/set-payment-initiation', + 'setreg' => 'application/set-registration-initiation', + 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', + 'sfs' => 'application/vnd.spotfire.sfs', + 'sgl' => 'application/vnd.stardivision.writer-global', + 'sgm' => 'text/sgml', + 'sgml' => 'text/sgml', + 'sh' => 'application/x-sh', + 'shar' => 'application/x-shar', + 'shf' => 'application/shf+xml', + 'sig' => 'application/pgp-signature', + 'silo' => 'model/mesh', + 'sis' => 'application/vnd.symbian.install', + 'sisx' => 'application/vnd.symbian.install', + 'sit' => 'application/x-stuffit', + 'sitx' => 'application/x-stuffitx', + 'skd' => 'application/vnd.koan', + 'skm' => 'application/vnd.koan', + 'skp' => 'application/vnd.koan', + 'skt' => 'application/vnd.koan', + 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', + 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', + 'slt' => 'application/vnd.epson.salt', + 'sm' => 'application/vnd.stepmania.stepchart', + 'smf' => 'application/vnd.stardivision.math', + 'smi' => 'application/smil+xml', + 'smil' => 'application/smil+xml', + 'snd' => 'audio/basic', + 'snf' => 'application/x-font-snf', + 'so' => 'application/octet-stream', + 'spc' => 'application/x-pkcs7-certificates', + 'spf' => 'application/vnd.yamaha.smaf-phrase', + 'spl' => 'application/x-futuresplash', + 'spot' => 'text/vnd.in3d.spot', + 'spp' => 'application/scvp-vp-response', + 'spq' => 'application/scvp-vp-request', + 'spx' => 'audio/ogg', + 'src' => 'application/x-wais-source', + 'srt' => 'application/octet-stream', + 'sru' => 'application/sru+xml', + 'srx' => 'application/sparql-results+xml', + 'sse' => 'application/vnd.kodak-descriptor', + 'ssf' => 'application/vnd.epson.ssf', + 'ssml' => 'application/ssml+xml', + 'st' => 'application/vnd.sailingtracker.track', + 'stc' => 'application/vnd.sun.xml.calc.template', + 'std' => 'application/vnd.sun.xml.draw.template', + 'stf' => 'application/vnd.wt.stf', + 'sti' => 'application/vnd.sun.xml.impress.template', + 'stk' => 'application/hyperstudio', + 'stl' => 'application/vnd.ms-pki.stl', + 'str' => 'application/vnd.pg.format', + 'stw' => 'application/vnd.sun.xml.writer.template', + 'sub' => 'image/vnd.dvb.subtitle', + 'sus' => 'application/vnd.sus-calendar', + 'susp' => 'application/vnd.sus-calendar', + 'sv4cpio' => 'application/x-sv4cpio', + 'sv4crc' => 'application/x-sv4crc', + 'svc' => 'application/vnd.dvb.service', + 'svd' => 'application/vnd.svd', + 'svg' => 'image/svg+xml', + 'svgz' => 'image/svg+xml', + 'swa' => 'application/x-director', + 'swf' => 'application/x-shockwave-flash', + 'swi' => 'application/vnd.aristanetworks.swi', + 'sxc' => 'application/vnd.sun.xml.calc', + 'sxd' => 'application/vnd.sun.xml.draw', + 'sxg' => 'application/vnd.sun.xml.writer.global', + 'sxi' => 'application/vnd.sun.xml.impress', + 'sxm' => 'application/vnd.sun.xml.math', + 'sxw' => 'application/vnd.sun.xml.writer', + 't' => 'text/troff', + 'tao' => 'application/vnd.tao.intent-module-archive', + 'tar' => 'application/x-tar', + 'tcap' => 'application/vnd.3gpp2.tcap', + 'tcl' => 'application/x-tcl', + 'teacher' => 'application/vnd.smart.teacher', + 'tei' => 'application/tei+xml', + 'teicorpus' => 'application/tei+xml', + 'tex' => 'application/x-tex', + 'texi' => 'application/x-texinfo', + 'texinfo' => 'application/x-texinfo', + 'text' => 'text/plain', + 'tfi' => 'application/thraud+xml', + 'tfm' => 'application/x-tex-tfm', + 'thmx' => 'application/vnd.ms-officetheme', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'tmo' => 'application/vnd.tmobile-livetv', + 'torrent' => 'application/x-bittorrent', + 'tpl' => 'application/vnd.groove-tool-template', + 'tpt' => 'application/vnd.trid.tpt', + 'tr' => 'text/troff', + 'tra' => 'application/vnd.trueapp', + 'trm' => 'application/x-msterminal', + 'tsd' => 'application/timestamped-data', + 'tsv' => 'text/tab-separated-values', + 'ttc' => 'application/x-font-ttf', + 'ttf' => 'application/x-font-ttf', + 'ttl' => 'text/turtle', + 'twd' => 'application/vnd.simtech-mindmapper', + 'twds' => 'application/vnd.simtech-mindmapper', + 'txd' => 'application/vnd.genomatix.tuxedo', + 'txf' => 'application/vnd.mobius.txf', + 'txt' => 'text/plain', + 'u32' => 'application/x-authorware-bin', + 'udeb' => 'application/x-debian-package', + 'ufd' => 'application/vnd.ufdl', + 'ufdl' => 'application/vnd.ufdl', + 'umj' => 'application/vnd.umajin', + 'unityweb' => 'application/vnd.unity', + 'uoml' => 'application/vnd.uoml+xml', + 'uri' => 'text/uri-list', + 'uris' => 'text/uri-list', + 'urls' => 'text/uri-list', + 'ustar' => 'application/x-ustar', + 'utz' => 'application/vnd.uiq.theme', + 'uu' => 'text/x-uuencode', + 'uva' => 'audio/vnd.dece.audio', + 'uvd' => 'application/vnd.dece.data', + 'uvf' => 'application/vnd.dece.data', + 'uvg' => 'image/vnd.dece.graphic', + 'uvh' => 'video/vnd.dece.hd', + 'uvi' => 'image/vnd.dece.graphic', + 'uvm' => 'video/vnd.dece.mobile', + 'uvp' => 'video/vnd.dece.pd', + 'uvs' => 'video/vnd.dece.sd', + 'uvt' => 'application/vnd.dece.ttml+xml', + 'uvu' => 'video/vnd.uvvu.mp4', + 'uvv' => 'video/vnd.dece.video', + 'uvva' => 'audio/vnd.dece.audio', + 'uvvd' => 'application/vnd.dece.data', + 'uvvf' => 'application/vnd.dece.data', + 'uvvg' => 'image/vnd.dece.graphic', + 'uvvh' => 'video/vnd.dece.hd', + 'uvvi' => 'image/vnd.dece.graphic', + 'uvvm' => 'video/vnd.dece.mobile', + 'uvvp' => 'video/vnd.dece.pd', + 'uvvs' => 'video/vnd.dece.sd', + 'uvvt' => 'application/vnd.dece.ttml+xml', + 'uvvu' => 'video/vnd.uvvu.mp4', + 'uvvv' => 'video/vnd.dece.video', + 'uvvx' => 'application/vnd.dece.unspecified', + 'uvx' => 'application/vnd.dece.unspecified', + 'vcd' => 'application/x-cdlink', + 'vcf' => 'text/x-vcard', + 'vcg' => 'application/vnd.groove-vcard', + 'vcs' => 'text/x-vcalendar', + 'vcx' => 'application/vnd.vcx', + 'vis' => 'application/vnd.visionary', + 'viv' => 'video/vnd.vivo', + 'vor' => 'application/vnd.stardivision.writer', + 'vox' => 'application/x-authorware-bin', + 'vrml' => 'model/vrml', + 'vsd' => 'application/vnd.visio', + 'vsf' => 'application/vnd.vsf', + 'vss' => 'application/vnd.visio', + 'vst' => 'application/vnd.visio', + 'vsw' => 'application/vnd.visio', + 'vtu' => 'model/vnd.vtu', + 'vxml' => 'application/voicexml+xml', + 'w3d' => 'application/x-director', + 'wad' => 'application/x-doom', + 'wav' => 'audio/x-wav', + 'wax' => 'audio/x-ms-wax', + 'wbmp' => 'image/vnd.wap.wbmp', + 'wbs' => 'application/vnd.criticaltools.wbs+xml', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wcm' => 'application/vnd.ms-works', + 'wdb' => 'application/vnd.ms-works', + 'weba' => 'audio/webm', + 'webm' => 'video/webm', + 'webp' => 'image/webp', + 'wg' => 'application/vnd.pmi.widget', + 'wgt' => 'application/widget', + 'wks' => 'application/vnd.ms-works', + 'wm' => 'video/x-ms-wm', + 'wma' => 'audio/x-ms-wma', + 'wmd' => 'application/x-ms-wmd', + 'wmf' => 'application/x-msmetafile', + 'wml' => 'text/vnd.wap.wml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'wmls' => 'text/vnd.wap.wmlscript', + 'wmlsc' => 'application/vnd.wap.wmlscriptc', + 'wmv' => 'video/x-ms-wmv', + 'wmx' => 'video/x-ms-wmx', + 'wmz' => 'application/x-ms-wmz', + 'woff' => 'application/x-font-woff', + 'wpd' => 'application/vnd.wordperfect', + 'wpl' => 'application/vnd.ms-wpl', + 'wps' => 'application/vnd.ms-works', + 'wqd' => 'application/vnd.wqd', + 'wri' => 'application/x-mswrite', + 'wrl' => 'model/vrml', + 'wsdl' => 'application/wsdl+xml', + 'wspolicy' => 'application/wspolicy+xml', + 'wtb' => 'application/vnd.webturbo', + 'wvx' => 'video/x-ms-wvx', + 'x32' => 'application/x-authorware-bin', + 'x3d' => 'application/vnd.hzn-3d-crossword', + 'xap' => 'application/x-silverlight-app', + 'xar' => 'application/vnd.xara', + 'xbap' => 'application/x-ms-xbap', + 'xbd' => 'application/vnd.fujixerox.docuworks.binder', + 'xbm' => 'image/x-xbitmap', + 'xdf' => 'application/xcap-diff+xml', + 'xdm' => 'application/vnd.syncml.dm+xml', + 'xdp' => 'application/vnd.adobe.xdp+xml', + 'xdssc' => 'application/dssc+xml', + 'xdw' => 'application/vnd.fujixerox.docuworks', + 'xenc' => 'application/xenc+xml', + 'xer' => 'application/patch-ops-error+xml', + 'xfdf' => 'application/vnd.adobe.xfdf', + 'xfdl' => 'application/vnd.xfdl', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', + 'xhvml' => 'application/xv+xml', + 'xif' => 'image/vnd.xiff', + 'xla' => 'application/vnd.ms-excel', + 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', + 'xlc' => 'application/vnd.ms-excel', + 'xlm' => 'application/vnd.ms-excel', + 'xls' => 'application/vnd.ms-excel', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', + 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xlt' => 'application/vnd.ms-excel', + 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', + 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + 'xlw' => 'application/vnd.ms-excel', + 'xml' => 'application/xml', + 'xo' => 'application/vnd.olpc-sugar', + 'xop' => 'application/xop+xml', + 'xpi' => 'application/x-xpinstall', + 'xpm' => 'image/x-xpixmap', + 'xpr' => 'application/vnd.is-xpr', + 'xps' => 'application/vnd.ms-xpsdocument', + 'xpw' => 'application/vnd.intercon.formnet', + 'xpx' => 'application/vnd.intercon.formnet', + 'xsl' => 'application/xml', + 'xslt' => 'application/xslt+xml', + 'xsm' => 'application/vnd.syncml+xml', + 'xspf' => 'application/xspf+xml', + 'xul' => 'application/vnd.mozilla.xul+xml', + 'xvm' => 'application/xv+xml', + 'xvml' => 'application/xv+xml', + 'xwd' => 'image/x-xwindowdump', + 'xyz' => 'chemical/x-xyz', + 'yaml' => 'text/yaml', + 'yang' => 'application/yang', + 'yin' => 'application/yin+xml', + 'yml' => 'text/yaml', + 'zaz' => 'application/vnd.zzazz.deck+xml', + 'zip' => 'application/zip', + 'zir' => 'application/vnd.zul', + 'zirz' => 'application/vnd.zul', + 'zmm' => 'application/vnd.handheld-entertainment+xml' + ]; + + /** + * Get a singleton instance of the class + * + * @return self + * @codeCoverageIgnore + */ + public static function getInstance() + { + if (!self::$instance) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * Get a mimetype value from a file extension + * + * @param string $extension File extension + * + * @return string|null + */ + public function fromExtension($extension) + { + $extension = strtolower($extension); + + return isset($this->mimetypes[$extension]) ? $this->mimetypes[$extension] : null; + } + + /** + * Get a mimetype from a filename + * + * @param string $filename Filename to generate a mimetype from + * + * @return string|null + */ + public function fromFilename($filename) + { + return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/Birthday.php b/inc/vendors/social-login/Facebook/GraphNodes/Birthday.php new file mode 100755 index 00000000..4338b65e --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/Birthday.php @@ -0,0 +1,85 @@ +hasYear = count($parts) === 3 || count($parts) === 1; + $this->hasDate = count($parts) === 3 || count($parts) === 2; + + parent::__construct($date); + } + + /** + * Returns whether date object contains birth day and month + * + * @return bool + */ + public function hasDate() + { + return $this->hasDate; + } + + /** + * Returns whether date object contains birth year + * + * @return bool + */ + public function hasYear() + { + return $this->hasYear; + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/Collection.php b/inc/vendors/social-login/Facebook/GraphNodes/Collection.php new file mode 100755 index 00000000..424b7cf3 --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/Collection.php @@ -0,0 +1,242 @@ +items = $items; + } + + /** + * Gets the value of a field from the Graph node. + * + * @param string $name The field to retrieve. + * @param mixed $default The default to return if the field doesn't exist. + * + * @return mixed + */ + public function getField($name, $default = null) + { + if (isset($this->items[$name])) { + return $this->items[$name]; + } + + return $default; + } + + /** + * Gets the value of the named property for this graph object. + * + * @param string $name The property to retrieve. + * @param mixed $default The default to return if the property doesn't exist. + * + * @return mixed + * + * @deprecated 5.0.0 getProperty() has been renamed to getField() + * @todo v6: Remove this method + */ + public function getProperty($name, $default = null) + { + return $this->getField($name, $default); + } + + /** + * Returns a list of all fields set on the object. + * + * @return array + */ + public function getFieldNames() + { + return array_keys($this->items); + } + + /** + * Returns a list of all properties set on the object. + * + * @return array + * + * @deprecated 5.0.0 getPropertyNames() has been renamed to getFieldNames() + * @todo v6: Remove this method + */ + public function getPropertyNames() + { + return $this->getFieldNames(); + } + + /** + * Get all of the items in the collection. + * + * @return array + */ + public function all() + { + return $this->items; + } + + /** + * Get the collection of items as a plain array. + * + * @return array + */ + public function asArray() + { + return array_map(function ($value) { + return $value instanceof Collection ? $value->asArray() : $value; + }, $this->items); + } + + /** + * Run a map over each of the items. + * + * @param \Closure $callback + * + * @return static + */ + public function map(\Closure $callback) + { + return new static(array_map($callback, $this->items, array_keys($this->items))); + } + + /** + * Get the collection of items as JSON. + * + * @param int $options + * + * @return string + */ + public function asJson($options = 0) + { + return json_encode($this->asArray(), $options); + } + + /** + * Count the number of items in the collection. + * + * @return int + */ + public function count() + { + return count($this->items); + } + + /** + * Get an iterator for the items. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->items); + } + + /** + * Determine if an item exists at an offset. + * + * @param mixed $key + * + * @return bool + */ + public function offsetExists($key) + { + return array_key_exists($key, $this->items); + } + + /** + * Get an item at a given offset. + * + * @param mixed $key + * + * @return mixed + */ + public function offsetGet($key) + { + return $this->items[$key]; + } + + /** + * Set the item at a given offset. + * + * @param mixed $key + * @param mixed $value + * + * @return void + */ + public function offsetSet($key, $value) + { + if (is_null($key)) { + $this->items[] = $value; + } else { + $this->items[$key] = $value; + } + } + + /** + * Unset the item at a given offset. + * + * @param string $key + * + * @return void + */ + public function offsetUnset($key) + { + unset($this->items[$key]); + } + + /** + * Convert the collection to its string representation. + * + * @return string + */ + public function __toString() + { + return $this->asJson(); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphAchievement.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphAchievement.php new file mode 100755 index 00000000..31508ee4 --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphAchievement.php @@ -0,0 +1,112 @@ + '\Facebook\GraphNodes\GraphUser', + 'application' => '\Facebook\GraphNodes\GraphApplication', + ]; + + /** + * Returns the ID for the achievement. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the user who achieved this. + * + * @return GraphUser|null + */ + public function getFrom() + { + return $this->getField('from'); + } + + /** + * Returns the time at which this was achieved. + * + * @return \DateTime|null + */ + public function getPublishTime() + { + return $this->getField('publish_time'); + } + + /** + * Returns the app in which the user achieved this. + * + * @return GraphApplication|null + */ + public function getApplication() + { + return $this->getField('application'); + } + + /** + * Returns information about the achievement type this instance is connected with. + * + * @return array|null + */ + public function getData() + { + return $this->getField('data'); + } + + /** + * Returns the type of achievement. + * + * @see https://developers.facebook.com/docs/graph-api/reference/achievement + * + * @return string + */ + public function getType() + { + return 'game.achievement'; + } + + /** + * Indicates whether gaining the achievement published a feed story for the user. + * + * @return boolean|null + */ + public function isNoFeedStory() + { + return $this->getField('no_feed_story'); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphAlbum.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphAlbum.php new file mode 100755 index 00000000..52f19b51 --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphAlbum.php @@ -0,0 +1,183 @@ + '\Facebook\GraphNodes\GraphUser', + 'place' => '\Facebook\GraphNodes\GraphPage', + ]; + + /** + * Returns the ID for the album. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns whether the viewer can upload photos to this album. + * + * @return boolean|null + */ + public function getCanUpload() + { + return $this->getField('can_upload'); + } + + /** + * Returns the number of photos in this album. + * + * @return int|null + */ + public function getCount() + { + return $this->getField('count'); + } + + /** + * Returns the ID of the album's cover photo. + * + * @return string|null + */ + public function getCoverPhoto() + { + return $this->getField('cover_photo'); + } + + /** + * Returns the time the album was initially created. + * + * @return \DateTime|null + */ + public function getCreatedTime() + { + return $this->getField('created_time'); + } + + /** + * Returns the time the album was updated. + * + * @return \DateTime|null + */ + public function getUpdatedTime() + { + return $this->getField('updated_time'); + } + + /** + * Returns the description of the album. + * + * @return string|null + */ + public function getDescription() + { + return $this->getField('description'); + } + + /** + * Returns profile that created the album. + * + * @return GraphUser|null + */ + public function getFrom() + { + return $this->getField('from'); + } + + /** + * Returns profile that created the album. + * + * @return GraphPage|null + */ + public function getPlace() + { + return $this->getField('place'); + } + + /** + * Returns a link to this album on Facebook. + * + * @return string|null + */ + public function getLink() + { + return $this->getField('link'); + } + + /** + * Returns the textual location of the album. + * + * @return string|null + */ + public function getLocation() + { + return $this->getField('location'); + } + + /** + * Returns the title of the album. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the privacy settings for the album. + * + * @return string|null + */ + public function getPrivacy() + { + return $this->getField('privacy'); + } + + /** + * Returns the type of the album. + * + * enum{ profile, mobile, wall, normal, album } + * + * @return string|null + */ + public function getType() + { + return $this->getField('type'); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphApplication.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphApplication.php new file mode 100755 index 00000000..aa07c825 --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphApplication.php @@ -0,0 +1,43 @@ +getField('id'); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphCoverPhoto.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphCoverPhoto.php new file mode 100755 index 00000000..824275bb --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphCoverPhoto.php @@ -0,0 +1,72 @@ +getField('id'); + } + + /** + * Returns the source of cover if it exists + * + * @return string|null + */ + public function getSource() + { + return $this->getField('source'); + } + + /** + * Returns the offset_x of cover if it exists + * + * @return int|null + */ + public function getOffsetX() + { + return $this->getField('offset_x'); + } + + /** + * Returns the offset_y of cover if it exists + * + * @return int|null + */ + public function getOffsetY() + { + return $this->getField('offset_y'); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphEdge.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphEdge.php new file mode 100755 index 00000000..f6f4970c --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphEdge.php @@ -0,0 +1,252 @@ +request = $request; + $this->metaData = $metaData; + $this->parentEdgeEndpoint = $parentEdgeEndpoint; + $this->subclassName = $subclassName; + + parent::__construct($data); + } + + /** + * Gets the parent Graph edge endpoint that generated the list. + * + * @return string|null + */ + public function getParentGraphEdge() + { + return $this->parentEdgeEndpoint; + } + + /** + * Gets the subclass name that the child GraphNode's are cast as. + * + * @return string|null + */ + public function getSubClassName() + { + return $this->subclassName; + } + + /** + * Returns the raw meta data associated with this GraphEdge. + * + * @return array + */ + public function getMetaData() + { + return $this->metaData; + } + + /** + * Returns the next cursor if it exists. + * + * @return string|null + */ + public function getNextCursor() + { + return $this->getCursor('after'); + } + + /** + * Returns the previous cursor if it exists. + * + * @return string|null + */ + public function getPreviousCursor() + { + return $this->getCursor('before'); + } + + /** + * Returns the cursor for a specific direction if it exists. + * + * @param string $direction The direction of the page: after|before + * + * @return string|null + */ + public function getCursor($direction) + { + if (isset($this->metaData['paging']['cursors'][$direction])) { + return $this->metaData['paging']['cursors'][$direction]; + } + + return null; + } + + /** + * Generates a pagination URL based on a cursor. + * + * @param string $direction The direction of the page: next|previous + * + * @return string|null + * + * @throws FacebookSDKException + */ + public function getPaginationUrl($direction) + { + $this->validateForPagination(); + + // Do we have a paging URL? + if (!isset($this->metaData['paging'][$direction])) { + return null; + } + + $pageUrl = $this->metaData['paging'][$direction]; + + return FacebookUrlManipulator::baseGraphUrlEndpoint($pageUrl); + } + + /** + * Validates whether or not we can paginate on this request. + * + * @throws FacebookSDKException + */ + public function validateForPagination() + { + if ($this->request->getMethod() !== 'GET') { + throw new FacebookSDKException('You can only paginate on a GET request.', 720); + } + } + + /** + * Gets the request object needed to make a next|previous page request. + * + * @param string $direction The direction of the page: next|previous + * + * @return FacebookRequest|null + * + * @throws FacebookSDKException + */ + public function getPaginationRequest($direction) + { + $pageUrl = $this->getPaginationUrl($direction); + if (!$pageUrl) { + return null; + } + + $newRequest = clone $this->request; + $newRequest->setEndpoint($pageUrl); + + return $newRequest; + } + + /** + * Gets the request object needed to make a "next" page request. + * + * @return FacebookRequest|null + * + * @throws FacebookSDKException + */ + public function getNextPageRequest() + { + return $this->getPaginationRequest('next'); + } + + /** + * Gets the request object needed to make a "previous" page request. + * + * @return FacebookRequest|null + * + * @throws FacebookSDKException + */ + public function getPreviousPageRequest() + { + return $this->getPaginationRequest('previous'); + } + + /** + * The total number of results according to Graph if it exists. + * + * This will be returned if the summary=true modifier is present in the request. + * + * @return int|null + */ + public function getTotalCount() + { + if (isset($this->metaData['summary']['total_count'])) { + return $this->metaData['summary']['total_count']; + } + + return null; + } + + /** + * @inheritDoc + */ + public function map(\Closure $callback) + { + return new static( + $this->request, + array_map($callback, $this->items, array_keys($this->items)), + $this->metaData, + $this->parentEdgeEndpoint, + $this->subclassName + ); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphEvent.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphEvent.php new file mode 100755 index 00000000..a470d89f --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphEvent.php @@ -0,0 +1,242 @@ + '\Facebook\GraphNodes\GraphCoverPhoto', + 'place' => '\Facebook\GraphNodes\GraphPage', + 'picture' => '\Facebook\GraphNodes\GraphPicture', + 'parent_group' => '\Facebook\GraphNodes\GraphGroup', + ]; + + /** + * Returns the `id` (The event ID) as string if present. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the `cover` (Cover picture) as GraphCoverPhoto if present. + * + * @return GraphCoverPhoto|null + */ + public function getCover() + { + return $this->getField('cover'); + } + + /** + * Returns the `description` (Long-form description) as string if present. + * + * @return string|null + */ + public function getDescription() + { + return $this->getField('description'); + } + + /** + * Returns the `end_time` (End time, if one has been set) as DateTime if present. + * + * @return \DateTime|null + */ + public function getEndTime() + { + return $this->getField('end_time'); + } + + /** + * Returns the `is_date_only` (Whether the event only has a date specified, but no time) as bool if present. + * + * @return bool|null + */ + public function getIsDateOnly() + { + return $this->getField('is_date_only'); + } + + /** + * Returns the `name` (Event name) as string if present. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the `owner` (The profile that created the event) as GraphNode if present. + * + * @return GraphNode|null + */ + public function getOwner() + { + return $this->getField('owner'); + } + + /** + * Returns the `parent_group` (The group the event belongs to) as GraphGroup if present. + * + * @return GraphGroup|null + */ + public function getParentGroup() + { + return $this->getField('parent_group'); + } + + /** + * Returns the `place` (Event Place information) as GraphPage if present. + * + * @return GraphPage|null + */ + public function getPlace() + { + return $this->getField('place'); + } + + /** + * Returns the `privacy` (Who can see the event) as string if present. + * + * @return string|null + */ + public function getPrivacy() + { + return $this->getField('privacy'); + } + + /** + * Returns the `start_time` (Start time) as DateTime if present. + * + * @return \DateTime|null + */ + public function getStartTime() + { + return $this->getField('start_time'); + } + + /** + * Returns the `ticket_uri` (The link users can visit to buy a ticket to this event) as string if present. + * + * @return string|null + */ + public function getTicketUri() + { + return $this->getField('ticket_uri'); + } + + /** + * Returns the `timezone` (Timezone) as string if present. + * + * @return string|null + */ + public function getTimezone() + { + return $this->getField('timezone'); + } + + /** + * Returns the `updated_time` (Last update time) as DateTime if present. + * + * @return \DateTime|null + */ + public function getUpdatedTime() + { + return $this->getField('updated_time'); + } + + /** + * Returns the `picture` (Event picture) as GraphPicture if present. + * + * @return GraphPicture|null + */ + public function getPicture() + { + return $this->getField('picture'); + } + + /** + * Returns the `attending_count` (Number of people attending the event) as int if present. + * + * @return int|null + */ + public function getAttendingCount() + { + return $this->getField('attending_count'); + } + + /** + * Returns the `declined_count` (Number of people who declined the event) as int if present. + * + * @return int|null + */ + public function getDeclinedCount() + { + return $this->getField('declined_count'); + } + + /** + * Returns the `maybe_count` (Number of people who maybe going to the event) as int if present. + * + * @return int|null + */ + public function getMaybeCount() + { + return $this->getField('maybe_count'); + } + + /** + * Returns the `noreply_count` (Number of people who did not reply to the event) as int if present. + * + * @return int|null + */ + public function getNoreplyCount() + { + return $this->getField('noreply_count'); + } + + /** + * Returns the `invited_count` (Number of people invited to the event) as int if present. + * + * @return int|null + */ + public function getInvitedCount() + { + return $this->getField('invited_count'); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphGroup.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphGroup.php new file mode 100755 index 00000000..6217bd4d --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphGroup.php @@ -0,0 +1,170 @@ + '\Facebook\GraphNodes\GraphCoverPhoto', + 'venue' => '\Facebook\GraphNodes\GraphLocation', + ]; + + /** + * Returns the `id` (The Group ID) as string if present. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the `cover` (The cover photo of the Group) as GraphCoverPhoto if present. + * + * @return GraphCoverPhoto|null + */ + public function getCover() + { + return $this->getField('cover'); + } + + /** + * Returns the `description` (A brief description of the Group) as string if present. + * + * @return string|null + */ + public function getDescription() + { + return $this->getField('description'); + } + + /** + * Returns the `email` (The email address to upload content to the Group. Only current members of the Group can use this) as string if present. + * + * @return string|null + */ + public function getEmail() + { + return $this->getField('email'); + } + + /** + * Returns the `icon` (The URL for the Group's icon) as string if present. + * + * @return string|null + */ + public function getIcon() + { + return $this->getField('icon'); + } + + /** + * Returns the `link` (The Group's website) as string if present. + * + * @return string|null + */ + public function getLink() + { + return $this->getField('link'); + } + + /** + * Returns the `name` (The name of the Group) as string if present. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the `member_request_count` (Number of people asking to join the group.) as int if present. + * + * @return int|null + */ + public function getMemberRequestCount() + { + return $this->getField('member_request_count'); + } + + /** + * Returns the `owner` (The profile that created this Group) as GraphNode if present. + * + * @return GraphNode|null + */ + public function getOwner() + { + return $this->getField('owner'); + } + + /** + * Returns the `parent` (The parent Group of this Group, if it exists) as GraphNode if present. + * + * @return GraphNode|null + */ + public function getParent() + { + return $this->getField('parent'); + } + + /** + * Returns the `privacy` (The privacy setting of the Group) as string if present. + * + * @return string|null + */ + public function getPrivacy() + { + return $this->getField('privacy'); + } + + /** + * Returns the `updated_time` (The last time the Group was updated (this includes changes in the Group's properties and changes in posts and comments if user can see them)) as \DateTime if present. + * + * @return \DateTime|null + */ + public function getUpdatedTime() + { + return $this->getField('updated_time'); + } + + /** + * Returns the `venue` (The location for the Group) as GraphLocation if present. + * + * @return GraphLocation|null + */ + public function getVenue() + { + return $this->getField('venue'); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphList.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphList.php new file mode 100755 index 00000000..3dfbd497 --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphList.php @@ -0,0 +1,36 @@ +getField('street'); + } + + /** + * Returns the city component of the location + * + * @return string|null + */ + public function getCity() + { + return $this->getField('city'); + } + + /** + * Returns the state component of the location + * + * @return string|null + */ + public function getState() + { + return $this->getField('state'); + } + + /** + * Returns the country component of the location + * + * @return string|null + */ + public function getCountry() + { + return $this->getField('country'); + } + + /** + * Returns the zipcode component of the location + * + * @return string|null + */ + public function getZip() + { + return $this->getField('zip'); + } + + /** + * Returns the latitude component of the location + * + * @return float|null + */ + public function getLatitude() + { + return $this->getField('latitude'); + } + + /** + * Returns the street component of the location + * + * @return float|null + */ + public function getLongitude() + { + return $this->getField('longitude'); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphNode.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphNode.php new file mode 100755 index 00000000..a81c47b7 --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphNode.php @@ -0,0 +1,198 @@ +castItems($data)); + } + + /** + * Iterates over an array and detects the types each node + * should be cast to and returns all the items as an array. + * + * @TODO Add auto-casting to AccessToken entities. + * + * @param array $data The array to iterate over. + * + * @return array + */ + public function castItems(array $data) + { + $items = []; + + foreach ($data as $k => $v) { + if ($this->shouldCastAsDateTime($k) + && (is_numeric($v) + || $this->isIso8601DateString($v)) + ) { + $items[$k] = $this->castToDateTime($v); + } elseif ($k === 'birthday') { + $items[$k] = $this->castToBirthday($v); + } else { + $items[$k] = $v; + } + } + + return $items; + } + + /** + * Uncasts any auto-casted datatypes. + * Basically the reverse of castItems(). + * + * @return array + */ + public function uncastItems() + { + $items = $this->asArray(); + + return array_map(function ($v) { + if ($v instanceof \DateTime) { + return $v->format(\DateTime::ISO8601); + } + + return $v; + }, $items); + } + + /** + * Get the collection of items as JSON. + * + * @param int $options + * + * @return string + */ + public function asJson($options = 0) + { + return json_encode($this->uncastItems(), $options); + } + + /** + * Detects an ISO 8601 formatted string. + * + * @param string $string + * + * @return boolean + * + * @see https://developers.facebook.com/docs/graph-api/using-graph-api/#readmodifiers + * @see http://www.cl.cam.ac.uk/~mgk25/iso-time.html + * @see http://en.wikipedia.org/wiki/ISO_8601 + */ + public function isIso8601DateString($string) + { + // This insane regex was yoinked from here: + // http://www.pelagodesign.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/ + // ...and I'm all like: + // http://thecodinglove.com/post/95378251969/when-code-works-and-i-dont-know-why + $crazyInsaneRegexThatSomehowDetectsIso8601 = '/^([\+-]?\d{4}(?!\d{2}\b))' + . '((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?' + . '|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d' + . '|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])' + . '((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d' + . '([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/'; + + return preg_match($crazyInsaneRegexThatSomehowDetectsIso8601, $string) === 1; + } + + /** + * Determines if a value from Graph should be cast to DateTime. + * + * @param string $key + * + * @return boolean + */ + public function shouldCastAsDateTime($key) + { + return in_array($key, [ + 'created_time', + 'updated_time', + 'start_time', + 'end_time', + 'backdated_time', + 'issued_at', + 'expires_at', + 'publish_time', + 'joined' + ], true); + } + + /** + * Casts a date value from Graph to DateTime. + * + * @param int|string $value + * + * @return \DateTime + */ + public function castToDateTime($value) + { + if (is_int($value)) { + $dt = new \DateTime(); + $dt->setTimestamp($value); + } else { + $dt = new \DateTime($value); + } + + return $dt; + } + + /** + * Casts a birthday value from Graph to Birthday + * + * @param string $value + * + * @return Birthday + */ + public function castToBirthday($value) + { + return new Birthday($value); + } + + /** + * Getter for $graphObjectMap. + * + * @return array + */ + public static function getObjectMap() + { + return static::$graphObjectMap; + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphNodeFactory.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphNodeFactory.php new file mode 100755 index 00000000..937128bb --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphNodeFactory.php @@ -0,0 +1,394 @@ +response = $response; + $this->decodedBody = $response->getDecodedBody(); + } + + /** + * Tries to convert a FacebookResponse entity into a GraphNode. + * + * @param string|null $subclassName The GraphNode sub class to cast to. + * + * @return GraphNode + * + * @throws FacebookSDKException + */ + public function makeGraphNode($subclassName = null) + { + $this->validateResponseAsArray(); + $this->validateResponseCastableAsGraphNode(); + + return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName); + } + + /** + * Convenience method for creating a GraphAchievement collection. + * + * @return GraphAchievement + * + * @throws FacebookSDKException + */ + public function makeGraphAchievement() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAchievement'); + } + + /** + * Convenience method for creating a GraphAlbum collection. + * + * @return GraphAlbum + * + * @throws FacebookSDKException + */ + public function makeGraphAlbum() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAlbum'); + } + + /** + * Convenience method for creating a GraphPage collection. + * + * @return GraphPage + * + * @throws FacebookSDKException + */ + public function makeGraphPage() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphPage'); + } + + /** + * Convenience method for creating a GraphSessionInfo collection. + * + * @return GraphSessionInfo + * + * @throws FacebookSDKException + */ + public function makeGraphSessionInfo() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphSessionInfo'); + } + + /** + * Convenience method for creating a GraphUser collection. + * + * @return GraphUser + * + * @throws FacebookSDKException + */ + public function makeGraphUser() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphUser'); + } + + /** + * Convenience method for creating a GraphEvent collection. + * + * @return GraphEvent + * + * @throws FacebookSDKException + */ + public function makeGraphEvent() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent'); + } + + /** + * Convenience method for creating a GraphGroup collection. + * + * @return GraphGroup + * + * @throws FacebookSDKException + */ + public function makeGraphGroup() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphGroup'); + } + + /** + * Tries to convert a FacebookResponse entity into a GraphEdge. + * + * @param string|null $subclassName The GraphNode sub class to cast the list items to. + * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. + * + * @return GraphEdge + * + * @throws FacebookSDKException + */ + public function makeGraphEdge($subclassName = null, $auto_prefix = true) + { + $this->validateResponseAsArray(); + $this->validateResponseCastableAsGraphEdge(); + + if ($subclassName && $auto_prefix) { + $subclassName = static::BASE_GRAPH_OBJECT_PREFIX . $subclassName; + } + + return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName); + } + + /** + * Validates the decoded body. + * + * @throws FacebookSDKException + */ + public function validateResponseAsArray() + { + if (!is_array($this->decodedBody)) { + throw new FacebookSDKException('Unable to get response from Graph as array.', 620); + } + } + + /** + * Validates that the return data can be cast as a GraphNode. + * + * @throws FacebookSDKException + */ + public function validateResponseCastableAsGraphNode() + { + if (isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data'])) { + throw new FacebookSDKException( + 'Unable to convert response from Graph to a GraphNode because the response looks like a GraphEdge. Try using GraphNodeFactory::makeGraphEdge() instead.', + 620 + ); + } + } + + /** + * Validates that the return data can be cast as a GraphEdge. + * + * @throws FacebookSDKException + */ + public function validateResponseCastableAsGraphEdge() + { + if (!(isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data']))) { + throw new FacebookSDKException( + 'Unable to convert response from Graph to a GraphEdge because the response does not look like a GraphEdge. Try using GraphNodeFactory::makeGraphNode() instead.', + 620 + ); + } + } + + /** + * Safely instantiates a GraphNode of $subclassName. + * + * @param array $data The array of data to iterate over. + * @param string|null $subclassName The subclass to cast this collection to. + * + * @return GraphNode + * + * @throws FacebookSDKException + */ + public function safelyMakeGraphNode(array $data, $subclassName = null) + { + $subclassName = $subclassName ?: static::BASE_GRAPH_NODE_CLASS; + static::validateSubclass($subclassName); + + // Remember the parent node ID + $parentNodeId = isset($data['id']) ? $data['id'] : null; + + $items = []; + + foreach ($data as $k => $v) { + // Array means could be recurable + if (is_array($v)) { + // Detect any smart-casting from the $graphObjectMap array. + // This is always empty on the GraphNode collection, but subclasses can define + // their own array of smart-casting types. + $graphObjectMap = $subclassName::getObjectMap(); + $objectSubClass = isset($graphObjectMap[$k]) + ? $graphObjectMap[$k] + : null; + + // Could be a GraphEdge or GraphNode + $items[$k] = $this->castAsGraphNodeOrGraphEdge($v, $objectSubClass, $k, $parentNodeId); + } else { + $items[$k] = $v; + } + } + + return new $subclassName($items); + } + + /** + * Takes an array of values and determines how to cast each node. + * + * @param array $data The array of data to iterate over. + * @param string|null $subclassName The subclass to cast this collection to. + * @param string|null $parentKey The key of this data (Graph edge). + * @param string|null $parentNodeId The parent Graph node ID. + * + * @return GraphNode|GraphEdge + * + * @throws FacebookSDKException + */ + public function castAsGraphNodeOrGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null) + { + if (isset($data['data'])) { + // Create GraphEdge + if (static::isCastableAsGraphEdge($data['data'])) { + return $this->safelyMakeGraphEdge($data, $subclassName, $parentKey, $parentNodeId); + } + // Sometimes Graph is a weirdo and returns a GraphNode under the "data" key + $outerData = $data; + unset($outerData['data']); + $data = $data['data'] + $outerData; + } + + // Create GraphNode + return $this->safelyMakeGraphNode($data, $subclassName); + } + + /** + * Return an array of GraphNode's. + * + * @param array $data The array of data to iterate over. + * @param string|null $subclassName The GraphNode subclass to cast each item in the list to. + * @param string|null $parentKey The key of this data (Graph edge). + * @param string|null $parentNodeId The parent Graph node ID. + * + * @return GraphEdge + * + * @throws FacebookSDKException + */ + public function safelyMakeGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null) + { + if (!isset($data['data'])) { + throw new FacebookSDKException('Cannot cast data to GraphEdge. Expected a "data" key.', 620); + } + + $dataList = []; + foreach ($data['data'] as $graphNode) { + $dataList[] = $this->safelyMakeGraphNode($graphNode, $subclassName); + } + + $metaData = $this->getMetaData($data); + + // We'll need to make an edge endpoint for this in case it's a GraphEdge (for cursor pagination) + $parentGraphEdgeEndpoint = $parentNodeId && $parentKey ? '/' . $parentNodeId . '/' . $parentKey : null; + $className = static::BASE_GRAPH_EDGE_CLASS; + + return new $className($this->response->getRequest(), $dataList, $metaData, $parentGraphEdgeEndpoint, $subclassName); + } + + /** + * Get the meta data from a list in a Graph response. + * + * @param array $data The Graph response. + * + * @return array + */ + public function getMetaData(array $data) + { + unset($data['data']); + + return $data; + } + + /** + * Determines whether or not the data should be cast as a GraphEdge. + * + * @param array $data + * + * @return boolean + */ + public static function isCastableAsGraphEdge(array $data) + { + if ($data === []) { + return true; + } + + // Checks for a sequential numeric array which would be a GraphEdge + return array_keys($data) === range(0, count($data) - 1); + } + + /** + * Ensures that the subclass in question is valid. + * + * @param string $subclassName The GraphNode subclass to validate. + * + * @throws FacebookSDKException + */ + public static function validateSubclass($subclassName) + { + if ($subclassName == static::BASE_GRAPH_NODE_CLASS || is_subclass_of($subclassName, static::BASE_GRAPH_NODE_CLASS)) { + return; + } + + throw new FacebookSDKException('The given subclass "' . $subclassName . '" is not valid. Cannot cast to an object that is not a GraphNode subclass.', 620); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphObject.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphObject.php new file mode 100755 index 00000000..0633c405 --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphObject.php @@ -0,0 +1,36 @@ +makeGraphNode($subclassName); + } + + /** + * Convenience method for creating a GraphEvent collection. + * + * @return GraphEvent + * + * @throws FacebookSDKException + */ + public function makeGraphEvent() + { + return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent'); + } + + /** + * Tries to convert a FacebookResponse entity into a GraphEdge. + * + * @param string|null $subclassName The GraphNode sub class to cast the list items to. + * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. + * + * @return GraphEdge + * + * @deprecated 5.0.0 GraphObjectFactory has been renamed to GraphNodeFactory + */ + public function makeGraphList($subclassName = null, $auto_prefix = true) + { + return $this->makeGraphEdge($subclassName, $auto_prefix); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphPage.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphPage.php new file mode 100755 index 00000000..503b96b5 --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphPage.php @@ -0,0 +1,157 @@ + '\Facebook\GraphNodes\GraphPage', + 'global_brand_parent_page' => '\Facebook\GraphNodes\GraphPage', + 'location' => '\Facebook\GraphNodes\GraphLocation', + 'cover' => '\Facebook\GraphNodes\GraphCoverPhoto', + 'picture' => '\Facebook\GraphNodes\GraphPicture', + ]; + + /** + * Returns the ID for the user's page as a string if present. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the Category for the user's page as a string if present. + * + * @return string|null + */ + public function getCategory() + { + return $this->getField('category'); + } + + /** + * Returns the Name of the user's page as a string if present. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the best available Page on Facebook. + * + * @return GraphPage|null + */ + public function getBestPage() + { + return $this->getField('best_page'); + } + + /** + * Returns the brand's global (parent) Page. + * + * @return GraphPage|null + */ + public function getGlobalBrandParentPage() + { + return $this->getField('global_brand_parent_page'); + } + + /** + * Returns the location of this place. + * + * @return GraphLocation|null + */ + public function getLocation() + { + return $this->getField('location'); + } + + /** + * Returns CoverPhoto of the Page. + * + * @return GraphCoverPhoto|null + */ + public function getCover() + { + return $this->getField('cover'); + } + + /** + * Returns Picture of the Page. + * + * @return GraphPicture|null + */ + public function getPicture() + { + return $this->getField('picture'); + } + + /** + * Returns the page access token for the admin user. + * + * Only available in the `/me/accounts` context. + * + * @return string|null + */ + public function getAccessToken() + { + return $this->getField('access_token'); + } + + /** + * Returns the roles of the page admin user. + * + * Only available in the `/me/accounts` context. + * + * @return array|null + */ + public function getPerms() + { + return $this->getField('perms'); + } + + /** + * Returns the `fan_count` (Number of people who likes to page) as int if present. + * + * @return int|null + */ + public function getFanCount() + { + return $this->getField('fan_count'); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphPicture.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphPicture.php new file mode 100755 index 00000000..10274ec5 --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphPicture.php @@ -0,0 +1,72 @@ +getField('is_silhouette'); + } + + /** + * Returns the url of user picture if it exists + * + * @return string|null + */ + public function getUrl() + { + return $this->getField('url'); + } + + /** + * Returns the width of user picture if it exists + * + * @return int|null + */ + public function getWidth() + { + return $this->getField('width'); + } + + /** + * Returns the height of user picture if it exists + * + * @return int|null + */ + public function getHeight() + { + return $this->getField('height'); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphSessionInfo.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphSessionInfo.php new file mode 100755 index 00000000..df8dd358 --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphSessionInfo.php @@ -0,0 +1,102 @@ +getField('app_id'); + } + + /** + * Returns the application name the token was issued for. + * + * @return string|null + */ + public function getApplication() + { + return $this->getField('application'); + } + + /** + * Returns the date & time that the token expires. + * + * @return \DateTime|null + */ + public function getExpiresAt() + { + return $this->getField('expires_at'); + } + + /** + * Returns whether the token is valid. + * + * @return boolean + */ + public function getIsValid() + { + return $this->getField('is_valid'); + } + + /** + * Returns the date & time the token was issued at. + * + * @return \DateTime|null + */ + public function getIssuedAt() + { + return $this->getField('issued_at'); + } + + /** + * Returns the scope permissions associated with the token. + * + * @return array + */ + public function getScopes() + { + return $this->getField('scopes'); + } + + /** + * Returns the login id of the user associated with the token. + * + * @return string|null + */ + public function getUserId() + { + return $this->getField('user_id'); + } +} diff --git a/inc/vendors/social-login/Facebook/GraphNodes/GraphUser.php b/inc/vendors/social-login/Facebook/GraphNodes/GraphUser.php new file mode 100755 index 00000000..6e1ed8f5 --- /dev/null +++ b/inc/vendors/social-login/Facebook/GraphNodes/GraphUser.php @@ -0,0 +1,172 @@ + '\Facebook\GraphNodes\GraphPage', + 'location' => '\Facebook\GraphNodes\GraphPage', + 'significant_other' => '\Facebook\GraphNodes\GraphUser', + 'picture' => '\Facebook\GraphNodes\GraphPicture', + ]; + + /** + * Returns the ID for the user as a string if present. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the name for the user as a string if present. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the first name for the user as a string if present. + * + * @return string|null + */ + public function getFirstName() + { + return $this->getField('first_name'); + } + + /** + * Returns the middle name for the user as a string if present. + * + * @return string|null + */ + public function getMiddleName() + { + return $this->getField('middle_name'); + } + + /** + * Returns the last name for the user as a string if present. + * + * @return string|null + */ + public function getLastName() + { + return $this->getField('last_name'); + } + + /** + * Returns the email for the user as a string if present. + * + * @return string|null + */ + public function getEmail() + { + return $this->getField('email'); + } + + /** + * Returns the gender for the user as a string if present. + * + * @return string|null + */ + public function getGender() + { + return $this->getField('gender'); + } + + /** + * Returns the Facebook URL for the user as a string if available. + * + * @return string|null + */ + public function getLink() + { + return $this->getField('link'); + } + + /** + * Returns the users birthday, if available. + * + * @return Birthday|null + */ + public function getBirthday() + { + return $this->getField('birthday'); + } + + /** + * Returns the current location of the user as a GraphPage. + * + * @return GraphPage|null + */ + public function getLocation() + { + return $this->getField('location'); + } + + /** + * Returns the current location of the user as a GraphPage. + * + * @return GraphPage|null + */ + public function getHometown() + { + return $this->getField('hometown'); + } + + /** + * Returns the current location of the user as a GraphUser. + * + * @return GraphUser|null + */ + public function getSignificantOther() + { + return $this->getField('significant_other'); + } + + /** + * Returns the picture of the user as a GraphPicture + * + * @return GraphPicture|null + */ + public function getPicture() + { + return $this->getField('picture'); + } +} diff --git a/inc/vendors/social-login/Facebook/Helpers/FacebookCanvasHelper.php b/inc/vendors/social-login/Facebook/Helpers/FacebookCanvasHelper.php new file mode 100755 index 00000000..7f3466ff --- /dev/null +++ b/inc/vendors/social-login/Facebook/Helpers/FacebookCanvasHelper.php @@ -0,0 +1,52 @@ +signedRequest ? $this->signedRequest->get('app_data') : null; + } + + /** + * Get raw signed request from POST. + * + * @return string|null + */ + public function getRawSignedRequest() + { + return $this->getRawSignedRequestFromPost() ?: null; + } +} diff --git a/inc/vendors/social-login/Facebook/Helpers/FacebookJavaScriptHelper.php b/inc/vendors/social-login/Facebook/Helpers/FacebookJavaScriptHelper.php new file mode 100755 index 00000000..01a76b8b --- /dev/null +++ b/inc/vendors/social-login/Facebook/Helpers/FacebookJavaScriptHelper.php @@ -0,0 +1,42 @@ +getRawSignedRequestFromCookie(); + } +} diff --git a/inc/vendors/social-login/Facebook/Helpers/FacebookPageTabHelper.php b/inc/vendors/social-login/Facebook/Helpers/FacebookPageTabHelper.php new file mode 100755 index 00000000..da2c356c --- /dev/null +++ b/inc/vendors/social-login/Facebook/Helpers/FacebookPageTabHelper.php @@ -0,0 +1,95 @@ +signedRequest) { + return; + } + + $this->pageData = $this->signedRequest->get('page'); + } + + /** + * Returns a value from the page data. + * + * @param string $key + * @param mixed|null $default + * + * @return mixed|null + */ + public function getPageData($key, $default = null) + { + if (isset($this->pageData[$key])) { + return $this->pageData[$key]; + } + + return $default; + } + + /** + * Returns true if the user is an admin. + * + * @return boolean + */ + public function isAdmin() + { + return $this->getPageData('admin') === true; + } + + /** + * Returns the page id if available. + * + * @return string|null + */ + public function getPageId() + { + return $this->getPageData('id'); + } +} diff --git a/inc/vendors/social-login/Facebook/Helpers/FacebookRedirectLoginHelper.php b/inc/vendors/social-login/Facebook/Helpers/FacebookRedirectLoginHelper.php new file mode 100755 index 00000000..6003a20f --- /dev/null +++ b/inc/vendors/social-login/Facebook/Helpers/FacebookRedirectLoginHelper.php @@ -0,0 +1,333 @@ +oAuth2Client = $oAuth2Client; + $this->persistentDataHandler = $persistentDataHandler ?: new FacebookSessionPersistentDataHandler(); + $this->urlDetectionHandler = $urlHandler ?: new FacebookUrlDetectionHandler(); + $this->pseudoRandomStringGenerator = PseudoRandomStringGeneratorFactory::createPseudoRandomStringGenerator($prsg); + } + + /** + * Returns the persistent data handler. + * + * @return PersistentDataInterface + */ + public function getPersistentDataHandler() + { + return $this->persistentDataHandler; + } + + /** + * Returns the URL detection handler. + * + * @return UrlDetectionInterface + */ + public function getUrlDetectionHandler() + { + return $this->urlDetectionHandler; + } + + /** + * Returns the cryptographically secure pseudo-random string generator. + * + * @return PseudoRandomStringGeneratorInterface + */ + public function getPseudoRandomStringGenerator() + { + return $this->pseudoRandomStringGenerator; + } + + /** + * Stores CSRF state and returns a URL to which the user should be sent to in order to continue the login process with Facebook. + * + * @param string $redirectUrl The URL Facebook should redirect users to after login. + * @param array $scope List of permissions to request during login. + * @param array $params An array of parameters to generate URL. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + private function makeUrl($redirectUrl, array $scope, array $params = [], $separator = '&') + { + $state = $this->persistentDataHandler->get('state') ?: $this->pseudoRandomStringGenerator->getPseudoRandomString(static::CSRF_LENGTH); + $this->persistentDataHandler->set('state', $state); + + return $this->oAuth2Client->getAuthorizationUrl($redirectUrl, $state, $scope, $params, $separator); + } + + /** + * Returns the URL to send the user in order to login to Facebook. + * + * @param string $redirectUrl The URL Facebook should redirect users to after login. + * @param array $scope List of permissions to request during login. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + public function getLoginUrl($redirectUrl, array $scope = [], $separator = '&') + { + return $this->makeUrl($redirectUrl, $scope, [], $separator); + } + + /** + * Returns the URL to send the user in order to log out of Facebook. + * + * @param AccessToken|string $accessToken The access token that will be logged out. + * @param string $next The url Facebook should redirect the user to after a successful logout. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + * + * @throws FacebookSDKException + */ + public function getLogoutUrl($accessToken, $next, $separator = '&') + { + if (!$accessToken instanceof AccessToken) { + $accessToken = new AccessToken($accessToken); + } + + if ($accessToken->isAppAccessToken()) { + throw new FacebookSDKException('Cannot generate a logout URL with an app access token.', 722); + } + + $params = [ + 'next' => $next, + 'access_token' => $accessToken->getValue(), + ]; + + return 'https://www.facebook.com/logout.php?' . http_build_query($params, null, $separator); + } + + /** + * Returns the URL to send the user in order to login to Facebook with permission(s) to be re-asked. + * + * @param string $redirectUrl The URL Facebook should redirect users to after login. + * @param array $scope List of permissions to request during login. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + public function getReRequestUrl($redirectUrl, array $scope = [], $separator = '&') + { + $params = ['auth_type' => 'rerequest']; + + return $this->makeUrl($redirectUrl, $scope, $params, $separator); + } + + /** + * Returns the URL to send the user in order to login to Facebook with user to be re-authenticated. + * + * @param string $redirectUrl The URL Facebook should redirect users to after login. + * @param array $scope List of permissions to request during login. + * @param string $separator The separator to use in http_build_query(). + * + * @return string + */ + public function getReAuthenticationUrl($redirectUrl, array $scope = [], $separator = '&') + { + $params = ['auth_type' => 'reauthenticate']; + + return $this->makeUrl($redirectUrl, $scope, $params, $separator); + } + + /** + * Takes a valid code from a login redirect, and returns an AccessToken entity. + * + * @param string|null $redirectUrl The redirect URL. + * + * @return AccessToken|null + * + * @throws FacebookSDKException + */ + public function getAccessToken($redirectUrl = null) + { + if (!$code = $this->getCode()) { + return null; + } + + $this->validateCsrf(); + $this->resetCsrf(); + + $redirectUrl = $redirectUrl ?: $this->urlDetectionHandler->getCurrentUrl(); + // At minimum we need to remove the 'code', 'enforce_https' and 'state' params + $redirectUrl = FacebookUrlManipulator::removeParamsFromUrl($redirectUrl, ['code', 'enforce_https', 'state']); + + return $this->oAuth2Client->getAccessTokenFromCode($code, $redirectUrl); + } + + /** + * Validate the request against a cross-site request forgery. + * + * @throws FacebookSDKException + */ + protected function validateCsrf() + { + $state = $this->getState(); + if (!$state) { + throw new FacebookSDKException('Cross-site request forgery validation failed. Required GET param "state" missing.'); + } + $savedState = $this->persistentDataHandler->get('state'); + if (!$savedState) { + throw new FacebookSDKException('Cross-site request forgery validation failed. Required param "state" missing from persistent data.'); + } + + if (\hash_equals($savedState, $state)) { + return; + } + + throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.'); + } + + /** + * Resets the CSRF so that it doesn't get reused. + */ + private function resetCsrf() + { + $this->persistentDataHandler->set('state', null); + } + + /** + * Return the code. + * + * @return string|null + */ + protected function getCode() + { + return $this->getInput('code'); + } + + /** + * Return the state. + * + * @return string|null + */ + protected function getState() + { + return $this->getInput('state'); + } + + /** + * Return the error code. + * + * @return string|null + */ + public function getErrorCode() + { + return $this->getInput('error_code'); + } + + /** + * Returns the error. + * + * @return string|null + */ + public function getError() + { + return $this->getInput('error'); + } + + /** + * Returns the error reason. + * + * @return string|null + */ + public function getErrorReason() + { + return $this->getInput('error_reason'); + } + + /** + * Returns the error description. + * + * @return string|null + */ + public function getErrorDescription() + { + return $this->getInput('error_description'); + } + + /** + * Returns a value from a GET param. + * + * @param string $key + * + * @return string|null + */ + private function getInput($key) + { + return isset($_GET[$key]) ? $_GET[$key] : null; + } +} diff --git a/inc/vendors/social-login/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php b/inc/vendors/social-login/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php new file mode 100755 index 00000000..4044da10 --- /dev/null +++ b/inc/vendors/social-login/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php @@ -0,0 +1,166 @@ +app = $app; + $graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; + $this->oAuth2Client = new OAuth2Client($this->app, $client, $graphVersion); + + $this->instantiateSignedRequest(); + } + + /** + * Instantiates a new SignedRequest entity. + * + * @param string|null + */ + public function instantiateSignedRequest($rawSignedRequest = null) + { + $rawSignedRequest = $rawSignedRequest ?: $this->getRawSignedRequest(); + + if (!$rawSignedRequest) { + return; + } + + $this->signedRequest = new SignedRequest($this->app, $rawSignedRequest); + } + + /** + * Returns an AccessToken entity from the signed request. + * + * @return AccessToken|null + * + * @throws \Facebook\Exceptions\FacebookSDKException + */ + public function getAccessToken() + { + if ($this->signedRequest && $this->signedRequest->hasOAuthData()) { + $code = $this->signedRequest->get('code'); + $accessToken = $this->signedRequest->get('oauth_token'); + + if ($code && !$accessToken) { + return $this->oAuth2Client->getAccessTokenFromCode($code); + } + + $expiresAt = $this->signedRequest->get('expires', 0); + + return new AccessToken($accessToken, $expiresAt); + } + + return null; + } + + /** + * Returns the SignedRequest entity. + * + * @return SignedRequest|null + */ + public function getSignedRequest() + { + return $this->signedRequest; + } + + /** + * Returns the user_id if available. + * + * @return string|null + */ + public function getUserId() + { + return $this->signedRequest ? $this->signedRequest->getUserId() : null; + } + + /** + * Get raw signed request from input. + * + * @return string|null + */ + abstract public function getRawSignedRequest(); + + /** + * Get raw signed request from POST input. + * + * @return string|null + */ + public function getRawSignedRequestFromPost() + { + if (isset($_POST['signed_request'])) { + return $_POST['signed_request']; + } + + return null; + } + + /** + * Get raw signed request from cookie set from the Javascript SDK. + * + * @return string|null + */ + public function getRawSignedRequestFromCookie() + { + if (isset($_COOKIE['fbsr_' . $this->app->getId()])) { + return $_COOKIE['fbsr_' . $this->app->getId()]; + } + + return null; + } +} diff --git a/inc/vendors/social-login/Facebook/Http/GraphRawResponse.php b/inc/vendors/social-login/Facebook/Http/GraphRawResponse.php new file mode 100755 index 00000000..44105c49 --- /dev/null +++ b/inc/vendors/social-login/Facebook/Http/GraphRawResponse.php @@ -0,0 +1,138 @@ +httpResponseCode = (int)$httpStatusCode; + } + + if (is_array($headers)) { + $this->headers = $headers; + } else { + $this->setHeadersFromString($headers); + } + + $this->body = $body; + } + + /** + * Return the response headers. + * + * @return array + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Return the body of the response. + * + * @return string + */ + public function getBody() + { + return $this->body; + } + + /** + * Return the HTTP response code. + * + * @return int + */ + public function getHttpResponseCode() + { + return $this->httpResponseCode; + } + + /** + * Sets the HTTP response code from a raw header. + * + * @param string $rawResponseHeader + */ + public function setHttpResponseCodeFromHeader($rawResponseHeader) + { + // https://tools.ietf.org/html/rfc7230#section-3.1.2 + list($version, $status, $reason) = array_pad(explode(' ', $rawResponseHeader, 3), 3, null); + $this->httpResponseCode = (int) $status; + } + + /** + * Parse the raw headers and set as an array. + * + * @param string $rawHeaders The raw headers from the response. + */ + protected function setHeadersFromString($rawHeaders) + { + // Normalize line breaks + $rawHeaders = str_replace("\r\n", "\n", $rawHeaders); + + // There will be multiple headers if a 301 was followed + // or a proxy was followed, etc + $headerCollection = explode("\n\n", trim($rawHeaders)); + // We just want the last response (at the end) + $rawHeader = array_pop($headerCollection); + + $headerComponents = explode("\n", $rawHeader); + foreach ($headerComponents as $line) { + if (strpos($line, ': ') === false) { + $this->setHttpResponseCodeFromHeader($line); + } else { + list($key, $value) = explode(': ', $line, 2); + $this->headers[$key] = $value; + } + } + } +} diff --git a/inc/vendors/social-login/Facebook/Http/RequestBodyInterface.php b/inc/vendors/social-login/Facebook/Http/RequestBodyInterface.php new file mode 100755 index 00000000..1c03f4fd --- /dev/null +++ b/inc/vendors/social-login/Facebook/Http/RequestBodyInterface.php @@ -0,0 +1,39 @@ +params = $params; + $this->files = $files; + $this->boundary = $boundary ?: uniqid(); + } + + /** + * @inheritdoc + */ + public function getBody() + { + $body = ''; + + // Compile normal params + $params = $this->getNestedParams($this->params); + foreach ($params as $k => $v) { + $body .= $this->getParamString($k, $v); + } + + // Compile files + foreach ($this->files as $k => $v) { + $body .= $this->getFileString($k, $v); + } + + // Peace out + $body .= "--{$this->boundary}--\r\n"; + + return $body; + } + + /** + * Get the boundary + * + * @return string + */ + public function getBoundary() + { + return $this->boundary; + } + + /** + * Get the string needed to transfer a file. + * + * @param string $name + * @param FacebookFile $file + * + * @return string + */ + private function getFileString($name, FacebookFile $file) + { + return sprintf( + "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"%s\r\n\r\n%s\r\n", + $this->boundary, + $name, + $file->getFileName(), + $this->getFileHeaders($file), + $file->getContents() + ); + } + + /** + * Get the string needed to transfer a POST field. + * + * @param string $name + * @param string $value + * + * @return string + */ + private function getParamString($name, $value) + { + return sprintf( + "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", + $this->boundary, + $name, + $value + ); + } + + /** + * Returns the params as an array of nested params. + * + * @param array $params + * + * @return array + */ + private function getNestedParams(array $params) + { + $query = http_build_query($params, null, '&'); + $params = explode('&', $query); + $result = []; + + foreach ($params as $param) { + list($key, $value) = explode('=', $param, 2); + $result[urldecode($key)] = urldecode($value); + } + + return $result; + } + + /** + * Get the headers needed before transferring the content of a POST file. + * + * @param FacebookFile $file + * + * @return string + */ + protected function getFileHeaders(FacebookFile $file) + { + return "\r\nContent-Type: {$file->getMimetype()}"; + } +} diff --git a/inc/vendors/social-login/Facebook/Http/RequestBodyUrlEncoded.php b/inc/vendors/social-login/Facebook/Http/RequestBodyUrlEncoded.php new file mode 100755 index 00000000..c1e35f43 --- /dev/null +++ b/inc/vendors/social-login/Facebook/Http/RequestBodyUrlEncoded.php @@ -0,0 +1,55 @@ +params = $params; + } + + /** + * @inheritdoc + */ + public function getBody() + { + return http_build_query($this->params, null, '&'); + } +} diff --git a/inc/vendors/social-login/Facebook/HttpClients/FacebookCurl.php b/inc/vendors/social-login/Facebook/HttpClients/FacebookCurl.php new file mode 100755 index 00000000..28e4ba59 --- /dev/null +++ b/inc/vendors/social-login/Facebook/HttpClients/FacebookCurl.php @@ -0,0 +1,129 @@ +curl = curl_init(); + } + + /** + * Set a curl option + * + * @param $key + * @param $value + */ + public function setopt($key, $value) + { + curl_setopt($this->curl, $key, $value); + } + + /** + * Set an array of options to a curl resource + * + * @param array $options + */ + public function setoptArray(array $options) + { + curl_setopt_array($this->curl, $options); + } + + /** + * Send a curl request + * + * @return mixed + */ + public function exec() + { + return curl_exec($this->curl); + } + + /** + * Return the curl error number + * + * @return int + */ + public function errno() + { + return curl_errno($this->curl); + } + + /** + * Return the curl error message + * + * @return string + */ + public function error() + { + return curl_error($this->curl); + } + + /** + * Get info from a curl reference + * + * @param $type + * + * @return mixed + */ + public function getinfo($type) + { + return curl_getinfo($this->curl, $type); + } + + /** + * Get the currently installed curl version + * + * @return array + */ + public function version() + { + return curl_version(); + } + + /** + * Close the resource connection to curl + */ + public function close() + { + curl_close($this->curl); + } +} diff --git a/inc/vendors/social-login/Facebook/HttpClients/FacebookCurlHttpClient.php b/inc/vendors/social-login/Facebook/HttpClients/FacebookCurlHttpClient.php new file mode 100755 index 00000000..9516cc83 --- /dev/null +++ b/inc/vendors/social-login/Facebook/HttpClients/FacebookCurlHttpClient.php @@ -0,0 +1,163 @@ +facebookCurl = $facebookCurl ?: new FacebookCurl(); + } + + /** + * @inheritdoc + */ + public function send($url, $method, $body, array $headers, $timeOut) + { + $this->openConnection($url, $method, $body, $headers, $timeOut); + $this->sendRequest(); + + if ($curlErrorCode = $this->facebookCurl->errno()) { + throw new FacebookSDKException($this->facebookCurl->error(), $curlErrorCode); + } + + // Separate the raw headers from the raw body + list($rawHeaders, $rawBody) = $this->extractResponseHeadersAndBody(); + + $this->closeConnection(); + + return new GraphRawResponse($rawHeaders, $rawBody); + } + + /** + * Opens a new curl connection. + * + * @param string $url The endpoint to send the request to. + * @param string $method The request method. + * @param string $body The body of the request. + * @param array $headers The request headers. + * @param int $timeOut The timeout in seconds for the request. + */ + public function openConnection($url, $method, $body, array $headers, $timeOut) + { + $options = [ + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_HTTPHEADER => $this->compileRequestHeaders($headers), + CURLOPT_URL => $url, + CURLOPT_CONNECTTIMEOUT => 10, + CURLOPT_TIMEOUT => $timeOut, + CURLOPT_RETURNTRANSFER => true, // Return response as string + CURLOPT_HEADER => true, // Enable header processing + CURLOPT_SSL_VERIFYHOST => 2, + CURLOPT_SSL_VERIFYPEER => true, + CURLOPT_CAINFO => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', + ]; + + if ($method !== "GET") { + $options[CURLOPT_POSTFIELDS] = $body; + } + + $this->facebookCurl->init(); + $this->facebookCurl->setoptArray($options); + } + + /** + * Closes an existing curl connection + */ + public function closeConnection() + { + $this->facebookCurl->close(); + } + + /** + * Send the request and get the raw response from curl + */ + public function sendRequest() + { + $this->rawResponse = $this->facebookCurl->exec(); + } + + /** + * Compiles the request headers into a curl-friendly format. + * + * @param array $headers The request headers. + * + * @return array + */ + public function compileRequestHeaders(array $headers) + { + $return = []; + + foreach ($headers as $key => $value) { + $return[] = $key . ': ' . $value; + } + + return $return; + } + + /** + * Extracts the headers and the body into a two-part array + * + * @return array + */ + public function extractResponseHeadersAndBody() + { + $parts = explode("\r\n\r\n", $this->rawResponse); + $rawBody = array_pop($parts); + $rawHeaders = implode("\r\n\r\n", $parts); + + return [trim($rawHeaders), trim($rawBody)]; + } +} diff --git a/inc/vendors/social-login/Facebook/HttpClients/FacebookGuzzleHttpClient.php b/inc/vendors/social-login/Facebook/HttpClients/FacebookGuzzleHttpClient.php new file mode 100755 index 00000000..8feb7cb6 --- /dev/null +++ b/inc/vendors/social-login/Facebook/HttpClients/FacebookGuzzleHttpClient.php @@ -0,0 +1,97 @@ +guzzleClient = $guzzleClient ?: new Client(); + } + + /** + * @inheritdoc + */ + public function send($url, $method, $body, array $headers, $timeOut) + { + $options = [ + 'headers' => $headers, + 'body' => $body, + 'timeout' => $timeOut, + 'connect_timeout' => 10, + 'verify' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', + ]; + $request = $this->guzzleClient->createRequest($method, $url, $options); + + try { + $rawResponse = $this->guzzleClient->send($request); + } catch (RequestException $e) { + $rawResponse = $e->getResponse(); + + if ($e->getPrevious() instanceof RingException || !$rawResponse instanceof ResponseInterface) { + throw new FacebookSDKException($e->getMessage(), $e->getCode()); + } + } + + $rawHeaders = $this->getHeadersAsString($rawResponse); + $rawBody = $rawResponse->getBody(); + $httpStatusCode = $rawResponse->getStatusCode(); + + return new GraphRawResponse($rawHeaders, $rawBody, $httpStatusCode); + } + + /** + * Returns the Guzzle array of headers as a string. + * + * @param ResponseInterface $response The Guzzle response. + * + * @return string + */ + public function getHeadersAsString(ResponseInterface $response) + { + $headers = $response->getHeaders(); + $rawHeaders = []; + foreach ($headers as $name => $values) { + $rawHeaders[] = $name . ": " . implode(", ", $values); + } + + return implode("\r\n", $rawHeaders); + } +} diff --git a/inc/vendors/social-login/Facebook/HttpClients/FacebookHttpClientInterface.php b/inc/vendors/social-login/Facebook/HttpClients/FacebookHttpClientInterface.php new file mode 100755 index 00000000..1fbf953d --- /dev/null +++ b/inc/vendors/social-login/Facebook/HttpClients/FacebookHttpClientInterface.php @@ -0,0 +1,47 @@ +stream = stream_context_create($options); + } + + /** + * The response headers from the stream wrapper + * + * @return array + */ + public function getResponseHeaders() + { + return $this->responseHeaders; + } + + /** + * Send a stream wrapped request + * + * @param string $url + * + * @return mixed + */ + public function fileGetContents($url) + { + // $rawResponse = file get contents($url, false, $this->stream); + $rawResponse = wp_remote_get($url, ['stream' => $this->stream]); + $this->responseHeaders = $http_response_header ?: []; + + return $rawResponse; + } +} diff --git a/inc/vendors/social-login/Facebook/HttpClients/FacebookStreamHttpClient.php b/inc/vendors/social-login/Facebook/HttpClients/FacebookStreamHttpClient.php new file mode 100755 index 00000000..1cdfd539 --- /dev/null +++ b/inc/vendors/social-login/Facebook/HttpClients/FacebookStreamHttpClient.php @@ -0,0 +1,94 @@ +facebookStream = $facebookStream ?: new FacebookStream(); + } + + /** + * @inheritdoc + */ + public function send($url, $method, $body, array $headers, $timeOut) + { + $options = [ + 'http' => [ + 'method' => $method, + 'header' => $this->compileHeader($headers), + 'content' => $body, + 'timeout' => $timeOut, + 'ignore_errors' => true + ], + 'ssl' => [ + 'verify_peer' => true, + 'verify_peer_name' => true, + 'allow_self_signed' => true, // All root certificates are self-signed + 'cafile' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', + ], + ]; + + $this->facebookStream->streamContextCreate($options); + $rawBody = $this->facebookStream->fileGetContents($url); + $rawHeaders = $this->facebookStream->getResponseHeaders(); + + if ($rawBody === false || empty($rawHeaders)) { + throw new FacebookSDKException('Stream returned an empty response', 660); + } + + $rawHeaders = implode("\r\n", $rawHeaders); + + return new GraphRawResponse($rawHeaders, $rawBody); + } + + /** + * Formats the headers for use in the stream wrapper. + * + * @param array $headers The request headers. + * + * @return string + */ + public function compileHeader(array $headers) + { + $header = []; + foreach ($headers as $k => $v) { + $header[] = $k . ': ' . $v; + } + + return implode("\r\n", $header); + } +} diff --git a/inc/vendors/social-login/Facebook/HttpClients/HttpClientsFactory.php b/inc/vendors/social-login/Facebook/HttpClients/HttpClientsFactory.php new file mode 100755 index 00000000..d9f2a8d3 --- /dev/null +++ b/inc/vendors/social-login/Facebook/HttpClients/HttpClientsFactory.php @@ -0,0 +1,99 @@ +sessionData[$key]) ? $this->sessionData[$key] : null; + } + + /** + * @inheritdoc + */ + public function set($key, $value) + { + $this->sessionData[$key] = $value; + } +} diff --git a/inc/vendors/social-login/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php b/inc/vendors/social-login/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php new file mode 100755 index 00000000..9123e3dc --- /dev/null +++ b/inc/vendors/social-login/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php @@ -0,0 +1,76 @@ +sessionPrefix . $key])) { + return $_SESSION[$this->sessionPrefix . $key]; + } + + return null; + } + + /** + * @inheritdoc + */ + public function set($key, $value) + { + $_SESSION[$this->sessionPrefix . $key] = $value; + } +} diff --git a/inc/vendors/social-login/Facebook/PersistentData/PersistentDataFactory.php b/inc/vendors/social-login/Facebook/PersistentData/PersistentDataFactory.php new file mode 100755 index 00000000..18fb8fd5 --- /dev/null +++ b/inc/vendors/social-login/Facebook/PersistentData/PersistentDataFactory.php @@ -0,0 +1,65 @@ +validateLength($length); + + $binaryString = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); + + if ($binaryString === false) { + throw new FacebookSDKException( + static::ERROR_MESSAGE . + 'mcrypt_create_iv() returned an error.' + ); + } + + return $this->binToHex($binaryString, $length); + } +} diff --git a/inc/vendors/social-login/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php b/inc/vendors/social-login/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php new file mode 100755 index 00000000..4b4276dc --- /dev/null +++ b/inc/vendors/social-login/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php @@ -0,0 +1,67 @@ +validateLength($length); + + $wasCryptographicallyStrong = false; + $binaryString = openssl_random_pseudo_bytes($length, $wasCryptographicallyStrong); + + if ($binaryString === false) { + throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned an unknown error.'); + } + + if ($wasCryptographicallyStrong !== true) { + throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned a pseudo-random string but it was not cryptographically secure and cannot be used.'); + } + + return $this->binToHex($binaryString, $length); + } +} diff --git a/inc/vendors/social-login/Facebook/PseudoRandomString/PseudoRandomStringGeneratorFactory.php b/inc/vendors/social-login/Facebook/PseudoRandomString/PseudoRandomStringGeneratorFactory.php new file mode 100755 index 00000000..412f4813 --- /dev/null +++ b/inc/vendors/social-login/Facebook/PseudoRandomString/PseudoRandomStringGeneratorFactory.php @@ -0,0 +1,101 @@ +validateLength($length); + + return $this->binToHex(random_bytes($length), $length); + } +} diff --git a/inc/vendors/social-login/Facebook/PseudoRandomString/UrandomPseudoRandomStringGenerator.php b/inc/vendors/social-login/Facebook/PseudoRandomString/UrandomPseudoRandomStringGenerator.php new file mode 100755 index 00000000..5ab434e6 --- /dev/null +++ b/inc/vendors/social-login/Facebook/PseudoRandomString/UrandomPseudoRandomStringGenerator.php @@ -0,0 +1,89 @@ +validateLength($length); + + $stream = fopen('/dev/urandom', 'rb'); + if (!is_resource($stream)) { + throw new FacebookSDKException( + static::ERROR_MESSAGE . + 'Unable to open stream to /dev/urandom.' + ); + } + + if (!defined('HHVM_VERSION')) { + stream_set_read_buffer($stream, 0); + } + + $binaryString = fread($stream, $length); + fclose($stream); + + if (!$binaryString) { + throw new FacebookSDKException( + static::ERROR_MESSAGE . + 'Stream to /dev/urandom returned no data.' + ); + } + + return $this->binToHex($binaryString, $length); + } +} diff --git a/inc/vendors/social-login/Facebook/SignedRequest.php b/inc/vendors/social-login/Facebook/SignedRequest.php new file mode 100755 index 00000000..6a175a0a --- /dev/null +++ b/inc/vendors/social-login/Facebook/SignedRequest.php @@ -0,0 +1,326 @@ +app = $facebookApp; + + if (!$rawSignedRequest) { + return; + } + + $this->rawSignedRequest = $rawSignedRequest; + + $this->parse(); + } + + /** + * Returns the raw signed request data. + * + * @return string|null + */ + public function getRawSignedRequest() + { + return $this->rawSignedRequest; + } + + /** + * Returns the parsed signed request data. + * + * @return array|null + */ + public function getPayload() + { + return $this->payload; + } + + /** + * Returns a property from the signed request data if available. + * + * @param string $key + * @param mixed|null $default + * + * @return mixed|null + */ + public function get($key, $default = null) + { + if (isset($this->payload[$key])) { + return $this->payload[$key]; + } + + return $default; + } + + /** + * Returns user_id from signed request data if available. + * + * @return string|null + */ + public function getUserId() + { + return $this->get('user_id'); + } + + /** + * Checks for OAuth data in the payload. + * + * @return boolean + */ + public function hasOAuthData() + { + return $this->get('oauth_token') || $this->get('code'); + } + + /** + * Creates a signed request from an array of data. + * + * @param array $payload + * + * @return string + */ + public function make(array $payload) + { + $payload['algorithm'] = isset($payload['algorithm']) ? $payload['algorithm'] : 'HMAC-SHA256'; + $payload['issued_at'] = isset($payload['issued_at']) ? $payload['issued_at'] : time(); + $encodedPayload = $this->base64UrlEncode(json_encode($payload)); + + $hashedSig = $this->hashSignature($encodedPayload); + $encodedSig = $this->base64UrlEncode($hashedSig); + + return $encodedSig . '.' . $encodedPayload; + } + + /** + * Validates and decodes a signed request and saves + * the payload to an array. + */ + protected function parse() + { + list($encodedSig, $encodedPayload) = $this->split(); + + // Signature validation + $sig = $this->decodeSignature($encodedSig); + $hashedSig = $this->hashSignature($encodedPayload); + $this->validateSignature($hashedSig, $sig); + + $this->payload = $this->decodePayload($encodedPayload); + + // Payload validation + $this->validateAlgorithm(); + } + + /** + * Splits a raw signed request into signature and payload. + * + * @return array + * + * @throws FacebookSDKException + */ + protected function split() + { + if (strpos($this->rawSignedRequest, '.') === false) { + throw new FacebookSDKException('Malformed signed request.', 606); + } + + return explode('.', $this->rawSignedRequest, 2); + } + + /** + * Decodes the raw signature from a signed request. + * + * @param string $encodedSig + * + * @return string + * + * @throws FacebookSDKException + */ + protected function decodeSignature($encodedSig) + { + $sig = $this->base64UrlDecode($encodedSig); + + if (!$sig) { + throw new FacebookSDKException('Signed request has malformed encoded signature data.', 607); + } + + return $sig; + } + + /** + * Decodes the raw payload from a signed request. + * + * @param string $encodedPayload + * + * @return array + * + * @throws FacebookSDKException + */ + protected function decodePayload($encodedPayload) + { + $payload = $this->base64UrlDecode($encodedPayload); + + if ($payload) { + $payload = json_decode($payload, true); + } + + if (!is_array($payload)) { + throw new FacebookSDKException('Signed request has malformed encoded payload data.', 607); + } + + return $payload; + } + + /** + * Validates the algorithm used in a signed request. + * + * @throws FacebookSDKException + */ + protected function validateAlgorithm() + { + if ($this->get('algorithm') !== 'HMAC-SHA256') { + throw new FacebookSDKException('Signed request is using the wrong algorithm.', 605); + } + } + + /** + * Hashes the signature used in a signed request. + * + * @param string $encodedData + * + * @return string + * + * @throws FacebookSDKException + */ + protected function hashSignature($encodedData) + { + $hashedSig = hash_hmac( + 'sha256', + $encodedData, + $this->app->getSecret(), + $raw_output = true + ); + + if (!$hashedSig) { + throw new FacebookSDKException('Unable to hash signature from encoded payload data.', 602); + } + + return $hashedSig; + } + + /** + * Validates the signature used in a signed request. + * + * @param string $hashedSig + * @param string $sig + * + * @throws FacebookSDKException + */ + protected function validateSignature($hashedSig, $sig) + { + if (\hash_equals($hashedSig, $sig)) { + return; + } + + throw new FacebookSDKException('Signed request has an invalid signature.', 602); + } + + /** + * Base64 decoding which replaces characters: + * + instead of - + * / instead of _ + * + * @link http://en.wikipedia.org/wiki/Base64#URL_applications + * + * @param string $input base64 url encoded input + * + * @return string decoded string + */ + public function base64UrlDecode($input) + { + $urlDecodedBase64 = strtr($input, '-_', '+/'); + $this->validateBase64($urlDecodedBase64); + + return base64_decode($urlDecodedBase64); + } + + /** + * Base64 encoding which replaces characters: + * + instead of - + * / instead of _ + * + * @link http://en.wikipedia.org/wiki/Base64#URL_applications + * + * @param string $input string to encode + * + * @return string base64 url encoded input + */ + public function base64UrlEncode($input) + { + return strtr(base64_encode($input), '+/', '-_'); + } + + /** + * Validates a base64 string. + * + * @param string $input base64 value to validate + * + * @throws FacebookSDKException + */ + protected function validateBase64($input) + { + if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $input)) { + throw new FacebookSDKException('Signed request contains malformed base64 encoding.', 608); + } + } +} diff --git a/inc/vendors/social-login/Facebook/Url/FacebookUrlDetectionHandler.php b/inc/vendors/social-login/Facebook/Url/FacebookUrlDetectionHandler.php new file mode 100755 index 00000000..1d134ddc --- /dev/null +++ b/inc/vendors/social-login/Facebook/Url/FacebookUrlDetectionHandler.php @@ -0,0 +1,182 @@ +getHttpScheme() . '://' . $this->getHostName() . $this->getServerVar('REQUEST_URI'); + } + + /** + * Get the currently active URL scheme. + * + * @return string + */ + protected function getHttpScheme() + { + return $this->isBehindSsl() ? 'https' : 'http'; + } + + /** + * Tries to detect if the server is running behind an SSL. + * + * @return boolean + */ + protected function isBehindSsl() + { + // Check for proxy first + $protocol = $this->getHeader('X_FORWARDED_PROTO'); + if ($protocol) { + return $this->protocolWithActiveSsl($protocol); + } + + $protocol = $this->getServerVar('HTTPS'); + if ($protocol) { + return $this->protocolWithActiveSsl($protocol); + } + + return (string)$this->getServerVar('SERVER_PORT') === '443'; + } + + /** + * Detects an active SSL protocol value. + * + * @param string $protocol + * + * @return boolean + */ + protected function protocolWithActiveSsl($protocol) + { + $protocol = strtolower((string)$protocol); + + return in_array($protocol, ['on', '1', 'https', 'ssl'], true); + } + + /** + * Tries to detect the host name of the server. + * + * Some elements adapted from + * + * @see https://github.com/symfony/HttpFoundation/blob/master/Request.php + * + * @return string + */ + protected function getHostName() + { + // Check for proxy first + $header = $this->getHeader('X_FORWARDED_HOST'); + if ($header && $this->isValidForwardedHost($header)) { + $elements = explode(',', $header); + $host = $elements[count($elements) - 1]; + } elseif (!$host = $this->getHeader('HOST')) { + if (!$host = $this->getServerVar('SERVER_NAME')) { + $host = $this->getServerVar('SERVER_ADDR'); + } + } + + // trim and remove port number from host + // host is lowercase as per RFC 952/2181 + $host = strtolower(preg_replace('/:\d+$/', '', trim($host))); + + // Port number + $scheme = $this->getHttpScheme(); + $port = $this->getCurrentPort(); + $appendPort = ':' . $port; + + // Don't append port number if a normal port. + if (($scheme == 'http' && $port == '80') || ($scheme == 'https' && $port == '443')) { + $appendPort = ''; + } + + return $host . $appendPort; + } + + protected function getCurrentPort() + { + // Check for proxy first + $port = $this->getHeader('X_FORWARDED_PORT'); + if ($port) { + return (string)$port; + } + + $protocol = (string)$this->getHeader('X_FORWARDED_PROTO'); + if ($protocol === 'https') { + return '443'; + } + + return (string)$this->getServerVar('SERVER_PORT'); + } + + /** + * Returns the a value from the $_SERVER super global. + * + * @param string $key + * + * @return string + */ + protected function getServerVar($key) + { + return isset($_SERVER[$key]) ? $_SERVER[$key] : ''; + } + + /** + * Gets a value from the HTTP request headers. + * + * @param string $key + * + * @return string + */ + protected function getHeader($key) + { + return $this->getServerVar('HTTP_' . $key); + } + + /** + * Checks if the value in X_FORWARDED_HOST is a valid hostname + * Could prevent unintended redirections + * + * @param string $header + * + * @return boolean + */ + protected function isValidForwardedHost($header) + { + $elements = explode(',', $header); + $host = $elements[count($elements) - 1]; + + return preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $host) //valid chars check + && 0 < strlen($host) && strlen($host) < 254 //overall length check + && preg_match("/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $host); //length of each label + } +} diff --git a/inc/vendors/social-login/Facebook/Url/FacebookUrlManipulator.php b/inc/vendors/social-login/Facebook/Url/FacebookUrlManipulator.php new file mode 100755 index 00000000..daeab9c5 --- /dev/null +++ b/inc/vendors/social-login/Facebook/Url/FacebookUrlManipulator.php @@ -0,0 +1,167 @@ + 0) { + $query = '?' . http_build_query($params, null, '&'); + } + } + + $scheme = isset($parts['scheme']) ? $parts['scheme'] . '://' : ''; + $host = isset($parts['host']) ? $parts['host'] : ''; + $port = isset($parts['port']) ? ':' . $parts['port'] : ''; + $path = isset($parts['path']) ? $parts['path'] : ''; + $fragment = isset($parts['fragment']) ? '#' . $parts['fragment'] : ''; + + return $scheme . $host . $port . $path . $query . $fragment; + } + + /** + * Gracefully appends params to the URL. + * + * @param string $url The URL that will receive the params. + * @param array $newParams The params to append to the URL. + * + * @return string + */ + public static function appendParamsToUrl($url, array $newParams = []) + { + if (empty($newParams)) { + return $url; + } + + if (strpos($url, '?') === false) { + return $url . '?' . http_build_query($newParams, null, '&'); + } + + list($path, $query) = explode('?', $url, 2); + $existingParams = []; + parse_str($query, $existingParams); + + // Favor params from the original URL over $newParams + $newParams = array_merge($newParams, $existingParams); + + // Sort for a predicable order + ksort($newParams); + + return $path . '?' . http_build_query($newParams, null, '&'); + } + + /** + * Returns the params from a URL in the form of an array. + * + * @param string $url The URL to parse the params from. + * + * @return array + */ + public static function getParamsAsArray($url) + { + $query = parse_url($url, PHP_URL_QUERY); + if (!$query) { + return []; + } + $params = []; + parse_str($query, $params); + + return $params; + } + + /** + * Adds the params of the first URL to the second URL. + * + * Any params that already exist in the second URL will go untouched. + * + * @param string $urlToStealFrom The URL harvest the params from. + * @param string $urlToAddTo The URL that will receive the new params. + * + * @return string The $urlToAddTo with any new params from $urlToStealFrom. + */ + public static function mergeUrlParams($urlToStealFrom, $urlToAddTo) + { + $newParams = static::getParamsAsArray($urlToStealFrom); + // Nothing new to add, return as-is + if (!$newParams) { + return $urlToAddTo; + } + + return static::appendParamsToUrl($urlToAddTo, $newParams); + } + + /** + * Check for a "/" prefix and prepend it if not exists. + * + * @param string|null $string + * + * @return string|null + */ + public static function forceSlashPrefix($string) + { + if (!$string) { + return $string; + } + + return strpos($string, '/') === 0 ? $string : '/' . $string; + } + + /** + * Trims off the hostname and Graph version from a URL. + * + * @param string $urlToTrim The URL the needs the surgery. + * + * @return string The $urlToTrim with the hostname and Graph version removed. + */ + public static function baseGraphUrlEndpoint($urlToTrim) + { + return '/' . preg_replace('/^https:\/\/.+\.facebook\.com(\/v.+?)?\//', '', $urlToTrim); + } +} diff --git a/inc/vendors/social-login/Facebook/Url/UrlDetectionInterface.php b/inc/vendors/social-login/Facebook/Url/UrlDetectionInterface.php new file mode 100755 index 00000000..dca38a0c --- /dev/null +++ b/inc/vendors/social-login/Facebook/Url/UrlDetectionInterface.php @@ -0,0 +1,39 @@ + + * @author Chirag Shah + */ +class apiClient { + // the version of the discovery mechanism this class is meant to work with + const discoveryVersion = 'v0.3'; + + /** + * @static + * @var apiAuth $auth + */ + static $auth; + + /** @var apiIo $io */ + static $io; + + /** @var apiCache $cache */ + static $cache; + + /** @var array $scopes */ + protected $scopes = array(); + + /** @var bool $useObjects */ + protected $useObjects = false; + + // definitions of services that are discovered. + protected $services = array(); + + // Used to track authenticated state, can't discover services after doing authenticate() + private $authenticated = false; + + private $defaultService = array( + 'authorization_token_url' => 'https://www.google.com/accounts/OAuthAuthorizeToken', + 'request_token_url' => 'https://www.google.com/accounts/OAuthGetRequestToken', + 'access_token_url' => 'https://www.google.com/accounts/OAuthGetAccessToken'); + + public function __construct($config = array()) { + global $apiConfig; + $apiConfig = array_merge($apiConfig, $config); + self::$cache = new $apiConfig['cacheClass'](); + self::$auth = new $apiConfig['authClass'](); + self::$io = new $apiConfig['ioClass'](); + } + + public function discover($service, $version = 'v1') { + $this->addService($service, $version); + $this->$service = $this->discoverService($service, $this->services[$service]['discoveryURI']); + return $this->$service; + } + + /** + * Add a service + */ + public function addService($service, $version) { + global $apiConfig; + if ($this->authenticated) { + // Adding services after being authenticated, since the oauth scope is already set (so you wouldn't have access to that data) + throw new apiException('Cant add services after having authenticated'); + } + $this->services[$service] = $this->defaultService; + if (isset($apiConfig['services'][$service])) { + // Merge the service descriptor with the default values + $this->services[$service] = array_merge($this->services[$service], $apiConfig['services'][$service]); + } + $this->services[$service]['discoveryURI'] = $apiConfig['basePath'] . '/discovery/' . self::discoveryVersion . '/describe/' . urlencode($service) . '/' . urlencode($version); + } + + /** + * Set the type of Auth class the client should use. + * @param string $authClassName + */ + public function setAuthClass($authClassName) { + self::$auth = new $authClassName(); + } + + public function authenticate() { + $service = $this->prepareService(); + $this->authenticated = true; + return self::$auth->authenticate($service); + } + + /** + * Construct the OAuth 2.0 authorization request URI. + * @return string + */ + public function createAuthUrl() { + $service = $this->prepareService(); + return self::$auth->createAuthUrl($service['scope']); + } + + private function prepareService() { + $service = $this->defaultService; + $scopes = array(); + if ($this->scopes) { + $scopes = $this->scopes; + } else { + foreach ($this->services as $key => $val) { + if (isset($val['scope'])) { + if (is_array($val['scope'])) { + $scopes = array_merge($val['scope'], $scopes); + } else { + $scopes[] = $val['scope']; + } + } else { + $scopes[] = 'https://www.googleapis.com/auth/' . $key; + } + unset($val['discoveryURI']); + unset($val['scope']); + $service = array_merge($service, $val); + } + } + $service['scope'] = implode(' ', $scopes); + return $service; + } + + /** + * Set the OAuth 2.0 access token using the string that resulted from calling authenticate() + * or apiClient#getAccessToken(). + * @param string $accessToken JSON encoded string containing in the following format: + * {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer", + * "expires_in":3600, "id_token":"TOKEN", "created":1320790426} + */ + public function setAccessToken($accessToken) { + if ($accessToken == null || 'null' == $accessToken) { + $accessToken = null; + } + self::$auth->setAccessToken($accessToken); + } + + /** + * Get the OAuth 2.0 access token. + * @return string $accessToken JSON encoded string in the following format: + * {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer", + * "expires_in":3600,"id_token":"TOKEN", "created":1320790426} + */ + public function getAccessToken() { + $token = self::$auth->getAccessToken(); + return (null == $token || 'null' == $token) ? null : $token; + } + + /** + * Set the developer key to use, these are obtained through the API Console. + * @see http://code.google.com/apis/console-help/#generatingdevkeys + * @param string $developerKey + */ + public function setDeveloperKey($developerKey) { + self::$auth->setDeveloperKey($developerKey); + } + + /** + * Set OAuth 2.0 "state" parameter to achieve per-request customization. + * @see http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.1.2.2 + * @param string $state + */ + public function setState($state) { + self::$auth->setState($state); + } + + /** + * @param string $accessType Possible values for access_type include: + * {@code "offline"} to request offline access from the user. (This is the default value) + * {@code "online"} to request online access from the user. + */ + public function setAccessType($accessType) { + self::$auth->setAccessType($accessType); + } + + /** + * @param string $approvalPrompt Possible values for approval_prompt include: + * {@code "force"} to force the approval UI to appear. (This is the default value) + * {@code "auto"} to request auto-approval when possible. + */ + public function setApprovalPrompt($approvalPrompt) { + self::$auth->setApprovalPrompt($approvalPrompt); + } + + /** + * Set the application name, this is included in the User-Agent HTTP header. + * @param string $applicationName + */ + public function setApplicationName($applicationName) { + global $apiConfig; + $apiConfig['application_name'] = $applicationName; + } + + /** + * Set the OAuth 2.0 Client ID. + * @param string $clientId + */ + public function setClientId($clientId) { + global $apiConfig; + $apiConfig['oauth2_client_id'] = $clientId; + self::$auth->clientId = $clientId; + } + + /** + * Set the OAuth 2.0 Client Secret. + * @param string $clientSecret + */ + public function setClientSecret($clientSecret) { + global $apiConfig; + $apiConfig['oauth2_client_secret'] = $clientSecret; + self::$auth->clientSecret = $clientSecret; + } + + /** + * Set the OAuth 2.0 Redirect URI. + * @param string $redirectUri + */ + public function setRedirectUri($redirectUri) { + global $apiConfig; + $apiConfig['oauth2_redirect_uri'] = $redirectUri; + self::$auth->redirectUri = $redirectUri; + } + + /** + * Fetches a fresh OAuth 2.0 access token with the given refresh token. + * @param string $refreshToken + * @return void + */ + public function refreshToken($refreshToken) { + self::$auth->refreshToken($refreshToken); + } + + /** + * Revoke an OAuth2 access token or refresh token. This method will revoke the current access + * token, if a token isn't provided. + * @throws apiAuthException + * @param string|null $token The token (access token or a refresh token) that should be revoked. + * @return boolean Returns True if the revocation was successful, otherwise False. + */ + public function revokeToken($token = null) { + self::$auth->revokeToken($token); + } + + /** + * Verify an id_token. This method will verify the current id_token, if one + * isn't provided. + * @throws apiAuthException + * @param string|null $token The token (id_token) that should be verified. + * @return apiLoginTicket Returns an apiLoginTicket if the verification was + * successful. + */ + public function verifyIdToken($token = null) { + return self::$auth->verifyIdToken($token); + } + + /** + * This function allows you to overrule the automatically generated scopes, + * so that you can ask for more or less permission in the auth flow + * Set this before you call authenticate() though! + * @param array $scopes, ie: array('https://www.googleapis.com/auth/plus', 'https://www.googleapis.com/auth/moderator') + */ + public function setScopes($scopes) { + $this->scopes = is_string($scopes) ? explode(" ", $scopes) : $scopes; + } + + /** + * Declare if objects should be returned by the api service classes. + * @param boolean $useObjects True if objects should be returned by the service classes. + * False if associative arrays should be returned (default behavior). + */ + public function setUseObjects($useObjects) { + global $apiConfig; + $apiConfig['use_objects'] = $useObjects; + } + + private function discoverService($serviceName, $serviceURI) { + $request = self::$io->makeRequest(new apiHttpRequest($serviceURI)); + if ($request->getResponseHttpCode() != 200) { + throw new apiException("Could not fetch discovery document for $serviceName, code: " + . $request->getResponseHttpCode() . ", response: " . $request->getResponseBody()); + } + $discoveryResponse = $request->getResponseBody(); + $discoveryDocument = json_decode($discoveryResponse, true); + if ($discoveryDocument == NULL) { + throw new apiException("Invalid json returned for $serviceName"); + } + return new apiService($serviceName, $discoveryDocument, apiClient::getIo()); + } + + /** + * @static + * @return apiAuth the implementation of apiAuth. + */ + public static function getAuth() { + return apiClient::$auth; + } + + /** + * @static + * @return apiIo the implementation of apiIo. + */ + public static function getIo() { + return apiClient::$io; + } + + /** + * @return apiCache the implementation of apiCache. + */ + public function getCache() { + return apiClient::$cache; + } +} + +// Exceptions that the Google PHP API Library can throw +class apiException extends Exception {} +class apiAuthException extends apiException {} +class apiCacheException extends apiException {} +class apiIOException extends apiException {} +class apiServiceException extends apiException {} diff --git a/inc/vendors/social-login/Google/auth/apiAuth.php b/inc/vendors/social-login/Google/auth/apiAuth.php new file mode 100755 index 00000000..90163d7a --- /dev/null +++ b/inc/vendors/social-login/Google/auth/apiAuth.php @@ -0,0 +1,33 @@ + + */ +abstract class apiAuth { + abstract public function authenticate($service); + abstract public function sign(apiHttpRequest $request); + abstract public function createAuthUrl($scope); + + abstract public function getAccessToken(); + abstract public function setAccessToken($accessToken); + abstract public function setDeveloperKey($developerKey); + abstract public function refreshToken($refreshToken); + abstract public function revokeToken(); +} diff --git a/inc/vendors/social-login/Google/auth/apiAuthNone.php b/inc/vendors/social-login/Google/auth/apiAuthNone.php new file mode 100755 index 00000000..9226bc87 --- /dev/null +++ b/inc/vendors/social-login/Google/auth/apiAuthNone.php @@ -0,0 +1,45 @@ + + * @author Chirag Shah + */ +class apiAuthNone extends apiAuth { + public $key = null; + + public function __construct() { + global $apiConfig; + if (!empty($apiConfig['developer_key'])) { + $this->setDeveloperKey($apiConfig['developer_key']); + } + } + + public function setDeveloperKey($key) {$this->key = $key;} + public function authenticate($service) {/*noop*/} + public function setAccessToken($accessToken) {/* noop*/} + public function getAccessToken() {return null;} + public function createAuthUrl($scope) {return null;} + public function refreshToken($refreshToken) {/* noop*/} + public function revokeToken() {/* noop*/} + + public function sign(apiHttpRequest $request) { + if ($this->key) { + $request->setUrl($request->getUrl() . ((strpos($request->getUrl(), '?') === false) ? '?' : '&') + . 'key='.urlencode($this->key)); + } + return $request; + } +} diff --git a/inc/vendors/social-login/Google/auth/apiLoginTicket.php b/inc/vendors/social-login/Google/auth/apiLoginTicket.php new file mode 100755 index 00000000..499c24a7 --- /dev/null +++ b/inc/vendors/social-login/Google/auth/apiLoginTicket.php @@ -0,0 +1,55 @@ + + */ +class apiLoginTicket { + const USER_ATTR = "id"; + + // Information from id token envelope. + private $envelope; + + // Information from id token payload. + private $payload; + + /** + * Creates a user based on the supplied token. + * envelope: header from a verified authentication token. + * payload: information from a verified authentication token. + */ + public function __construct($envelope, $payload) { + $this->envelope = $envelope; + $this->payload = $payload; + } + + /** + * Returns the numeric identifier for the user. + */ + public function getUserId() { + if (array_key_exists(self::USER_ATTR, $this->payload)) { + return $this->payload[self::USER_ATTR]; + } + throw new apiAuthException("No user_id in token"); + } + + /** + * Returns attributes from the login ticket. This can contain + * various information about the user session. + */ + public function getAttributes() { + return array("envelope" => $this->envelope, "payload" => $this->payload); + } +} diff --git a/inc/vendors/social-login/Google/auth/apiOAuth.php b/inc/vendors/social-login/Google/auth/apiOAuth.php new file mode 100755 index 00000000..f27a2ced --- /dev/null +++ b/inc/vendors/social-login/Google/auth/apiOAuth.php @@ -0,0 +1,236 @@ + + */ +class apiOAuth extends apiAuth { + public $cacheKey; + protected $consumerToken; + protected $accessToken; + protected $privateKeyFile; + protected $developerKey; + public $service; + + /** + * Instantiates the class, but does not initiate the login flow, leaving it + * to the discretion of the caller. + */ + public function __construct() { + global $apiConfig; + if (!empty($apiConfig['developer_key'])) { + $this->setDeveloperKey($apiConfig['developer_key']); + } + $this->consumerToken = new apiClientOAuthConsumer($apiConfig['oauth_consumer_key'], $apiConfig['oauth_consumer_secret'], NULL); + $this->signatureMethod = new apiClientOAuthSignatureMethod_HMAC_SHA1(); + $this->cacheKey = 'OAuth:' . $apiConfig['oauth_consumer_key']; // Scope data to the local user as well, or else multiple local users will share the same OAuth credentials. + } + + /** + * The 3 legged oauth class needs a way to store the access key and token + * it uses the apiCache class to do so. + * Constructing this class will initiate the 3 legged oauth work flow, including redirecting + * to the OAuth provider's site if required(!) + * @param string $consumerKey + * @param string $consumerSecret + * @return apiOAuth3Legged the logged-in provider instance + */ + public function authenticate($service) { + global $apiConfig; + $this->service = $service; + $this->service['authorization_token_url'] .= '?scope=' . apiClientOAuthUtil::urlencodeRFC3986($service['scope']) . '&domain=' . apiClientOAuthUtil::urlencodeRFC3986($apiConfig['site_name']) . '&oauth_token='; + if (isset($_GET['oauth_verifier']) && isset($_GET['oauth_token']) && isset($_GET['uid'])) { + $uid = $_GET['uid']; + $secret = apiClient::$cache->get($this->cacheKey.":nonce:" . $uid); + apiClient::$cache->delete($this->cacheKey.":nonce:" . $uid); + $token = $this->upgradeRequestToken($_GET['oauth_token'], $secret, $_GET['oauth_verifier']); + return json_encode($token); + } else { + // Initialize the OAuth dance, first request a request token, then kick the client to the authorize URL + // First we store the current URL in our cache, so that when the oauth dance is completed we can return there + $callbackUrl = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; + $uid = uniqid(); + $token = $this->obtainRequestToken($callbackUrl, $uid); + apiClient::$cache->set($this->cacheKey.":nonce:" . $uid, $token->secret); + $this->redirectToAuthorization($token); + } + } + + /** + * Sets the internal oauth access token (which is returned by the authenticate function), a user should only + * go through the authenticate() flow once (which involces a bunch of browser redirections and authentication screens, not fun) + * and every time the user comes back the access token from the authentication() flow should be re-used (it essentially never expires) + * @param object $accessToken + */ + public function setAccessToken($accessToken) { + $accessToken = json_decode($accessToken, true); + if ($accessToken == null) { + throw new apiAuthException("Could not json decode the access token"); + } + if (! isset($accessToken['key']) || ! isset($accessToken['secret'])) { + throw new apiAuthException("Invalid OAuth token, missing key and/or secret"); + } + $this->accessToken = new apiClientOAuthConsumer($accessToken['key'], $accessToken['secret']); + } + + /** + * Returns the current access token + */ + public function getAccessToken() { + return $this->accessToken; + } + + + /** + * Set the developer key to use, these are obtained through the API Console + */ + public function setDeveloperKey($developerKey) { + $this->developerKey = $developerKey; + } + + /** + * Upgrades an existing request token to an access token. + * @param apiCache $cache cache class to use (file,apc,memcache,mysql) + * @param oauthVerifier + */ + public function upgradeRequestToken($requestToken, $requestTokenSecret, $oauthVerifier) { + $ret = $this->requestAccessToken($requestToken, $requestTokenSecret, $oauthVerifier); + $matches = array(); + @parse_str($ret, $matches); + if (!isset($matches['oauth_token']) || !isset($matches['oauth_token_secret'])) { + throw new apiAuthException("Error authorizing access key (result was: {$ret})"); + } + // The token was upgraded to an access token, we can now continue to use it. + $this->accessToken = new apiClientOAuthConsumer(apiClientOAuthUtil::urldecodeRFC3986($matches['oauth_token']), apiClientOAuthUtil::urldecodeRFC3986($matches['oauth_token_secret'])); + return $this->accessToken; + } + + /** + * Sends the actual request to exchange an existing request token for an access token. + * @param string $requestToken the existing request token + * @param string $requestTokenSecret the request token secret + * @return array('http_code' => HTTP response code (200, 404, 401, etc), 'data' => the html document) + */ + protected function requestAccessToken($requestToken, $requestTokenSecret, $oauthVerifier) { + $accessToken = new apiClientOAuthConsumer($requestToken, $requestTokenSecret); + $accessRequest = apiClientOAuthRequest::from_consumer_and_token($this->consumerToken, $accessToken, "GET", $this->service['access_token_url'], array('oauth_verifier' => $oauthVerifier)); + $accessRequest->sign_request($this->signatureMethod, $this->consumerToken, $accessToken); + $request = apiClient::$io->makeRequest(new apiHttpRequest($accessRequest)); + if ($request->getResponseHttpCode() != 200) { + throw new apiAuthException("Could not fetch access token, http code: " . $request->getResponseHttpCode() . ', response body: '. $request->getResponseBody()); + } + return $request->getResponseBody(); + } + + /** + * Obtains a request token from the specified provider. + */ + public function obtainRequestToken($callbackUrl, $uid) { + $callbackParams = (strpos($_SERVER['REQUEST_URI'], '?') !== false ? '&' : '?') . 'uid=' . urlencode($uid); + $ret = $this->requestRequestToken($callbackUrl . $callbackParams); + $matches = array(); + preg_match('/oauth_token=(.*)&oauth_token_secret=(.*)&oauth_callback_confirmed=(.*)/', $ret, $matches); + if (!is_array($matches) || count($matches) != 4) { + throw new apiAuthException("Error retrieving request key ({$ret})"); + } + return new apiClientOAuthToken(apiClientOAuthUtil::urldecodeRFC3986($matches[1]), apiClientOAuthUtil::urldecodeRFC3986($matches[2])); + } + + /** + * Sends the actual request to obtain a request token. + * @return array('http_code' => HTTP response code (200, 404, 401, etc), 'data' => the html document) + */ + protected function requestRequestToken($callbackUrl) { + $requestTokenRequest = apiClientOAuthRequest::from_consumer_and_token($this->consumerToken, NULL, "GET", $this->service['request_token_url'], array()); + $requestTokenRequest->set_parameter('scope', $this->service['scope']); + $requestTokenRequest->set_parameter('oauth_callback', $callbackUrl); + $requestTokenRequest->sign_request($this->signatureMethod, $this->consumerToken, NULL); + $request = apiClient::$io->makeRequest(new apiHttpRequest($requestTokenRequest)); + if ($request->getResponseHttpCode() != 200) { + throw new apiAuthException("Couldn't fetch request token, http code: " . $request->getResponseHttpCode() . ', response body: '. $request->getResponseBody()); + } + return $request->getResponseBody(); + } + + /** + * Redirect the uset to the (provider's) authorize page, if approved it should kick the user back to the call back URL + * which hopefully means we'll end up in the constructor of this class again, but with oauth_continue=1 set + * @param OAuthToken $token the request token + * @param string $callbackUrl the URL to return to post-authorization (passed to login site) + */ + public function redirectToAuthorization($token) { + $authorizeRedirect = $this->service['authorization_token_url']. $token->key; + header("Location: $authorizeRedirect"); + } + + /** + * Sign the request using OAuth. This uses the consumer token and key + * @param string $method the method (get/put/delete/post) + * @param string $url the url to sign (http://site/social/rest/people/1/@me) + * @param array $params the params that should be appended to the url (count=20 fields=foo, etc) + * @param string $postBody for POST/PUT requests, the postBody is included in the signature + * @return string the signed url + */ + public function sign(apiHttpRequest $request) { + // add the developer key to the request before signing it + if ($this->developerKey) { + $request->setUrl($request->getUrl() . ((strpos($request->getUrl(), '?') === false) ? '?' : '&') . 'key='.urlencode($this->developerKey)); + } + // and sign the request + $oauthRequest = apiClientOAuthRequest::from_request($request->getMethod(), $request->getBaseUrl(), $request->getQueryParams()); + $params = $this->mergeParameters($request->getQueryParams()); + foreach ($params as $key => $val) { + if (is_array($val)) { + $val = implode(',', $val); + } + $oauthRequest->set_parameter($key, $val); + } + $oauthRequest->sign_request($this->signatureMethod, $this->consumerToken, $this->accessToken); + $authHeaders = $oauthRequest->to_header(); + $headers = $request->getHeaders(); + $headers[] = $authHeaders; + $request->setHeaders($headers); + // and add the access token key to it (since it doesn't include the secret, it's still secure to store this in cache) + $request->accessKey = $this->accessToken->key; + return $request; + } + + /** + * Merges the supplied parameters with reasonable defaults for 2 legged oauth. User-supplied parameters + * will have precedent over the defaults. + * @param array $params the user-supplied params that will be appended to the url + * @return array the combined parameters + */ + protected function mergeParameters($params) { + $defaults = array( + 'oauth_nonce' => md5(microtime() . mt_rand()), + 'oauth_version' => apiClientOAuthRequest::$version, 'oauth_timestamp' => time(), + 'oauth_consumer_key' => $this->consumerToken->key + ); + if ($this->accessToken != null) { + $params['oauth_token'] = $this->accessToken->key; + } + return array_merge($defaults, $params); + } + + public function createAuthUrl($scope) {return null;} + public function refreshToken($refreshToken) {/* noop*/} + public function revokeToken() {/* noop*/} +} \ No newline at end of file diff --git a/inc/vendors/social-login/Google/auth/apiOAuth2.php b/inc/vendors/social-login/Google/auth/apiOAuth2.php new file mode 100755 index 00000000..256d984e --- /dev/null +++ b/inc/vendors/social-login/Google/auth/apiOAuth2.php @@ -0,0 +1,385 @@ + + * @author Chirag Shah + */ +class apiOAuth2 extends apiAuth { + public $clientId; + public $clientSecret; + public $developerKey; + public $accessToken; + public $redirectUri; + public $state; + public $accessType = 'offline'; + public $approvalPrompt = 'force'; + + const OAUTH2_REVOKE_URI = 'https://accounts.google.com/o/oauth2/revoke'; + const OAUTH2_TOKEN_URI = 'https://accounts.google.com/o/oauth2/token'; + const OAUTH2_AUTH_URL = 'https://accounts.google.com/o/oauth2/auth'; + const OAUTH2_FEDERATED_SIGNON_CERTS_URL = 'https://www.googleapis.com/oauth2/v1/certs'; + const CLOCK_SKEW_SECS = 300; // five minutes in seconds + const AUTH_TOKEN_LIFETIME_SECS = 300; // five minutes in seconds + const MAX_TOKEN_LIFETIME_SECS = 86400; // one day in seconds + + /** + * Instantiates the class, but does not initiate the login flow, leaving it + * to the discretion of the caller (which is done by calling authenticate()). + */ + public function __construct() { + global $apiConfig; + + if (! empty($apiConfig['developer_key'])) { + $this->developerKey = $apiConfig['developer_key']; + } + + if (! empty($apiConfig['oauth2_client_id'])) { + $this->clientId = $apiConfig['oauth2_client_id']; + } + + if (! empty($apiConfig['oauth2_client_secret'])) { + $this->clientSecret = $apiConfig['oauth2_client_secret']; + } + + if (! empty($apiConfig['oauth2_redirect_uri'])) { + $this->redirectUri = $apiConfig['oauth2_redirect_uri']; + } + + if (! empty($apiConfig['oauth2_access_type'])) { + $this->accessType = $apiConfig['oauth2_access_type']; + } + + if (! empty($apiConfig['oauth2_approval_prompt'])) { + $this->approvalPrompt = $apiConfig['oauth2_approval_prompt']; + } + } + + /** + * @param $service + * @return string + * @throws apiAuthException + */ + public function authenticate($service) { + if (isset($_GET['code'])) { + // We got here from the redirect from a successful authorization grant, fetch the access token + $request = apiClient::$io->makeRequest(new apiHttpRequest(self::OAUTH2_TOKEN_URI, 'POST', array(), array( + 'code' => $_GET['code'], + 'grant_type' => 'authorization_code', + 'redirect_uri' => $this->redirectUri, + 'client_id' => $this->clientId, + 'client_secret' => $this->clientSecret + ))); + + if ($request->getResponseHttpCode() == 200) { + $this->setAccessToken($request->getResponseBody()); + $this->accessToken['created'] = time(); + return $this->getAccessToken(); + } else { + $response = $request->getResponseBody(); + $decodedResponse = json_decode($response, true); + if ($decodedResponse != $response && $decodedResponse != null && $decodedResponse['error']) { + $response = $decodedResponse['error']; + } + throw new apiAuthException("Error fetching OAuth2 access token, message: '$response'", $request->getResponseHttpCode()); + } + } + + $authUrl = $this->createAuthUrl($service['scope']); + header('Location: ' . $authUrl); + } + + /** + * Create a URL to obtain user authorization. + * The authorization endpoint allows the user to first + * authenticate, and then grant/deny the access request. + * @param string $scope The scope is expressed as a list of space-delimited strings. + * @return string + */ + public function createAuthUrl($scope) { + $params = array( + 'response_type=code', + 'redirect_uri=' . urlencode($this->redirectUri), + 'client_id=' . urlencode($this->clientId), + 'scope=' . urlencode($scope), + 'access_type=' . urlencode($this->accessType), + 'approval_prompt=' . urlencode($this->approvalPrompt) + ); + + if (isset($this->state)) { + $params[] = 'state=' . urlencode($this->state); + } + $params = implode('&', $params); + return self::OAUTH2_AUTH_URL . "?$params"; + } + + /** + * @param $accessToken + * @throws apiAuthException Thrown when $accessToken is invalid. + */ + public function setAccessToken($accessToken) { + $accessToken = json_decode($accessToken, true); + if ($accessToken == null) { + throw new apiAuthException('Could not json decode the access token'); + } + if (! isset($accessToken['access_token'])) { + throw new apiAuthException("Invalid token format"); + } + $this->accessToken = $accessToken; + } + + public function getAccessToken() { + return json_encode($this->accessToken); + } + + public function setDeveloperKey($developerKey) { + $this->developerKey = $developerKey; + } + + public function setState($state) { + $this->state = $state; + } + + public function setAccessType($accessType) { + $this->accessType = $accessType; + } + + public function setApprovalPrompt($approvalPrompt) { + $this->approvalPrompt = $approvalPrompt; + } + + /** + * Include an accessToken in a given apiHttpRequest. + * @param apiHttpRequest $request + * @return apiHttpRequest + * @throws apiAuthException + */ + public function sign(apiHttpRequest $request) { + // add the developer key to the request before signing it + if ($this->developerKey) { + $requestUrl = $request->getUrl(); + $requestUrl .= (strpos($request->getUrl(), '?') === false) ? '?' : '&'; + $requestUrl .= 'key=' . urlencode($this->developerKey); + $request->setUrl($requestUrl); + } + + // Cannot sign the request without an OAuth access token. + if (null == $this->accessToken) { + return $request; + } + + // If the token is set to expire in the next 30 seconds (or has already + // expired), refresh it and set the new token. + $expired = ($this->accessToken['created'] + ($this->accessToken['expires_in'] - 30)) < time(); + if ($expired) { + if (! array_key_exists('refresh_token', $this->accessToken)) { + throw new apiAuthException("The OAuth 2.0 access token has expired, " + . "and a refresh token is not available. Refresh tokens are not " + . "returned for responses that were auto-approved."); + } + $this->refreshToken($this->accessToken['refresh_token']); + } + + // Add the OAuth2 header to the request + $request->setRequestHeaders( + array('Authorization' => 'Bearer ' . $this->accessToken['access_token']) + ); + + return $request; + } + + /** + * Fetches a fresh access token with the given refresh token. + * @param string $refreshToken + * @return void + */ + public function refreshToken($refreshToken) { + $params = array( + 'client_id' => $this->clientId, + 'client_secret' => $this->clientSecret, + 'refresh_token' => $refreshToken, + 'grant_type' => 'refresh_token' + ); + $request = apiClient::$io->makeRequest( + new apiHttpRequest(self::OAUTH2_TOKEN_URI, 'POST', array(), $params)); + $code = $request->getResponseHttpCode(); + $body = $request->getResponseBody(); + if ($code == 200) { + $token = json_decode($body, true); + if ($token == null) { + throw new apiAuthException("Could not json decode the access token"); + } + + if (! isset($token['access_token']) || ! isset($token['expires_in'])) { + throw new apiAuthException("Invalid token format"); + } + + $this->accessToken['access_token'] = $token['access_token']; + $this->accessToken['expires_in'] = $token['expires_in']; + $this->accessToken['created'] = time(); + } else { + throw new apiAuthException("Error refreshing the OAuth2 token, message: '$body'", $code); + } + } + + /** + * Revoke an OAuth2 access token or refresh token. This method will revoke the current access + * token, if a token isn't provided. + * @throws apiAuthException + * @param string|null $token The token (access token or a refresh token) that should be revoked. + * @return boolean Returns True if the revocation was successful, otherwise False. + */ + public function revokeToken($token = null) { + if (!$token) { + $token = $this->accessToken['access_token']; + } + $request = new apiHttpRequest(self::OAUTH2_REVOKE_URI, 'POST', array(), "token=$token"); + $response = apiClient::$io->makeRequest($request); + $code = $response->getResponseHttpCode(); + if ($code == 200) { + $this->accessToken = null; + return true; + } + + return false; + } + + // Gets federated sign-on certificates to use for verifying identity tokens. + // Returns certs as array structure, where keys are key ids, and values + // are PEM encoded certificates. + private function getFederatedSignOnCerts() { + // This relies on makeRequest caching certificate responses. + $request = apiClient::$io->makeRequest(new apiHttpRequest( + self::OAUTH2_FEDERATED_SIGNON_CERTS_URL)); + if ($request->getResponseHttpCode() == 200) { + $certs = json_decode($request->getResponseBody(), true); + if ($certs) { + return $certs; + } + } + throw new apiAuthException( + "Failed to retrieve verification certificates: '" . + $request->getResponseBody() . "'.", + $request->getResponseHttpCode()); + } + + /** + * Verifies an id token and returns the authenticated apiLoginTicket. + * Throws an exception if the id token is not valid. + * The audience parameter can be used to control which id tokens are + * accepted. By default, the id token must have been issued to this OAuth2 client. + * @param $id_token + * @param $audience + * @return apiLoginTicket + */ + public function verifyIdToken($id_token = null, $audience = null) { + if (!$id_token) { + $id_token = $this->accessToken['id_token']; + } + + $certs = $this->getFederatedSignonCerts(); + if (!$audience) { + $audience = $this->clientId; + } + return $this->verifySignedJwtWithCerts($id_token, $certs, $audience); + } + + // Verifies the id token, returns the verified token contents. + // Visible for testing. + function verifySignedJwtWithCerts($jwt, $certs, $required_audience) { + $segments = explode(".", $jwt); + if (count($segments) != 3) { + throw new apiAuthException("Wrong number of segments in token: $jwt"); + } + $signed = $segments[0] . "." . $segments[1]; + $signature = apiUtils::urlSafeB64Decode($segments[2]); + + // Parse envelope. + $envelope = json_decode(apiUtils::urlSafeB64Decode($segments[0]), true); + if (!$envelope) { + throw new apiAuthException("Can't parse token envelope: " . $segments[0]); + } + + // Parse token + $json_body = apiUtils::urlSafeB64Decode($segments[1]); + $payload = json_decode($json_body, true); + if (!$payload) { + throw new apiAuthException("Can't parse token payload: " . $segments[1]); + } + + // Check signature + $verified = false; + foreach ($certs as $keyName => $pem) { + $public_key = new apiPemVerifier($pem); + if ($public_key->verify($signed, $signature)) { + $verified = true; + break; + } + } + + if (!$verified) { + throw new apiAuthException("Invalid token signature: $jwt"); + } + + // Check issued-at timestamp + $iat = 0; + if (array_key_exists("iat", $payload)) { + $iat = $payload["iat"]; + } + if (!$iat) { + throw new apiAuthException("No issue time in token: $json_body"); + } + $earliest = $iat - self::CLOCK_SKEW_SECS; + + // Check expiration timestamp + $now = time(); + $exp = 0; + if (array_key_exists("exp", $payload)) { + $exp = $payload["exp"]; + } + if (!$exp) { + throw new apiAuthException("No expiration time in token: $json_body"); + } + if ($exp >= $now + self::MAX_TOKEN_LIFETIME_SECS) { + throw new apiAuthException( + "Expiration time too far in future: $json_body"); + } + + $latest = $exp + self::CLOCK_SKEW_SECS; + if ($now < $earliest) { + throw new apiAuthException( + "Token used too early, $now < $earliest: $json_body"); + } + if ($now > $latest) { + throw new apiAuthException( + "Token used too late, $now > $latest: $json_body"); + } + + // TODO(beaton): check issuer field? + + // Check audience + $aud = $payload["aud"]; + if ($aud != $required_audience) { + throw new apiAuthException("Wrong recipient, $aud != $required_audience: $json_body"); + } + + // All good. + return new apiLoginTicket($envelope, $payload); + } +} \ No newline at end of file diff --git a/inc/vendors/social-login/Google/auth/apiP12Signer.php b/inc/vendors/social-login/Google/auth/apiP12Signer.php new file mode 100755 index 00000000..ff3df576 --- /dev/null +++ b/inc/vendors/social-login/Google/auth/apiP12Signer.php @@ -0,0 +1,62 @@ + + */ +class apiP12Signer extends apiSigner { + // OpenSSL private key resource + private $privateKey; + + // Creates a new signer from a .p12 file. + function __construct($p12file, $password) { + if (!function_exists('openssl_x509_read')) { + throw new Exception( + 'The Google PHP API library needs the openssl PHP extension'); + } + // This throws on error + // $p12 = file get contents($p12file); + $p12 = wp_remote_get($p12file); + $certs = array(); + if (!openssl_pkcs12_read($p12, $certs, $password)) { + throw new apiAuthException("Unable to parse $p12file. " . + "Is this a .p12 file? Is the password correct? OpenSSL error: " . + openssl_error_string()); + } + // TODO(beaton): is this part of the contract for the openssl_pkcs12_read + // method? What happens if there are multiple private keys? Do we care? + if (!array_key_exists("pkey", $certs) || !$certs["pkey"]) { + throw new apiAuthException("No private key found in p12 file $p12file"); + } + $this->privateKey = openssl_pkey_get_private($certs["pkey"]); + if (!$this->privateKey) { + throw new apiAuthException("Unable to load private key in $p12file"); + } + } + + function __destruct() { + if ($this->privateKey) { + openssl_pkey_free($this->privateKey); + } + } + + function sign($data) { + if (!openssl_sign($data, $signature, $this->privateKey, "sha256")) { + throw new apiAuthException("Unable to sign data"); + } + return $signature; + } +} diff --git a/inc/vendors/social-login/Google/auth/apiPemVerifier.php b/inc/vendors/social-login/Google/auth/apiPemVerifier.php new file mode 100755 index 00000000..368162b3 --- /dev/null +++ b/inc/vendors/social-login/Google/auth/apiPemVerifier.php @@ -0,0 +1,55 @@ + + */ +class apiPemVerifier extends apiVerifier { + private $publicKey; + + /** + * Constructs a verifier from the supplied PEM-encoded certificate. + * $pem: a PEM encoded certificate (not a file). + */ + function __construct($pem) { + if (!function_exists('openssl_x509_read')) { + throw new Exception( + 'The Google PHP API library needs the openssl PHP extension'); + } + $this->publicKey = openssl_x509_read($pem); + if (!$this->publicKey) { + throw new apiAuthException("Unable to parse PEM: $pem"); + } + } + + function __destruct() { + if ($this->publicKey) { + openssl_x509_free($this->publicKey); + } + } + + /** + * Verifies the signature on data. + * Returns true if the signature is valid, false otherwise. + */ + function verify($data, $signature) { + $status = openssl_verify($data, $signature, $this->publicKey, "sha256"); + if ($status === -1) { + throw new apiAuthException("Signature verification error: " . + openssl_error_string()); + } + return $status === 1; + } +} diff --git a/inc/vendors/social-login/Google/auth/apiSigner.php b/inc/vendors/social-login/Google/auth/apiSigner.php new file mode 100755 index 00000000..104035c7 --- /dev/null +++ b/inc/vendors/social-login/Google/auth/apiSigner.php @@ -0,0 +1,26 @@ + + */ +abstract class apiSigner { + /** + * Signs data, returns the signature as binary data. + */ + abstract public function sign($data); +} diff --git a/inc/vendors/social-login/Google/auth/apiVerifier.php b/inc/vendors/social-login/Google/auth/apiVerifier.php new file mode 100755 index 00000000..bdfac84d --- /dev/null +++ b/inc/vendors/social-login/Google/auth/apiVerifier.php @@ -0,0 +1,27 @@ + + */ +abstract class apiVerifier { + /** + * Checks a signature, returns true if the signature is correct, + * false otherwise. + */ + abstract public function verify($data, $signature); +} diff --git a/inc/vendors/social-login/Google/cache/apiApcCache.php b/inc/vendors/social-login/Google/cache/apiApcCache.php new file mode 100755 index 00000000..e6708df3 --- /dev/null +++ b/inc/vendors/social-login/Google/cache/apiApcCache.php @@ -0,0 +1,93 @@ + + */ +class apiApcCache extends apiCache { + + public function __construct() { + if (! function_exists('apc_add')) { + throw new apiCacheException("Apc functions not available"); + } + } + + private function isLocked($key) { + if ((@apc_fetch($key . '.lock')) === false) { + return false; + } + return true; + } + + private function createLock($key) { + // the interesting thing is that this could fail if the lock was created in the meantime.. + // but we'll ignore that out of convenience + @apc_add($key . '.lock', '', 5); + } + + private function removeLock($key) { + // suppress all warnings, if some other process removed it that's ok too + @apc_delete($key . '.lock'); + } + + private function waitForLock($key) { + // 20 x 250 = 5 seconds + $tries = 20; + $cnt = 0; + do { + // 250 ms is a long time to sleep, but it does stop the server from burning all resources on polling locks.. + usleep(250); + $cnt ++; + } while ($cnt <= $tries && $this->isLocked($key)); + if ($this->isLocked($key)) { + // 5 seconds passed, assume the owning process died off and remove it + $this->removeLock($key); + } + } + + /** + * @inheritDoc + */ + public function get($key, $expiration = false) { + + if (($ret = @apc_fetch($key)) === false) { + return false; + } + if (!$expiration || (time() - $ret['time'] > $expiration)) { + $this->delete($key); + return false; + } + return unserialize($ret['data']); + } + + /** + * @inheritDoc + */ + public function set($key, $value) { + if (@apc_store($key, array('time' => time(), 'data' => serialize($value))) == false) { + throw new apiCacheException("Couldn't store data"); + } + } + + /** + * @inheritDoc + */ + public function delete($key) { + @apc_delete($key); + } +} diff --git a/inc/vendors/social-login/Google/cache/apiCache.php b/inc/vendors/social-login/Google/cache/apiCache.php new file mode 100755 index 00000000..63f8a4f5 --- /dev/null +++ b/inc/vendors/social-login/Google/cache/apiCache.php @@ -0,0 +1,48 @@ + + */ +abstract class apiCache { + + /** + * Retrieves the data for the given key, or false if they + * key is unknown or expired + * @param String $key The key who's data to retrieve + * @param boolean|int $expiration Expiration time in seconds + */ + abstract function get($key, $expiration = false); + + /** + * Store the key => $value set. The $value is serialized + * by this function so can be of any type + * @param String $key Key of the data + * @param $value the data + */ + abstract function set($key, $value); + + /** + * Removes the key/data pair for the given $key + * @param String $key + */ + abstract function delete($key); +} + + diff --git a/inc/vendors/social-login/Google/cache/apiFileCache.php b/inc/vendors/social-login/Google/cache/apiFileCache.php new file mode 100755 index 00000000..dd86277b --- /dev/null +++ b/inc/vendors/social-login/Google/cache/apiFileCache.php @@ -0,0 +1,135 @@ + + */ +class apiFileCache extends apiCache { + private $path; + + public function __construct() { + global $apiConfig; + $this->path = $apiConfig['ioFileCache_directory']; + } + + private function isLocked($storageFile) { + // our lock file convention is simple: /the/file/path.lock + return file_exists($storageFile . '.lock'); + } + + private function createLock($storageFile) { + $storageDir = dirname($storageFile); + if (! is_dir($storageDir)) { + if (! @mkdir($storageDir, 0755, true)) { + // make sure the failure isn't because of a concurrency issue + if (! is_dir($storageDir)) { + throw new apiCacheException("Could not create storage directory: $storageDir"); + } + } + } + @touch($storageFile . '.lock'); + } + + private function removeLock($storageFile) { + // suppress all warnings, if some other process removed it that's ok too + @unlink($storageFile . '.lock'); + } + + private function waitForLock($storageFile) { + // 20 x 250 = 5 seconds + $tries = 20; + $cnt = 0; + do { + // make sure PHP picks up on file changes. This is an expensive action but really can't be avoided + clearstatcache(); + // 250 ms is a long time to sleep, but it does stop the server from burning all resources on polling locks.. + usleep(250); + $cnt ++; + } while ($cnt <= $tries && $this->isLocked($storageFile)); + if ($this->isLocked($storageFile)) { + // 5 seconds passed, assume the owning process died off and remove it + $this->removeLock($storageFile); + } + } + + private function getCacheDir($hash) { + // use the first 2 characters of the hash as a directory prefix + // this should prevent slowdowns due to huge directory listings + // and thus give some basic amount of scalability + return $this->path . '/' . substr($hash, 0, 2); + } + + private function getCacheFile($hash) { + return $this->getCacheDir($hash) . '/' . $hash; + } + + public function get($key, $expiration = false) { + $storageFile = $this->getCacheFile(md5($key)); + // See if this storage file is locked, if so we wait upto 5 seconds for the lock owning process to + // complete it's work. If the lock is not released within that time frame, it's cleaned up. + // This should give us a fair amount of 'Cache Stampeding' protection + if ($this->isLocked($storageFile)) { + $this->waitForLock($storageFile); + } + if (file_exists($storageFile) && is_readable($storageFile)) { + $now = time(); + if (! $expiration || (($mtime = @filemtime($storageFile)) !== false && ($now - $mtime) < $expiration)) { + // if (($data = @ file get contents($storageFile)) !== false) { + // $data = unserialize($data); + // return $data; + // } + if (($data = wp_remote_get($storageFile)) !== false) { + $data = unserialize($data); + return $data; + } + } + } + return false; + } + + public function set($key, $value) { + $storageDir = $this->getCacheDir(md5($key)); + $storageFile = $this->getCacheFile(md5($key)); + if ($this->isLocked($storageFile)) { + // some other process is writing to this file too, wait until it's done to prevent hickups + $this->waitForLock($storageFile); + } + if (! is_dir($storageDir)) { + if (! @mkdir($storageDir, 0755, true)) { + throw new apiCacheException("Could not create storage directory: $storageDir"); + } + } + // we serialize the whole request object, since we don't only want the + // responseContent but also the postBody used, headers, size, etc + $data = serialize($value); + $this->createLock($storageFile); + if (! @file_put_contents($storageFile, $data)) { + $this->removeLock($storageFile); + throw new apiCacheException("Could not store data in the file"); + } + $this->removeLock($storageFile); + } + + public function delete($key) { + $file = $this->getCacheFile(md5($key)); + if (! @unlink($file)) { + throw new apiCacheException("Cache file could not be deleted"); + } + } +} diff --git a/inc/vendors/social-login/Google/cache/apiMemcacheCache.php b/inc/vendors/social-login/Google/cache/apiMemcacheCache.php new file mode 100755 index 00000000..a96c9ae5 --- /dev/null +++ b/inc/vendors/social-login/Google/cache/apiMemcacheCache.php @@ -0,0 +1,122 @@ + + */ +class apiMemcacheCache extends apiCache { + private $connection = false; + + public function __construct() { + global $apiConfig; + if (! function_exists('memcache_connect')) { + throw new apiCacheException("Memcache functions not available"); + } + $this->host = $apiConfig['ioMemCacheCache_host']; + $this->port = $apiConfig['ioMemCacheCache_port']; + if (empty($this->host) || empty($this->port)) { + throw new apiCacheException("You need to supply a valid memcache host and port"); + } + } + + private function isLocked($key) { + $this->check(); + if ((@memcache_get($this->connection, $key . '.lock')) === false) { + return false; + } + return true; + } + + private function createLock($key) { + $this->check(); + // the interesting thing is that this could fail if the lock was created in the meantime.. + // but we'll ignore that out of convenience + @memcache_add($this->connection, $key . '.lock', '', 0, 5); + } + + private function removeLock($key) { + $this->check(); + // suppress all warnings, if some other process removed it that's ok too + @memcache_delete($this->connection, $key . '.lock'); + } + + private function waitForLock($key) { + $this->check(); + // 20 x 250 = 5 seconds + $tries = 20; + $cnt = 0; + do { + // 250 ms is a long time to sleep, but it does stop the server from burning all resources on polling locks.. + usleep(250); + $cnt ++; + } while ($cnt <= $tries && $this->isLocked($key)); + if ($this->isLocked($key)) { + // 5 seconds passed, assume the owning process died off and remove it + $this->removeLock($key); + } + } + + // I prefer lazy initialization since the cache isn't used every request + // so this potentially saves a lot of overhead + private function connect() { + if (! $this->connection = @memcache_pconnect($this->host, $this->port)) { + throw new apiCacheException("Couldn't connect to memcache server"); + } + } + + private function check() { + if (! $this->connection) { + $this->connect(); + } + } + + /** + * @inheritDoc + */ + public function get($key, $expiration = false) { + $this->check(); + if (($ret = @memcache_get($this->connection, $key)) === false) { + return false; + } + if (! $expiration || (time() - $ret['time'] > $expiration)) { + $this->delete($key); + return false; + } + return $ret['data']; + } + + /** + * @inheritDoc + */ + public function set($key, $value) { + $this->check(); + // we store it with the cache_time default expiration so objects will at least get cleaned eventually. + if (@memcache_set($this->connection, $key, array('time' => time(), + 'data' => $value), false) == false) { + throw new apiCacheException("Couldn't store data in cache"); + } + } + + /** + * @inheritDoc + */ + public function delete($key) { + $this->check(); + @memcache_delete($this->connection, $key); + } +} diff --git a/inc/vendors/social-login/Google/config.php b/inc/vendors/social-login/Google/config.php new file mode 100755 index 00000000..684ab173 --- /dev/null +++ b/inc/vendors/social-login/Google/config.php @@ -0,0 +1,89 @@ + false, + + // The application_name is included in the User-Agent HTTP header. + 'application_name' => '', + + // OAuth2 Settings, you can get these keys at https://code.google.com/apis/console + 'oauth2_client_id' => '', + 'oauth2_client_secret' => '', + 'oauth2_redirect_uri' => '', + + // The developer key, you get this at https://code.google.com/apis/console + 'developer_key' => '', + + // OAuth1 Settings. + // If you're using the apiOAuth auth class, it will use these values for the oauth consumer key and secret. + // See http://code.google.com/apis/accounts/docs/RegistrationForWebAppsAuto.html for info on how to obtain those + 'oauth_consumer_key' => 'anonymous', + 'oauth_consumer_secret' => 'anonymous', + + // Site name to show in the Google's OAuth 1 authentication screen. + 'site_name' => 'www.example.org', + + // Which Authentication, Storage and HTTP IO classes to use. + 'authClass' => 'apiOAuth2', + 'ioClass' => 'apiCurlIO', + 'cacheClass' => 'apiFileCache', + + // If you want to run the test suite (by running # phpunit AllTests.php in the tests/ directory), fill in the settings below + 'oauth_test_token' => '', // the oauth access token to use (which you can get by runing authenticate() as the test user and copying the token value), ie '{"key":"foo","secret":"bar","callback_url":null}' + 'oauth_test_user' => '', // and the user ID to use, this can either be a vanity name 'testuser' or a numberic ID '123456' + + // Don't change these unless you're working against a special development or testing environment. + 'basePath' => 'https://www.googleapis.com', + + // IO Class dependent configuration, you only have to configure the values for the class that was configured as the ioClass above + 'ioFileCache_directory' => + (function_exists('sys_get_temp_dir') ? + sys_get_temp_dir() . '/apiClient' : + '/tmp/apiClient'), + 'ioMemCacheStorage_host' => '127.0.0.1', + 'ioMemcacheStorage_port' => '11211', + + // Definition of service specific values like scopes, oauth token URLs, etc + 'services' => array( + 'analytics' => array('scope' => 'https://www.googleapis.com/auth/analytics.readonly'), + 'calendar' => array( + 'scope' => array( + "https://www.googleapis.com/auth/calendar", + "https://www.googleapis.com/auth/calendar.readonly", + ) + ), + 'books' => array('scope' => 'https://www.googleapis.com/auth/books'), + 'latitude' => array( + 'scope' => array( + 'https://www.googleapis.com/auth/latitude.all.best', + 'https://www.googleapis.com/auth/latitude.all.city', + ) + ), + 'moderator' => array('scope' => 'https://www.googleapis.com/auth/moderator'), + 'oauth2' => array( + 'scope' => array( + 'https://www.googleapis.com/auth/userinfo.profile', + 'https://www.googleapis.com/auth/userinfo.email', + ) + ), + 'plus' => array('scope' => 'https://www.googleapis.com/auth/plus.me'), + 'siteVerification' => array('scope' => 'https://www.googleapis.com/auth/siteverification'), + 'tasks' => array('scope' => 'https://www.googleapis.com/auth/tasks'), + 'urlshortener' => array('scope' => 'https://www.googleapis.com/auth/urlshortener') + ) +); \ No newline at end of file diff --git a/inc/vendors/social-login/Google/contrib/apiAdsenseService.php b/inc/vendors/social-login/Google/contrib/apiAdsenseService.php new file mode 100755 index 00000000..3fdefaea --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiAdsenseService.php @@ -0,0 +1,1135 @@ + + * $adsenseService = new apiAdsenseService(...); + * $urlchannels = $adsenseService->urlchannels; + * + */ + class UrlchannelsServiceResource extends apiServiceResource { + + + /** + * List all URL channels in the specified ad client for this AdSense account. (urlchannels.list) + * @param string $adClientId Ad client for which to list URL channels. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token, used to page through URL channels. To retrieve the next page, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param int maxResults The maximum number of URL channels to include in the response, used for paging. + * @return UrlChannels + */ + public function listUrlchannels($adClientId, $optParams = array()) { + $params = array('adClientId' => $adClientId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new UrlChannels($data); + } else { + return $data; + } + } + } + + /** + * The "adunits" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $adunits = $adsenseService->adunits; + * + */ + class AdunitsServiceResource extends apiServiceResource { + + + /** + * List all ad units in the specified ad client for this AdSense account. (adunits.list) + * @param string $adClientId Ad client for which to list ad units. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool includeInactive Whether to include inactive ad units. Default: true. + * @opt_param string pageToken A continuation token, used to page through ad units. To retrieve the next page, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param int maxResults The maximum number of ad units to include in the response, used for paging. + * @return AdUnits + */ + public function listAdunits($adClientId, $optParams = array()) { + $params = array('adClientId' => $adClientId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new AdUnits($data); + } else { + return $data; + } + } + /** + * Gets the specified ad unit in the specified ad client. (adunits.get) + * @param string $adClientId Ad client for which to get the ad unit. + * @param string $adUnitId Ad unit to retrieve. + * @return AdUnit + */ + public function get($adClientId, $adUnitId, $optParams = array()) { + $params = array('adClientId' => $adClientId, 'adUnitId' => $adUnitId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new AdUnit($data); + } else { + return $data; + } + } + } + + + /** + * The "customchannels" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $customchannels = $adsenseService->customchannels; + * + */ + class AdunitsCustomchannelsServiceResource extends apiServiceResource { + + + /** + * List all custom channels which the specified ad unit belongs to. (customchannels.list) + * @param string $adClientId Ad client which contains the ad unit. + * @param string $adUnitId Ad unit for which to list custom channels. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token, used to page through custom channels. To retrieve the next page, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param int maxResults The maximum number of custom channels to include in the response, used for paging. + * @return CustomChannels + */ + public function listAdunitsCustomchannels($adClientId, $adUnitId, $optParams = array()) { + $params = array('adClientId' => $adClientId, 'adUnitId' => $adUnitId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CustomChannels($data); + } else { + return $data; + } + } + } + + /** + * The "adclients" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $adclients = $adsenseService->adclients; + * + */ + class AdclientsServiceResource extends apiServiceResource { + + + /** + * List all ad clients in this AdSense account. (adclients.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token, used to page through ad clients. To retrieve the next page, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param int maxResults The maximum number of ad clients to include in the response, used for paging. + * @return AdClients + */ + public function listAdclients($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new AdClients($data); + } else { + return $data; + } + } + } + + /** + * The "reports" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $reports = $adsenseService->reports; + * + */ + class ReportsServiceResource extends apiServiceResource { + + + /** + * Generate an AdSense report based on the report request sent in the query parameters. Returns the + * result as JSON; to retrieve output in CSV format specify "alt=csv" as a query parameter. + * (reports.generate) + * @param string $startDate Start of the date range to report on in "YYYY-MM-DD" format, inclusive. + * @param string $endDate End of the date range to report on in "YYYY-MM-DD" format, inclusive. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string sort The name of a dimension or metric to sort the resulting report on, optionally prefixed with "+" to sort ascending or "-" to sort descending. If no prefix is specified, the column is sorted ascending. + * @opt_param string locale Optional locale to use for translating report output to a local language. Defaults to "en_US" if not specified. + * @opt_param string metric Numeric columns to include in the report. + * @opt_param int maxResults The maximum number of rows of report data to return. + * @opt_param string filter Filters to be run on the report. + * @opt_param string currency Optional currency to use when reporting on monetary metrics. Defaults to the account's currency if not set. + * @opt_param int startIndex Index of the first row of report data to return. + * @opt_param string dimension Dimensions to base the report on. + * @opt_param string accountId Accounts upon which to report. + * @return AdsenseReportsGenerateResponse + */ + public function generate($startDate, $endDate, $optParams = array()) { + $params = array('startDate' => $startDate, 'endDate' => $endDate); + $params = array_merge($params, $optParams); + $data = $this->__call('generate', array($params)); + if ($this->useObjects()) { + return new AdsenseReportsGenerateResponse($data); + } else { + return $data; + } + } + } + + /** + * The "accounts" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $accounts = $adsenseService->accounts; + * + */ + class AccountsServiceResource extends apiServiceResource { + + + /** + * List all accounts available to this AdSense account. (accounts.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token, used to page through accounts. To retrieve the next page, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param int maxResults The maximum number of accounts to include in the response, used for paging. + * @return Accounts + */ + public function listAccounts($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Accounts($data); + } else { + return $data; + } + } + /** + * Get information about the selected AdSense account. (accounts.get) + * @param string $accountId Account to get information about. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool tree Whether the tree of sub accounts should be returned. + * @return Account + */ + public function get($accountId, $optParams = array()) { + $params = array('accountId' => $accountId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Account($data); + } else { + return $data; + } + } + } + + + /** + * The "urlchannels" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $urlchannels = $adsenseService->urlchannels; + * + */ + class AccountsUrlchannelsServiceResource extends apiServiceResource { + + + /** + * List all URL channels in the specified ad client for the specified account. (urlchannels.list) + * @param string $accountId Account to which the ad client belongs. + * @param string $adClientId Ad client for which to list URL channels. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token, used to page through URL channels. To retrieve the next page, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param int maxResults The maximum number of URL channels to include in the response, used for paging. + * @return UrlChannels + */ + public function listAccountsUrlchannels($accountId, $adClientId, $optParams = array()) { + $params = array('accountId' => $accountId, 'adClientId' => $adClientId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new UrlChannels($data); + } else { + return $data; + } + } + } + /** + * The "adunits" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $adunits = $adsenseService->adunits; + * + */ + class AccountsAdunitsServiceResource extends apiServiceResource { + + + /** + * List all ad units in the specified ad client for the specified account. (adunits.list) + * @param string $accountId Account to which the ad client belongs. + * @param string $adClientId Ad client for which to list ad units. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool includeInactive Whether to include inactive ad units. Default: true. + * @opt_param string pageToken A continuation token, used to page through ad units. To retrieve the next page, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param int maxResults The maximum number of ad units to include in the response, used for paging. + * @return AdUnits + */ + public function listAccountsAdunits($accountId, $adClientId, $optParams = array()) { + $params = array('accountId' => $accountId, 'adClientId' => $adClientId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new AdUnits($data); + } else { + return $data; + } + } + /** + * Gets the specified ad unit in the specified ad client for the specified account. (adunits.get) + * @param string $accountId Account to which the ad client belongs. + * @param string $adClientId Ad client for which to get the ad unit. + * @param string $adUnitId Ad unit to retrieve. + * @return AdUnit + */ + public function get($accountId, $adClientId, $adUnitId, $optParams = array()) { + $params = array('accountId' => $accountId, 'adClientId' => $adClientId, 'adUnitId' => $adUnitId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new AdUnit($data); + } else { + return $data; + } + } + } + + + /** + * The "customchannels" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $customchannels = $adsenseService->customchannels; + * + */ + class AccountsAdunitsCustomchannelsServiceResource extends apiServiceResource { + + + /** + * List all custom channels which the specified ad unit belongs to. (customchannels.list) + * @param string $accountId Account to which the ad client belongs. + * @param string $adClientId Ad client which contains the ad unit. + * @param string $adUnitId Ad unit for which to list custom channels. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token, used to page through custom channels. To retrieve the next page, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param int maxResults The maximum number of custom channels to include in the response, used for paging. + * @return CustomChannels + */ + public function listAccountsAdunitsCustomchannels($accountId, $adClientId, $adUnitId, $optParams = array()) { + $params = array('accountId' => $accountId, 'adClientId' => $adClientId, 'adUnitId' => $adUnitId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CustomChannels($data); + } else { + return $data; + } + } + } + /** + * The "adclients" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $adclients = $adsenseService->adclients; + * + */ + class AccountsAdclientsServiceResource extends apiServiceResource { + + + /** + * List all ad clients in the specified account. (adclients.list) + * @param string $accountId Account for which to list ad clients. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token, used to page through ad clients. To retrieve the next page, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param int maxResults The maximum number of ad clients to include in the response, used for paging. + * @return AdClients + */ + public function listAccountsAdclients($accountId, $optParams = array()) { + $params = array('accountId' => $accountId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new AdClients($data); + } else { + return $data; + } + } + } + /** + * The "reports" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $reports = $adsenseService->reports; + * + */ + class AccountsReportsServiceResource extends apiServiceResource { + + + /** + * Generate an AdSense report based on the report request sent in the query parameters. Returns the + * result as JSON; to retrieve output in CSV format specify "alt=csv" as a query parameter. + * (reports.generate) + * @param string $startDate Start of the date range to report on in "YYYY-MM-DD" format, inclusive. + * @param string $endDate End of the date range to report on in "YYYY-MM-DD" format, inclusive. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string accountId Account upon which to report. + * @opt_param string sort The name of a dimension or metric to sort the resulting report on, optionally prefixed with "+" to sort ascending or "-" to sort descending. If no prefix is specified, the column is sorted ascending. + * @opt_param string locale Optional locale to use for translating report output to a local language. Defaults to "en_US" if not specified. + * @opt_param string metric Numeric columns to include in the report. + * @opt_param int maxResults The maximum number of rows of report data to return. + * @opt_param string filter Filters to be run on the report. + * @opt_param string currency Optional currency to use when reporting on monetary metrics. Defaults to the account's currency if not set. + * @opt_param int startIndex Index of the first row of report data to return. + * @opt_param string dimension Dimensions to base the report on. + * @return AdsenseReportsGenerateResponse + */ + public function generate($startDate, $endDate, $optParams = array()) { + $params = array('startDate' => $startDate, 'endDate' => $endDate); + $params = array_merge($params, $optParams); + $data = $this->__call('generate', array($params)); + if ($this->useObjects()) { + return new AdsenseReportsGenerateResponse($data); + } else { + return $data; + } + } + } + /** + * The "customchannels" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $customchannels = $adsenseService->customchannels; + * + */ + class AccountsCustomchannelsServiceResource extends apiServiceResource { + + + /** + * List all custom channels in the specified ad client for the specified account. + * (customchannels.list) + * @param string $accountId Account to which the ad client belongs. + * @param string $adClientId Ad client for which to list custom channels. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token, used to page through custom channels. To retrieve the next page, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param int maxResults The maximum number of custom channels to include in the response, used for paging. + * @return CustomChannels + */ + public function listAccountsCustomchannels($accountId, $adClientId, $optParams = array()) { + $params = array('accountId' => $accountId, 'adClientId' => $adClientId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CustomChannels($data); + } else { + return $data; + } + } + /** + * Get the specified custom channel from the specified ad client for the specified account. + * (customchannels.get) + * @param string $accountId Account to which the ad client belongs. + * @param string $adClientId Ad client which contains the custom channel. + * @param string $customChannelId Custom channel to retrieve. + * @return CustomChannel + */ + public function get($accountId, $adClientId, $customChannelId, $optParams = array()) { + $params = array('accountId' => $accountId, 'adClientId' => $adClientId, 'customChannelId' => $customChannelId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new CustomChannel($data); + } else { + return $data; + } + } + } + + + /** + * The "adunits" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $adunits = $adsenseService->adunits; + * + */ + class AccountsCustomchannelsAdunitsServiceResource extends apiServiceResource { + + + /** + * List all ad units in the specified custom channel. (adunits.list) + * @param string $accountId Account to which the ad client belongs. + * @param string $adClientId Ad client which contains the custom channel. + * @param string $customChannelId Custom channel for which to list ad units. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool includeInactive Whether to include inactive ad units. Default: true. + * @opt_param int maxResults The maximum number of ad units to include in the response, used for paging. + * @opt_param string pageToken A continuation token, used to page through ad units. To retrieve the next page, set this parameter to the value of "nextPageToken" from the previous response. + * @return AdUnits + */ + public function listAccountsCustomchannelsAdunits($accountId, $adClientId, $customChannelId, $optParams = array()) { + $params = array('accountId' => $accountId, 'adClientId' => $adClientId, 'customChannelId' => $customChannelId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new AdUnits($data); + } else { + return $data; + } + } + } + + /** + * The "customchannels" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $customchannels = $adsenseService->customchannels; + * + */ + class CustomchannelsServiceResource extends apiServiceResource { + + + /** + * List all custom channels in the specified ad client for this AdSense account. + * (customchannels.list) + * @param string $adClientId Ad client for which to list custom channels. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token, used to page through custom channels. To retrieve the next page, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param int maxResults The maximum number of custom channels to include in the response, used for paging. + * @return CustomChannels + */ + public function listCustomchannels($adClientId, $optParams = array()) { + $params = array('adClientId' => $adClientId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CustomChannels($data); + } else { + return $data; + } + } + /** + * Get the specified custom channel from the specified ad client. (customchannels.get) + * @param string $adClientId Ad client which contains the custom channel. + * @param string $customChannelId Custom channel to retrieve. + * @return CustomChannel + */ + public function get($adClientId, $customChannelId, $optParams = array()) { + $params = array('adClientId' => $adClientId, 'customChannelId' => $customChannelId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new CustomChannel($data); + } else { + return $data; + } + } + } + + + /** + * The "adunits" collection of methods. + * Typical usage is: + * + * $adsenseService = new apiAdsenseService(...); + * $adunits = $adsenseService->adunits; + * + */ + class CustomchannelsAdunitsServiceResource extends apiServiceResource { + + + /** + * List all ad units in the specified custom channel. (adunits.list) + * @param string $adClientId Ad client which contains the custom channel. + * @param string $customChannelId Custom channel for which to list ad units. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool includeInactive Whether to include inactive ad units. Default: true. + * @opt_param string pageToken A continuation token, used to page through ad units. To retrieve the next page, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param int maxResults The maximum number of ad units to include in the response, used for paging. + * @return AdUnits + */ + public function listCustomchannelsAdunits($adClientId, $customChannelId, $optParams = array()) { + $params = array('adClientId' => $adClientId, 'customChannelId' => $customChannelId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new AdUnits($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Adsense (v1.1). + *

              + * Gives AdSense publishers access to their inventory and the ability to generate reports + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiAdsenseService extends apiService { + public $urlchannels; + public $adunits; + public $adunits_customchannels; + public $adunits_customchannels_customchannels; + public $adclients; + public $reports; + public $accounts; + public $accounts_urlchannels; + public $accounts_urlchannels_urlchannels; + public $accounts_urlchannels_adunits; + public $accounts_urlchannels_adclients; + public $accounts_urlchannels_reports; + public $accounts_urlchannels_customchannels; + public $accounts_adunits; + public $accounts_adunits_urlchannels; + public $accounts_adunits_adunits; + public $accounts_adunits_adclients; + public $accounts_adunits_reports; + public $accounts_adunits_customchannels; + public $accounts_adclients; + public $accounts_adclients_urlchannels; + public $accounts_adclients_adunits; + public $accounts_adclients_adclients; + public $accounts_adclients_reports; + public $accounts_adclients_customchannels; + public $accounts_reports; + public $accounts_reports_urlchannels; + public $accounts_reports_adunits; + public $accounts_reports_adclients; + public $accounts_reports_reports; + public $accounts_reports_customchannels; + public $accounts_customchannels; + public $accounts_customchannels_urlchannels; + public $accounts_customchannels_adunits; + public $accounts_customchannels_adclients; + public $accounts_customchannels_reports; + public $accounts_customchannels_customchannels; + public $customchannels; + public $customchannels_adunits; + public $customchannels_adunits_adunits; + /** + * Constructs the internal representation of the Adsense service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/adsense/v1.1/'; + $this->version = 'v1.1'; + $this->serviceName = 'adsense'; + + $apiClient->addService($this->serviceName, $this->version); + $this->urlchannels = new UrlchannelsServiceResource($this, $this->serviceName, 'urlchannels', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "adClientId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "int32", "maximum": "10000", "minimum": "0", "location": "query", "type": "integer"}}, "id": "adsense.urlchannels.list", "httpMethod": "GET", "path": "adclients/{adClientId}/urlchannels", "response": {"$ref": "UrlChannels"}}}}', true)); + $this->adunits = new AdunitsServiceResource($this, $this->serviceName, 'adunits', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"includeInactive": {"type": "boolean", "location": "query"}, "pageToken": {"type": "string", "location": "query"}, "adClientId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "int32", "maximum": "10000", "minimum": "0", "location": "query", "type": "integer"}}, "id": "adsense.adunits.list", "httpMethod": "GET", "path": "adclients/{adClientId}/adunits", "response": {"$ref": "AdUnits"}}, "get": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"adClientId": {"required": true, "type": "string", "location": "path"}, "adUnitId": {"required": true, "type": "string", "location": "path"}}, "id": "adsense.adunits.get", "httpMethod": "GET", "path": "adclients/{adClientId}/adunits/{adUnitId}", "response": {"$ref": "AdUnit"}}}}', true)); + $this->adunits_customchannels = new AdunitsCustomchannelsServiceResource($this, $this->serviceName, 'customchannels', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "adClientId": {"required": true, "type": "string", "location": "path"}, "adUnitId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "int32", "maximum": "10000", "minimum": "0", "location": "query", "type": "integer"}}, "id": "adsense.adunits.customchannels.list", "httpMethod": "GET", "path": "adclients/{adClientId}/adunits/{adUnitId}/customchannels", "response": {"$ref": "CustomChannels"}}}}', true)); + $this->adclients = new AdclientsServiceResource($this, $this->serviceName, 'adclients', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "maxResults": {"format": "int32", "maximum": "10000", "minimum": "0", "location": "query", "type": "integer"}}, "response": {"$ref": "AdClients"}, "httpMethod": "GET", "path": "adclients", "id": "adsense.adclients.list"}}}', true)); + $this->reports = new ReportsServiceResource($this, $this->serviceName, 'reports', json_decode('{"methods": {"generate": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"sort": {"repeated": true, "type": "string", "location": "query"}, "startDate": {"required": true, "type": "string", "location": "query"}, "endDate": {"required": true, "type": "string", "location": "query"}, "locale": {"type": "string", "location": "query"}, "metric": {"repeated": true, "type": "string", "location": "query"}, "maxResults": {"format": "int32", "maximum": "50000", "minimum": "0", "location": "query", "type": "integer"}, "filter": {"repeated": true, "type": "string", "location": "query"}, "currency": {"type": "string", "location": "query"}, "startIndex": {"format": "int32", "maximum": "5000", "minimum": "0", "location": "query", "type": "integer"}, "dimension": {"repeated": true, "type": "string", "location": "query"}, "accountId": {"repeated": true, "type": "string", "location": "query"}}, "id": "adsense.reports.generate", "httpMethod": "GET", "path": "reports", "response": {"$ref": "AdsenseReportsGenerateResponse"}}}}', true)); + $this->accounts = new AccountsServiceResource($this, $this->serviceName, 'accounts', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "maxResults": {"format": "int32", "maximum": "10000", "minimum": "0", "location": "query", "type": "integer"}}, "response": {"$ref": "Accounts"}, "httpMethod": "GET", "path": "accounts", "id": "adsense.accounts.list"}, "get": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"tree": {"type": "boolean", "location": "query"}, "accountId": {"required": true, "type": "string", "location": "path"}}, "id": "adsense.accounts.get", "httpMethod": "GET", "path": "accounts/{accountId}", "response": {"$ref": "Account"}}}}', true)); + $this->accounts_urlchannels = new AccountsUrlchannelsServiceResource($this, $this->serviceName, 'urlchannels', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "adClientId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "int32", "maximum": "10000", "minimum": "0", "location": "query", "type": "integer"}, "accountId": {"required": true, "type": "string", "location": "path"}}, "id": "adsense.accounts.urlchannels.list", "httpMethod": "GET", "path": "accounts/{accountId}/adclients/{adClientId}/urlchannels", "response": {"$ref": "UrlChannels"}}}}', true)); + $this->accounts_adunits = new AccountsAdunitsServiceResource($this, $this->serviceName, 'adunits', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"includeInactive": {"type": "boolean", "location": "query"}, "pageToken": {"type": "string", "location": "query"}, "adClientId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "int32", "maximum": "10000", "minimum": "0", "location": "query", "type": "integer"}, "accountId": {"required": true, "type": "string", "location": "path"}}, "id": "adsense.accounts.adunits.list", "httpMethod": "GET", "path": "accounts/{accountId}/adclients/{adClientId}/adunits", "response": {"$ref": "AdUnits"}}, "get": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"adClientId": {"required": true, "type": "string", "location": "path"}, "adUnitId": {"required": true, "type": "string", "location": "path"}, "accountId": {"required": true, "type": "string", "location": "path"}}, "id": "adsense.accounts.adunits.get", "httpMethod": "GET", "path": "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}", "response": {"$ref": "AdUnit"}}}}', true)); + $this->accounts_adunits_customchannels = new AccountsAdunitsCustomchannelsServiceResource($this, $this->serviceName, 'customchannels', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "adClientId": {"required": true, "type": "string", "location": "path"}, "adUnitId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "int32", "maximum": "10000", "minimum": "0", "location": "query", "type": "integer"}, "accountId": {"required": true, "type": "string", "location": "path"}}, "id": "adsense.accounts.adunits.customchannels.list", "httpMethod": "GET", "path": "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/customchannels", "response": {"$ref": "CustomChannels"}}}}', true)); + $this->accounts_adclients = new AccountsAdclientsServiceResource($this, $this->serviceName, 'adclients', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "maxResults": {"format": "int32", "maximum": "10000", "minimum": "0", "location": "query", "type": "integer"}, "accountId": {"required": true, "type": "string", "location": "path"}}, "id": "adsense.accounts.adclients.list", "httpMethod": "GET", "path": "accounts/{accountId}/adclients", "response": {"$ref": "AdClients"}}}}', true)); + $this->accounts_reports = new AccountsReportsServiceResource($this, $this->serviceName, 'reports', json_decode('{"methods": {"generate": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"sort": {"repeated": true, "type": "string", "location": "query"}, "startDate": {"required": true, "type": "string", "location": "query"}, "endDate": {"required": true, "type": "string", "location": "query"}, "locale": {"type": "string", "location": "query"}, "metric": {"repeated": true, "type": "string", "location": "query"}, "maxResults": {"format": "int32", "maximum": "50000", "minimum": "0", "location": "query", "type": "integer"}, "filter": {"repeated": true, "type": "string", "location": "query"}, "currency": {"type": "string", "location": "query"}, "startIndex": {"format": "int32", "maximum": "5000", "minimum": "0", "location": "query", "type": "integer"}, "dimension": {"repeated": true, "type": "string", "location": "query"}, "accountId": {"type": "string", "location": "path"}}, "id": "adsense.accounts.reports.generate", "httpMethod": "GET", "path": "accounts/{accountId}/reports", "response": {"$ref": "AdsenseReportsGenerateResponse"}}}}', true)); + $this->accounts_customchannels = new AccountsCustomchannelsServiceResource($this, $this->serviceName, 'customchannels', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "adClientId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "int32", "maximum": "10000", "minimum": "0", "location": "query", "type": "integer"}, "accountId": {"required": true, "type": "string", "location": "path"}}, "id": "adsense.accounts.customchannels.list", "httpMethod": "GET", "path": "accounts/{accountId}/adclients/{adClientId}/customchannels", "response": {"$ref": "CustomChannels"}}, "get": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"customChannelId": {"required": true, "type": "string", "location": "path"}, "adClientId": {"required": true, "type": "string", "location": "path"}, "accountId": {"required": true, "type": "string", "location": "path"}}, "id": "adsense.accounts.customchannels.get", "httpMethod": "GET", "path": "accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}", "response": {"$ref": "CustomChannel"}}}}', true)); + $this->accounts_customchannels_adunits = new AccountsCustomchannelsAdunitsServiceResource($this, $this->serviceName, 'adunits', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"includeInactive": {"type": "boolean", "location": "query"}, "customChannelId": {"required": true, "type": "string", "location": "path"}, "adClientId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "int32", "maximum": "10000", "minimum": "0", "location": "query", "type": "integer"}, "pageToken": {"type": "string", "location": "query"}, "accountId": {"required": true, "type": "string", "location": "path"}}, "id": "adsense.accounts.customchannels.adunits.list", "httpMethod": "GET", "path": "accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}/adunits", "response": {"$ref": "AdUnits"}}}}', true)); + $this->customchannels = new CustomchannelsServiceResource($this, $this->serviceName, 'customchannels', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "adClientId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "int32", "maximum": "10000", "minimum": "0", "location": "query", "type": "integer"}}, "id": "adsense.customchannels.list", "httpMethod": "GET", "path": "adclients/{adClientId}/customchannels", "response": {"$ref": "CustomChannels"}}, "get": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"customChannelId": {"required": true, "type": "string", "location": "path"}, "adClientId": {"required": true, "type": "string", "location": "path"}}, "id": "adsense.customchannels.get", "httpMethod": "GET", "path": "adclients/{adClientId}/customchannels/{customChannelId}", "response": {"$ref": "CustomChannel"}}}}', true)); + $this->customchannels_adunits = new CustomchannelsAdunitsServiceResource($this, $this->serviceName, 'adunits', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/adsense", "https://www.googleapis.com/auth/adsense.readonly"], "parameters": {"includeInactive": {"type": "boolean", "location": "query"}, "pageToken": {"type": "string", "location": "query"}, "customChannelId": {"required": true, "type": "string", "location": "path"}, "adClientId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "int32", "maximum": "10000", "minimum": "0", "location": "query", "type": "integer"}}, "id": "adsense.customchannels.adunits.list", "httpMethod": "GET", "path": "adclients/{adClientId}/customchannels/{customChannelId}/adunits", "response": {"$ref": "AdUnits"}}}}', true)); + } +} + +class Account extends apiModel { + public $kind; + public $id; + protected $__subAccountsType = 'Account'; + protected $__subAccountsDataType = 'array'; + public $subAccounts; + public $name; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSubAccounts(/* array(Account) */ $subAccounts) { + $this->assertIsArray($subAccounts, 'Account', __METHOD__); + $this->subAccounts = $subAccounts; + } + public function getSubAccounts() { + return $this->subAccounts; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class Accounts extends apiModel { + public $nextPageToken; + protected $__itemsType = 'Account'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $etag; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(Account) */ $items) { + $this->assertIsArray($items, 'Account', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } +} + +class AdClient extends apiModel { + public $productCode; + public $kind; + public $id; + public $supportsReporting; + public function setProductCode($productCode) { + $this->productCode = $productCode; + } + public function getProductCode() { + return $this->productCode; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSupportsReporting($supportsReporting) { + $this->supportsReporting = $supportsReporting; + } + public function getSupportsReporting() { + return $this->supportsReporting; + } +} + +class AdClients extends apiModel { + public $nextPageToken; + protected $__itemsType = 'AdClient'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $etag; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(AdClient) */ $items) { + $this->assertIsArray($items, 'AdClient', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } +} + +class AdUnit extends apiModel { + public $status; + public $kind; + public $code; + public $id; + public $name; + public function setStatus($status) { + $this->status = $status; + } + public function getStatus() { + return $this->status; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setCode($code) { + $this->code = $code; + } + public function getCode() { + return $this->code; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class AdUnits extends apiModel { + public $nextPageToken; + protected $__itemsType = 'AdUnit'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $etag; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(AdUnit) */ $items) { + $this->assertIsArray($items, 'AdUnit', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } +} + +class AdsenseReportsGenerateResponse extends apiModel { + public $kind; + public $rows; + public $warnings; + public $totals; + protected $__headersType = 'AdsenseReportsGenerateResponseHeaders'; + protected $__headersDataType = 'array'; + public $headers; + public $totalMatchedRows; + public $averages; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setRows(/* array(string) */ $rows) { + $this->assertIsArray($rows, 'string', __METHOD__); + $this->rows = $rows; + } + public function getRows() { + return $this->rows; + } + public function setWarnings(/* array(string) */ $warnings) { + $this->assertIsArray($warnings, 'string', __METHOD__); + $this->warnings = $warnings; + } + public function getWarnings() { + return $this->warnings; + } + public function setTotals(/* array(string) */ $totals) { + $this->assertIsArray($totals, 'string', __METHOD__); + $this->totals = $totals; + } + public function getTotals() { + return $this->totals; + } + public function setHeaders(/* array(AdsenseReportsGenerateResponseHeaders) */ $headers) { + $this->assertIsArray($headers, 'AdsenseReportsGenerateResponseHeaders', __METHOD__); + $this->headers = $headers; + } + public function getHeaders() { + return $this->headers; + } + public function setTotalMatchedRows($totalMatchedRows) { + $this->totalMatchedRows = $totalMatchedRows; + } + public function getTotalMatchedRows() { + return $this->totalMatchedRows; + } + public function setAverages(/* array(string) */ $averages) { + $this->assertIsArray($averages, 'string', __METHOD__); + $this->averages = $averages; + } + public function getAverages() { + return $this->averages; + } +} + +class AdsenseReportsGenerateResponseHeaders extends apiModel { + public $currency; + public $type; + public $name; + public function setCurrency($currency) { + $this->currency = $currency; + } + public function getCurrency() { + return $this->currency; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class CustomChannel extends apiModel { + public $kind; + public $code; + protected $__targetingInfoType = 'CustomChannelTargetingInfo'; + protected $__targetingInfoDataType = ''; + public $targetingInfo; + public $id; + public $name; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setCode($code) { + $this->code = $code; + } + public function getCode() { + return $this->code; + } + public function setTargetingInfo(CustomChannelTargetingInfo $targetingInfo) { + $this->targetingInfo = $targetingInfo; + } + public function getTargetingInfo() { + return $this->targetingInfo; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class CustomChannelTargetingInfo extends apiModel { + public $location; + public $adsAppearOn; + public $siteLanguage; + public $description; + public function setLocation($location) { + $this->location = $location; + } + public function getLocation() { + return $this->location; + } + public function setAdsAppearOn($adsAppearOn) { + $this->adsAppearOn = $adsAppearOn; + } + public function getAdsAppearOn() { + return $this->adsAppearOn; + } + public function setSiteLanguage($siteLanguage) { + $this->siteLanguage = $siteLanguage; + } + public function getSiteLanguage() { + return $this->siteLanguage; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } +} + +class CustomChannels extends apiModel { + public $nextPageToken; + protected $__itemsType = 'CustomChannel'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $etag; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(CustomChannel) */ $items) { + $this->assertIsArray($items, 'CustomChannel', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } +} + +class UrlChannel extends apiModel { + public $kind; + public $id; + public $urlPattern; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setUrlPattern($urlPattern) { + $this->urlPattern = $urlPattern; + } + public function getUrlPattern() { + return $this->urlPattern; + } +} + +class UrlChannels extends apiModel { + public $nextPageToken; + protected $__itemsType = 'UrlChannel'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $etag; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(UrlChannel) */ $items) { + $this->assertIsArray($items, 'UrlChannel', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiAnalyticsService.php b/inc/vendors/social-login/Google/contrib/apiAnalyticsService.php new file mode 100755 index 00000000..61b14f06 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiAnalyticsService.php @@ -0,0 +1,1553 @@ + + * $analyticsService = new apiAnalyticsService(...); + * $management = $analyticsService->management; + *
              + */ + class ManagementServiceResource extends apiServiceResource { + + + } + + + /** + * The "webproperties" collection of methods. + * Typical usage is: + * + * $analyticsService = new apiAnalyticsService(...); + * $webproperties = $analyticsService->webproperties; + * + */ + class ManagementWebpropertiesServiceResource extends apiServiceResource { + + + /** + * Lists web properties to which the user has access. (webproperties.list) + * @param string $accountId Account ID for the web properties to retrieve. Can either be a specific account ID or '~all', which refers to all the accounts to which user has access. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param int max-results The maximum number of entries to include in this response. + * @opt_param int start-index An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter. + * @return Webproperties + */ + public function listManagementWebproperties($accountId, $optParams = array()) { + $params = array('accountId' => $accountId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Webproperties($data); + } else { + return $data; + } + } + } + /** + * The "segments" collection of methods. + * Typical usage is: + * + * $analyticsService = new apiAnalyticsService(...); + * $segments = $analyticsService->segments; + * + */ + class ManagementSegmentsServiceResource extends apiServiceResource { + + + /** + * Lists advanced segments to which the user has access. (segments.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param int max-results The maximum number of entries to include in this response. + * @opt_param int start-index An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter. + * @return Segments + */ + public function listManagementSegments($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Segments($data); + } else { + return $data; + } + } + } + /** + * The "accounts" collection of methods. + * Typical usage is: + * + * $analyticsService = new apiAnalyticsService(...); + * $accounts = $analyticsService->accounts; + * + */ + class ManagementAccountsServiceResource extends apiServiceResource { + + + /** + * Lists all accounts to which the user has access. (accounts.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param int max-results The maximum number of entries to include in this response. + * @opt_param int start-index An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter. + * @return Accounts + */ + public function listManagementAccounts($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Accounts($data); + } else { + return $data; + } + } + } + /** + * The "goals" collection of methods. + * Typical usage is: + * + * $analyticsService = new apiAnalyticsService(...); + * $goals = $analyticsService->goals; + * + */ + class ManagementGoalsServiceResource extends apiServiceResource { + + + /** + * Lists goals to which the user has access. (goals.list) + * @param string $accountId Account ID for the web properties to retrieve. Can either be a specific account ID or '~all', which refers to all the accounts to which the user has access. + * @param string $webPropertyId Web property ID for the web properties to retrieve. Can either be a specific web property ID or '~all', which refers to all the web properties to which the user has access. + * @param string $profileId Profile ID for the web properties to retrieve. Can either be a specific profile ID or '~all', which refers to all the profiles to which the user has access. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param int max-results The maximum number of entries to include in this response. + * @opt_param int start-index An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter. + * @return Goals + */ + public function listManagementGoals($accountId, $webPropertyId, $profileId, $optParams = array()) { + $params = array('accountId' => $accountId, 'webPropertyId' => $webPropertyId, 'profileId' => $profileId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Goals($data); + } else { + return $data; + } + } + } + /** + * The "profiles" collection of methods. + * Typical usage is: + * + * $analyticsService = new apiAnalyticsService(...); + * $profiles = $analyticsService->profiles; + * + */ + class ManagementProfilesServiceResource extends apiServiceResource { + + + /** + * Lists profiles to which the user has access. (profiles.list) + * @param string $accountId Account ID for the web properties to retrieve. Can either be a specific account ID or '~all', which refers to all the accounts to which the user has access. + * @param string $webPropertyId Web property ID for the web properties to retrieve. Can either be a specific web property ID or '~all', which refers to all the web properties to which the user has access. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param int max-results The maximum number of entries to include in this response. + * @opt_param int start-index An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter. + * @return Profiles + */ + public function listManagementProfiles($accountId, $webPropertyId, $optParams = array()) { + $params = array('accountId' => $accountId, 'webPropertyId' => $webPropertyId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Profiles($data); + } else { + return $data; + } + } + } + + /** + * The "data" collection of methods. + * Typical usage is: + * + * $analyticsService = new apiAnalyticsService(...); + * $data = $analyticsService->data; + * + */ + class DataServiceResource extends apiServiceResource { + + + } + + + /** + * The "ga" collection of methods. + * Typical usage is: + * + * $analyticsService = new apiAnalyticsService(...); + * $ga = $analyticsService->ga; + * + */ + class DataGaServiceResource extends apiServiceResource { + + + /** + * Returns Analytics data for a profile. (ga.get) + * @param string $ids Unique table ID for retrieving Analytics data. Table ID is of the form ga:XXXX, where XXXX is the Analytics profile ID. + * @param string $start_date Start date for fetching Analytics data. All requests should specify a start date formatted as YYYY-MM-DD. + * @param string $end_date End date for fetching Analytics data. All requests should specify an end date formatted as YYYY-MM-DD. + * @param string $metrics A comma-separated list of Analytics metrics. E.g., 'ga:visits,ga:pageviews'. At least one metric must be specified. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param int max-results The maximum number of entries to include in this feed. + * @opt_param string sort A comma-separated list of dimensions or metrics that determine the sort order for Analytics data. + * @opt_param string dimensions A comma-separated list of Analytics dimensions. E.g., 'ga:browser,ga:city'. + * @opt_param int start-index An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter. + * @opt_param string segment An Analytics advanced segment to be applied to data. + * @opt_param string filters A comma-separated list of dimension or metric filters to be applied to Analytics data. + * @return GaData + */ + public function get($ids, $start_date, $end_date, $metrics, $optParams = array()) { + $params = array('ids' => $ids, 'start-date' => $start_date, 'end-date' => $end_date, 'metrics' => $metrics); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new GaData($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Analytics (v3). + *

              + * View and manage your Google Analytics data + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiAnalyticsService extends apiService { + public $management_webproperties; + public $management_segments; + public $management_accounts; + public $management_goals; + public $management_profiles; + public $data_ga; + /** + * Constructs the internal representation of the Analytics service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/analytics/v3/'; + $this->version = 'v3'; + $this->serviceName = 'analytics'; + + $apiClient->addService($this->serviceName, $this->version); + $this->management_webproperties = new ManagementWebpropertiesServiceResource($this, $this->serviceName, 'webproperties', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/analytics.readonly"], "parameters": {"max-results": {"format": "int32", "type": "integer", "location": "query"}, "start-index": {"format": "int32", "minimum": "1", "type": "integer", "location": "query"}, "accountId": {"required": true, "type": "string", "location": "path"}}, "id": "analytics.management.webproperties.list", "httpMethod": "GET", "path": "management/accounts/{accountId}/webproperties", "response": {"$ref": "Webproperties"}}}}', true)); + $this->management_segments = new ManagementSegmentsServiceResource($this, $this->serviceName, 'segments', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/analytics.readonly"], "parameters": {"max-results": {"format": "int32", "type": "integer", "location": "query"}, "start-index": {"format": "int32", "minimum": "1", "type": "integer", "location": "query"}}, "response": {"$ref": "Segments"}, "httpMethod": "GET", "path": "management/segments", "id": "analytics.management.segments.list"}}}', true)); + $this->management_accounts = new ManagementAccountsServiceResource($this, $this->serviceName, 'accounts', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/analytics.readonly"], "parameters": {"max-results": {"format": "int32", "type": "integer", "location": "query"}, "start-index": {"format": "int32", "minimum": "1", "type": "integer", "location": "query"}}, "response": {"$ref": "Accounts"}, "httpMethod": "GET", "path": "management/accounts", "id": "analytics.management.accounts.list"}}}', true)); + $this->management_goals = new ManagementGoalsServiceResource($this, $this->serviceName, 'goals', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/analytics.readonly"], "parameters": {"max-results": {"format": "int32", "type": "integer", "location": "query"}, "profileId": {"required": true, "type": "string", "location": "path"}, "start-index": {"format": "int32", "minimum": "1", "type": "integer", "location": "query"}, "accountId": {"required": true, "type": "string", "location": "path"}, "webPropertyId": {"required": true, "type": "string", "location": "path"}}, "id": "analytics.management.goals.list", "httpMethod": "GET", "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals", "response": {"$ref": "Goals"}}}}', true)); + $this->management_profiles = new ManagementProfilesServiceResource($this, $this->serviceName, 'profiles', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/analytics.readonly"], "parameters": {"max-results": {"format": "int32", "type": "integer", "location": "query"}, "start-index": {"format": "int32", "minimum": "1", "type": "integer", "location": "query"}, "accountId": {"required": true, "type": "string", "location": "path"}, "webPropertyId": {"required": true, "type": "string", "location": "path"}}, "id": "analytics.management.profiles.list", "httpMethod": "GET", "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles", "response": {"$ref": "Profiles"}}}}', true)); + $this->data_ga = new DataGaServiceResource($this, $this->serviceName, 'ga', json_decode('{"methods": {"get": {"scopes": ["https://www.googleapis.com/auth/analytics.readonly"], "parameters": {"max-results": {"format": "int32", "type": "integer", "location": "query"}, "sort": {"type": "string", "location": "query"}, "dimensions": {"type": "string", "location": "query"}, "start-date": {"required": true, "type": "string", "location": "query"}, "start-index": {"format": "int32", "minimum": "1", "type": "integer", "location": "query"}, "end-date": {"required": true, "type": "string", "location": "query"}, "ids": {"required": true, "type": "string", "location": "query"}, "metrics": {"required": true, "type": "string", "location": "query"}, "filters": {"type": "string", "location": "query"}, "segment": {"type": "string", "location": "query"}}, "id": "analytics.data.ga.get", "httpMethod": "GET", "path": "data/ga", "response": {"$ref": "GaData"}}}}', true)); + } +} + +class Account extends apiModel { + public $kind; + public $name; + public $created; + public $updated; + protected $__childLinkType = 'AccountChildLink'; + protected $__childLinkDataType = ''; + public $childLink; + public $id; + public $selfLink; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setCreated($created) { + $this->created = $created; + } + public function getCreated() { + return $this->created; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setChildLink(AccountChildLink $childLink) { + $this->childLink = $childLink; + } + public function getChildLink() { + return $this->childLink; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class AccountChildLink extends apiModel { + public $href; + public $type; + public function setHref($href) { + $this->href = $href; + } + public function getHref() { + return $this->href; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } +} + +class Accounts extends apiModel { + public $username; + public $kind; + protected $__itemsType = 'Account'; + protected $__itemsDataType = 'array'; + public $items; + public $itemsPerPage; + public $previousLink; + public $startIndex; + public $nextLink; + public $totalResults; + public function setUsername($username) { + $this->username = $username; + } + public function getUsername() { + return $this->username; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setItems(/* array(Account) */ $items) { + $this->assertIsArray($items, 'Account', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setItemsPerPage($itemsPerPage) { + $this->itemsPerPage = $itemsPerPage; + } + public function getItemsPerPage() { + return $this->itemsPerPage; + } + public function setPreviousLink($previousLink) { + $this->previousLink = $previousLink; + } + public function getPreviousLink() { + return $this->previousLink; + } + public function setStartIndex($startIndex) { + $this->startIndex = $startIndex; + } + public function getStartIndex() { + return $this->startIndex; + } + public function setNextLink($nextLink) { + $this->nextLink = $nextLink; + } + public function getNextLink() { + return $this->nextLink; + } + public function setTotalResults($totalResults) { + $this->totalResults = $totalResults; + } + public function getTotalResults() { + return $this->totalResults; + } +} + +class GaData extends apiModel { + public $kind; + public $rows; + public $containsSampledData; + public $totalResults; + public $itemsPerPage; + public $totalsForAllResults; + public $nextLink; + public $id; + protected $__queryType = 'GaDataQuery'; + protected $__queryDataType = ''; + public $query; + public $previousLink; + protected $__profileInfoType = 'GaDataProfileInfo'; + protected $__profileInfoDataType = ''; + public $profileInfo; + protected $__columnHeadersType = 'GaDataColumnHeaders'; + protected $__columnHeadersDataType = 'array'; + public $columnHeaders; + public $selfLink; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setRows(/* array(string) */ $rows) { + $this->assertIsArray($rows, 'string', __METHOD__); + $this->rows = $rows; + } + public function getRows() { + return $this->rows; + } + public function setContainsSampledData($containsSampledData) { + $this->containsSampledData = $containsSampledData; + } + public function getContainsSampledData() { + return $this->containsSampledData; + } + public function setTotalResults($totalResults) { + $this->totalResults = $totalResults; + } + public function getTotalResults() { + return $this->totalResults; + } + public function setItemsPerPage($itemsPerPage) { + $this->itemsPerPage = $itemsPerPage; + } + public function getItemsPerPage() { + return $this->itemsPerPage; + } + public function setTotalsForAllResults($totalsForAllResults) { + $this->totalsForAllResults = $totalsForAllResults; + } + public function getTotalsForAllResults() { + return $this->totalsForAllResults; + } + public function setNextLink($nextLink) { + $this->nextLink = $nextLink; + } + public function getNextLink() { + return $this->nextLink; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setQuery(GaDataQuery $query) { + $this->query = $query; + } + public function getQuery() { + return $this->query; + } + public function setPreviousLink($previousLink) { + $this->previousLink = $previousLink; + } + public function getPreviousLink() { + return $this->previousLink; + } + public function setProfileInfo(GaDataProfileInfo $profileInfo) { + $this->profileInfo = $profileInfo; + } + public function getProfileInfo() { + return $this->profileInfo; + } + public function setColumnHeaders(/* array(GaDataColumnHeaders) */ $columnHeaders) { + $this->assertIsArray($columnHeaders, 'GaDataColumnHeaders', __METHOD__); + $this->columnHeaders = $columnHeaders; + } + public function getColumnHeaders() { + return $this->columnHeaders; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class GaDataColumnHeaders extends apiModel { + public $dataType; + public $columnType; + public $name; + public function setDataType($dataType) { + $this->dataType = $dataType; + } + public function getDataType() { + return $this->dataType; + } + public function setColumnType($columnType) { + $this->columnType = $columnType; + } + public function getColumnType() { + return $this->columnType; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class GaDataProfileInfo extends apiModel { + public $webPropertyId; + public $internalWebPropertyId; + public $tableId; + public $profileId; + public $profileName; + public $accountId; + public function setWebPropertyId($webPropertyId) { + $this->webPropertyId = $webPropertyId; + } + public function getWebPropertyId() { + return $this->webPropertyId; + } + public function setInternalWebPropertyId($internalWebPropertyId) { + $this->internalWebPropertyId = $internalWebPropertyId; + } + public function getInternalWebPropertyId() { + return $this->internalWebPropertyId; + } + public function setTableId($tableId) { + $this->tableId = $tableId; + } + public function getTableId() { + return $this->tableId; + } + public function setProfileId($profileId) { + $this->profileId = $profileId; + } + public function getProfileId() { + return $this->profileId; + } + public function setProfileName($profileName) { + $this->profileName = $profileName; + } + public function getProfileName() { + return $this->profileName; + } + public function setAccountId($accountId) { + $this->accountId = $accountId; + } + public function getAccountId() { + return $this->accountId; + } +} + +class GaDataQuery extends apiModel { + public $max_results; + public $sort; + public $dimensions; + public $start_date; + public $start_index; + public $segment; + public $ids; + public $metrics; + public $filters; + public $end_date; + public function setMax_results($max_results) { + $this->max_results = $max_results; + } + public function getMax_results() { + return $this->max_results; + } + public function setSort(/* array(string) */ $sort) { + $this->assertIsArray($sort, 'string', __METHOD__); + $this->sort = $sort; + } + public function getSort() { + return $this->sort; + } + public function setDimensions($dimensions) { + $this->dimensions = $dimensions; + } + public function getDimensions() { + return $this->dimensions; + } + public function setStart_date($start_date) { + $this->start_date = $start_date; + } + public function getStart_date() { + return $this->start_date; + } + public function setStart_index($start_index) { + $this->start_index = $start_index; + } + public function getStart_index() { + return $this->start_index; + } + public function setSegment($segment) { + $this->segment = $segment; + } + public function getSegment() { + return $this->segment; + } + public function setIds($ids) { + $this->ids = $ids; + } + public function getIds() { + return $this->ids; + } + public function setMetrics(/* array(string) */ $metrics) { + $this->assertIsArray($metrics, 'string', __METHOD__); + $this->metrics = $metrics; + } + public function getMetrics() { + return $this->metrics; + } + public function setFilters($filters) { + $this->filters = $filters; + } + public function getFilters() { + return $this->filters; + } + public function setEnd_date($end_date) { + $this->end_date = $end_date; + } + public function getEnd_date() { + return $this->end_date; + } +} + +class Goal extends apiModel { + public $kind; + protected $__visitTimeOnSiteDetailsType = 'GoalVisitTimeOnSiteDetails'; + protected $__visitTimeOnSiteDetailsDataType = ''; + public $visitTimeOnSiteDetails; + public $name; + public $created; + protected $__urlDestinationDetailsType = 'GoalUrlDestinationDetails'; + protected $__urlDestinationDetailsDataType = ''; + public $urlDestinationDetails; + public $updated; + public $value; + protected $__visitNumPagesDetailsType = 'GoalVisitNumPagesDetails'; + protected $__visitNumPagesDetailsDataType = ''; + public $visitNumPagesDetails; + public $internalWebPropertyId; + protected $__eventDetailsType = 'GoalEventDetails'; + protected $__eventDetailsDataType = ''; + public $eventDetails; + public $webPropertyId; + public $active; + public $profileId; + protected $__parentLinkType = 'GoalParentLink'; + protected $__parentLinkDataType = ''; + public $parentLink; + public $type; + public $id; + public $selfLink; + public $accountId; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setVisitTimeOnSiteDetails(GoalVisitTimeOnSiteDetails $visitTimeOnSiteDetails) { + $this->visitTimeOnSiteDetails = $visitTimeOnSiteDetails; + } + public function getVisitTimeOnSiteDetails() { + return $this->visitTimeOnSiteDetails; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setCreated($created) { + $this->created = $created; + } + public function getCreated() { + return $this->created; + } + public function setUrlDestinationDetails(GoalUrlDestinationDetails $urlDestinationDetails) { + $this->urlDestinationDetails = $urlDestinationDetails; + } + public function getUrlDestinationDetails() { + return $this->urlDestinationDetails; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setValue($value) { + $this->value = $value; + } + public function getValue() { + return $this->value; + } + public function setVisitNumPagesDetails(GoalVisitNumPagesDetails $visitNumPagesDetails) { + $this->visitNumPagesDetails = $visitNumPagesDetails; + } + public function getVisitNumPagesDetails() { + return $this->visitNumPagesDetails; + } + public function setInternalWebPropertyId($internalWebPropertyId) { + $this->internalWebPropertyId = $internalWebPropertyId; + } + public function getInternalWebPropertyId() { + return $this->internalWebPropertyId; + } + public function setEventDetails(GoalEventDetails $eventDetails) { + $this->eventDetails = $eventDetails; + } + public function getEventDetails() { + return $this->eventDetails; + } + public function setWebPropertyId($webPropertyId) { + $this->webPropertyId = $webPropertyId; + } + public function getWebPropertyId() { + return $this->webPropertyId; + } + public function setActive($active) { + $this->active = $active; + } + public function getActive() { + return $this->active; + } + public function setProfileId($profileId) { + $this->profileId = $profileId; + } + public function getProfileId() { + return $this->profileId; + } + public function setParentLink(GoalParentLink $parentLink) { + $this->parentLink = $parentLink; + } + public function getParentLink() { + return $this->parentLink; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } + public function setAccountId($accountId) { + $this->accountId = $accountId; + } + public function getAccountId() { + return $this->accountId; + } +} + +class GoalEventDetails extends apiModel { + protected $__eventConditionsType = 'GoalEventDetailsEventConditions'; + protected $__eventConditionsDataType = 'array'; + public $eventConditions; + public $useEventValue; + public function setEventConditions(/* array(GoalEventDetailsEventConditions) */ $eventConditions) { + $this->assertIsArray($eventConditions, 'GoalEventDetailsEventConditions', __METHOD__); + $this->eventConditions = $eventConditions; + } + public function getEventConditions() { + return $this->eventConditions; + } + public function setUseEventValue($useEventValue) { + $this->useEventValue = $useEventValue; + } + public function getUseEventValue() { + return $this->useEventValue; + } +} + +class GoalEventDetailsEventConditions extends apiModel { + public $type; + public $matchType; + public $expression; + public $comparisonType; + public $comparisonValue; + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setMatchType($matchType) { + $this->matchType = $matchType; + } + public function getMatchType() { + return $this->matchType; + } + public function setExpression($expression) { + $this->expression = $expression; + } + public function getExpression() { + return $this->expression; + } + public function setComparisonType($comparisonType) { + $this->comparisonType = $comparisonType; + } + public function getComparisonType() { + return $this->comparisonType; + } + public function setComparisonValue($comparisonValue) { + $this->comparisonValue = $comparisonValue; + } + public function getComparisonValue() { + return $this->comparisonValue; + } +} + +class GoalParentLink extends apiModel { + public $href; + public $type; + public function setHref($href) { + $this->href = $href; + } + public function getHref() { + return $this->href; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } +} + +class GoalUrlDestinationDetails extends apiModel { + public $url; + public $caseSensitive; + public $matchType; + protected $__stepsType = 'GoalUrlDestinationDetailsSteps'; + protected $__stepsDataType = 'array'; + public $steps; + public $firstStepRequired; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setCaseSensitive($caseSensitive) { + $this->caseSensitive = $caseSensitive; + } + public function getCaseSensitive() { + return $this->caseSensitive; + } + public function setMatchType($matchType) { + $this->matchType = $matchType; + } + public function getMatchType() { + return $this->matchType; + } + public function setSteps(/* array(GoalUrlDestinationDetailsSteps) */ $steps) { + $this->assertIsArray($steps, 'GoalUrlDestinationDetailsSteps', __METHOD__); + $this->steps = $steps; + } + public function getSteps() { + return $this->steps; + } + public function setFirstStepRequired($firstStepRequired) { + $this->firstStepRequired = $firstStepRequired; + } + public function getFirstStepRequired() { + return $this->firstStepRequired; + } +} + +class GoalUrlDestinationDetailsSteps extends apiModel { + public $url; + public $name; + public $number; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setNumber($number) { + $this->number = $number; + } + public function getNumber() { + return $this->number; + } +} + +class GoalVisitNumPagesDetails extends apiModel { + public $comparisonType; + public $comparisonValue; + public function setComparisonType($comparisonType) { + $this->comparisonType = $comparisonType; + } + public function getComparisonType() { + return $this->comparisonType; + } + public function setComparisonValue($comparisonValue) { + $this->comparisonValue = $comparisonValue; + } + public function getComparisonValue() { + return $this->comparisonValue; + } +} + +class GoalVisitTimeOnSiteDetails extends apiModel { + public $comparisonType; + public $comparisonValue; + public function setComparisonType($comparisonType) { + $this->comparisonType = $comparisonType; + } + public function getComparisonType() { + return $this->comparisonType; + } + public function setComparisonValue($comparisonValue) { + $this->comparisonValue = $comparisonValue; + } + public function getComparisonValue() { + return $this->comparisonValue; + } +} + +class Goals extends apiModel { + public $username; + public $kind; + protected $__itemsType = 'Goal'; + protected $__itemsDataType = 'array'; + public $items; + public $itemsPerPage; + public $previousLink; + public $startIndex; + public $nextLink; + public $totalResults; + public function setUsername($username) { + $this->username = $username; + } + public function getUsername() { + return $this->username; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setItems(/* array(Goal) */ $items) { + $this->assertIsArray($items, 'Goal', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setItemsPerPage($itemsPerPage) { + $this->itemsPerPage = $itemsPerPage; + } + public function getItemsPerPage() { + return $this->itemsPerPage; + } + public function setPreviousLink($previousLink) { + $this->previousLink = $previousLink; + } + public function getPreviousLink() { + return $this->previousLink; + } + public function setStartIndex($startIndex) { + $this->startIndex = $startIndex; + } + public function getStartIndex() { + return $this->startIndex; + } + public function setNextLink($nextLink) { + $this->nextLink = $nextLink; + } + public function getNextLink() { + return $this->nextLink; + } + public function setTotalResults($totalResults) { + $this->totalResults = $totalResults; + } + public function getTotalResults() { + return $this->totalResults; + } +} + +class Profile extends apiModel { + public $defaultPage; + public $kind; + public $excludeQueryParameters; + public $name; + public $created; + public $webPropertyId; + public $updated; + public $siteSearchQueryParameters; + public $currency; + public $internalWebPropertyId; + protected $__childLinkType = 'ProfileChildLink'; + protected $__childLinkDataType = ''; + public $childLink; + public $timezone; + public $siteSearchCategoryParameters; + protected $__parentLinkType = 'ProfileParentLink'; + protected $__parentLinkDataType = ''; + public $parentLink; + public $id; + public $selfLink; + public $accountId; + public function setDefaultPage($defaultPage) { + $this->defaultPage = $defaultPage; + } + public function getDefaultPage() { + return $this->defaultPage; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setExcludeQueryParameters($excludeQueryParameters) { + $this->excludeQueryParameters = $excludeQueryParameters; + } + public function getExcludeQueryParameters() { + return $this->excludeQueryParameters; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setCreated($created) { + $this->created = $created; + } + public function getCreated() { + return $this->created; + } + public function setWebPropertyId($webPropertyId) { + $this->webPropertyId = $webPropertyId; + } + public function getWebPropertyId() { + return $this->webPropertyId; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setSiteSearchQueryParameters($siteSearchQueryParameters) { + $this->siteSearchQueryParameters = $siteSearchQueryParameters; + } + public function getSiteSearchQueryParameters() { + return $this->siteSearchQueryParameters; + } + public function setCurrency($currency) { + $this->currency = $currency; + } + public function getCurrency() { + return $this->currency; + } + public function setInternalWebPropertyId($internalWebPropertyId) { + $this->internalWebPropertyId = $internalWebPropertyId; + } + public function getInternalWebPropertyId() { + return $this->internalWebPropertyId; + } + public function setChildLink(ProfileChildLink $childLink) { + $this->childLink = $childLink; + } + public function getChildLink() { + return $this->childLink; + } + public function setTimezone($timezone) { + $this->timezone = $timezone; + } + public function getTimezone() { + return $this->timezone; + } + public function setSiteSearchCategoryParameters($siteSearchCategoryParameters) { + $this->siteSearchCategoryParameters = $siteSearchCategoryParameters; + } + public function getSiteSearchCategoryParameters() { + return $this->siteSearchCategoryParameters; + } + public function setParentLink(ProfileParentLink $parentLink) { + $this->parentLink = $parentLink; + } + public function getParentLink() { + return $this->parentLink; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } + public function setAccountId($accountId) { + $this->accountId = $accountId; + } + public function getAccountId() { + return $this->accountId; + } +} + +class ProfileChildLink extends apiModel { + public $href; + public $type; + public function setHref($href) { + $this->href = $href; + } + public function getHref() { + return $this->href; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } +} + +class ProfileParentLink extends apiModel { + public $href; + public $type; + public function setHref($href) { + $this->href = $href; + } + public function getHref() { + return $this->href; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } +} + +class Profiles extends apiModel { + public $username; + public $kind; + protected $__itemsType = 'Profile'; + protected $__itemsDataType = 'array'; + public $items; + public $itemsPerPage; + public $previousLink; + public $startIndex; + public $nextLink; + public $totalResults; + public function setUsername($username) { + $this->username = $username; + } + public function getUsername() { + return $this->username; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setItems(/* array(Profile) */ $items) { + $this->assertIsArray($items, 'Profile', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setItemsPerPage($itemsPerPage) { + $this->itemsPerPage = $itemsPerPage; + } + public function getItemsPerPage() { + return $this->itemsPerPage; + } + public function setPreviousLink($previousLink) { + $this->previousLink = $previousLink; + } + public function getPreviousLink() { + return $this->previousLink; + } + public function setStartIndex($startIndex) { + $this->startIndex = $startIndex; + } + public function getStartIndex() { + return $this->startIndex; + } + public function setNextLink($nextLink) { + $this->nextLink = $nextLink; + } + public function getNextLink() { + return $this->nextLink; + } + public function setTotalResults($totalResults) { + $this->totalResults = $totalResults; + } + public function getTotalResults() { + return $this->totalResults; + } +} + +class Segment extends apiModel { + public $definition; + public $kind; + public $segmentId; + public $created; + public $updated; + public $id; + public $selfLink; + public $name; + public function setDefinition($definition) { + $this->definition = $definition; + } + public function getDefinition() { + return $this->definition; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setSegmentId($segmentId) { + $this->segmentId = $segmentId; + } + public function getSegmentId() { + return $this->segmentId; + } + public function setCreated($created) { + $this->created = $created; + } + public function getCreated() { + return $this->created; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class Segments extends apiModel { + public $username; + public $kind; + protected $__itemsType = 'Segment'; + protected $__itemsDataType = 'array'; + public $items; + public $itemsPerPage; + public $previousLink; + public $startIndex; + public $nextLink; + public $totalResults; + public function setUsername($username) { + $this->username = $username; + } + public function getUsername() { + return $this->username; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setItems(/* array(Segment) */ $items) { + $this->assertIsArray($items, 'Segment', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setItemsPerPage($itemsPerPage) { + $this->itemsPerPage = $itemsPerPage; + } + public function getItemsPerPage() { + return $this->itemsPerPage; + } + public function setPreviousLink($previousLink) { + $this->previousLink = $previousLink; + } + public function getPreviousLink() { + return $this->previousLink; + } + public function setStartIndex($startIndex) { + $this->startIndex = $startIndex; + } + public function getStartIndex() { + return $this->startIndex; + } + public function setNextLink($nextLink) { + $this->nextLink = $nextLink; + } + public function getNextLink() { + return $this->nextLink; + } + public function setTotalResults($totalResults) { + $this->totalResults = $totalResults; + } + public function getTotalResults() { + return $this->totalResults; + } +} + +class Webproperties extends apiModel { + public $username; + public $kind; + protected $__itemsType = 'Webproperty'; + protected $__itemsDataType = 'array'; + public $items; + public $itemsPerPage; + public $previousLink; + public $startIndex; + public $nextLink; + public $totalResults; + public function setUsername($username) { + $this->username = $username; + } + public function getUsername() { + return $this->username; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setItems(/* array(Webproperty) */ $items) { + $this->assertIsArray($items, 'Webproperty', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setItemsPerPage($itemsPerPage) { + $this->itemsPerPage = $itemsPerPage; + } + public function getItemsPerPage() { + return $this->itemsPerPage; + } + public function setPreviousLink($previousLink) { + $this->previousLink = $previousLink; + } + public function getPreviousLink() { + return $this->previousLink; + } + public function setStartIndex($startIndex) { + $this->startIndex = $startIndex; + } + public function getStartIndex() { + return $this->startIndex; + } + public function setNextLink($nextLink) { + $this->nextLink = $nextLink; + } + public function getNextLink() { + return $this->nextLink; + } + public function setTotalResults($totalResults) { + $this->totalResults = $totalResults; + } + public function getTotalResults() { + return $this->totalResults; + } +} + +class Webproperty extends apiModel { + public $kind; + public $name; + public $created; + public $updated; + public $websiteUrl; + public $internalWebPropertyId; + protected $__childLinkType = 'WebpropertyChildLink'; + protected $__childLinkDataType = ''; + public $childLink; + protected $__parentLinkType = 'WebpropertyParentLink'; + protected $__parentLinkDataType = ''; + public $parentLink; + public $id; + public $selfLink; + public $accountId; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setCreated($created) { + $this->created = $created; + } + public function getCreated() { + return $this->created; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setWebsiteUrl($websiteUrl) { + $this->websiteUrl = $websiteUrl; + } + public function getWebsiteUrl() { + return $this->websiteUrl; + } + public function setInternalWebPropertyId($internalWebPropertyId) { + $this->internalWebPropertyId = $internalWebPropertyId; + } + public function getInternalWebPropertyId() { + return $this->internalWebPropertyId; + } + public function setChildLink(WebpropertyChildLink $childLink) { + $this->childLink = $childLink; + } + public function getChildLink() { + return $this->childLink; + } + public function setParentLink(WebpropertyParentLink $parentLink) { + $this->parentLink = $parentLink; + } + public function getParentLink() { + return $this->parentLink; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } + public function setAccountId($accountId) { + $this->accountId = $accountId; + } + public function getAccountId() { + return $this->accountId; + } +} + +class WebpropertyChildLink extends apiModel { + public $href; + public $type; + public function setHref($href) { + $this->href = $href; + } + public function getHref() { + return $this->href; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } +} + +class WebpropertyParentLink extends apiModel { + public $href; + public $type; + public function setHref($href) { + $this->href = $href; + } + public function getHref() { + return $this->href; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiBigqueryService.php b/inc/vendors/social-login/Google/contrib/apiBigqueryService.php new file mode 100755 index 00000000..e6ec6916 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiBigqueryService.php @@ -0,0 +1,1702 @@ + + * $bigqueryService = new apiBigqueryService(...); + * $tables = $bigqueryService->tables; + * + */ + class TablesServiceResource extends apiServiceResource { + + + /** + * Creates a new, empty table in the dataset. (tables.insert) + * @param Table $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string projectId Project ID of the new table + * @opt_param string datasetId Dataset ID of the new table + * @return Table + */ + public function insert(Table $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Table($data); + } else { + return $data; + } + } + /** + * Gets the specified table resource by table ID. This method does not return the data in the table, + * it only returns the table resource, which describes the structure of this table. (tables.get) + * @param string $projectId Project ID of the requested table + * @param string $datasetId Dataset ID of the requested table + * @param string $tableId Table ID of the requested table + * @return Table + */ + public function get($projectId, $datasetId, $tableId, $optParams = array()) { + $params = array('projectId' => $projectId, 'datasetId' => $datasetId, 'tableId' => $tableId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Table($data); + } else { + return $data; + } + } + /** + * Lists all tables in the specified dataset. (tables.list) + * @param string $projectId Project ID of the tables to list + * @param string $datasetId Dataset ID of the tables to list + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken Page token, returned by a previous call, to request the next page of results + * @opt_param string maxResults Maximum number of results to return + * @return TableList + */ + public function listTables($projectId, $datasetId, $optParams = array()) { + $params = array('projectId' => $projectId, 'datasetId' => $datasetId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new TableList($data); + } else { + return $data; + } + } + /** + * Updates information in an existing table, specified by tableId. (tables.update) + * @param Table $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string projectId Project ID of the table to update + * @opt_param string datasetId Dataset ID of the table to update + * @opt_param string tableId Table ID of the table to update + * @return Table + */ + public function update(Table $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new Table($data); + } else { + return $data; + } + } + /** + * Updates information in an existing table, specified by tableId. This method supports patch + * semantics. (tables.patch) + * @param string $projectId Project ID of the table to update + * @param string $datasetId Dataset ID of the table to update + * @param string $tableId Table ID of the table to update + * @param Table $postBody + * @return Table + */ + public function patch($projectId, $datasetId, $tableId, Table $postBody, $optParams = array()) { + $params = array('projectId' => $projectId, 'datasetId' => $datasetId, 'tableId' => $tableId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('patch', array($params)); + if ($this->useObjects()) { + return new Table($data); + } else { + return $data; + } + } + /** + * Deletes the table specified by tableId from the dataset. If the table contains data, all the data + * will be deleted. (tables.delete) + * @param string $projectId Project ID of the table to delete + * @param string $datasetId Dataset ID of the table to delete + * @param string $tableId Table ID of the table to delete + */ + public function delete($projectId, $datasetId, $tableId, $optParams = array()) { + $params = array('projectId' => $projectId, 'datasetId' => $datasetId, 'tableId' => $tableId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "datasets" collection of methods. + * Typical usage is: + * + * $bigqueryService = new apiBigqueryService(...); + * $datasets = $bigqueryService->datasets; + * + */ + class DatasetsServiceResource extends apiServiceResource { + + + /** + * Creates a new empty dataset. (datasets.insert) + * @param Dataset $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string projectId Project ID of the new dataset + * @return Dataset + */ + public function insert(Dataset $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Dataset($data); + } else { + return $data; + } + } + /** + * Returns the dataset specified by datasetID. (datasets.get) + * @param string $projectId Project ID of the requested dataset + * @param string $datasetId Dataset ID of the requested dataset + * @return Dataset + */ + public function get($projectId, $datasetId, $optParams = array()) { + $params = array('projectId' => $projectId, 'datasetId' => $datasetId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Dataset($data); + } else { + return $data; + } + } + /** + * Lists all the datasets in the specified project to which the caller has read access; however, a + * project owner can list (but not necessarily get) all datasets in his project. (datasets.list) + * @param string $projectId Project ID of the datasets to be listed + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken Page token, returned by a previous call, to request the next page of results + * @opt_param string maxResults The maximum number of results to return + * @return DatasetList + */ + public function listDatasets($projectId, $optParams = array()) { + $params = array('projectId' => $projectId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new DatasetList($data); + } else { + return $data; + } + } + /** + * Updates information in an existing dataset, specified by datasetId. Properties not included in + * the submitted resource will not be changed. If you include the access property without any values + * assigned, the request will fail as you must specify at least one owner for a dataset. + * (datasets.update) + * @param Dataset $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string projectId Project ID of the dataset being updated + * @opt_param string datasetId Dataset ID of the dataset being updated + * @return Dataset + */ + public function update(Dataset $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new Dataset($data); + } else { + return $data; + } + } + /** + * Updates information in an existing dataset, specified by datasetId. Properties not included in + * the submitted resource will not be changed. If you include the access property without any values + * assigned, the request will fail as you must specify at least one owner for a dataset. This method + * supports patch semantics. (datasets.patch) + * @param string $projectId Project ID of the dataset being updated + * @param string $datasetId Dataset ID of the dataset being updated + * @param Dataset $postBody + * @return Dataset + */ + public function patch($projectId, $datasetId, Dataset $postBody, $optParams = array()) { + $params = array('projectId' => $projectId, 'datasetId' => $datasetId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('patch', array($params)); + if ($this->useObjects()) { + return new Dataset($data); + } else { + return $data; + } + } + /** + * Deletes the dataset specified by datasetId value. Before you can delete a dataset, you must + * delete all its tables, either manually or by specifying deleteContents. Immediately after + * deletion, you can create another dataset with the same name. (datasets.delete) + * @param string $projectId Project ID of the dataset being deleted + * @param string $datasetId Dataset ID of dataset being deleted + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool deleteContents If True, delete all the tables in the dataset. If False and the dataset contains tables, the request will fail. Default is False + */ + public function delete($projectId, $datasetId, $optParams = array()) { + $params = array('projectId' => $projectId, 'datasetId' => $datasetId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "jobs" collection of methods. + * Typical usage is: + * + * $bigqueryService = new apiBigqueryService(...); + * $jobs = $bigqueryService->jobs; + * + */ + class JobsServiceResource extends apiServiceResource { + + + /** + * Starts a new asynchronous job. (jobs.insert) + * @param Job $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string projectId Project ID of the project that will be billed for the job + * @return Job + */ + public function insert(Job $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Job($data); + } else { + return $data; + } + } + /** + * Retrieves the specified job by ID. (jobs.get) + * @param string $projectId Project ID of the requested job + * @param string $jobId Job ID of the requested job + * @return Job + */ + public function get($projectId, $jobId, $optParams = array()) { + $params = array('projectId' => $projectId, 'jobId' => $jobId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Job($data); + } else { + return $data; + } + } + /** + * Lists all the Jobs in the specified project that were started by the user. (jobs.list) + * @param string $projectId Project ID of the jobs to list + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string projection Restrict information returned to a set of selected fields + * @opt_param string stateFilter Filter for job state + * @opt_param bool allUsers Whether to display jobs owned by all users in the project. Default false + * @opt_param string maxResults Maximum number of results to return + * @opt_param string pageToken Page token, returned by a previous call, to request the next page of results + * @return JobList + */ + public function listJobs($projectId, $optParams = array()) { + $params = array('projectId' => $projectId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new JobList($data); + } else { + return $data; + } + } + /** + * Runs a BigQuery SQL query synchronously and returns query results if the query completes within a + * specified timeout. (jobs.query) + * @param string $projectId Project ID of the project billed for the query + * @param QueryRequest $postBody + * @return QueryResponse + */ + public function query($projectId, QueryRequest $postBody, $optParams = array()) { + $params = array('projectId' => $projectId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('query', array($params)); + if ($this->useObjects()) { + return new QueryResponse($data); + } else { + return $data; + } + } + /** + * Retrieves the results of a query job. (jobs.getQueryResults) + * @param string $projectId Project ID of the query job + * @param string $jobId Job ID of the query job + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string timeoutMs How long to wait for the query to complete, in milliseconds, before returning. Default is to return immediately. If the timeout passes before the job completes, the request will fail with a TIMEOUT error + * @opt_param string startIndex Zero-based index of the starting row + * @opt_param string maxResults Maximum number of results to read + * @return GetQueryResultsResponse + */ + public function getQueryResults($projectId, $jobId, $optParams = array()) { + $params = array('projectId' => $projectId, 'jobId' => $jobId); + $params = array_merge($params, $optParams); + $data = $this->__call('getQueryResults', array($params)); + if ($this->useObjects()) { + return new GetQueryResultsResponse($data); + } else { + return $data; + } + } + /** + * Deletes a completed job specified by job ID. (jobs.delete) + * @param string $projectId Project ID of the job to delete + * @param string $jobId Job ID of the job to delete + */ + public function delete($projectId, $jobId, $optParams = array()) { + $params = array('projectId' => $projectId, 'jobId' => $jobId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "tabledata" collection of methods. + * Typical usage is: + * + * $bigqueryService = new apiBigqueryService(...); + * $tabledata = $bigqueryService->tabledata; + * + */ + class TabledataServiceResource extends apiServiceResource { + + + /** + * Retrieves table data from a specified set of rows. (tabledata.list) + * @param string $projectId Project ID of the table to read + * @param string $datasetId Dataset ID of the table to read + * @param string $tableId Table ID of the table to read + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string startIndex Zero-based index of the starting row to read + * @opt_param string maxResults Maximum number of results to return + * @return TableDataList + */ + public function listTabledata($projectId, $datasetId, $tableId, $optParams = array()) { + $params = array('projectId' => $projectId, 'datasetId' => $datasetId, 'tableId' => $tableId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new TableDataList($data); + } else { + return $data; + } + } + } + + /** + * The "projects" collection of methods. + * Typical usage is: + * + * $bigqueryService = new apiBigqueryService(...); + * $projects = $bigqueryService->projects; + * + */ + class ProjectsServiceResource extends apiServiceResource { + + + /** + * Lists the projects to which you have at least read access. (projects.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken Page token, returned by a previous call, to request the next page of results + * @opt_param string maxResults Maximum number of results to return + * @return ProjectList + */ + public function listProjects($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new ProjectList($data); + } else { + return $data; + } + } + } + +/** + * Service definition for Bigquery (v2). + *

              + * A data platform for customers to create, manage, share and query data. + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiBigqueryService extends apiService { + public $tables; + public $datasets; + public $jobs; + public $tabledata; + public $projects; + /** + * Constructs the internal representation of the Bigquery service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/bigquery/v2/'; + $this->version = 'v2'; + $this->serviceName = 'bigquery'; + + $apiClient->addService($this->serviceName, $this->version); + $this->tables = new TablesServiceResource($this, $this->serviceName, 'tables', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"type": "string", "location": "path"}, "datasetId": {"type": "string", "location": "path"}}, "request": {"$ref": "Table"}, "id": "bigquery.tables.insert", "httpMethod": "POST", "path": "projects/{projectId}/datasets/{datasetId}/tables", "response": {"$ref": "Table"}}, "get": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"required": true, "type": "string", "location": "path"}, "tableId": {"required": true, "type": "string", "location": "path"}, "datasetId": {"required": true, "type": "string", "location": "path"}}, "id": "bigquery.tables.get", "httpMethod": "GET", "path": "projects/{projectId}/datasets/{datasetId}/tables/{tableId}", "response": {"$ref": "Table"}}, "list": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "datasetId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "uint32", "type": "integer", "location": "query"}, "projectId": {"required": true, "type": "string", "location": "path"}}, "id": "bigquery.tables.list", "httpMethod": "GET", "path": "projects/{projectId}/datasets/{datasetId}/tables", "response": {"$ref": "TableList"}}, "update": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"type": "string", "location": "path"}, "tableId": {"type": "string", "location": "path"}, "datasetId": {"type": "string", "location": "path"}}, "request": {"$ref": "Table"}, "id": "bigquery.tables.update", "httpMethod": "PUT", "path": "projects/{projectId}/datasets/{datasetId}/tables/{tableId}", "response": {"$ref": "Table"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"required": true, "type": "string", "location": "path"}, "tableId": {"required": true, "type": "string", "location": "path"}, "datasetId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Table"}, "id": "bigquery.tables.patch", "httpMethod": "PATCH", "path": "projects/{projectId}/datasets/{datasetId}/tables/{tableId}", "response": {"$ref": "Table"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"required": true, "type": "string", "location": "path"}, "tableId": {"required": true, "type": "string", "location": "path"}, "datasetId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "projects/{projectId}/datasets/{datasetId}/tables/{tableId}", "id": "bigquery.tables.delete"}}}', true)); + $this->datasets = new DatasetsServiceResource($this, $this->serviceName, 'datasets', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"type": "string", "location": "path"}}, "request": {"$ref": "Dataset"}, "id": "bigquery.datasets.insert", "httpMethod": "POST", "path": "projects/{projectId}/datasets", "response": {"$ref": "Dataset"}}, "get": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"required": true, "type": "string", "location": "path"}, "datasetId": {"required": true, "type": "string", "location": "path"}}, "id": "bigquery.datasets.get", "httpMethod": "GET", "path": "projects/{projectId}/datasets/{datasetId}", "response": {"$ref": "Dataset"}}, "list": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "maxResults": {"format": "uint32", "type": "integer", "location": "query"}, "projectId": {"required": true, "type": "string", "location": "path"}}, "id": "bigquery.datasets.list", "httpMethod": "GET", "path": "projects/{projectId}/datasets", "response": {"$ref": "DatasetList"}}, "update": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"type": "string", "location": "path"}, "datasetId": {"type": "string", "location": "path"}}, "request": {"$ref": "Dataset"}, "id": "bigquery.datasets.update", "httpMethod": "PUT", "path": "projects/{projectId}/datasets/{datasetId}", "response": {"$ref": "Dataset"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"required": true, "type": "string", "location": "path"}, "datasetId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Dataset"}, "id": "bigquery.datasets.patch", "httpMethod": "PATCH", "path": "projects/{projectId}/datasets/{datasetId}", "response": {"$ref": "Dataset"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"deleteContents": {"type": "boolean", "location": "query"}, "datasetId": {"required": true, "type": "string", "location": "path"}, "projectId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "projects/{projectId}/datasets/{datasetId}", "id": "bigquery.datasets.delete"}}}', true)); + $this->jobs = new JobsServiceResource($this, $this->serviceName, 'jobs', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"type": "string", "location": "path"}}, "mediaUpload": {"accept": ["application/octet-stream"], "protocols": {"simple": {"path": "/upload/bigquery/v2/projects/{projectId}/jobs", "multipart": true}, "resumable": {"path": "/resumable/upload/bigquery/v2/projects/{projectId}/jobs", "multipart": true}}}, "request": {"$ref": "Job"}, "id": "bigquery.jobs.insert", "httpMethod": "POST", "path": "projects/{projectId}/jobs", "response": {"$ref": "Job"}}, "get": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"required": true, "type": "string", "location": "path"}, "jobId": {"required": true, "type": "string", "location": "path"}}, "id": "bigquery.jobs.get", "httpMethod": "GET", "path": "projects/{projectId}/jobs/{jobId}", "response": {"$ref": "Job"}}, "list": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projection": {"enum": ["full", "minimal"], "type": "string", "location": "query"}, "stateFilter": {"enum": ["done", "pending", "running"], "repeated": true, "location": "query", "type": "string"}, "projectId": {"required": true, "type": "string", "location": "path"}, "allUsers": {"type": "boolean", "location": "query"}, "maxResults": {"format": "uint32", "type": "integer", "location": "query"}, "pageToken": {"type": "string", "location": "query"}}, "id": "bigquery.jobs.list", "httpMethod": "GET", "path": "projects/{projectId}/jobs", "response": {"$ref": "JobList"}}, "query": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "QueryRequest"}, "id": "bigquery.jobs.query", "httpMethod": "POST", "path": "projects/{projectId}/queries", "response": {"$ref": "QueryResponse"}}, "getQueryResults": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"timeoutMs": {"format": "uint32", "type": "integer", "location": "query"}, "projectId": {"required": true, "type": "string", "location": "path"}, "startIndex": {"format": "uint64", "type": "string", "location": "query"}, "maxResults": {"format": "uint32", "type": "integer", "location": "query"}, "jobId": {"required": true, "type": "string", "location": "path"}}, "id": "bigquery.jobs.getQueryResults", "httpMethod": "GET", "path": "projects/{projectId}/queries/{jobId}", "response": {"$ref": "GetQueryResultsResponse"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"required": true, "type": "string", "location": "path"}, "jobId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "projects/{projectId}/jobs/{jobId}", "id": "bigquery.jobs.delete"}}}', true)); + $this->tabledata = new TabledataServiceResource($this, $this->serviceName, 'tabledata', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"projectId": {"required": true, "type": "string", "location": "path"}, "startIndex": {"format": "uint64", "type": "string", "location": "query"}, "tableId": {"required": true, "type": "string", "location": "path"}, "datasetId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "uint32", "type": "integer", "location": "query"}}, "id": "bigquery.tabledata.list", "httpMethod": "GET", "path": "projects/{projectId}/datasets/{datasetId}/tables/{tableId}/data", "response": {"$ref": "TableDataList"}}}}', true)); + $this->projects = new ProjectsServiceResource($this, $this->serviceName, 'projects', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/bigquery"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "maxResults": {"format": "uint32", "type": "integer", "location": "query"}}, "response": {"$ref": "ProjectList"}, "httpMethod": "GET", "path": "projects", "id": "bigquery.projects.list"}}}', true)); + + } +} + +class Dataset extends apiModel { + public $kind; + public $description; + protected $__datasetReferenceType = 'DatasetReference'; + protected $__datasetReferenceDataType = ''; + public $datasetReference; + public $creationTime; + protected $__accessType = 'DatasetAccess'; + protected $__accessDataType = 'array'; + public $access; + public $etag; + public $friendlyName; + public $lastModifiedTime; + public $id; + public $selfLink; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setDatasetReference(DatasetReference $datasetReference) { + $this->datasetReference = $datasetReference; + } + public function getDatasetReference() { + return $this->datasetReference; + } + public function setCreationTime($creationTime) { + $this->creationTime = $creationTime; + } + public function getCreationTime() { + return $this->creationTime; + } + public function setAccess(/* array(DatasetAccess) */ $access) { + $this->assertIsArray($access, 'DatasetAccess', __METHOD__); + $this->access = $access; + } + public function getAccess() { + return $this->access; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setFriendlyName($friendlyName) { + $this->friendlyName = $friendlyName; + } + public function getFriendlyName() { + return $this->friendlyName; + } + public function setLastModifiedTime($lastModifiedTime) { + $this->lastModifiedTime = $lastModifiedTime; + } + public function getLastModifiedTime() { + return $this->lastModifiedTime; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class DatasetAccess extends apiModel { + public $specialGroup; + public $domain; + public $role; + public $groupByEmail; + public $userByEmail; + public function setSpecialGroup($specialGroup) { + $this->specialGroup = $specialGroup; + } + public function getSpecialGroup() { + return $this->specialGroup; + } + public function setDomain($domain) { + $this->domain = $domain; + } + public function getDomain() { + return $this->domain; + } + public function setRole($role) { + $this->role = $role; + } + public function getRole() { + return $this->role; + } + public function setGroupByEmail($groupByEmail) { + $this->groupByEmail = $groupByEmail; + } + public function getGroupByEmail() { + return $this->groupByEmail; + } + public function setUserByEmail($userByEmail) { + $this->userByEmail = $userByEmail; + } + public function getUserByEmail() { + return $this->userByEmail; + } +} + +class DatasetList extends apiModel { + public $nextPageToken; + public $kind; + protected $__datasetsType = 'DatasetListDatasets'; + protected $__datasetsDataType = 'array'; + public $datasets; + public $etag; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDatasets(/* array(DatasetListDatasets) */ $datasets) { + $this->assertIsArray($datasets, 'DatasetListDatasets', __METHOD__); + $this->datasets = $datasets; + } + public function getDatasets() { + return $this->datasets; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } +} + +class DatasetListDatasets extends apiModel { + public $friendlyName; + public $kind; + public $id; + protected $__datasetReferenceType = 'DatasetReference'; + protected $__datasetReferenceDataType = ''; + public $datasetReference; + public function setFriendlyName($friendlyName) { + $this->friendlyName = $friendlyName; + } + public function getFriendlyName() { + return $this->friendlyName; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setDatasetReference(DatasetReference $datasetReference) { + $this->datasetReference = $datasetReference; + } + public function getDatasetReference() { + return $this->datasetReference; + } +} + +class DatasetReference extends apiModel { + public $projectId; + public $datasetId; + public function setProjectId($projectId) { + $this->projectId = $projectId; + } + public function getProjectId() { + return $this->projectId; + } + public function setDatasetId($datasetId) { + $this->datasetId = $datasetId; + } + public function getDatasetId() { + return $this->datasetId; + } +} + +class ErrorProto extends apiModel { + public $debugInfo; + public $message; + public $reason; + public $location; + public function setDebugInfo($debugInfo) { + $this->debugInfo = $debugInfo; + } + public function getDebugInfo() { + return $this->debugInfo; + } + public function setMessage($message) { + $this->message = $message; + } + public function getMessage() { + return $this->message; + } + public function setReason($reason) { + $this->reason = $reason; + } + public function getReason() { + return $this->reason; + } + public function setLocation($location) { + $this->location = $location; + } + public function getLocation() { + return $this->location; + } +} + +class GetQueryResultsResponse extends apiModel { + public $kind; + protected $__rowsType = 'TableRow'; + protected $__rowsDataType = 'array'; + public $rows; + protected $__jobReferenceType = 'JobReference'; + protected $__jobReferenceDataType = ''; + public $jobReference; + public $jobComplete; + public $totalRows; + public $etag; + protected $__schemaType = 'TableSchema'; + protected $__schemaDataType = ''; + public $schema; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setRows(/* array(TableRow) */ $rows) { + $this->assertIsArray($rows, 'TableRow', __METHOD__); + $this->rows = $rows; + } + public function getRows() { + return $this->rows; + } + public function setJobReference(JobReference $jobReference) { + $this->jobReference = $jobReference; + } + public function getJobReference() { + return $this->jobReference; + } + public function setJobComplete($jobComplete) { + $this->jobComplete = $jobComplete; + } + public function getJobComplete() { + return $this->jobComplete; + } + public function setTotalRows($totalRows) { + $this->totalRows = $totalRows; + } + public function getTotalRows() { + return $this->totalRows; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setSchema(TableSchema $schema) { + $this->schema = $schema; + } + public function getSchema() { + return $this->schema; + } +} + +class Job extends apiModel { + protected $__statusType = 'JobStatus'; + protected $__statusDataType = ''; + public $status; + public $kind; + protected $__statisticsType = 'JobStatistics'; + protected $__statisticsDataType = ''; + public $statistics; + protected $__jobReferenceType = 'JobReference'; + protected $__jobReferenceDataType = ''; + public $jobReference; + public $etag; + protected $__configurationType = 'JobConfiguration'; + protected $__configurationDataType = ''; + public $configuration; + public $id; + public $selfLink; + public function setStatus(JobStatus $status) { + $this->status = $status; + } + public function getStatus() { + return $this->status; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setStatistics(JobStatistics $statistics) { + $this->statistics = $statistics; + } + public function getStatistics() { + return $this->statistics; + } + public function setJobReference(JobReference $jobReference) { + $this->jobReference = $jobReference; + } + public function getJobReference() { + return $this->jobReference; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setConfiguration(JobConfiguration $configuration) { + $this->configuration = $configuration; + } + public function getConfiguration() { + return $this->configuration; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class JobConfiguration extends apiModel { + protected $__loadType = 'JobConfigurationLoad'; + protected $__loadDataType = ''; + public $load; + protected $__linkType = 'JobConfigurationLink'; + protected $__linkDataType = ''; + public $link; + protected $__queryType = 'JobConfigurationQuery'; + protected $__queryDataType = ''; + public $query; + protected $__copyType = 'JobConfigurationTableCopy'; + protected $__copyDataType = ''; + public $copy; + protected $__extractType = 'JobConfigurationExtract'; + protected $__extractDataType = ''; + public $extract; + public $properties; + public function setLoad(JobConfigurationLoad $load) { + $this->load = $load; + } + public function getLoad() { + return $this->load; + } + public function setLink(JobConfigurationLink $link) { + $this->link = $link; + } + public function getLink() { + return $this->link; + } + public function setQuery(JobConfigurationQuery $query) { + $this->query = $query; + } + public function getQuery() { + return $this->query; + } + public function setCopy(JobConfigurationTableCopy $copy) { + $this->copy = $copy; + } + public function getCopy() { + return $this->copy; + } + public function setExtract(JobConfigurationExtract $extract) { + $this->extract = $extract; + } + public function getExtract() { + return $this->extract; + } + public function setProperties($properties) { + $this->properties = $properties; + } + public function getProperties() { + return $this->properties; + } +} + +class JobConfigurationExtract extends apiModel { + public $destinationUri; + protected $__sourceTableType = 'TableReference'; + protected $__sourceTableDataType = ''; + public $sourceTable; + public function setDestinationUri($destinationUri) { + $this->destinationUri = $destinationUri; + } + public function getDestinationUri() { + return $this->destinationUri; + } + public function setSourceTable(TableReference $sourceTable) { + $this->sourceTable = $sourceTable; + } + public function getSourceTable() { + return $this->sourceTable; + } +} + +class JobConfigurationLink extends apiModel { + public $createDisposition; + protected $__destinationTableType = 'TableReference'; + protected $__destinationTableDataType = ''; + public $destinationTable; + public $sourceUri; + public function setCreateDisposition($createDisposition) { + $this->createDisposition = $createDisposition; + } + public function getCreateDisposition() { + return $this->createDisposition; + } + public function setDestinationTable(TableReference $destinationTable) { + $this->destinationTable = $destinationTable; + } + public function getDestinationTable() { + return $this->destinationTable; + } + public function setSourceUri($sourceUri) { + $this->sourceUri = $sourceUri; + } + public function getSourceUri() { + return $this->sourceUri; + } +} + +class JobConfigurationLoad extends apiModel { + public $encoding; + public $fieldDelimiter; + protected $__destinationTableType = 'TableReference'; + protected $__destinationTableDataType = ''; + public $destinationTable; + public $maxBadRecords; + public $writeDisposition; + public $sourceUris; + public $skipLeadingRows; + public $createDisposition; + protected $__schemaType = 'TableSchema'; + protected $__schemaDataType = ''; + public $schema; + public function setEncoding($encoding) { + $this->encoding = $encoding; + } + public function getEncoding() { + return $this->encoding; + } + public function setFieldDelimiter($fieldDelimiter) { + $this->fieldDelimiter = $fieldDelimiter; + } + public function getFieldDelimiter() { + return $this->fieldDelimiter; + } + public function setDestinationTable(TableReference $destinationTable) { + $this->destinationTable = $destinationTable; + } + public function getDestinationTable() { + return $this->destinationTable; + } + public function setMaxBadRecords($maxBadRecords) { + $this->maxBadRecords = $maxBadRecords; + } + public function getMaxBadRecords() { + return $this->maxBadRecords; + } + public function setWriteDisposition($writeDisposition) { + $this->writeDisposition = $writeDisposition; + } + public function getWriteDisposition() { + return $this->writeDisposition; + } + public function setSourceUris(/* array(string) */ $sourceUris) { + $this->assertIsArray($sourceUris, 'string', __METHOD__); + $this->sourceUris = $sourceUris; + } + public function getSourceUris() { + return $this->sourceUris; + } + public function setSkipLeadingRows($skipLeadingRows) { + $this->skipLeadingRows = $skipLeadingRows; + } + public function getSkipLeadingRows() { + return $this->skipLeadingRows; + } + public function setCreateDisposition($createDisposition) { + $this->createDisposition = $createDisposition; + } + public function getCreateDisposition() { + return $this->createDisposition; + } + public function setSchema(TableSchema $schema) { + $this->schema = $schema; + } + public function getSchema() { + return $this->schema; + } +} + +class JobConfigurationQuery extends apiModel { + public $createDisposition; + public $query; + public $writeDisposition; + protected $__destinationTableType = 'TableReference'; + protected $__destinationTableDataType = ''; + public $destinationTable; + protected $__defaultDatasetType = 'DatasetReference'; + protected $__defaultDatasetDataType = ''; + public $defaultDataset; + public function setCreateDisposition($createDisposition) { + $this->createDisposition = $createDisposition; + } + public function getCreateDisposition() { + return $this->createDisposition; + } + public function setQuery($query) { + $this->query = $query; + } + public function getQuery() { + return $this->query; + } + public function setWriteDisposition($writeDisposition) { + $this->writeDisposition = $writeDisposition; + } + public function getWriteDisposition() { + return $this->writeDisposition; + } + public function setDestinationTable(TableReference $destinationTable) { + $this->destinationTable = $destinationTable; + } + public function getDestinationTable() { + return $this->destinationTable; + } + public function setDefaultDataset(DatasetReference $defaultDataset) { + $this->defaultDataset = $defaultDataset; + } + public function getDefaultDataset() { + return $this->defaultDataset; + } +} + +class JobConfigurationTableCopy extends apiModel { + public $createDisposition; + public $writeDisposition; + protected $__destinationTableType = 'TableReference'; + protected $__destinationTableDataType = ''; + public $destinationTable; + protected $__sourceTableType = 'TableReference'; + protected $__sourceTableDataType = ''; + public $sourceTable; + public function setCreateDisposition($createDisposition) { + $this->createDisposition = $createDisposition; + } + public function getCreateDisposition() { + return $this->createDisposition; + } + public function setWriteDisposition($writeDisposition) { + $this->writeDisposition = $writeDisposition; + } + public function getWriteDisposition() { + return $this->writeDisposition; + } + public function setDestinationTable(TableReference $destinationTable) { + $this->destinationTable = $destinationTable; + } + public function getDestinationTable() { + return $this->destinationTable; + } + public function setSourceTable(TableReference $sourceTable) { + $this->sourceTable = $sourceTable; + } + public function getSourceTable() { + return $this->sourceTable; + } +} + +class JobList extends apiModel { + public $nextPageToken; + public $totalItems; + public $kind; + public $etag; + protected $__jobsType = 'JobListJobs'; + protected $__jobsDataType = 'array'; + public $jobs; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setJobs(/* array(JobListJobs) */ $jobs) { + $this->assertIsArray($jobs, 'JobListJobs', __METHOD__); + $this->jobs = $jobs; + } + public function getJobs() { + return $this->jobs; + } +} + +class JobListJobs extends apiModel { + protected $__statusType = 'JobStatus'; + protected $__statusDataType = ''; + public $status; + protected $__statisticsType = 'JobStatistics'; + protected $__statisticsDataType = ''; + public $statistics; + protected $__jobReferenceType = 'JobReference'; + protected $__jobReferenceDataType = ''; + public $jobReference; + public $state; + protected $__configurationType = 'JobConfiguration'; + protected $__configurationDataType = ''; + public $configuration; + public $id; + protected $__errorResultType = 'ErrorProto'; + protected $__errorResultDataType = ''; + public $errorResult; + public function setStatus(JobStatus $status) { + $this->status = $status; + } + public function getStatus() { + return $this->status; + } + public function setStatistics(JobStatistics $statistics) { + $this->statistics = $statistics; + } + public function getStatistics() { + return $this->statistics; + } + public function setJobReference(JobReference $jobReference) { + $this->jobReference = $jobReference; + } + public function getJobReference() { + return $this->jobReference; + } + public function setState($state) { + $this->state = $state; + } + public function getState() { + return $this->state; + } + public function setConfiguration(JobConfiguration $configuration) { + $this->configuration = $configuration; + } + public function getConfiguration() { + return $this->configuration; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setErrorResult(ErrorProto $errorResult) { + $this->errorResult = $errorResult; + } + public function getErrorResult() { + return $this->errorResult; + } +} + +class JobReference extends apiModel { + public $projectId; + public $jobId; + public function setProjectId($projectId) { + $this->projectId = $projectId; + } + public function getProjectId() { + return $this->projectId; + } + public function setJobId($jobId) { + $this->jobId = $jobId; + } + public function getJobId() { + return $this->jobId; + } +} + +class JobStatistics extends apiModel { + public $endTime; + public $totalBytesProcessed; + public $startTime; + public function setEndTime($endTime) { + $this->endTime = $endTime; + } + public function getEndTime() { + return $this->endTime; + } + public function setTotalBytesProcessed($totalBytesProcessed) { + $this->totalBytesProcessed = $totalBytesProcessed; + } + public function getTotalBytesProcessed() { + return $this->totalBytesProcessed; + } + public function setStartTime($startTime) { + $this->startTime = $startTime; + } + public function getStartTime() { + return $this->startTime; + } +} + +class JobStatus extends apiModel { + public $state; + protected $__errorsType = 'ErrorProto'; + protected $__errorsDataType = 'array'; + public $errors; + protected $__errorResultType = 'ErrorProto'; + protected $__errorResultDataType = ''; + public $errorResult; + public function setState($state) { + $this->state = $state; + } + public function getState() { + return $this->state; + } + public function setErrors(/* array(ErrorProto) */ $errors) { + $this->assertIsArray($errors, 'ErrorProto', __METHOD__); + $this->errors = $errors; + } + public function getErrors() { + return $this->errors; + } + public function setErrorResult(ErrorProto $errorResult) { + $this->errorResult = $errorResult; + } + public function getErrorResult() { + return $this->errorResult; + } +} + +class ProjectList extends apiModel { + public $nextPageToken; + public $totalItems; + public $kind; + public $etag; + protected $__projectsType = 'ProjectListProjects'; + protected $__projectsDataType = 'array'; + public $projects; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setProjects(/* array(ProjectListProjects) */ $projects) { + $this->assertIsArray($projects, 'ProjectListProjects', __METHOD__); + $this->projects = $projects; + } + public function getProjects() { + return $this->projects; + } +} + +class ProjectListProjects extends apiModel { + public $friendlyName; + public $kind; + public $id; + protected $__projectReferenceType = 'ProjectReference'; + protected $__projectReferenceDataType = ''; + public $projectReference; + public function setFriendlyName($friendlyName) { + $this->friendlyName = $friendlyName; + } + public function getFriendlyName() { + return $this->friendlyName; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setProjectReference(ProjectReference $projectReference) { + $this->projectReference = $projectReference; + } + public function getProjectReference() { + return $this->projectReference; + } +} + +class ProjectReference extends apiModel { + public $projectId; + public function setProjectId($projectId) { + $this->projectId = $projectId; + } + public function getProjectId() { + return $this->projectId; + } +} + +class QueryRequest extends apiModel { + public $timeoutMs; + public $query; + public $kind; + public $maxResults; + protected $__defaultDatasetType = 'DatasetReference'; + protected $__defaultDatasetDataType = ''; + public $defaultDataset; + public function setTimeoutMs($timeoutMs) { + $this->timeoutMs = $timeoutMs; + } + public function getTimeoutMs() { + return $this->timeoutMs; + } + public function setQuery($query) { + $this->query = $query; + } + public function getQuery() { + return $this->query; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setMaxResults($maxResults) { + $this->maxResults = $maxResults; + } + public function getMaxResults() { + return $this->maxResults; + } + public function setDefaultDataset(DatasetReference $defaultDataset) { + $this->defaultDataset = $defaultDataset; + } + public function getDefaultDataset() { + return $this->defaultDataset; + } +} + +class QueryResponse extends apiModel { + public $kind; + protected $__rowsType = 'TableRow'; + protected $__rowsDataType = 'array'; + public $rows; + protected $__jobReferenceType = 'JobReference'; + protected $__jobReferenceDataType = ''; + public $jobReference; + public $jobComplete; + public $totalRows; + protected $__schemaType = 'TableSchema'; + protected $__schemaDataType = ''; + public $schema; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setRows(/* array(TableRow) */ $rows) { + $this->assertIsArray($rows, 'TableRow', __METHOD__); + $this->rows = $rows; + } + public function getRows() { + return $this->rows; + } + public function setJobReference(JobReference $jobReference) { + $this->jobReference = $jobReference; + } + public function getJobReference() { + return $this->jobReference; + } + public function setJobComplete($jobComplete) { + $this->jobComplete = $jobComplete; + } + public function getJobComplete() { + return $this->jobComplete; + } + public function setTotalRows($totalRows) { + $this->totalRows = $totalRows; + } + public function getTotalRows() { + return $this->totalRows; + } + public function setSchema(TableSchema $schema) { + $this->schema = $schema; + } + public function getSchema() { + return $this->schema; + } +} + +class Table extends apiModel { + public $kind; + public $description; + public $creationTime; + protected $__tableReferenceType = 'TableReference'; + protected $__tableReferenceDataType = ''; + public $tableReference; + public $etag; + public $friendlyName; + public $lastModifiedTime; + public $id; + public $selfLink; + protected $__schemaType = 'TableSchema'; + protected $__schemaDataType = ''; + public $schema; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setCreationTime($creationTime) { + $this->creationTime = $creationTime; + } + public function getCreationTime() { + return $this->creationTime; + } + public function setTableReference(TableReference $tableReference) { + $this->tableReference = $tableReference; + } + public function getTableReference() { + return $this->tableReference; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setFriendlyName($friendlyName) { + $this->friendlyName = $friendlyName; + } + public function getFriendlyName() { + return $this->friendlyName; + } + public function setLastModifiedTime($lastModifiedTime) { + $this->lastModifiedTime = $lastModifiedTime; + } + public function getLastModifiedTime() { + return $this->lastModifiedTime; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } + public function setSchema(TableSchema $schema) { + $this->schema = $schema; + } + public function getSchema() { + return $this->schema; + } +} + +class TableDataList extends apiModel { + protected $__rowsType = 'TableRow'; + protected $__rowsDataType = 'array'; + public $rows; + public $kind; + public $etag; + public $totalRows; + public function setRows(/* array(TableRow) */ $rows) { + $this->assertIsArray($rows, 'TableRow', __METHOD__); + $this->rows = $rows; + } + public function getRows() { + return $this->rows; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setTotalRows($totalRows) { + $this->totalRows = $totalRows; + } + public function getTotalRows() { + return $this->totalRows; + } +} + +class TableFieldSchema extends apiModel { + protected $__fieldsType = 'TableFieldSchema'; + protected $__fieldsDataType = 'array'; + public $fields; + public $type; + public $mode; + public $name; + public function setFields(/* array(TableFieldSchema) */ $fields) { + $this->assertIsArray($fields, 'TableFieldSchema', __METHOD__); + $this->fields = $fields; + } + public function getFields() { + return $this->fields; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setMode($mode) { + $this->mode = $mode; + } + public function getMode() { + return $this->mode; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class TableList extends apiModel { + public $nextPageToken; + protected $__tablesType = 'TableListTables'; + protected $__tablesDataType = 'array'; + public $tables; + public $kind; + public $etag; + public $totalItems; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setTables(/* array(TableListTables) */ $tables) { + $this->assertIsArray($tables, 'TableListTables', __METHOD__); + $this->tables = $tables; + } + public function getTables() { + return $this->tables; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } +} + +class TableListTables extends apiModel { + public $friendlyName; + public $kind; + public $id; + protected $__tableReferenceType = 'TableReference'; + protected $__tableReferenceDataType = ''; + public $tableReference; + public function setFriendlyName($friendlyName) { + $this->friendlyName = $friendlyName; + } + public function getFriendlyName() { + return $this->friendlyName; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setTableReference(TableReference $tableReference) { + $this->tableReference = $tableReference; + } + public function getTableReference() { + return $this->tableReference; + } +} + +class TableReference extends apiModel { + public $projectId; + public $tableId; + public $datasetId; + public function setProjectId($projectId) { + $this->projectId = $projectId; + } + public function getProjectId() { + return $this->projectId; + } + public function setTableId($tableId) { + $this->tableId = $tableId; + } + public function getTableId() { + return $this->tableId; + } + public function setDatasetId($datasetId) { + $this->datasetId = $datasetId; + } + public function getDatasetId() { + return $this->datasetId; + } +} + +class TableRow extends apiModel { + protected $__fType = 'TableRowF'; + protected $__fDataType = 'array'; + public $f; + public function setF(/* array(TableRowF) */ $f) { + $this->assertIsArray($f, 'TableRowF', __METHOD__); + $this->f = $f; + } + public function getF() { + return $this->f; + } +} + +class TableRowF extends apiModel { + public $v; + public function setV($v) { + $this->v = $v; + } + public function getV() { + return $this->v; + } +} + +class TableSchema extends apiModel { + protected $__fieldsType = 'TableFieldSchema'; + protected $__fieldsDataType = 'array'; + public $fields; + public function setFields(/* array(TableFieldSchema) */ $fields) { + $this->assertIsArray($fields, 'TableFieldSchema', __METHOD__); + $this->fields = $fields; + } + public function getFields() { + return $this->fields; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiBloggerService.php b/inc/vendors/social-login/Google/contrib/apiBloggerService.php new file mode 100755 index 00000000..cd6ae0c1 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiBloggerService.php @@ -0,0 +1,1074 @@ + + * $bloggerService = new apiBloggerService(...); + * $blogs = $bloggerService->blogs; + *
              + */ + class BlogsServiceResource extends apiServiceResource { + + + /** + * Gets one blog by id. (blogs.get) + * @param string $blogId The ID of the blog to get. + * @return Blog + */ + public function get($blogId, $optParams = array()) { + $params = array('blogId' => $blogId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Blog($data); + } else { + return $data; + } + } + } + + /** + * The "posts" collection of methods. + * Typical usage is: + * + * $bloggerService = new apiBloggerService(...); + * $posts = $bloggerService->posts; + * + */ + class PostsServiceResource extends apiServiceResource { + + + /** + * Retrieves a list of posts, possibly filtered. (posts.list) + * @param string $blogId ID of the blog to fetch posts from. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken Continuation token if the request is paged. + * @opt_param bool fetchBodies Whether the body content of posts is included. + * @opt_param string maxResults Maximum number of posts to fetch. + * @opt_param string startDate Earliest post date to fetch. + * @return PostList + */ + public function listPosts($blogId, $optParams = array()) { + $params = array('blogId' => $blogId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new PostList($data); + } else { + return $data; + } + } + /** + * Get a post by id. (posts.get) + * @param string $blogId ID of the blog to fetch the post from. + * @param string $postId The ID of the post + * @return Post + */ + public function get($blogId, $postId, $optParams = array()) { + $params = array('blogId' => $blogId, 'postId' => $postId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Post($data); + } else { + return $data; + } + } + } + + /** + * The "pages" collection of methods. + * Typical usage is: + * + * $bloggerService = new apiBloggerService(...); + * $pages = $bloggerService->pages; + * + */ + class PagesServiceResource extends apiServiceResource { + + + /** + * Retrieves pages for a blog, possibly filtered. (pages.list) + * @param string $blogId ID of the blog to fetch pages from. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool fetchBodies Whether to retrieve the Page bodies. + * @return PageList + */ + public function listPages($blogId, $optParams = array()) { + $params = array('blogId' => $blogId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new PageList($data); + } else { + return $data; + } + } + /** + * Gets one blog page by id. (pages.get) + * @param string $blogId ID of the blog containing the page. + * @param string $pageId The ID of the page to get. + * @return Page + */ + public function get($blogId, $pageId, $optParams = array()) { + $params = array('blogId' => $blogId, 'pageId' => $pageId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Page($data); + } else { + return $data; + } + } + } + + /** + * The "comments" collection of methods. + * Typical usage is: + * + * $bloggerService = new apiBloggerService(...); + * $comments = $bloggerService->comments; + * + */ + class CommentsServiceResource extends apiServiceResource { + + + /** + * Retrieves the comments for a blog, possibly filtered. (comments.list) + * @param string $blogId ID of the blog to fetch comments from. + * @param string $postId ID of the post to fetch posts from. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string startDate Earliest date of comment to fetch. + * @opt_param string maxResults Maximum number of comments to include in the result. + * @opt_param string pageToken Continuation token if request is paged. + * @opt_param bool fetchBodies Whether the body content of the comments is included. + * @return CommentList + */ + public function listComments($blogId, $postId, $optParams = array()) { + $params = array('blogId' => $blogId, 'postId' => $postId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CommentList($data); + } else { + return $data; + } + } + /** + * Gets one comment by id. (comments.get) + * @param string $blogId ID of the blog to containing the comment. + * @param string $postId ID of the post to fetch posts from. + * @param string $commentId The ID of the comment to get. + * @return Comment + */ + public function get($blogId, $postId, $commentId, $optParams = array()) { + $params = array('blogId' => $blogId, 'postId' => $postId, 'commentId' => $commentId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Comment($data); + } else { + return $data; + } + } + } + + /** + * The "users" collection of methods. + * Typical usage is: + * + * $bloggerService = new apiBloggerService(...); + * $users = $bloggerService->users; + * + */ + class UsersServiceResource extends apiServiceResource { + + + /** + * Gets one user by id. (users.get) + * @param string $userId The ID of the user to get. + * @return User + */ + public function get($userId, $optParams = array()) { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new User($data); + } else { + return $data; + } + } + } + + + /** + * The "blogs" collection of methods. + * Typical usage is: + * + * $bloggerService = new apiBloggerService(...); + * $blogs = $bloggerService->blogs; + * + */ + class UsersBlogsServiceResource extends apiServiceResource { + + + /** + * Retrieves a list of blogs, possibly filtered. (blogs.list) + * @param string $userId ID of the user whose blogs are to be fetched. + * @return BlogList + */ + public function listUsersBlogs($userId, $optParams = array()) { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new BlogList($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Blogger (v2). + *

              + * API for access to the data within Blogger. + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiBloggerService extends apiService { + public $blogs; + public $posts; + public $pages; + public $comments; + public $users; + public $users_blogs; + /** + * Constructs the internal representation of the Blogger service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/blogger/v2/'; + $this->version = 'v2'; + $this->serviceName = 'blogger'; + + $apiClient->addService($this->serviceName, $this->version); + $this->blogs = new BlogsServiceResource($this, $this->serviceName, 'blogs', json_decode('{"methods": {"get": {"scopes": ["https://www.googleapis.com/auth/blogger"], "parameters": {"blogId": {"required": true, "type": "string", "location": "path"}}, "id": "blogger.blogs.get", "httpMethod": "GET", "path": "blogs/{blogId}", "response": {"$ref": "Blog"}}}}', true)); + $this->posts = new PostsServiceResource($this, $this->serviceName, 'posts', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/blogger"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "fetchBodies": {"type": "boolean", "location": "query"}, "blogId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "uint32", "type": "integer", "location": "query"}, "startDate": {"type": "string", "location": "query"}}, "id": "blogger.posts.list", "httpMethod": "GET", "path": "blogs/{blogId}/posts", "response": {"$ref": "PostList"}}, "get": {"scopes": ["https://www.googleapis.com/auth/blogger"], "parameters": {"postId": {"required": true, "type": "string", "location": "path"}, "blogId": {"required": true, "type": "string", "location": "path"}}, "id": "blogger.posts.get", "httpMethod": "GET", "path": "blogs/{blogId}/posts/{postId}", "response": {"$ref": "Post"}}}}', true)); + $this->pages = new PagesServiceResource($this, $this->serviceName, 'pages', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/blogger"], "parameters": {"fetchBodies": {"type": "boolean", "location": "query"}, "blogId": {"required": true, "type": "string", "location": "path"}}, "id": "blogger.pages.list", "httpMethod": "GET", "path": "blogs/{blogId}/pages", "response": {"$ref": "PageList"}}, "get": {"scopes": ["https://www.googleapis.com/auth/blogger"], "parameters": {"pageId": {"required": true, "type": "string", "location": "path"}, "blogId": {"required": true, "type": "string", "location": "path"}}, "id": "blogger.pages.get", "httpMethod": "GET", "path": "blogs/{blogId}/pages/{pageId}", "response": {"$ref": "Page"}}}}', true)); + $this->comments = new CommentsServiceResource($this, $this->serviceName, 'comments', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/blogger"], "parameters": {"startDate": {"type": "string", "location": "query"}, "postId": {"required": true, "type": "string", "location": "path"}, "maxResults": {"format": "uint32", "type": "integer", "location": "query"}, "pageToken": {"type": "string", "location": "query"}, "fetchBodies": {"type": "boolean", "location": "query"}, "blogId": {"required": true, "type": "string", "location": "path"}}, "id": "blogger.comments.list", "httpMethod": "GET", "path": "blogs/{blogId}/posts/{postId}/comments", "response": {"$ref": "CommentList"}}, "get": {"scopes": ["https://www.googleapis.com/auth/blogger"], "parameters": {"commentId": {"required": true, "type": "string", "location": "path"}, "postId": {"required": true, "type": "string", "location": "path"}, "blogId": {"required": true, "type": "string", "location": "path"}}, "id": "blogger.comments.get", "httpMethod": "GET", "path": "blogs/{blogId}/posts/{postId}/comments/{commentId}", "response": {"$ref": "Comment"}}}}', true)); + $this->users = new UsersServiceResource($this, $this->serviceName, 'users', json_decode('{"methods": {"get": {"scopes": ["https://www.googleapis.com/auth/blogger"], "parameters": {"userId": {"required": true, "type": "string", "location": "path"}}, "id": "blogger.users.get", "httpMethod": "GET", "path": "users/{userId}", "response": {"$ref": "User"}}}}', true)); + $this->users_blogs = new UsersBlogsServiceResource($this, $this->serviceName, 'blogs', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/blogger"], "parameters": {"userId": {"required": true, "type": "string", "location": "path"}}, "id": "blogger.users.blogs.list", "httpMethod": "GET", "path": "users/{userId}/blogs", "response": {"$ref": "BlogList"}}}}', true)); + } +} + +class Blog extends apiModel { + public $kind; + public $description; + protected $__localeType = 'BlogLocale'; + protected $__localeDataType = ''; + public $locale; + protected $__postsType = 'BlogPosts'; + protected $__postsDataType = ''; + public $posts; + public $updated; + public $id; + public $url; + public $published; + protected $__pagesType = 'BlogPages'; + protected $__pagesDataType = ''; + public $pages; + public $selfLink; + public $name; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setLocale(BlogLocale $locale) { + $this->locale = $locale; + } + public function getLocale() { + return $this->locale; + } + public function setPosts(BlogPosts $posts) { + $this->posts = $posts; + } + public function getPosts() { + return $this->posts; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setPublished($published) { + $this->published = $published; + } + public function getPublished() { + return $this->published; + } + public function setPages(BlogPages $pages) { + $this->pages = $pages; + } + public function getPages() { + return $this->pages; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class BlogList extends apiModel { + protected $__itemsType = 'Blog'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(Blog) */ $items) { + $this->assertIsArray($items, 'Blog', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class BlogLocale extends apiModel { + public $country; + public $variant; + public $language; + public function setCountry($country) { + $this->country = $country; + } + public function getCountry() { + return $this->country; + } + public function setVariant($variant) { + $this->variant = $variant; + } + public function getVariant() { + return $this->variant; + } + public function setLanguage($language) { + $this->language = $language; + } + public function getLanguage() { + return $this->language; + } +} + +class BlogPages extends apiModel { + public $totalItems; + public $selfLink; + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class BlogPosts extends apiModel { + public $totalItems; + public $selfLink; + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class Comment extends apiModel { + public $content; + public $kind; + protected $__authorType = 'CommentAuthor'; + protected $__authorDataType = ''; + public $author; + public $updated; + protected $__blogType = 'CommentBlog'; + protected $__blogDataType = ''; + public $blog; + public $published; + protected $__postType = 'CommentPost'; + protected $__postDataType = ''; + public $post; + public $id; + public $selfLink; + public function setContent($content) { + $this->content = $content; + } + public function getContent() { + return $this->content; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setAuthor(CommentAuthor $author) { + $this->author = $author; + } + public function getAuthor() { + return $this->author; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setBlog(CommentBlog $blog) { + $this->blog = $blog; + } + public function getBlog() { + return $this->blog; + } + public function setPublished($published) { + $this->published = $published; + } + public function getPublished() { + return $this->published; + } + public function setPost(CommentPost $post) { + $this->post = $post; + } + public function getPost() { + return $this->post; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class CommentAuthor extends apiModel { + public $url; + protected $__imageType = 'CommentAuthorImage'; + protected $__imageDataType = ''; + public $image; + public $displayName; + public $id; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setImage(CommentAuthorImage $image) { + $this->image = $image; + } + public function getImage() { + return $this->image; + } + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class CommentAuthorImage extends apiModel { + public $url; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } +} + +class CommentBlog extends apiModel { + public $id; + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class CommentList extends apiModel { + public $nextPageToken; + protected $__itemsType = 'Comment'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $prevPageToken; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(Comment) */ $items) { + $this->assertIsArray($items, 'Comment', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setPrevPageToken($prevPageToken) { + $this->prevPageToken = $prevPageToken; + } + public function getPrevPageToken() { + return $this->prevPageToken; + } +} + +class CommentPost extends apiModel { + public $id; + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class Page extends apiModel { + public $content; + public $kind; + protected $__authorType = 'PageAuthor'; + protected $__authorDataType = ''; + public $author; + public $url; + public $title; + public $updated; + protected $__blogType = 'PageBlog'; + protected $__blogDataType = ''; + public $blog; + public $published; + public $id; + public $selfLink; + public function setContent($content) { + $this->content = $content; + } + public function getContent() { + return $this->content; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setAuthor(PageAuthor $author) { + $this->author = $author; + } + public function getAuthor() { + return $this->author; + } + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setBlog(PageBlog $blog) { + $this->blog = $blog; + } + public function getBlog() { + return $this->blog; + } + public function setPublished($published) { + $this->published = $published; + } + public function getPublished() { + return $this->published; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class PageAuthor extends apiModel { + public $url; + protected $__imageType = 'PageAuthorImage'; + protected $__imageDataType = ''; + public $image; + public $displayName; + public $id; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setImage(PageAuthorImage $image) { + $this->image = $image; + } + public function getImage() { + return $this->image; + } + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class PageAuthorImage extends apiModel { + public $url; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } +} + +class PageBlog extends apiModel { + public $id; + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class PageList extends apiModel { + protected $__itemsType = 'Page'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(Page) */ $items) { + $this->assertIsArray($items, 'Page', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class Post extends apiModel { + public $content; + public $kind; + protected $__authorType = 'PostAuthor'; + protected $__authorDataType = ''; + public $author; + protected $__repliesType = 'PostReplies'; + protected $__repliesDataType = ''; + public $replies; + public $labels; + public $updated; + protected $__blogType = 'PostBlog'; + protected $__blogDataType = ''; + public $blog; + public $url; + public $published; + public $title; + public $id; + public $selfLink; + public function setContent($content) { + $this->content = $content; + } + public function getContent() { + return $this->content; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setAuthor(PostAuthor $author) { + $this->author = $author; + } + public function getAuthor() { + return $this->author; + } + public function setReplies(PostReplies $replies) { + $this->replies = $replies; + } + public function getReplies() { + return $this->replies; + } + public function setLabels(/* array(string) */ $labels) { + $this->assertIsArray($labels, 'string', __METHOD__); + $this->labels = $labels; + } + public function getLabels() { + return $this->labels; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setBlog(PostBlog $blog) { + $this->blog = $blog; + } + public function getBlog() { + return $this->blog; + } + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setPublished($published) { + $this->published = $published; + } + public function getPublished() { + return $this->published; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class PostAuthor extends apiModel { + public $url; + protected $__imageType = 'PostAuthorImage'; + protected $__imageDataType = ''; + public $image; + public $displayName; + public $id; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setImage(PostAuthorImage $image) { + $this->image = $image; + } + public function getImage() { + return $this->image; + } + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class PostAuthorImage extends apiModel { + public $url; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } +} + +class PostBlog extends apiModel { + public $id; + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class PostList extends apiModel { + public $nextPageToken; + protected $__itemsType = 'Post'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $prevPageToken; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(Post) */ $items) { + $this->assertIsArray($items, 'Post', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setPrevPageToken($prevPageToken) { + $this->prevPageToken = $prevPageToken; + } + public function getPrevPageToken() { + return $this->prevPageToken; + } +} + +class PostReplies extends apiModel { + public $totalItems; + public $selfLink; + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class User extends apiModel { + public $about; + public $displayName; + public $created; + protected $__localeType = 'UserLocale'; + protected $__localeDataType = ''; + public $locale; + protected $__blogsType = 'UserBlogs'; + protected $__blogsDataType = ''; + public $blogs; + public $kind; + public $url; + public $id; + public $selfLink; + public function setAbout($about) { + $this->about = $about; + } + public function getAbout() { + return $this->about; + } + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setCreated($created) { + $this->created = $created; + } + public function getCreated() { + return $this->created; + } + public function setLocale(UserLocale $locale) { + $this->locale = $locale; + } + public function getLocale() { + return $this->locale; + } + public function setBlogs(UserBlogs $blogs) { + $this->blogs = $blogs; + } + public function getBlogs() { + return $this->blogs; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class UserBlogs extends apiModel { + public $selfLink; + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class UserLocale extends apiModel { + public $country; + public $variant; + public $language; + public function setCountry($country) { + $this->country = $country; + } + public function getCountry() { + return $this->country; + } + public function setVariant($variant) { + $this->variant = $variant; + } + public function getVariant() { + return $this->variant; + } + public function setLanguage($language) { + $this->language = $language; + } + public function getLanguage() { + return $this->language; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiBooksService.php b/inc/vendors/social-login/Google/contrib/apiBooksService.php new file mode 100755 index 00000000..a190fa98 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiBooksService.php @@ -0,0 +1,1820 @@ + + * $booksService = new apiBooksService(...); + * $bookshelves = $booksService->bookshelves; + * + */ + class BookshelvesServiceResource extends apiServiceResource { + + + /** + * Retrieves a list of public bookshelves for the specified user. (bookshelves.list) + * @param string $userId Id of user for whom to retrieve bookshelves. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string source String to identify the originator of this request. + * @return Bookshelves + */ + public function listBookshelves($userId, $optParams = array()) { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Bookshelves($data); + } else { + return $data; + } + } + /** + * Retrieves a specific bookshelf for the specified user. (bookshelves.get) + * @param string $userId Id of user for whom to retrieve bookshelves. + * @param string $shelf Id of bookshelf to retrieve. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string source String to identify the originator of this request. + * @return Bookshelf + */ + public function get($userId, $shelf, $optParams = array()) { + $params = array('userId' => $userId, 'shelf' => $shelf); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Bookshelf($data); + } else { + return $data; + } + } + } + + + /** + * The "volumes" collection of methods. + * Typical usage is: + * + * $booksService = new apiBooksService(...); + * $volumes = $booksService->volumes; + * + */ + class BookshelvesVolumesServiceResource extends apiServiceResource { + + + /** + * Retrieves volumes in a specific bookshelf for the specified user. (volumes.list) + * @param string $userId Id of user for whom to retrieve bookshelf volumes. + * @param string $shelf Id of bookshelf to retrieve volumes. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param bool showPreorders Set to true to show pre-ordered books. Defaults to false. + * @opt_param string maxResults Maximum number of results to return + * @opt_param string source String to identify the originator of this request. + * @opt_param string startIndex Index of the first element to return (starts at 0) + * @return Volumes + */ + public function listBookshelvesVolumes($userId, $shelf, $optParams = array()) { + $params = array('userId' => $userId, 'shelf' => $shelf); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Volumes($data); + } else { + return $data; + } + } + } + + /** + * The "myconfig" collection of methods. + * Typical usage is: + * + * $booksService = new apiBooksService(...); + * $myconfig = $booksService->myconfig; + * + */ + class MyconfigServiceResource extends apiServiceResource { + + + /** + * Release downloaded content access restriction. (myconfig.releaseDownloadAccess) + * @param string $volumeIds The volume(s) to release restrictions for. + * @param string $cpksver The device/version identifier from which to release the restriction. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string locale ISO-639-1, ISO-3166-1 codes for message localization, i.e. en_US. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string source String to identify the originator of this request. + * @return DownloadAccesses + */ + public function releaseDownloadAccess($volumeIds, $cpksver, $optParams = array()) { + $params = array('volumeIds' => $volumeIds, 'cpksver' => $cpksver); + $params = array_merge($params, $optParams); + $data = $this->__call('releaseDownloadAccess', array($params)); + if ($this->useObjects()) { + return new DownloadAccesses($data); + } else { + return $data; + } + } + /** + * Request concurrent and download access restrictions. (myconfig.requestAccess) + * @param string $source String to identify the originator of this request. + * @param string $volumeId The volume to request concurrent/download restrictions for. + * @param string $nonce The client nonce value. + * @param string $cpksver The device/version identifier from which to request the restrictions. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string locale ISO-639-1, ISO-3166-1 codes for message localization, i.e. en_US. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @return RequestAccess + */ + public function requestAccess($source, $volumeId, $nonce, $cpksver, $optParams = array()) { + $params = array('source' => $source, 'volumeId' => $volumeId, 'nonce' => $nonce, 'cpksver' => $cpksver); + $params = array_merge($params, $optParams); + $data = $this->__call('requestAccess', array($params)); + if ($this->useObjects()) { + return new RequestAccess($data); + } else { + return $data; + } + } + /** + * Request downloaded content access for specified volumes on the My eBooks shelf. + * (myconfig.syncVolumeLicenses) + * @param string $source String to identify the originator of this request. + * @param string $nonce The client nonce value. + * @param string $cpksver The device/version identifier from which to release the restriction. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string locale ISO-639-1, ISO-3166-1 codes for message localization, i.e. en_US. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string volumeIds The volume(s) to request download restrictions for. + * @return Volumes + */ + public function syncVolumeLicenses($source, $nonce, $cpksver, $optParams = array()) { + $params = array('source' => $source, 'nonce' => $nonce, 'cpksver' => $cpksver); + $params = array_merge($params, $optParams); + $data = $this->__call('syncVolumeLicenses', array($params)); + if ($this->useObjects()) { + return new Volumes($data); + } else { + return $data; + } + } + } + + /** + * The "volumes" collection of methods. + * Typical usage is: + * + * $booksService = new apiBooksService(...); + * $volumes = $booksService->volumes; + * + */ + class VolumesServiceResource extends apiServiceResource { + + + /** + * Performs a book search. (volumes.list) + * @param string $q Full-text search query string. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string orderBy Sort search results. + * @opt_param string projection Restrict information returned to a set of selected fields. + * @opt_param string libraryRestrict Restrict search to this user's library. + * @opt_param string langRestrict Restrict results to books with this language code. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string printType Restrict to books or magazines. + * @opt_param string maxResults Maximum number of results to return. + * @opt_param string filter Filter search results. + * @opt_param string source String to identify the originator of this request. + * @opt_param string startIndex Index of the first result to return (starts at 0) + * @opt_param string download Restrict to volumes by download availability. + * @opt_param string partner Identifier of partner for whom to restrict and brand results. + * @opt_param bool showPreorders Set to true to show books available for preorder. Defaults to false. + * @return Volumes + */ + public function listVolumes($q, $optParams = array()) { + $params = array('q' => $q); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Volumes($data); + } else { + return $data; + } + } + /** + * Gets volume information for a single volume. (volumes.get) + * @param string $volumeId Id of volume to retrieve. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string source String to identify the originator of this request. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string projection Restrict information returned to a set of selected fields. + * @opt_param string partner Identifier of partner for whom to brand results. + * @return Volume + */ + public function get($volumeId, $optParams = array()) { + $params = array('volumeId' => $volumeId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Volume($data); + } else { + return $data; + } + } + } + + /** + * The "mylibrary" collection of methods. + * Typical usage is: + * + * $booksService = new apiBooksService(...); + * $mylibrary = $booksService->mylibrary; + * + */ + class MylibraryServiceResource extends apiServiceResource { + + + } + + + /** + * The "bookshelves" collection of methods. + * Typical usage is: + * + * $booksService = new apiBooksService(...); + * $bookshelves = $booksService->bookshelves; + * + */ + class MylibraryBookshelvesServiceResource extends apiServiceResource { + + + /** + * Clears all volumes from a bookshelf. (bookshelves.clearVolumes) + * @param string $shelf Id of bookshelf from which to remove a volume. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string source String to identify the originator of this request. + */ + public function clearVolumes($shelf, $optParams = array()) { + $params = array('shelf' => $shelf); + $params = array_merge($params, $optParams); + $data = $this->__call('clearVolumes', array($params)); + return $data; + } + /** + * Removes a volume from a bookshelf. (bookshelves.removeVolume) + * @param string $shelf Id of bookshelf from which to remove a volume. + * @param string $volumeId Id of volume to remove. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string source String to identify the originator of this request. + */ + public function removeVolume($shelf, $volumeId, $optParams = array()) { + $params = array('shelf' => $shelf, 'volumeId' => $volumeId); + $params = array_merge($params, $optParams); + $data = $this->__call('removeVolume', array($params)); + return $data; + } + /** + * Retrieves a list of bookshelves belonging to the authenticated user. (bookshelves.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string source String to identify the originator of this request. + * @return Bookshelves + */ + public function listMylibraryBookshelves($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Bookshelves($data); + } else { + return $data; + } + } + /** + * Adds a volume to a bookshelf. (bookshelves.addVolume) + * @param string $shelf Id of bookshelf to which to add a volume. + * @param string $volumeId Id of volume to add. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string source String to identify the originator of this request. + */ + public function addVolume($shelf, $volumeId, $optParams = array()) { + $params = array('shelf' => $shelf, 'volumeId' => $volumeId); + $params = array_merge($params, $optParams); + $data = $this->__call('addVolume', array($params)); + return $data; + } + /** + * Retrieves a specific bookshelf belonging to the authenticated user. (bookshelves.get) + * @param string $shelf Id of bookshelf to retrieve. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string source String to identify the originator of this request. + * @return Bookshelf + */ + public function get($shelf, $optParams = array()) { + $params = array('shelf' => $shelf); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Bookshelf($data); + } else { + return $data; + } + } + } + + + /** + * The "volumes" collection of methods. + * Typical usage is: + * + * $booksService = new apiBooksService(...); + * $volumes = $booksService->volumes; + * + */ + class MylibraryBookshelvesVolumesServiceResource extends apiServiceResource { + + + /** + * Gets volume information for volumes on a bookshelf. (volumes.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string shelf The bookshelf id or name retrieve volumes for. + * @opt_param string projection Restrict information returned to a set of selected fields. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param bool showPreorders Set to true to show pre-ordered books. Defaults to false. + * @opt_param string maxResults Maximum number of results to return + * @opt_param string q Full-text search query string in this bookshelf. + * @opt_param string source String to identify the originator of this request. + * @opt_param string startIndex Index of the first element to return (starts at 0) + * @return Volumes + */ + public function listMylibraryBookshelvesVolumes($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Volumes($data); + } else { + return $data; + } + } + } + /** + * The "annotations" collection of methods. + * Typical usage is: + * + * $booksService = new apiBooksService(...); + * $annotations = $booksService->annotations; + * + */ + class MylibraryAnnotationsServiceResource extends apiServiceResource { + + + /** + * Inserts a new annotation. (annotations.insert) + * @param Annotation $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string source String to identify the originator of this request. + * @return Annotation + */ + public function insert(Annotation $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Annotation($data); + } else { + return $data; + } + } + /** + * Gets an annotation by its id. (annotations.get) + * @param string $annotationId The annotation identifier for the annotation to retrieve. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string source String to identify the originator of this request. + * @return Annotation + */ + public function get($annotationId, $optParams = array()) { + $params = array('annotationId' => $annotationId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Annotation($data); + } else { + return $data; + } + } + /** + * Retrieves a list of annotations, possibly filtered. (annotations.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string source String to identify the originator of this request. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string volumeId The volume to restrict annotations to. + * @opt_param string maxResults Maximum number of results to return + * @opt_param string pageToken The value of the nextToken from the previous page. + * @opt_param string pageIds The page id(s) for the volume that is being queried. + * @opt_param string contentVersion The content version for the requested volume. + * @opt_param string layerId The layer id to limit annotation by. + * @return Annotations + */ + public function listMylibraryAnnotations($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Annotations($data); + } else { + return $data; + } + } + /** + * Updates an existing annotation. (annotations.update) + * @param string $annotationId The annotation identifier for the annotation to update. + * @param Annotation $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string source String to identify the originator of this request. + * @return Annotation + */ + public function update($annotationId, Annotation $postBody, $optParams = array()) { + $params = array('annotationId' => $annotationId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new Annotation($data); + } else { + return $data; + } + } + /** + * Deletes an annotation. (annotations.delete) + * @param string $annotationId The annotation identifier for the annotation to delete. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string country ISO-3166-1 code to override the IP-based location. + * @opt_param string source String to identify the originator of this request. + */ + public function delete($annotationId, $optParams = array()) { + $params = array('annotationId' => $annotationId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + + +/** + * Service definition for Books (v1). + *

              + * Lets you search for books and manage your Google Books library. + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiBooksService extends apiService { + public $bookshelves; + public $bookshelves_volumes; + public $myconfig; + public $volumes; + public $mylibrary; + public $mylibrary_bookshelves; + public $mylibrary_annotations; + /** + * Constructs the internal representation of the Books service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/books/v1/'; + $this->version = 'v1'; + $this->serviceName = 'books'; + + $apiClient->addService($this->serviceName, $this->version); + $this->bookshelves = new BookshelvesServiceResource($this, $this->serviceName, 'bookshelves', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"country": {"type": "string", "location": "query"}, "userId": {"required": true, "type": "string", "location": "path"}, "source": {"type": "string", "location": "query"}}, "id": "books.bookshelves.list", "httpMethod": "GET", "path": "users/{userId}/bookshelves", "response": {"$ref": "Bookshelves"}}, "get": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"country": {"type": "string", "location": "query"}, "userId": {"required": true, "type": "string", "location": "path"}, "shelf": {"required": true, "type": "string", "location": "path"}, "source": {"type": "string", "location": "query"}}, "id": "books.bookshelves.get", "httpMethod": "GET", "path": "users/{userId}/bookshelves/{shelf}", "response": {"$ref": "Bookshelf"}}}}', true)); + $this->bookshelves_volumes = new BookshelvesVolumesServiceResource($this, $this->serviceName, 'volumes', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"country": {"type": "string", "location": "query"}, "showPreorders": {"type": "boolean", "location": "query"}, "maxResults": {"format": "uint32", "minimum": "0", "type": "integer", "location": "query"}, "source": {"type": "string", "location": "query"}, "startIndex": {"format": "uint32", "minimum": "0", "type": "integer", "location": "query"}, "shelf": {"required": true, "type": "string", "location": "path"}, "userId": {"required": true, "type": "string", "location": "path"}}, "id": "books.bookshelves.volumes.list", "httpMethod": "GET", "path": "users/{userId}/bookshelves/{shelf}/volumes", "response": {"$ref": "Volumes"}}}}', true)); + $this->myconfig = new MyconfigServiceResource($this, $this->serviceName, 'myconfig', json_decode('{"methods": {"releaseDownloadAccess": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"locale": {"type": "string", "location": "query"}, "country": {"type": "string", "location": "query"}, "source": {"type": "string", "location": "query"}, "cpksver": {"required": true, "type": "string", "location": "query"}, "volumeIds": {"repeated": true, "required": true, "type": "string", "location": "query"}}, "id": "books.myconfig.releaseDownloadAccess", "httpMethod": "POST", "path": "myconfig/releaseDownloadAccess", "response": {"$ref": "DownloadAccesses"}}, "requestAccess": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"nonce": {"required": true, "type": "string", "location": "query"}, "locale": {"type": "string", "location": "query"}, "country": {"type": "string", "location": "query"}, "cpksver": {"required": true, "type": "string", "location": "query"}, "volumeId": {"required": true, "type": "string", "location": "query"}, "source": {"required": true, "type": "string", "location": "query"}}, "id": "books.myconfig.requestAccess", "httpMethod": "POST", "path": "myconfig/requestAccess", "response": {"$ref": "RequestAccess"}}, "syncVolumeLicenses": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"nonce": {"required": true, "type": "string", "location": "query"}, "locale": {"type": "string", "location": "query"}, "country": {"type": "string", "location": "query"}, "cpksver": {"required": true, "type": "string", "location": "query"}, "source": {"required": true, "type": "string", "location": "query"}, "volumeIds": {"repeated": true, "type": "string", "location": "query"}}, "id": "books.myconfig.syncVolumeLicenses", "httpMethod": "POST", "path": "myconfig/syncVolumeLicenses", "response": {"$ref": "Volumes"}}}}', true)); + $this->volumes = new VolumesServiceResource($this, $this->serviceName, 'volumes', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"orderBy": {"enum": ["newest", "relevance"], "type": "string", "location": "query"}, "filter": {"enum": ["ebooks", "free-ebooks", "full", "paid-ebooks", "partial"], "type": "string", "location": "query"}, "projection": {"enum": ["full", "lite"], "type": "string", "location": "query"}, "libraryRestrict": {"enum": ["my-library", "no-restrict"], "type": "string", "location": "query"}, "langRestrict": {"type": "string", "location": "query"}, "country": {"type": "string", "location": "query"}, "printType": {"enum": ["all", "books", "magazines"], "type": "string", "location": "query"}, "maxResults": {"format": "uint32", "maximum": "40", "minimum": "0", "location": "query", "type": "integer"}, "q": {"required": true, "type": "string", "location": "query"}, "source": {"type": "string", "location": "query"}, "startIndex": {"format": "uint32", "minimum": "0", "type": "integer", "location": "query"}, "download": {"enum": ["epub"], "type": "string", "location": "query"}, "partner": {"type": "string", "location": "query"}, "showPreorders": {"type": "boolean", "location": "query"}}, "id": "books.volumes.list", "httpMethod": "GET", "path": "volumes", "response": {"$ref": "Volumes"}}, "get": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"partner": {"type": "string", "location": "query"}, "source": {"type": "string", "location": "query"}, "projection": {"enum": ["full", "lite"], "type": "string", "location": "query"}, "volumeId": {"required": true, "type": "string", "location": "path"}, "country": {"type": "string", "location": "query"}}, "id": "books.volumes.get", "httpMethod": "GET", "path": "volumes/{volumeId}", "response": {"$ref": "Volume"}}}}', true)); + $this->mylibrary = new MylibraryServiceResource($this, $this->serviceName, 'mylibrary', json_decode('{}', true)); + $this->mylibrary_bookshelves = new MylibraryBookshelvesServiceResource($this, $this->serviceName, 'bookshelves', json_decode('{"methods": {"clearVolumes": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"country": {"type": "string", "location": "query"}, "shelf": {"required": true, "type": "string", "location": "path"}, "source": {"type": "string", "location": "query"}}, "httpMethod": "POST", "path": "mylibrary/bookshelves/{shelf}/clearVolumes", "id": "books.mylibrary.bookshelves.clearVolumes"}, "removeVolume": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"country": {"type": "string", "location": "query"}, "volumeId": {"required": true, "type": "string", "location": "query"}, "shelf": {"required": true, "type": "string", "location": "path"}, "source": {"type": "string", "location": "query"}}, "httpMethod": "POST", "path": "mylibrary/bookshelves/{shelf}/removeVolume", "id": "books.mylibrary.bookshelves.removeVolume"}, "list": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"country": {"type": "string", "location": "query"}, "source": {"type": "string", "location": "query"}}, "response": {"$ref": "Bookshelves"}, "httpMethod": "GET", "path": "mylibrary/bookshelves", "id": "books.mylibrary.bookshelves.list"}, "addVolume": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"country": {"type": "string", "location": "query"}, "volumeId": {"required": true, "type": "string", "location": "query"}, "shelf": {"required": true, "type": "string", "location": "path"}, "source": {"type": "string", "location": "query"}}, "httpMethod": "POST", "path": "mylibrary/bookshelves/{shelf}/addVolume", "id": "books.mylibrary.bookshelves.addVolume"}, "get": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"country": {"type": "string", "location": "query"}, "shelf": {"required": true, "type": "string", "location": "path"}, "source": {"type": "string", "location": "query"}}, "id": "books.mylibrary.bookshelves.get", "httpMethod": "GET", "path": "mylibrary/bookshelves/{shelf}", "response": {"$ref": "Bookshelf"}}}}', true)); + $this->mylibrary_annotations = new MylibraryAnnotationsServiceResource($this, $this->serviceName, 'annotations', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"country": {"type": "string", "location": "query"}, "source": {"type": "string", "location": "query"}}, "request": {"$ref": "Annotation"}, "id": "books.mylibrary.annotations.insert", "httpMethod": "POST", "path": "mylibrary/annotations", "response": {"$ref": "Annotation"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"country": {"type": "string", "location": "query"}, "annotationId": {"required": true, "type": "string", "location": "path"}, "source": {"type": "string", "location": "query"}}, "httpMethod": "DELETE", "path": "mylibrary/annotations/{annotationId}", "id": "books.mylibrary.annotations.delete"}, "list": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "country": {"type": "string", "location": "query"}, "volumeId": {"type": "string", "location": "query"}, "maxResults": {"format": "uint32", "maximum": "40", "minimum": "0", "location": "query", "type": "integer"}, "source": {"type": "string", "location": "query"}, "pageIds": {"repeated": true, "type": "string", "location": "query"}, "contentVersion": {"type": "string", "location": "query"}, "layerId": {"type": "string", "location": "query"}}, "response": {"$ref": "Annotations"}, "httpMethod": "GET", "path": "mylibrary/annotations", "id": "books.mylibrary.annotations.list"}, "update": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"country": {"type": "string", "location": "query"}, "annotationId": {"required": true, "type": "string", "location": "path"}, "source": {"type": "string", "location": "query"}}, "request": {"$ref": "Annotation"}, "id": "books.mylibrary.annotations.update", "httpMethod": "PUT", "path": "mylibrary/annotations/{annotationId}", "response": {"$ref": "Annotation"}}, "get": {"scopes": ["https://www.googleapis.com/auth/books"], "parameters": {"country": {"type": "string", "location": "query"}, "annotationId": {"required": true, "type": "string", "location": "path"}, "source": {"type": "string", "location": "query"}}, "id": "books.mylibrary.annotations.get", "httpMethod": "GET", "path": "mylibrary/annotations/{annotationId}", "response": {"$ref": "Annotation"}}}}', true)); + } +} + +class Annotation extends apiModel { + public $kind; + public $updated; + public $created; + public $beforeSelectedText; + protected $__currentVersionRangesType = 'AnnotationCurrentVersionRanges'; + protected $__currentVersionRangesDataType = ''; + public $currentVersionRanges; + public $afterSelectedText; + protected $__clientVersionRangesType = 'AnnotationClientVersionRanges'; + protected $__clientVersionRangesDataType = ''; + public $clientVersionRanges; + public $volumeId; + public $pageIds; + public $layerId; + public $selectedText; + public $highlightStyle; + public $data; + public $id; + public $selfLink; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setCreated($created) { + $this->created = $created; + } + public function getCreated() { + return $this->created; + } + public function setBeforeSelectedText($beforeSelectedText) { + $this->beforeSelectedText = $beforeSelectedText; + } + public function getBeforeSelectedText() { + return $this->beforeSelectedText; + } + public function setCurrentVersionRanges(AnnotationCurrentVersionRanges $currentVersionRanges) { + $this->currentVersionRanges = $currentVersionRanges; + } + public function getCurrentVersionRanges() { + return $this->currentVersionRanges; + } + public function setAfterSelectedText($afterSelectedText) { + $this->afterSelectedText = $afterSelectedText; + } + public function getAfterSelectedText() { + return $this->afterSelectedText; + } + public function setClientVersionRanges(AnnotationClientVersionRanges $clientVersionRanges) { + $this->clientVersionRanges = $clientVersionRanges; + } + public function getClientVersionRanges() { + return $this->clientVersionRanges; + } + public function setVolumeId($volumeId) { + $this->volumeId = $volumeId; + } + public function getVolumeId() { + return $this->volumeId; + } + public function setPageIds(/* array(string) */ $pageIds) { + $this->assertIsArray($pageIds, 'string', __METHOD__); + $this->pageIds = $pageIds; + } + public function getPageIds() { + return $this->pageIds; + } + public function setLayerId($layerId) { + $this->layerId = $layerId; + } + public function getLayerId() { + return $this->layerId; + } + public function setSelectedText($selectedText) { + $this->selectedText = $selectedText; + } + public function getSelectedText() { + return $this->selectedText; + } + public function setHighlightStyle($highlightStyle) { + $this->highlightStyle = $highlightStyle; + } + public function getHighlightStyle() { + return $this->highlightStyle; + } + public function setData($data) { + $this->data = $data; + } + public function getData() { + return $this->data; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class AnnotationClientVersionRanges extends apiModel { + public $contentVersion; + protected $__gbTextRangeType = 'BooksAnnotationsRange'; + protected $__gbTextRangeDataType = ''; + public $gbTextRange; + protected $__cfiRangeType = 'BooksAnnotationsRange'; + protected $__cfiRangeDataType = ''; + public $cfiRange; + protected $__gbImageRangeType = 'BooksAnnotationsRange'; + protected $__gbImageRangeDataType = ''; + public $gbImageRange; + public function setContentVersion($contentVersion) { + $this->contentVersion = $contentVersion; + } + public function getContentVersion() { + return $this->contentVersion; + } + public function setGbTextRange(BooksAnnotationsRange $gbTextRange) { + $this->gbTextRange = $gbTextRange; + } + public function getGbTextRange() { + return $this->gbTextRange; + } + public function setCfiRange(BooksAnnotationsRange $cfiRange) { + $this->cfiRange = $cfiRange; + } + public function getCfiRange() { + return $this->cfiRange; + } + public function setGbImageRange(BooksAnnotationsRange $gbImageRange) { + $this->gbImageRange = $gbImageRange; + } + public function getGbImageRange() { + return $this->gbImageRange; + } +} + +class AnnotationCurrentVersionRanges extends apiModel { + public $contentVersion; + protected $__gbTextRangeType = 'BooksAnnotationsRange'; + protected $__gbTextRangeDataType = ''; + public $gbTextRange; + protected $__cfiRangeType = 'BooksAnnotationsRange'; + protected $__cfiRangeDataType = ''; + public $cfiRange; + protected $__gbImageRangeType = 'BooksAnnotationsRange'; + protected $__gbImageRangeDataType = ''; + public $gbImageRange; + public function setContentVersion($contentVersion) { + $this->contentVersion = $contentVersion; + } + public function getContentVersion() { + return $this->contentVersion; + } + public function setGbTextRange(BooksAnnotationsRange $gbTextRange) { + $this->gbTextRange = $gbTextRange; + } + public function getGbTextRange() { + return $this->gbTextRange; + } + public function setCfiRange(BooksAnnotationsRange $cfiRange) { + $this->cfiRange = $cfiRange; + } + public function getCfiRange() { + return $this->cfiRange; + } + public function setGbImageRange(BooksAnnotationsRange $gbImageRange) { + $this->gbImageRange = $gbImageRange; + } + public function getGbImageRange() { + return $this->gbImageRange; + } +} + +class Annotations extends apiModel { + public $nextPageToken; + protected $__itemsType = 'Annotation'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $totalItems; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(Annotation) */ $items) { + $this->assertIsArray($items, 'Annotation', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } +} + +class BooksAnnotationsRange extends apiModel { + public $startPosition; + public $endPosition; + public $startOffset; + public $endOffset; + public function setStartPosition($startPosition) { + $this->startPosition = $startPosition; + } + public function getStartPosition() { + return $this->startPosition; + } + public function setEndPosition($endPosition) { + $this->endPosition = $endPosition; + } + public function getEndPosition() { + return $this->endPosition; + } + public function setStartOffset($startOffset) { + $this->startOffset = $startOffset; + } + public function getStartOffset() { + return $this->startOffset; + } + public function setEndOffset($endOffset) { + $this->endOffset = $endOffset; + } + public function getEndOffset() { + return $this->endOffset; + } +} + +class Bookshelf extends apiModel { + public $kind; + public $description; + public $created; + public $volumeCount; + public $title; + public $updated; + public $access; + public $volumesLastUpdated; + public $id; + public $selfLink; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setCreated($created) { + $this->created = $created; + } + public function getCreated() { + return $this->created; + } + public function setVolumeCount($volumeCount) { + $this->volumeCount = $volumeCount; + } + public function getVolumeCount() { + return $this->volumeCount; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setAccess($access) { + $this->access = $access; + } + public function getAccess() { + return $this->access; + } + public function setVolumesLastUpdated($volumesLastUpdated) { + $this->volumesLastUpdated = $volumesLastUpdated; + } + public function getVolumesLastUpdated() { + return $this->volumesLastUpdated; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class Bookshelves extends apiModel { + protected $__itemsType = 'Bookshelf'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(Bookshelf) */ $items) { + $this->assertIsArray($items, 'Bookshelf', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class ConcurrentAccessRestriction extends apiModel { + public $nonce; + public $kind; + public $restricted; + public $volumeId; + public $maxConcurrentDevices; + public $deviceAllowed; + public $source; + public $timeWindowSeconds; + public $signature; + public $reasonCode; + public $message; + public function setNonce($nonce) { + $this->nonce = $nonce; + } + public function getNonce() { + return $this->nonce; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setRestricted($restricted) { + $this->restricted = $restricted; + } + public function getRestricted() { + return $this->restricted; + } + public function setVolumeId($volumeId) { + $this->volumeId = $volumeId; + } + public function getVolumeId() { + return $this->volumeId; + } + public function setMaxConcurrentDevices($maxConcurrentDevices) { + $this->maxConcurrentDevices = $maxConcurrentDevices; + } + public function getMaxConcurrentDevices() { + return $this->maxConcurrentDevices; + } + public function setDeviceAllowed($deviceAllowed) { + $this->deviceAllowed = $deviceAllowed; + } + public function getDeviceAllowed() { + return $this->deviceAllowed; + } + public function setSource($source) { + $this->source = $source; + } + public function getSource() { + return $this->source; + } + public function setTimeWindowSeconds($timeWindowSeconds) { + $this->timeWindowSeconds = $timeWindowSeconds; + } + public function getTimeWindowSeconds() { + return $this->timeWindowSeconds; + } + public function setSignature($signature) { + $this->signature = $signature; + } + public function getSignature() { + return $this->signature; + } + public function setReasonCode($reasonCode) { + $this->reasonCode = $reasonCode; + } + public function getReasonCode() { + return $this->reasonCode; + } + public function setMessage($message) { + $this->message = $message; + } + public function getMessage() { + return $this->message; + } +} + +class DownloadAccessRestriction extends apiModel { + public $nonce; + public $kind; + public $justAcquired; + public $maxDownloadDevices; + public $downloadsAcquired; + public $signature; + public $volumeId; + public $deviceAllowed; + public $source; + public $restricted; + public $reasonCode; + public $message; + public function setNonce($nonce) { + $this->nonce = $nonce; + } + public function getNonce() { + return $this->nonce; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setJustAcquired($justAcquired) { + $this->justAcquired = $justAcquired; + } + public function getJustAcquired() { + return $this->justAcquired; + } + public function setMaxDownloadDevices($maxDownloadDevices) { + $this->maxDownloadDevices = $maxDownloadDevices; + } + public function getMaxDownloadDevices() { + return $this->maxDownloadDevices; + } + public function setDownloadsAcquired($downloadsAcquired) { + $this->downloadsAcquired = $downloadsAcquired; + } + public function getDownloadsAcquired() { + return $this->downloadsAcquired; + } + public function setSignature($signature) { + $this->signature = $signature; + } + public function getSignature() { + return $this->signature; + } + public function setVolumeId($volumeId) { + $this->volumeId = $volumeId; + } + public function getVolumeId() { + return $this->volumeId; + } + public function setDeviceAllowed($deviceAllowed) { + $this->deviceAllowed = $deviceAllowed; + } + public function getDeviceAllowed() { + return $this->deviceAllowed; + } + public function setSource($source) { + $this->source = $source; + } + public function getSource() { + return $this->source; + } + public function setRestricted($restricted) { + $this->restricted = $restricted; + } + public function getRestricted() { + return $this->restricted; + } + public function setReasonCode($reasonCode) { + $this->reasonCode = $reasonCode; + } + public function getReasonCode() { + return $this->reasonCode; + } + public function setMessage($message) { + $this->message = $message; + } + public function getMessage() { + return $this->message; + } +} + +class DownloadAccesses extends apiModel { + protected $__downloadAccessListType = 'DownloadAccessRestriction'; + protected $__downloadAccessListDataType = 'array'; + public $downloadAccessList; + public $kind; + public function setDownloadAccessList(/* array(DownloadAccessRestriction) */ $downloadAccessList) { + $this->assertIsArray($downloadAccessList, 'DownloadAccessRestriction', __METHOD__); + $this->downloadAccessList = $downloadAccessList; + } + public function getDownloadAccessList() { + return $this->downloadAccessList; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class ReadingPosition extends apiModel { + public $kind; + public $gbImagePosition; + public $epubCfiPosition; + public $updated; + public $volumeId; + public $pdfPosition; + public $gbTextPosition; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setGbImagePosition($gbImagePosition) { + $this->gbImagePosition = $gbImagePosition; + } + public function getGbImagePosition() { + return $this->gbImagePosition; + } + public function setEpubCfiPosition($epubCfiPosition) { + $this->epubCfiPosition = $epubCfiPosition; + } + public function getEpubCfiPosition() { + return $this->epubCfiPosition; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setVolumeId($volumeId) { + $this->volumeId = $volumeId; + } + public function getVolumeId() { + return $this->volumeId; + } + public function setPdfPosition($pdfPosition) { + $this->pdfPosition = $pdfPosition; + } + public function getPdfPosition() { + return $this->pdfPosition; + } + public function setGbTextPosition($gbTextPosition) { + $this->gbTextPosition = $gbTextPosition; + } + public function getGbTextPosition() { + return $this->gbTextPosition; + } +} + +class RequestAccess extends apiModel { + protected $__downloadAccessType = 'DownloadAccessRestriction'; + protected $__downloadAccessDataType = ''; + public $downloadAccess; + public $kind; + protected $__concurrentAccessType = 'ConcurrentAccessRestriction'; + protected $__concurrentAccessDataType = ''; + public $concurrentAccess; + public function setDownloadAccess(DownloadAccessRestriction $downloadAccess) { + $this->downloadAccess = $downloadAccess; + } + public function getDownloadAccess() { + return $this->downloadAccess; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setConcurrentAccess(ConcurrentAccessRestriction $concurrentAccess) { + $this->concurrentAccess = $concurrentAccess; + } + public function getConcurrentAccess() { + return $this->concurrentAccess; + } +} + +class Review extends apiModel { + public $rating; + public $kind; + protected $__authorType = 'ReviewAuthor'; + protected $__authorDataType = ''; + public $author; + public $title; + public $volumeId; + public $content; + protected $__sourceType = 'ReviewSource'; + protected $__sourceDataType = ''; + public $source; + public $date; + public $type; + public $fullTextUrl; + public function setRating($rating) { + $this->rating = $rating; + } + public function getRating() { + return $this->rating; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setAuthor(ReviewAuthor $author) { + $this->author = $author; + } + public function getAuthor() { + return $this->author; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setVolumeId($volumeId) { + $this->volumeId = $volumeId; + } + public function getVolumeId() { + return $this->volumeId; + } + public function setContent($content) { + $this->content = $content; + } + public function getContent() { + return $this->content; + } + public function setSource(ReviewSource $source) { + $this->source = $source; + } + public function getSource() { + return $this->source; + } + public function setDate($date) { + $this->date = $date; + } + public function getDate() { + return $this->date; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setFullTextUrl($fullTextUrl) { + $this->fullTextUrl = $fullTextUrl; + } + public function getFullTextUrl() { + return $this->fullTextUrl; + } +} + +class ReviewAuthor extends apiModel { + public $displayName; + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } +} + +class ReviewSource extends apiModel { + public $extraDescription; + public $url; + public $description; + public function setExtraDescription($extraDescription) { + $this->extraDescription = $extraDescription; + } + public function getExtraDescription() { + return $this->extraDescription; + } + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } +} + +class Volume extends apiModel { + public $kind; + protected $__accessInfoType = 'VolumeAccessInfo'; + protected $__accessInfoDataType = ''; + public $accessInfo; + protected $__saleInfoType = 'VolumeSaleInfo'; + protected $__saleInfoDataType = ''; + public $saleInfo; + public $etag; + protected $__userInfoType = 'VolumeUserInfo'; + protected $__userInfoDataType = ''; + public $userInfo; + protected $__volumeInfoType = 'VolumeVolumeInfo'; + protected $__volumeInfoDataType = ''; + public $volumeInfo; + public $id; + public $selfLink; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setAccessInfo(VolumeAccessInfo $accessInfo) { + $this->accessInfo = $accessInfo; + } + public function getAccessInfo() { + return $this->accessInfo; + } + public function setSaleInfo(VolumeSaleInfo $saleInfo) { + $this->saleInfo = $saleInfo; + } + public function getSaleInfo() { + return $this->saleInfo; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setUserInfo(VolumeUserInfo $userInfo) { + $this->userInfo = $userInfo; + } + public function getUserInfo() { + return $this->userInfo; + } + public function setVolumeInfo(VolumeVolumeInfo $volumeInfo) { + $this->volumeInfo = $volumeInfo; + } + public function getVolumeInfo() { + return $this->volumeInfo; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class VolumeAccessInfo extends apiModel { + public $publicDomain; + public $embeddable; + protected $__downloadAccessType = 'DownloadAccessRestriction'; + protected $__downloadAccessDataType = ''; + public $downloadAccess; + public $country; + public $textToSpeechPermission; + protected $__pdfType = 'VolumeAccessInfoPdf'; + protected $__pdfDataType = ''; + public $pdf; + public $viewability; + protected $__epubType = 'VolumeAccessInfoEpub'; + protected $__epubDataType = ''; + public $epub; + public $accessViewStatus; + public function setPublicDomain($publicDomain) { + $this->publicDomain = $publicDomain; + } + public function getPublicDomain() { + return $this->publicDomain; + } + public function setEmbeddable($embeddable) { + $this->embeddable = $embeddable; + } + public function getEmbeddable() { + return $this->embeddable; + } + public function setDownloadAccess(DownloadAccessRestriction $downloadAccess) { + $this->downloadAccess = $downloadAccess; + } + public function getDownloadAccess() { + return $this->downloadAccess; + } + public function setCountry($country) { + $this->country = $country; + } + public function getCountry() { + return $this->country; + } + public function setTextToSpeechPermission($textToSpeechPermission) { + $this->textToSpeechPermission = $textToSpeechPermission; + } + public function getTextToSpeechPermission() { + return $this->textToSpeechPermission; + } + public function setPdf(VolumeAccessInfoPdf $pdf) { + $this->pdf = $pdf; + } + public function getPdf() { + return $this->pdf; + } + public function setViewability($viewability) { + $this->viewability = $viewability; + } + public function getViewability() { + return $this->viewability; + } + public function setEpub(VolumeAccessInfoEpub $epub) { + $this->epub = $epub; + } + public function getEpub() { + return $this->epub; + } + public function setAccessViewStatus($accessViewStatus) { + $this->accessViewStatus = $accessViewStatus; + } + public function getAccessViewStatus() { + return $this->accessViewStatus; + } +} + +class VolumeAccessInfoEpub extends apiModel { + public $downloadLink; + public $acsTokenLink; + public function setDownloadLink($downloadLink) { + $this->downloadLink = $downloadLink; + } + public function getDownloadLink() { + return $this->downloadLink; + } + public function setAcsTokenLink($acsTokenLink) { + $this->acsTokenLink = $acsTokenLink; + } + public function getAcsTokenLink() { + return $this->acsTokenLink; + } +} + +class VolumeAccessInfoPdf extends apiModel { + public $downloadLink; + public $acsTokenLink; + public function setDownloadLink($downloadLink) { + $this->downloadLink = $downloadLink; + } + public function getDownloadLink() { + return $this->downloadLink; + } + public function setAcsTokenLink($acsTokenLink) { + $this->acsTokenLink = $acsTokenLink; + } + public function getAcsTokenLink() { + return $this->acsTokenLink; + } +} + +class VolumeSaleInfo extends apiModel { + public $country; + protected $__retailPriceType = 'VolumeSaleInfoRetailPrice'; + protected $__retailPriceDataType = ''; + public $retailPrice; + public $isEbook; + public $saleability; + public $buyLink; + public $onSaleDate; + protected $__listPriceType = 'VolumeSaleInfoListPrice'; + protected $__listPriceDataType = ''; + public $listPrice; + public function setCountry($country) { + $this->country = $country; + } + public function getCountry() { + return $this->country; + } + public function setRetailPrice(VolumeSaleInfoRetailPrice $retailPrice) { + $this->retailPrice = $retailPrice; + } + public function getRetailPrice() { + return $this->retailPrice; + } + public function setIsEbook($isEbook) { + $this->isEbook = $isEbook; + } + public function getIsEbook() { + return $this->isEbook; + } + public function setSaleability($saleability) { + $this->saleability = $saleability; + } + public function getSaleability() { + return $this->saleability; + } + public function setBuyLink($buyLink) { + $this->buyLink = $buyLink; + } + public function getBuyLink() { + return $this->buyLink; + } + public function setOnSaleDate($onSaleDate) { + $this->onSaleDate = $onSaleDate; + } + public function getOnSaleDate() { + return $this->onSaleDate; + } + public function setListPrice(VolumeSaleInfoListPrice $listPrice) { + $this->listPrice = $listPrice; + } + public function getListPrice() { + return $this->listPrice; + } +} + +class VolumeSaleInfoListPrice extends apiModel { + public $amount; + public $currencyCode; + public function setAmount($amount) { + $this->amount = $amount; + } + public function getAmount() { + return $this->amount; + } + public function setCurrencyCode($currencyCode) { + $this->currencyCode = $currencyCode; + } + public function getCurrencyCode() { + return $this->currencyCode; + } +} + +class VolumeSaleInfoRetailPrice extends apiModel { + public $amount; + public $currencyCode; + public function setAmount($amount) { + $this->amount = $amount; + } + public function getAmount() { + return $this->amount; + } + public function setCurrencyCode($currencyCode) { + $this->currencyCode = $currencyCode; + } + public function getCurrencyCode() { + return $this->currencyCode; + } +} + +class VolumeUserInfo extends apiModel { + public $updated; + public $isPreordered; + public $isPurchased; + protected $__readingPositionType = 'ReadingPosition'; + protected $__readingPositionDataType = ''; + public $readingPosition; + protected $__reviewType = 'Review'; + protected $__reviewDataType = ''; + public $review; + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setIsPreordered($isPreordered) { + $this->isPreordered = $isPreordered; + } + public function getIsPreordered() { + return $this->isPreordered; + } + public function setIsPurchased($isPurchased) { + $this->isPurchased = $isPurchased; + } + public function getIsPurchased() { + return $this->isPurchased; + } + public function setReadingPosition(ReadingPosition $readingPosition) { + $this->readingPosition = $readingPosition; + } + public function getReadingPosition() { + return $this->readingPosition; + } + public function setReview(Review $review) { + $this->review = $review; + } + public function getReview() { + return $this->review; + } +} + +class VolumeVolumeInfo extends apiModel { + public $publisher; + public $subtitle; + public $description; + public $language; + public $pageCount; + protected $__imageLinksType = 'VolumeVolumeInfoImageLinks'; + protected $__imageLinksDataType = ''; + public $imageLinks; + public $publishedDate; + public $previewLink; + public $printType; + public $ratingsCount; + public $mainCategory; + protected $__dimensionsType = 'VolumeVolumeInfoDimensions'; + protected $__dimensionsDataType = ''; + public $dimensions; + public $contentVersion; + protected $__industryIdentifiersType = 'VolumeVolumeInfoIndustryIdentifiers'; + protected $__industryIdentifiersDataType = 'array'; + public $industryIdentifiers; + public $authors; + public $title; + public $canonicalVolumeLink; + public $infoLink; + public $categories; + public $averageRating; + public function setPublisher($publisher) { + $this->publisher = $publisher; + } + public function getPublisher() { + return $this->publisher; + } + public function setSubtitle($subtitle) { + $this->subtitle = $subtitle; + } + public function getSubtitle() { + return $this->subtitle; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setLanguage($language) { + $this->language = $language; + } + public function getLanguage() { + return $this->language; + } + public function setPageCount($pageCount) { + $this->pageCount = $pageCount; + } + public function getPageCount() { + return $this->pageCount; + } + public function setImageLinks(VolumeVolumeInfoImageLinks $imageLinks) { + $this->imageLinks = $imageLinks; + } + public function getImageLinks() { + return $this->imageLinks; + } + public function setPublishedDate($publishedDate) { + $this->publishedDate = $publishedDate; + } + public function getPublishedDate() { + return $this->publishedDate; + } + public function setPreviewLink($previewLink) { + $this->previewLink = $previewLink; + } + public function getPreviewLink() { + return $this->previewLink; + } + public function setPrintType($printType) { + $this->printType = $printType; + } + public function getPrintType() { + return $this->printType; + } + public function setRatingsCount($ratingsCount) { + $this->ratingsCount = $ratingsCount; + } + public function getRatingsCount() { + return $this->ratingsCount; + } + public function setMainCategory($mainCategory) { + $this->mainCategory = $mainCategory; + } + public function getMainCategory() { + return $this->mainCategory; + } + public function setDimensions(VolumeVolumeInfoDimensions $dimensions) { + $this->dimensions = $dimensions; + } + public function getDimensions() { + return $this->dimensions; + } + public function setContentVersion($contentVersion) { + $this->contentVersion = $contentVersion; + } + public function getContentVersion() { + return $this->contentVersion; + } + public function setIndustryIdentifiers(/* array(VolumeVolumeInfoIndustryIdentifiers) */ $industryIdentifiers) { + $this->assertIsArray($industryIdentifiers, 'VolumeVolumeInfoIndustryIdentifiers', __METHOD__); + $this->industryIdentifiers = $industryIdentifiers; + } + public function getIndustryIdentifiers() { + return $this->industryIdentifiers; + } + public function setAuthors(/* array(string) */ $authors) { + $this->assertIsArray($authors, 'string', __METHOD__); + $this->authors = $authors; + } + public function getAuthors() { + return $this->authors; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setCanonicalVolumeLink($canonicalVolumeLink) { + $this->canonicalVolumeLink = $canonicalVolumeLink; + } + public function getCanonicalVolumeLink() { + return $this->canonicalVolumeLink; + } + public function setInfoLink($infoLink) { + $this->infoLink = $infoLink; + } + public function getInfoLink() { + return $this->infoLink; + } + public function setCategories(/* array(string) */ $categories) { + $this->assertIsArray($categories, 'string', __METHOD__); + $this->categories = $categories; + } + public function getCategories() { + return $this->categories; + } + public function setAverageRating($averageRating) { + $this->averageRating = $averageRating; + } + public function getAverageRating() { + return $this->averageRating; + } +} + +class VolumeVolumeInfoDimensions extends apiModel { + public $width; + public $thickness; + public $height; + public function setWidth($width) { + $this->width = $width; + } + public function getWidth() { + return $this->width; + } + public function setThickness($thickness) { + $this->thickness = $thickness; + } + public function getThickness() { + return $this->thickness; + } + public function setHeight($height) { + $this->height = $height; + } + public function getHeight() { + return $this->height; + } +} + +class VolumeVolumeInfoImageLinks extends apiModel { + public $medium; + public $smallThumbnail; + public $large; + public $extraLarge; + public $small; + public $thumbnail; + public function setMedium($medium) { + $this->medium = $medium; + } + public function getMedium() { + return $this->medium; + } + public function setSmallThumbnail($smallThumbnail) { + $this->smallThumbnail = $smallThumbnail; + } + public function getSmallThumbnail() { + return $this->smallThumbnail; + } + public function setLarge($large) { + $this->large = $large; + } + public function getLarge() { + return $this->large; + } + public function setExtraLarge($extraLarge) { + $this->extraLarge = $extraLarge; + } + public function getExtraLarge() { + return $this->extraLarge; + } + public function setSmall($small) { + $this->small = $small; + } + public function getSmall() { + return $this->small; + } + public function setThumbnail($thumbnail) { + $this->thumbnail = $thumbnail; + } + public function getThumbnail() { + return $this->thumbnail; + } +} + +class VolumeVolumeInfoIndustryIdentifiers extends apiModel { + public $identifier; + public $type; + public function setIdentifier($identifier) { + $this->identifier = $identifier; + } + public function getIdentifier() { + return $this->identifier; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } +} + +class Volumes extends apiModel { + public $totalItems; + protected $__itemsType = 'Volume'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } + public function setItems(/* array(Volume) */ $items) { + $this->assertIsArray($items, 'Volume', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiCalendarService.php b/inc/vendors/social-login/Google/contrib/apiCalendarService.php new file mode 100755 index 00000000..cfcbffd6 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiCalendarService.php @@ -0,0 +1,1812 @@ + + * $calendarService = new apiCalendarService(...); + * $freebusy = $calendarService->freebusy; + * + */ + class FreebusyServiceResource extends apiServiceResource { + + + /** + * Returns free/busy information for a set of calendars. (freebusy.query) + * @param FreeBusyRequest $postBody + * @return FreeBusyResponse + */ + public function query(FreeBusyRequest $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('query', array($params)); + if ($this->useObjects()) { + return new FreeBusyResponse($data); + } else { + return $data; + } + } + } + + /** + * The "settings" collection of methods. + * Typical usage is: + * + * $calendarService = new apiCalendarService(...); + * $settings = $calendarService->settings; + * + */ + class SettingsServiceResource extends apiServiceResource { + + + /** + * Returns all user settings for the authenticated user. (settings.list) + * @return Settings + */ + public function listSettings($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Settings($data); + } else { + return $data; + } + } + /** + * Returns a single user setting. (settings.get) + * @param string $setting Name of the user setting. + * @return Setting + */ + public function get($setting, $optParams = array()) { + $params = array('setting' => $setting); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Setting($data); + } else { + return $data; + } + } + } + + /** + * The "calendarList" collection of methods. + * Typical usage is: + * + * $calendarService = new apiCalendarService(...); + * $calendarList = $calendarService->calendarList; + * + */ + class CalendarListServiceResource extends apiServiceResource { + + + /** + * Adds an entry to the user's calendar list. (calendarList.insert) + * @param CalendarListEntry $postBody + * @return CalendarListEntry + */ + public function insert(CalendarListEntry $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new CalendarListEntry($data); + } else { + return $data; + } + } + /** + * Returns an entry on the user's calendar list. (calendarList.get) + * @param string $calendarId Calendar identifier. + * @return CalendarListEntry + */ + public function get($calendarId, $optParams = array()) { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new CalendarListEntry($data); + } else { + return $data; + } + } + /** + * Returns entries on the user's calendar list. (calendarList.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken Token specifying which result page to return. Optional. + * @opt_param bool showHidden Whether to show hidden entries. Optional. The default is False. + * @opt_param int maxResults Maximum number of entries returned on one result page. Optional. + * @opt_param string minAccessRole The minimum access role for the user in the returned entires. Optional. The default is no restriction. + * @return CalendarList + */ + public function listCalendarList($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CalendarList($data); + } else { + return $data; + } + } + /** + * Updates an entry on the user's calendar list. (calendarList.update) + * @param string $calendarId Calendar identifier. + * @param CalendarListEntry $postBody + * @return CalendarListEntry + */ + public function update($calendarId, CalendarListEntry $postBody, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new CalendarListEntry($data); + } else { + return $data; + } + } + /** + * Updates an entry on the user's calendar list. This method supports patch semantics. + * (calendarList.patch) + * @param string $calendarId Calendar identifier. + * @param CalendarListEntry $postBody + * @return CalendarListEntry + */ + public function patch($calendarId, CalendarListEntry $postBody, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('patch', array($params)); + if ($this->useObjects()) { + return new CalendarListEntry($data); + } else { + return $data; + } + } + /** + * Deletes an entry on the user's calendar list. (calendarList.delete) + * @param string $calendarId Calendar identifier. + */ + public function delete($calendarId, $optParams = array()) { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "calendars" collection of methods. + * Typical usage is: + * + * $calendarService = new apiCalendarService(...); + * $calendars = $calendarService->calendars; + * + */ + class CalendarsServiceResource extends apiServiceResource { + + + /** + * Creates a secondary calendar. (calendars.insert) + * @param Calendar $postBody + * @return Calendar + */ + public function insert(Calendar $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Calendar($data); + } else { + return $data; + } + } + /** + * Returns metadata for a calendar. (calendars.get) + * @param string $calendarId Calendar identifier. + * @return Calendar + */ + public function get($calendarId, $optParams = array()) { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Calendar($data); + } else { + return $data; + } + } + /** + * Clears a primary calendar. This operation deletes all data associated with the primary calendar + * of an account and cannot be undone. (calendars.clear) + * @param string $calendarId Calendar identifier. + */ + public function clear($calendarId, $optParams = array()) { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + $data = $this->__call('clear', array($params)); + return $data; + } + /** + * Updates metadata for a calendar. (calendars.update) + * @param string $calendarId Calendar identifier. + * @param Calendar $postBody + * @return Calendar + */ + public function update($calendarId, Calendar $postBody, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new Calendar($data); + } else { + return $data; + } + } + /** + * Updates metadata for a calendar. This method supports patch semantics. (calendars.patch) + * @param string $calendarId Calendar identifier. + * @param Calendar $postBody + * @return Calendar + */ + public function patch($calendarId, Calendar $postBody, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('patch', array($params)); + if ($this->useObjects()) { + return new Calendar($data); + } else { + return $data; + } + } + /** + * Deletes a secondary calendar. (calendars.delete) + * @param string $calendarId Calendar identifier. + */ + public function delete($calendarId, $optParams = array()) { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "acl" collection of methods. + * Typical usage is: + * + * $calendarService = new apiCalendarService(...); + * $acl = $calendarService->acl; + * + */ + class AclServiceResource extends apiServiceResource { + + + /** + * Creates an access control rule. (acl.insert) + * @param string $calendarId Calendar identifier. + * @param AclRule $postBody + * @return AclRule + */ + public function insert($calendarId, AclRule $postBody, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new AclRule($data); + } else { + return $data; + } + } + /** + * Returns an access control rule. (acl.get) + * @param string $calendarId Calendar identifier. + * @param string $ruleId ACL rule identifier. + * @return AclRule + */ + public function get($calendarId, $ruleId, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'ruleId' => $ruleId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new AclRule($data); + } else { + return $data; + } + } + /** + * Returns the rules in the access control list for the calendar. (acl.list) + * @param string $calendarId Calendar identifier. + * @return Acl + */ + public function listAcl($calendarId, $optParams = array()) { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Acl($data); + } else { + return $data; + } + } + /** + * Updates an access control rule. (acl.update) + * @param string $calendarId Calendar identifier. + * @param string $ruleId ACL rule identifier. + * @param AclRule $postBody + * @return AclRule + */ + public function update($calendarId, $ruleId, AclRule $postBody, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'ruleId' => $ruleId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new AclRule($data); + } else { + return $data; + } + } + /** + * Updates an access control rule. This method supports patch semantics. (acl.patch) + * @param string $calendarId Calendar identifier. + * @param string $ruleId ACL rule identifier. + * @param AclRule $postBody + * @return AclRule + */ + public function patch($calendarId, $ruleId, AclRule $postBody, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'ruleId' => $ruleId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('patch', array($params)); + if ($this->useObjects()) { + return new AclRule($data); + } else { + return $data; + } + } + /** + * Deletes an access control rule. (acl.delete) + * @param string $calendarId Calendar identifier. + * @param string $ruleId ACL rule identifier. + */ + public function delete($calendarId, $ruleId, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'ruleId' => $ruleId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "colors" collection of methods. + * Typical usage is: + * + * $calendarService = new apiCalendarService(...); + * $colors = $calendarService->colors; + * + */ + class ColorsServiceResource extends apiServiceResource { + + + /** + * Returns the color definitions for calendars and events. (colors.get) + * @return Colors + */ + public function get($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Colors($data); + } else { + return $data; + } + } + } + + /** + * The "events" collection of methods. + * Typical usage is: + * + * $calendarService = new apiCalendarService(...); + * $events = $calendarService->events; + * + */ + class EventsServiceResource extends apiServiceResource { + + + /** + * Resets a specialized instance of a recurring event to its original state. (events.reset) + * @param string $calendarId Calendar identifier. + * @param string $eventId Event identifier. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool sendNotifications Whether to send notifications about the event update. Optional. The default is False. + * @return Event + */ + public function reset($calendarId, $eventId, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'eventId' => $eventId); + $params = array_merge($params, $optParams); + $data = $this->__call('reset', array($params)); + if ($this->useObjects()) { + return new Event($data); + } else { + return $data; + } + } + /** + * Creates an event. (events.insert) + * @param string $calendarId Calendar identifier. + * @param Event $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool sendNotifications Whether to send notifications about the creation of the new event. Optional. The default is False. + * @return Event + */ + public function insert($calendarId, Event $postBody, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Event($data); + } else { + return $data; + } + } + /** + * Returns an event. (events.get) + * @param string $calendarId Calendar identifier. + * @param string $eventId Event identifier. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string timeZone Time zone used in the response. Optional. The default is the time zone of the calendar. + * @opt_param int maxAttendees The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional. + * @return Event + */ + public function get($calendarId, $eventId, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'eventId' => $eventId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Event($data); + } else { + return $data; + } + } + /** + * Moves an event to another calendar, i.e. changes an event's organizer. (events.move) + * @param string $calendarId Calendar identifier of the source calendar where the event currently is on. + * @param string $eventId Event identifier. + * @param string $destination Calendar identifier of the target calendar where the event is to be moved to. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool sendNotifications Whether to send notifications about the change of the event's organizer. Optional. The default is False. + * @return Event + */ + public function move($calendarId, $eventId, $destination, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'destination' => $destination); + $params = array_merge($params, $optParams); + $data = $this->__call('move', array($params)); + if ($this->useObjects()) { + return new Event($data); + } else { + return $data; + } + } + /** + * Returns events on the specified calendar. (events.list) + * @param string $calendarId Calendar identifier. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string orderBy The order of the events returned in the result. Optional. The default is an unspecified, stable order. + * @opt_param bool showHiddenInvitations Whether to include hidden invitations in the result. Optional. The default is False. + * @opt_param bool showDeleted Whether to include deleted events (with 'eventStatus' equals 'cancelled') in the result. Optional. The default is False. + * @opt_param string iCalUID Specifies iCalendar UID (iCalUID) of events to be included in the response. Optional. + * @opt_param string updatedMin Lower bound for an event's last modification time (as a RFC 3339 timestamp) to filter by. Optional. The default is not to filter by last modification time. + * @opt_param bool singleEvents Whether to expand recurring events into instances and only return single one-off events and instances of recurring events, but not the underlying recurring events themselves. Optional. The default is False. + * @opt_param int maxResults Maximum number of events returned on one result page. Optional. + * @opt_param string q Free text search terms to find events that match these terms in any field, except for extended properties. Optional. + * @opt_param string pageToken Token specifying which result page to return. Optional. + * @opt_param string timeMin Lower bound (inclusive) for an event's end time to filter by. Optional. The default is not to filter by end time. + * @opt_param string timeZone Time zone used in the response. Optional. The default is the time zone of the calendar. + * @opt_param string timeMax Upper bound (exclusive) for an event's start time to filter by. Optional. The default is not to filter by start time. + * @opt_param int maxAttendees The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional. + * @return Events + */ + public function listEvents($calendarId, $optParams = array()) { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Events($data); + } else { + return $data; + } + } + /** + * Updates an event. (events.update) + * @param string $calendarId Calendar identifier. + * @param string $eventId Event identifier. + * @param Event $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool sendNotifications Whether to send notifications about the event update (e.g. attendee's responses, title changes, etc.). Optional. The default is False. + * @return Event + */ + public function update($calendarId, $eventId, Event $postBody, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new Event($data); + } else { + return $data; + } + } + /** + * Updates an event. This method supports patch semantics. (events.patch) + * @param string $calendarId Calendar identifier. + * @param string $eventId Event identifier. + * @param Event $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool sendNotifications Whether to send notifications about the event update (e.g. attendee's responses, title changes, etc.). Optional. The default is False. + * @return Event + */ + public function patch($calendarId, $eventId, Event $postBody, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('patch', array($params)); + if ($this->useObjects()) { + return new Event($data); + } else { + return $data; + } + } + /** + * Returns instances of the specified recurring event. (events.instances) + * @param string $calendarId Calendar identifier. + * @param string $eventId Recurring event identifier. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool showDeleted Whether to include deleted events (with 'eventStatus' equals 'cancelled') in the result. Optional. The default is False. + * @opt_param int maxResults Maximum number of events returned on one result page. Optional. + * @opt_param string pageToken Token specifying which result page to return. Optional. + * @opt_param string timeZone Time zone used in the response. Optional. The default is the time zone of the calendar. + * @opt_param string originalStart The original start time of the instance in the result. Optional. + * @opt_param int maxAttendees The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional. + * @return Events + */ + public function instances($calendarId, $eventId, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'eventId' => $eventId); + $params = array_merge($params, $optParams); + $data = $this->__call('instances', array($params)); + if ($this->useObjects()) { + return new Events($data); + } else { + return $data; + } + } + /** + * Imports an event. (events.import) + * @param string $calendarId Calendar identifier. + * @param Event $postBody + * @return Event + */ + public function import($calendarId, Event $postBody, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('import', array($params)); + if ($this->useObjects()) { + return new Event($data); + } else { + return $data; + } + } + /** + * Creates an event based on a simple text string. (events.quickAdd) + * @param string $calendarId Calendar identifier. + * @param string $text The text describing the event to be created. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool sendNotifications Whether to send notifications about the creation of the event. Optional. The default is False. + * @return Event + */ + public function quickAdd($calendarId, $text, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'text' => $text); + $params = array_merge($params, $optParams); + $data = $this->__call('quickAdd', array($params)); + if ($this->useObjects()) { + return new Event($data); + } else { + return $data; + } + } + /** + * Deletes an event. (events.delete) + * @param string $calendarId Calendar identifier. + * @param string $eventId Event identifier. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool sendNotifications Whether to send notifications about the deletion of the event. Optional. The default is False. + */ + public function delete($calendarId, $eventId, $optParams = array()) { + $params = array('calendarId' => $calendarId, 'eventId' => $eventId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + + +/** + * Service definition for Calendar (v3). + *

              + * Lets you manipulate events and other calendar data. + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiCalendarService extends apiService { + public $freebusy; + public $settings; + public $calendarList; + public $calendars; + public $acl; + public $colors; + public $events; + /** + * Constructs the internal representation of the Calendar service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/calendar/v3/'; + $this->version = 'v3'; + $this->serviceName = 'calendar'; + + $apiClient->addService($this->serviceName, $this->version); + $this->freebusy = new FreebusyServiceResource($this, $this->serviceName, 'freebusy', json_decode('{"methods": {"query": {"scopes": ["https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.readonly"], "request": {"$ref": "FreeBusyRequest"}, "response": {"$ref": "FreeBusyResponse"}, "httpMethod": "POST", "path": "freeBusy", "id": "calendar.freebusy.query"}}}', true)); + $this->settings = new SettingsServiceResource($this, $this->serviceName, 'settings', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.readonly"], "id": "calendar.settings.list", "httpMethod": "GET", "path": "users/me/settings", "response": {"$ref": "Settings"}}, "get": {"scopes": ["https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.readonly"], "parameters": {"setting": {"required": true, "type": "string", "location": "path"}}, "id": "calendar.settings.get", "httpMethod": "GET", "path": "users/me/settings/{setting}", "response": {"$ref": "Setting"}}}}', true)); + $this->calendarList = new CalendarListServiceResource($this, $this->serviceName, 'calendarList', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/calendar"], "request": {"$ref": "CalendarListEntry"}, "response": {"$ref": "CalendarListEntry"}, "httpMethod": "POST", "path": "users/me/calendarList", "id": "calendar.calendarList.insert"}, "get": {"scopes": ["https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.readonly"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}}, "id": "calendar.calendarList.get", "httpMethod": "GET", "path": "users/me/calendarList/{calendarId}", "response": {"$ref": "CalendarListEntry"}}, "list": {"scopes": ["https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "showHidden": {"type": "boolean", "location": "query"}, "maxResults": {"format": "int32", "minimum": "1", "type": "integer", "location": "query"}, "minAccessRole": {"enum": ["freeBusyReader", "owner", "reader", "writer"], "type": "string", "location": "query"}}, "response": {"$ref": "CalendarList"}, "httpMethod": "GET", "path": "users/me/calendarList", "id": "calendar.calendarList.list"}, "update": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "CalendarListEntry"}, "id": "calendar.calendarList.update", "httpMethod": "PUT", "path": "users/me/calendarList/{calendarId}", "response": {"$ref": "CalendarListEntry"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "CalendarListEntry"}, "id": "calendar.calendarList.patch", "httpMethod": "PATCH", "path": "users/me/calendarList/{calendarId}", "response": {"$ref": "CalendarListEntry"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "users/me/calendarList/{calendarId}", "id": "calendar.calendarList.delete"}}}', true)); + $this->calendars = new CalendarsServiceResource($this, $this->serviceName, 'calendars', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/calendar"], "request": {"$ref": "Calendar"}, "response": {"$ref": "Calendar"}, "httpMethod": "POST", "path": "calendars", "id": "calendar.calendars.insert"}, "get": {"scopes": ["https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.readonly"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}}, "id": "calendar.calendars.get", "httpMethod": "GET", "path": "calendars/{calendarId}", "response": {"$ref": "Calendar"}}, "clear": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "POST", "path": "calendars/{calendarId}/clear", "id": "calendar.calendars.clear"}, "update": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Calendar"}, "id": "calendar.calendars.update", "httpMethod": "PUT", "path": "calendars/{calendarId}", "response": {"$ref": "Calendar"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Calendar"}, "id": "calendar.calendars.patch", "httpMethod": "PATCH", "path": "calendars/{calendarId}", "response": {"$ref": "Calendar"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "calendars/{calendarId}", "id": "calendar.calendars.delete"}}}', true)); + $this->acl = new AclServiceResource($this, $this->serviceName, 'acl', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "AclRule"}, "id": "calendar.acl.insert", "httpMethod": "POST", "path": "calendars/{calendarId}/acl", "response": {"$ref": "AclRule"}}, "get": {"scopes": ["https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.readonly"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}, "ruleId": {"required": true, "type": "string", "location": "path"}}, "id": "calendar.acl.get", "httpMethod": "GET", "path": "calendars/{calendarId}/acl/{ruleId}", "response": {"$ref": "AclRule"}}, "list": {"scopes": ["https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.readonly"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}}, "id": "calendar.acl.list", "httpMethod": "GET", "path": "calendars/{calendarId}/acl", "response": {"$ref": "Acl"}}, "update": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}, "ruleId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "AclRule"}, "id": "calendar.acl.update", "httpMethod": "PUT", "path": "calendars/{calendarId}/acl/{ruleId}", "response": {"$ref": "AclRule"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}, "ruleId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "AclRule"}, "id": "calendar.acl.patch", "httpMethod": "PATCH", "path": "calendars/{calendarId}/acl/{ruleId}", "response": {"$ref": "AclRule"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}, "ruleId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "calendars/{calendarId}/acl/{ruleId}", "id": "calendar.acl.delete"}}}', true)); + $this->colors = new ColorsServiceResource($this, $this->serviceName, 'colors', json_decode('{"methods": {"get": {"id": "calendar.colors.get", "path": "colors", "httpMethod": "GET", "response": {"$ref": "Colors"}}}}', true)); + $this->events = new EventsServiceResource($this, $this->serviceName, 'events', json_decode('{"methods": {"reset": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"eventId": {"required": true, "type": "string", "location": "path"}, "calendarId": {"required": true, "type": "string", "location": "path"}, "sendNotifications": {"type": "boolean", "location": "query"}}, "id": "calendar.events.reset", "httpMethod": "POST", "path": "calendars/{calendarId}/events/{eventId}/reset", "response": {"$ref": "Event"}}, "insert": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}, "sendNotifications": {"type": "boolean", "location": "query"}}, "request": {"$ref": "Event"}, "id": "calendar.events.insert", "httpMethod": "POST", "path": "calendars/{calendarId}/events", "response": {"$ref": "Event"}}, "get": {"scopes": ["https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.readonly"], "parameters": {"eventId": {"required": true, "type": "string", "location": "path"}, "timeZone": {"type": "string", "location": "query"}, "calendarId": {"required": true, "type": "string", "location": "path"}, "maxAttendees": {"format": "int32", "minimum": "1", "type": "integer", "location": "query"}}, "id": "calendar.events.get", "httpMethod": "GET", "path": "calendars/{calendarId}/events/{eventId}", "response": {"$ref": "Event"}}, "move": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"eventId": {"required": true, "type": "string", "location": "path"}, "calendarId": {"required": true, "type": "string", "location": "path"}, "destination": {"required": true, "type": "string", "location": "query"}, "sendNotifications": {"type": "boolean", "location": "query"}}, "id": "calendar.events.move", "httpMethod": "POST", "path": "calendars/{calendarId}/events/{eventId}/move", "response": {"$ref": "Event"}}, "list": {"scopes": ["https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.readonly"], "parameters": {"orderBy": {"enum": ["startTime", "updated"], "type": "string", "location": "query"}, "showHiddenInvitations": {"type": "boolean", "location": "query"}, "pageToken": {"type": "string", "location": "query"}, "iCalUID": {"type": "string", "location": "query"}, "updatedMin": {"type": "string", "location": "query"}, "singleEvents": {"type": "boolean", "location": "query"}, "maxResults": {"format": "int32", "minimum": "1", "type": "integer", "location": "query"}, "q": {"type": "string", "location": "query"}, "showDeleted": {"type": "boolean", "location": "query"}, "calendarId": {"required": true, "type": "string", "location": "path"}, "timeMin": {"type": "string", "location": "query"}, "timeZone": {"type": "string", "location": "query"}, "timeMax": {"type": "string", "location": "query"}, "maxAttendees": {"format": "int32", "minimum": "1", "type": "integer", "location": "query"}}, "id": "calendar.events.list", "httpMethod": "GET", "path": "calendars/{calendarId}/events", "response": {"$ref": "Events"}}, "update": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"eventId": {"required": true, "type": "string", "location": "path"}, "calendarId": {"required": true, "type": "string", "location": "path"}, "sendNotifications": {"type": "boolean", "location": "query"}}, "request": {"$ref": "Event"}, "id": "calendar.events.update", "httpMethod": "PUT", "path": "calendars/{calendarId}/events/{eventId}", "response": {"$ref": "Event"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"eventId": {"required": true, "type": "string", "location": "path"}, "calendarId": {"required": true, "type": "string", "location": "path"}, "sendNotifications": {"type": "boolean", "location": "query"}}, "request": {"$ref": "Event"}, "id": "calendar.events.patch", "httpMethod": "PATCH", "path": "calendars/{calendarId}/events/{eventId}", "response": {"$ref": "Event"}}, "instances": {"scopes": ["https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.readonly"], "parameters": {"eventId": {"required": true, "type": "string", "location": "path"}, "pageToken": {"type": "string", "location": "query"}, "maxResults": {"format": "int32", "minimum": "1", "type": "integer", "location": "query"}, "showDeleted": {"type": "boolean", "location": "query"}, "calendarId": {"required": true, "type": "string", "location": "path"}, "timeZone": {"type": "string", "location": "query"}, "originalStart": {"type": "string", "location": "query"}, "maxAttendees": {"format": "int32", "minimum": "1", "type": "integer", "location": "query"}}, "id": "calendar.events.instances", "httpMethod": "GET", "path": "calendars/{calendarId}/events/{eventId}/instances", "response": {"$ref": "Events"}}, "import": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"calendarId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Event"}, "id": "calendar.events.import", "httpMethod": "POST", "path": "calendars/{calendarId}/events/import", "response": {"$ref": "Event"}}, "quickAdd": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"text": {"required": true, "type": "string", "location": "query"}, "calendarId": {"required": true, "type": "string", "location": "path"}, "sendNotifications": {"type": "boolean", "location": "query"}}, "id": "calendar.events.quickAdd", "httpMethod": "POST", "path": "calendars/{calendarId}/events/quickAdd", "response": {"$ref": "Event"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/calendar"], "parameters": {"eventId": {"required": true, "type": "string", "location": "path"}, "calendarId": {"required": true, "type": "string", "location": "path"}, "sendNotifications": {"type": "boolean", "location": "query"}}, "httpMethod": "DELETE", "path": "calendars/{calendarId}/events/{eventId}", "id": "calendar.events.delete"}}}', true)); + } +} + +class Acl extends apiModel { + public $nextPageToken; + protected $__itemsType = 'AclRule'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $etag; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(AclRule) */ $items) { + $this->assertIsArray($items, 'AclRule', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } +} + +class AclRule extends apiModel { + protected $__scopeType = 'AclRuleScope'; + protected $__scopeDataType = ''; + public $scope; + public $kind; + public $etag; + public $role; + public $id; + public function setScope(AclRuleScope $scope) { + $this->scope = $scope; + } + public function getScope() { + return $this->scope; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setRole($role) { + $this->role = $role; + } + public function getRole() { + return $this->role; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class AclRuleScope extends apiModel { + public $type; + public $value; + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setValue($value) { + $this->value = $value; + } + public function getValue() { + return $this->value; + } +} + +class Calendar extends apiModel { + public $kind; + public $description; + public $summary; + public $etag; + public $location; + public $timeZone; + public $id; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setSummary($summary) { + $this->summary = $summary; + } + public function getSummary() { + return $this->summary; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setLocation($location) { + $this->location = $location; + } + public function getLocation() { + return $this->location; + } + public function setTimeZone($timeZone) { + $this->timeZone = $timeZone; + } + public function getTimeZone() { + return $this->timeZone; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class CalendarList extends apiModel { + public $nextPageToken; + protected $__itemsType = 'CalendarListEntry'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $etag; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(CalendarListEntry) */ $items) { + $this->assertIsArray($items, 'CalendarListEntry', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } +} + +class CalendarListEntry extends apiModel { + public $kind; + protected $__defaultRemindersType = 'EventReminder'; + protected $__defaultRemindersDataType = 'array'; + public $defaultReminders; + public $description; + public $colorId; + public $selected; + public $summary; + public $etag; + public $location; + public $summaryOverride; + public $timeZone; + public $hidden; + public $accessRole; + public $id; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDefaultReminders(/* array(EventReminder) */ $defaultReminders) { + $this->assertIsArray($defaultReminders, 'EventReminder', __METHOD__); + $this->defaultReminders = $defaultReminders; + } + public function getDefaultReminders() { + return $this->defaultReminders; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setColorId($colorId) { + $this->colorId = $colorId; + } + public function getColorId() { + return $this->colorId; + } + public function setSelected($selected) { + $this->selected = $selected; + } + public function getSelected() { + return $this->selected; + } + public function setSummary($summary) { + $this->summary = $summary; + } + public function getSummary() { + return $this->summary; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setLocation($location) { + $this->location = $location; + } + public function getLocation() { + return $this->location; + } + public function setSummaryOverride($summaryOverride) { + $this->summaryOverride = $summaryOverride; + } + public function getSummaryOverride() { + return $this->summaryOverride; + } + public function setTimeZone($timeZone) { + $this->timeZone = $timeZone; + } + public function getTimeZone() { + return $this->timeZone; + } + public function setHidden($hidden) { + $this->hidden = $hidden; + } + public function getHidden() { + return $this->hidden; + } + public function setAccessRole($accessRole) { + $this->accessRole = $accessRole; + } + public function getAccessRole() { + return $this->accessRole; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class ColorDefinition extends apiModel { + public $foreground; + public $background; + public function setForeground($foreground) { + $this->foreground = $foreground; + } + public function getForeground() { + return $this->foreground; + } + public function setBackground($background) { + $this->background = $background; + } + public function getBackground() { + return $this->background; + } +} + +class Colors extends apiModel { + protected $__calendarType = 'ColorDefinition'; + protected $__calendarDataType = 'map'; + public $calendar; + public $updated; + protected $__eventType = 'ColorDefinition'; + protected $__eventDataType = 'map'; + public $event; + public $kind; + public function setCalendar(ColorDefinition $calendar) { + $this->calendar = $calendar; + } + public function getCalendar() { + return $this->calendar; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setEvent(ColorDefinition $event) { + $this->event = $event; + } + public function getEvent() { + return $this->event; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class Error extends apiModel { + public $domain; + public $reason; + public function setDomain($domain) { + $this->domain = $domain; + } + public function getDomain() { + return $this->domain; + } + public function setReason($reason) { + $this->reason = $reason; + } + public function getReason() { + return $this->reason; + } +} + +class Event extends apiModel { + protected $__creatorType = 'EventCreator'; + protected $__creatorDataType = ''; + public $creator; + protected $__organizerType = 'EventOrganizer'; + protected $__organizerDataType = ''; + public $organizer; + public $id; + protected $__attendeesType = 'EventAttendee'; + protected $__attendeesDataType = 'array'; + public $attendees; + public $htmlLink; + public $recurrence; + protected $__startType = 'EventDateTime'; + protected $__startDataType = ''; + public $start; + public $etag; + public $location; + public $recurringEventId; + protected $__originalStartTimeType = 'EventDateTime'; + protected $__originalStartTimeDataType = ''; + public $originalStartTime; + public $status; + public $updated; + protected $__gadgetType = 'EventGadget'; + protected $__gadgetDataType = ''; + public $gadget; + public $description; + public $iCalUID; + protected $__extendedPropertiesType = 'EventExtendedProperties'; + protected $__extendedPropertiesDataType = ''; + public $extendedProperties; + public $sequence; + public $visibility; + public $guestsCanModify; + protected $__endType = 'EventDateTime'; + protected $__endDataType = ''; + public $end; + public $attendeesOmitted; + public $kind; + public $created; + public $colorId; + public $anyoneCanAddSelf; + protected $__remindersType = 'EventReminders'; + protected $__remindersDataType = ''; + public $reminders; + public $guestsCanSeeOtherGuests; + public $summary; + public $guestsCanInviteOthers; + public $transparency; + public $privateCopy; + public function setCreator(EventCreator $creator) { + $this->creator = $creator; + } + public function getCreator() { + return $this->creator; + } + public function setOrganizer(EventOrganizer $organizer) { + $this->organizer = $organizer; + } + public function getOrganizer() { + return $this->organizer; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setAttendees(/* array(EventAttendee) */ $attendees) { + $this->assertIsArray($attendees, 'EventAttendee', __METHOD__); + $this->attendees = $attendees; + } + public function getAttendees() { + return $this->attendees; + } + public function setHtmlLink($htmlLink) { + $this->htmlLink = $htmlLink; + } + public function getHtmlLink() { + return $this->htmlLink; + } + public function setRecurrence(/* array(string) */ $recurrence) { + $this->assertIsArray($recurrence, 'string', __METHOD__); + $this->recurrence = $recurrence; + } + public function getRecurrence() { + return $this->recurrence; + } + public function setStart(EventDateTime $start) { + $this->start = $start; + } + public function getStart() { + return $this->start; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setLocation($location) { + $this->location = $location; + } + public function getLocation() { + return $this->location; + } + public function setRecurringEventId($recurringEventId) { + $this->recurringEventId = $recurringEventId; + } + public function getRecurringEventId() { + return $this->recurringEventId; + } + public function setOriginalStartTime(EventDateTime $originalStartTime) { + $this->originalStartTime = $originalStartTime; + } + public function getOriginalStartTime() { + return $this->originalStartTime; + } + public function setStatus($status) { + $this->status = $status; + } + public function getStatus() { + return $this->status; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setGadget(EventGadget $gadget) { + $this->gadget = $gadget; + } + public function getGadget() { + return $this->gadget; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setICalUID($iCalUID) { + $this->iCalUID = $iCalUID; + } + public function getICalUID() { + return $this->iCalUID; + } + public function setExtendedProperties(EventExtendedProperties $extendedProperties) { + $this->extendedProperties = $extendedProperties; + } + public function getExtendedProperties() { + return $this->extendedProperties; + } + public function setSequence($sequence) { + $this->sequence = $sequence; + } + public function getSequence() { + return $this->sequence; + } + public function setVisibility($visibility) { + $this->visibility = $visibility; + } + public function getVisibility() { + return $this->visibility; + } + public function setGuestsCanModify($guestsCanModify) { + $this->guestsCanModify = $guestsCanModify; + } + public function getGuestsCanModify() { + return $this->guestsCanModify; + } + public function setEnd(EventDateTime $end) { + $this->end = $end; + } + public function getEnd() { + return $this->end; + } + public function setAttendeesOmitted($attendeesOmitted) { + $this->attendeesOmitted = $attendeesOmitted; + } + public function getAttendeesOmitted() { + return $this->attendeesOmitted; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setCreated($created) { + $this->created = $created; + } + public function getCreated() { + return $this->created; + } + public function setColorId($colorId) { + $this->colorId = $colorId; + } + public function getColorId() { + return $this->colorId; + } + public function setAnyoneCanAddSelf($anyoneCanAddSelf) { + $this->anyoneCanAddSelf = $anyoneCanAddSelf; + } + public function getAnyoneCanAddSelf() { + return $this->anyoneCanAddSelf; + } + public function setReminders(EventReminders $reminders) { + $this->reminders = $reminders; + } + public function getReminders() { + return $this->reminders; + } + public function setGuestsCanSeeOtherGuests($guestsCanSeeOtherGuests) { + $this->guestsCanSeeOtherGuests = $guestsCanSeeOtherGuests; + } + public function getGuestsCanSeeOtherGuests() { + return $this->guestsCanSeeOtherGuests; + } + public function setSummary($summary) { + $this->summary = $summary; + } + public function getSummary() { + return $this->summary; + } + public function setGuestsCanInviteOthers($guestsCanInviteOthers) { + $this->guestsCanInviteOthers = $guestsCanInviteOthers; + } + public function getGuestsCanInviteOthers() { + return $this->guestsCanInviteOthers; + } + public function setTransparency($transparency) { + $this->transparency = $transparency; + } + public function getTransparency() { + return $this->transparency; + } + public function setPrivateCopy($privateCopy) { + $this->privateCopy = $privateCopy; + } + public function getPrivateCopy() { + return $this->privateCopy; + } +} + +class EventAttendee extends apiModel { + public $comment; + public $displayName; + public $self; + public $responseStatus; + public $additionalGuests; + public $resource; + public $organizer; + public $optional; + public $email; + public function setComment($comment) { + $this->comment = $comment; + } + public function getComment() { + return $this->comment; + } + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setSelf($self) { + $this->self = $self; + } + public function getSelf() { + return $this->self; + } + public function setResponseStatus($responseStatus) { + $this->responseStatus = $responseStatus; + } + public function getResponseStatus() { + return $this->responseStatus; + } + public function setAdditionalGuests($additionalGuests) { + $this->additionalGuests = $additionalGuests; + } + public function getAdditionalGuests() { + return $this->additionalGuests; + } + public function setResource($resource) { + $this->resource = $resource; + } + public function getResource() { + return $this->resource; + } + public function setOrganizer($organizer) { + $this->organizer = $organizer; + } + public function getOrganizer() { + return $this->organizer; + } + public function setOptional($optional) { + $this->optional = $optional; + } + public function getOptional() { + return $this->optional; + } + public function setEmail($email) { + $this->email = $email; + } + public function getEmail() { + return $this->email; + } +} + +class EventCreator extends apiModel { + public $displayName; + public $email; + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setEmail($email) { + $this->email = $email; + } + public function getEmail() { + return $this->email; + } +} + +class EventDateTime extends apiModel { + public $date; + public $timeZone; + public $dateTime; + public function setDate($date) { + $this->date = $date; + } + public function getDate() { + return $this->date; + } + public function setTimeZone($timeZone) { + $this->timeZone = $timeZone; + } + public function getTimeZone() { + return $this->timeZone; + } + public function setDateTime($dateTime) { + $this->dateTime = $dateTime; + } + public function getDateTime() { + return $this->dateTime; + } +} + +class EventExtendedProperties extends apiModel { + public $shared; + public $private; + public function setShared($shared) { + $this->shared = $shared; + } + public function getShared() { + return $this->shared; + } + public function setPrivate($private) { + $this->private = $private; + } + public function getPrivate() { + return $this->private; + } +} + +class EventGadget extends apiModel { + public $preferences; + public $title; + public $height; + public $width; + public $link; + public $type; + public $display; + public $iconLink; + public function setPreferences($preferences) { + $this->preferences = $preferences; + } + public function getPreferences() { + return $this->preferences; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setHeight($height) { + $this->height = $height; + } + public function getHeight() { + return $this->height; + } + public function setWidth($width) { + $this->width = $width; + } + public function getWidth() { + return $this->width; + } + public function setLink($link) { + $this->link = $link; + } + public function getLink() { + return $this->link; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setDisplay($display) { + $this->display = $display; + } + public function getDisplay() { + return $this->display; + } + public function setIconLink($iconLink) { + $this->iconLink = $iconLink; + } + public function getIconLink() { + return $this->iconLink; + } +} + +class EventOrganizer extends apiModel { + public $displayName; + public $email; + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setEmail($email) { + $this->email = $email; + } + public function getEmail() { + return $this->email; + } +} + +class EventReminder extends apiModel { + public $minutes; + public $method; + public function setMinutes($minutes) { + $this->minutes = $minutes; + } + public function getMinutes() { + return $this->minutes; + } + public function setMethod($method) { + $this->method = $method; + } + public function getMethod() { + return $this->method; + } +} + +class EventReminders extends apiModel { + protected $__overridesType = 'EventReminder'; + protected $__overridesDataType = 'array'; + public $overrides; + public $useDefault; + public function setOverrides(/* array(EventReminder) */ $overrides) { + $this->assertIsArray($overrides, 'EventReminder', __METHOD__); + $this->overrides = $overrides; + } + public function getOverrides() { + return $this->overrides; + } + public function setUseDefault($useDefault) { + $this->useDefault = $useDefault; + } + public function getUseDefault() { + return $this->useDefault; + } +} + +class Events extends apiModel { + public $nextPageToken; + public $kind; + protected $__defaultRemindersType = 'EventReminder'; + protected $__defaultRemindersDataType = 'array'; + public $defaultReminders; + public $description; + protected $__itemsType = 'Event'; + protected $__itemsDataType = 'array'; + public $items; + public $updated; + public $summary; + public $etag; + public $timeZone; + public $accessRole; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDefaultReminders(/* array(EventReminder) */ $defaultReminders) { + $this->assertIsArray($defaultReminders, 'EventReminder', __METHOD__); + $this->defaultReminders = $defaultReminders; + } + public function getDefaultReminders() { + return $this->defaultReminders; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setItems(/* array(Event) */ $items) { + $this->assertIsArray($items, 'Event', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setSummary($summary) { + $this->summary = $summary; + } + public function getSummary() { + return $this->summary; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setTimeZone($timeZone) { + $this->timeZone = $timeZone; + } + public function getTimeZone() { + return $this->timeZone; + } + public function setAccessRole($accessRole) { + $this->accessRole = $accessRole; + } + public function getAccessRole() { + return $this->accessRole; + } +} + +class FreeBusyCalendar extends apiModel { + protected $__busyType = 'TimePeriod'; + protected $__busyDataType = 'array'; + public $busy; + protected $__errorsType = 'Error'; + protected $__errorsDataType = 'array'; + public $errors; + public function setBusy(/* array(TimePeriod) */ $busy) { + $this->assertIsArray($busy, 'TimePeriod', __METHOD__); + $this->busy = $busy; + } + public function getBusy() { + return $this->busy; + } + public function setErrors(/* array(Error) */ $errors) { + $this->assertIsArray($errors, 'Error', __METHOD__); + $this->errors = $errors; + } + public function getErrors() { + return $this->errors; + } +} + +class FreeBusyGroup extends apiModel { + protected $__errorsType = 'Error'; + protected $__errorsDataType = 'array'; + public $errors; + public $calendars; + public function setErrors(/* array(Error) */ $errors) { + $this->assertIsArray($errors, 'Error', __METHOD__); + $this->errors = $errors; + } + public function getErrors() { + return $this->errors; + } + public function setCalendars(/* array(string) */ $calendars) { + $this->assertIsArray($calendars, 'string', __METHOD__); + $this->calendars = $calendars; + } + public function getCalendars() { + return $this->calendars; + } +} + +class FreeBusyRequest extends apiModel { + public $calendarExpansionMax; + public $groupExpansionMax; + public $timeMax; + protected $__itemsType = 'FreeBusyRequestItem'; + protected $__itemsDataType = 'array'; + public $items; + public $timeMin; + public $timeZone; + public function setCalendarExpansionMax($calendarExpansionMax) { + $this->calendarExpansionMax = $calendarExpansionMax; + } + public function getCalendarExpansionMax() { + return $this->calendarExpansionMax; + } + public function setGroupExpansionMax($groupExpansionMax) { + $this->groupExpansionMax = $groupExpansionMax; + } + public function getGroupExpansionMax() { + return $this->groupExpansionMax; + } + public function setTimeMax($timeMax) { + $this->timeMax = $timeMax; + } + public function getTimeMax() { + return $this->timeMax; + } + public function setItems(/* array(FreeBusyRequestItem) */ $items) { + $this->assertIsArray($items, 'FreeBusyRequestItem', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setTimeMin($timeMin) { + $this->timeMin = $timeMin; + } + public function getTimeMin() { + return $this->timeMin; + } + public function setTimeZone($timeZone) { + $this->timeZone = $timeZone; + } + public function getTimeZone() { + return $this->timeZone; + } +} + +class FreeBusyRequestItem extends apiModel { + public $id; + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class FreeBusyResponse extends apiModel { + public $timeMax; + public $kind; + protected $__calendarsType = 'FreeBusyCalendar'; + protected $__calendarsDataType = 'map'; + public $calendars; + public $timeMin; + protected $__groupsType = 'FreeBusyGroup'; + protected $__groupsDataType = 'map'; + public $groups; + public function setTimeMax($timeMax) { + $this->timeMax = $timeMax; + } + public function getTimeMax() { + return $this->timeMax; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setCalendars(FreeBusyCalendar $calendars) { + $this->calendars = $calendars; + } + public function getCalendars() { + return $this->calendars; + } + public function setTimeMin($timeMin) { + $this->timeMin = $timeMin; + } + public function getTimeMin() { + return $this->timeMin; + } + public function setGroups(FreeBusyGroup $groups) { + $this->groups = $groups; + } + public function getGroups() { + return $this->groups; + } +} + +class Setting extends apiModel { + public $kind; + public $etag; + public $id; + public $value; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setValue($value) { + $this->value = $value; + } + public function getValue() { + return $this->value; + } +} + +class Settings extends apiModel { + protected $__itemsType = 'Setting'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $etag; + public function setItems(/* array(Setting) */ $items) { + $this->assertIsArray($items, 'Setting', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } +} + +class TimePeriod extends apiModel { + public $start; + public $end; + public function setStart($start) { + $this->start = $start; + } + public function getStart() { + return $this->start; + } + public function setEnd($end) { + $this->end = $end; + } + public function getEnd() { + return $this->end; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiCustomsearchService.php b/inc/vendors/social-login/Google/contrib/apiCustomsearchService.php new file mode 100755 index 00000000..eddce975 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiCustomsearchService.php @@ -0,0 +1,479 @@ + + * $customsearchService = new apiCustomsearchService(...); + * $cse = $customsearchService->cse; + * + */ + class CseServiceResource extends apiServiceResource { + + + /** + * Returns metadata about the search performed, metadata about the custom search engine used for the + * search, and the search results. (cse.list) + * @param string $q Query + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string sort The sort expression to apply to the results + * @opt_param string num Number of search results to return + * @opt_param string googlehost The local Google domain to use to perform the search. + * @opt_param string safe Search safety level + * @opt_param string filter Controls turning on or off the duplicate content filter. + * @opt_param string start The index of the first result to return + * @opt_param string cx The custom search engine ID to scope this search query + * @opt_param string lr The language restriction for the search results + * @opt_param string cr Country restrict(s). + * @opt_param string gl Geolocation of end user. + * @opt_param string cref The URL of a linked custom search engine + * @return Search + */ + public function listCse($q, $optParams = array()) { + $params = array('q' => $q); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Search($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Customsearch (v1). + *

              + * Lets you search over a website or collection of websites + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiCustomsearchService extends apiService { + public $cse; + /** + * Constructs the internal representation of the Customsearch service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/customsearch/'; + $this->version = 'v1'; + $this->serviceName = 'customsearch'; + + $apiClient->addService($this->serviceName, $this->version); + $this->cse = new CseServiceResource($this, $this->serviceName, 'cse', json_decode('{"methods": {"list": {"parameters": {"sort": {"type": "string", "location": "query"}, "filter": {"enum": ["0", "1"], "type": "string", "location": "query"}, "cx": {"type": "string", "location": "query"}, "googlehost": {"type": "string", "location": "query"}, "safe": {"default": "off", "enum": ["high", "medium", "off"], "location": "query", "type": "string"}, "q": {"required": true, "type": "string", "location": "query"}, "start": {"type": "string", "location": "query"}, "num": {"default": "10", "type": "string", "location": "query"}, "lr": {"enum": ["lang_ar", "lang_bg", "lang_ca", "lang_cs", "lang_da", "lang_de", "lang_el", "lang_en", "lang_es", "lang_et", "lang_fi", "lang_fr", "lang_hr", "lang_hu", "lang_id", "lang_is", "lang_it", "lang_iw", "lang_ja", "lang_ko", "lang_lt", "lang_lv", "lang_nl", "lang_no", "lang_pl", "lang_pt", "lang_ro", "lang_ru", "lang_sk", "lang_sl", "lang_sr", "lang_sv", "lang_tr", "lang_zh-CN", "lang_zh-TW"], "type": "string", "location": "query"}, "cr": {"type": "string", "location": "query"}, "gl": {"type": "string", "location": "query"}, "cref": {"type": "string", "location": "query"}}, "id": "search.cse.list", "httpMethod": "GET", "path": "v1", "response": {"$ref": "Search"}}}}', true)); + } +} + +class Context extends apiModel { + protected $__facetsType = 'ContextFacets'; + protected $__facetsDataType = 'array'; + public $facets; + public $title; + public function setFacets(/* array(ContextFacets) */ $facets) { + $this->assertIsArray($facets, 'ContextFacets', __METHOD__); + $this->facets = $facets; + } + public function getFacets() { + return $this->facets; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } +} + +class ContextFacets extends apiModel { + public $anchor; + public $label; + public function setAnchor($anchor) { + $this->anchor = $anchor; + } + public function getAnchor() { + return $this->anchor; + } + public function setLabel($label) { + $this->label = $label; + } + public function getLabel() { + return $this->label; + } +} + +class Promotion extends apiModel { + public $link; + public $displayLink; + protected $__imageType = 'PromotionImage'; + protected $__imageDataType = ''; + public $image; + protected $__bodyLinesType = 'PromotionBodyLines'; + protected $__bodyLinesDataType = 'array'; + public $bodyLines; + public $title; + public function setLink($link) { + $this->link = $link; + } + public function getLink() { + return $this->link; + } + public function setDisplayLink($displayLink) { + $this->displayLink = $displayLink; + } + public function getDisplayLink() { + return $this->displayLink; + } + public function setImage(PromotionImage $image) { + $this->image = $image; + } + public function getImage() { + return $this->image; + } + public function setBodyLines(/* array(PromotionBodyLines) */ $bodyLines) { + $this->assertIsArray($bodyLines, 'PromotionBodyLines', __METHOD__); + $this->bodyLines = $bodyLines; + } + public function getBodyLines() { + return $this->bodyLines; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } +} + +class PromotionBodyLines extends apiModel { + public $url; + public $link; + public $title; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setLink($link) { + $this->link = $link; + } + public function getLink() { + return $this->link; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } +} + +class PromotionImage extends apiModel { + public $source; + public $width; + public $height; + public function setSource($source) { + $this->source = $source; + } + public function getSource() { + return $this->source; + } + public function setWidth($width) { + $this->width = $width; + } + public function getWidth() { + return $this->width; + } + public function setHeight($height) { + $this->height = $height; + } + public function getHeight() { + return $this->height; + } +} + +class Query extends apiModel { + public $count; + public $sort; + public $outputEncoding; + public $language; + public $title; + public $googleHost; + public $safe; + public $searchTerms; + public $filter; + public $startIndex; + public $cx; + public $startPage; + public $inputEncoding; + public $cr; + public $gl; + public $totalResults; + public $cref; + public function setCount($count) { + $this->count = $count; + } + public function getCount() { + return $this->count; + } + public function setSort($sort) { + $this->sort = $sort; + } + public function getSort() { + return $this->sort; + } + public function setOutputEncoding($outputEncoding) { + $this->outputEncoding = $outputEncoding; + } + public function getOutputEncoding() { + return $this->outputEncoding; + } + public function setLanguage($language) { + $this->language = $language; + } + public function getLanguage() { + return $this->language; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setGoogleHost($googleHost) { + $this->googleHost = $googleHost; + } + public function getGoogleHost() { + return $this->googleHost; + } + public function setSafe($safe) { + $this->safe = $safe; + } + public function getSafe() { + return $this->safe; + } + public function setSearchTerms($searchTerms) { + $this->searchTerms = $searchTerms; + } + public function getSearchTerms() { + return $this->searchTerms; + } + public function setFilter($filter) { + $this->filter = $filter; + } + public function getFilter() { + return $this->filter; + } + public function setStartIndex($startIndex) { + $this->startIndex = $startIndex; + } + public function getStartIndex() { + return $this->startIndex; + } + public function setCx($cx) { + $this->cx = $cx; + } + public function getCx() { + return $this->cx; + } + public function setStartPage($startPage) { + $this->startPage = $startPage; + } + public function getStartPage() { + return $this->startPage; + } + public function setInputEncoding($inputEncoding) { + $this->inputEncoding = $inputEncoding; + } + public function getInputEncoding() { + return $this->inputEncoding; + } + public function setCr($cr) { + $this->cr = $cr; + } + public function getCr() { + return $this->cr; + } + public function setGl($gl) { + $this->gl = $gl; + } + public function getGl() { + return $this->gl; + } + public function setTotalResults($totalResults) { + $this->totalResults = $totalResults; + } + public function getTotalResults() { + return $this->totalResults; + } + public function setCref($cref) { + $this->cref = $cref; + } + public function getCref() { + return $this->cref; + } +} + +class Result extends apiModel { + public $kind; + public $title; + public $displayLink; + public $cacheId; + public $pagemap; + public $snippet; + public $htmlSnippet; + public $link; + public $htmlTitle; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setDisplayLink($displayLink) { + $this->displayLink = $displayLink; + } + public function getDisplayLink() { + return $this->displayLink; + } + public function setCacheId($cacheId) { + $this->cacheId = $cacheId; + } + public function getCacheId() { + return $this->cacheId; + } + public function setPagemap($pagemap) { + $this->pagemap = $pagemap; + } + public function getPagemap() { + return $this->pagemap; + } + public function setSnippet($snippet) { + $this->snippet = $snippet; + } + public function getSnippet() { + return $this->snippet; + } + public function setHtmlSnippet($htmlSnippet) { + $this->htmlSnippet = $htmlSnippet; + } + public function getHtmlSnippet() { + return $this->htmlSnippet; + } + public function setLink($link) { + $this->link = $link; + } + public function getLink() { + return $this->link; + } + public function setHtmlTitle($htmlTitle) { + $this->htmlTitle = $htmlTitle; + } + public function getHtmlTitle() { + return $this->htmlTitle; + } +} + +class Search extends apiModel { + protected $__promotionsType = 'Promotion'; + protected $__promotionsDataType = 'array'; + public $promotions; + public $kind; + protected $__urlType = 'SearchUrl'; + protected $__urlDataType = ''; + public $url; + protected $__itemsType = 'Result'; + protected $__itemsDataType = 'array'; + public $items; + protected $__contextType = 'Context'; + protected $__contextDataType = ''; + public $context; + protected $__queriesType = 'Query'; + protected $__queriesDataType = 'map'; + public $queries; + public function setPromotions(/* array(Promotion) */ $promotions) { + $this->assertIsArray($promotions, 'Promotion', __METHOD__); + $this->promotions = $promotions; + } + public function getPromotions() { + return $this->promotions; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setUrl(SearchUrl $url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setItems(/* array(Result) */ $items) { + $this->assertIsArray($items, 'Result', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setContext(Context $context) { + $this->context = $context; + } + public function getContext() { + return $this->context; + } + public function setQueries(Query $queries) { + $this->queries = $queries; + } + public function getQueries() { + return $this->queries; + } +} + +class SearchUrl extends apiModel { + public $type; + public $template; + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setTemplate($template) { + $this->template = $template; + } + public function getTemplate() { + return $this->template; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiFreebaseService.php b/inc/vendors/social-login/Google/contrib/apiFreebaseService.php new file mode 100755 index 00000000..19a430c2 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiFreebaseService.php @@ -0,0 +1,153 @@ + + * $freebaseService = new apiFreebaseService(...); + * $text = $freebaseService->text; + * + */ + class TextServiceResource extends apiServiceResource { + + + /** + * Returns blob attached to node at specified id as HTML (text.get) + * @param string $id The id of the item that you want data about + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string maxlength The max number of characters to return. Valid only for 'plain' format. + * @opt_param string format Sanitizing transformation. + * @return ContentserviceGet + */ + public function get($id, $optParams = array()) { + $params = array('id' => $id); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new ContentserviceGet($data); + } else { + return $data; + } + } + } + + + /** + * The "mqlread" collection of methods. + * Typical usage is: + * + * $freebaseService = new apiFreebaseService(...); + * $mqlread = $freebaseService->mqlread; + * + */ + class MqlreadServiceResource extends apiServiceResource { + /** + * Performs MQL Queries. (mqlread.mqlread) + * @param string $query An envelope containing a single MQL query. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string lang The language of the results - an id of a /type/lang object. + * @opt_param bool html_escape Whether or not to escape entities. + * @opt_param string indent How many spaces to indent the json. + * @opt_param string uniqueness_failure How MQL responds to uniqueness failures. + * @opt_param string dateline The dateline that you get in a mqlwrite response to ensure consistent results. + * @opt_param string cursor The mql cursor. + * @opt_param string callback JS method name for JSONP callbacks. + * @opt_param bool cost Show the costs or not. + * @opt_param string as_of_time Run the query as it would've been run at the specified point in time. + */ + public function mqlread($query, $optParams = array()) { + $params = array('query' => $query); + $params = array_merge($params, $optParams); + $data = $this->__call('mqlread', array($params)); + return $data; + } + + } + + /** + * The "image" collection of methods. + * Typical usage is: + * + * $freebaseService = new apiFreebaseService(...); + * $image = $freebaseService->image; + * + */ + class ImageServiceResource extends apiServiceResource { + /** + * Returns the scaled/cropped image attached to a freebase node. (image.image) + * @param string $id Freebase entity or content id, mid, or guid. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string maxwidth Maximum width in pixels for resulting image. + * @opt_param string maxheight Maximum height in pixels for resulting image. + * @opt_param string fallbackid Use the image associated with this secondary id if no image is associated with the primary id. + * @opt_param bool pad A boolean specifying whether the resulting image should be padded up to the requested dimensions. + * @opt_param string mode Method used to scale or crop image. + */ + public function image($id, $optParams = array()) { + $params = array('id' => $id); + $params = array_merge($params, $optParams); + $data = $this->__call('image', array($params)); + return $data; + } + + } + + +/** + * Service definition for Freebase (v1). + *

              + * Lets you access the Freebase repository of open data. + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiFreebaseService extends apiService { + public $mqlread; + public $image; + public $text; + /** + * Constructs the internal representation of the Freebase service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/freebase/v1/'; + $this->version = 'v1'; + $this->serviceName = 'freebase'; + + $apiClient->addService($this->serviceName, $this->version); + $this->text = new TextServiceResource($this, $this->serviceName, 'text', json_decode('{"methods": {"get": {"parameters": {"format": {"default": "plain", "enum": ["html", "plain", "raw"], "location": "query", "type": "string"}, "id": {"repeated": true, "required": true, "type": "string", "location": "path"}, "maxlength": {"format": "uint32", "type": "integer", "location": "query"}}, "id": "freebase.text.get", "httpMethod": "GET", "path": "text{/id*}", "response": {"$ref": "ContentserviceGet"}}}}', true)); + $this->mqlread = new MqlreadServiceResource($this, $this->serviceName, 'mqlread', json_decode('{"httpMethod": "GET", "parameters": {"lang": {"default": "/lang/en", "type": "string", "location": "query"}, "cursor": {"type": "string", "location": "query"}, "indent": {"format": "uint32", "default": "0", "maximum": "10", "location": "query", "type": "integer"}, "uniqueness_failure": {"default": "hard", "enum": ["hard", "soft"], "location": "query", "type": "string"}, "dateline": {"type": "string", "location": "query"}, "html_escape": {"default": "true", "type": "boolean", "location": "query"}, "callback": {"type": "string", "location": "query"}, "cost": {"default": "false", "type": "boolean", "location": "query"}, "query": {"required": true, "type": "string", "location": "query"}, "as_of_time": {"type": "string", "location": "query"}}, "path": "mqlread", "id": "freebase.mqlread"}', true)); + $this->image = new ImageServiceResource($this, $this->serviceName, 'image', json_decode('{"httpMethod": "GET", "parameters": {"maxwidth": {"format": "uint32", "type": "integer", "location": "query", "maximum": "4096"}, "maxheight": {"format": "uint32", "type": "integer", "location": "query", "maximum": "4096"}, "fallbackid": {"default": "/freebase/no_image_png", "type": "string", "location": "query"}, "pad": {"default": "false", "type": "boolean", "location": "query"}, "mode": {"default": "fit", "enum": ["fill", "fillcrop", "fillcropmid", "fit"], "location": "query", "type": "string"}, "id": {"repeated": true, "required": true, "type": "string", "location": "path"}}, "path": "image{/id*}", "id": "freebase.image"}', true)); + } +} + +class ContentserviceGet extends apiModel { + public $result; + public function setResult($result) { + $this->result = $result; + } + public function getResult() { + return $this->result; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiGanService.php b/inc/vendors/social-login/Google/contrib/apiGanService.php new file mode 100755 index 00000000..60fefc70 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiGanService.php @@ -0,0 +1,1510 @@ + + * $ganService = new apiGanService(...); + * $advertisers = $ganService->advertisers; + * + */ + class AdvertisersServiceResource extends apiServiceResource { + + + /** + * Retrieves data about all advertisers that the requesting advertiser/publisher has access to. + * (advertisers.list) + * @param string $role The role of the requester. Valid values: 'advertisers' or 'publishers'. + * @param string $roleId The ID of the requesting advertiser or publisher. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string relationshipStatus Filters out all advertisers for which do not have the given relationship status with the requesting publisher. + * @opt_param double minSevenDayEpc Filters out all advertisers that have a seven day EPC average lower than the given value (inclusive). Min value: 0.0. Optional. + * @opt_param string advertiserCategory Caret(^) delimted list of advertiser categories. Valid categories are defined here: http://www.google.com/support/affiliatenetwork/advertiser/bin/answer.py?hl=en=107581. Filters out all advertisers not in one of the given advertiser categories. Optional. + * @opt_param double minNinetyDayEpc Filters out all advertisers that have a ninety day EPC average lower than the given value (inclusive). Min value: 0.0. Optional. + * @opt_param string pageToken The value of 'nextPageToken' from the previous page. Optional. + * @opt_param string maxResults Max number of items to return in this page. Optional. Defaults to 20. + * @opt_param int minPayoutRank A value between 1 and 4, where 1 represents the quartile of advertisers with the lowest ranks and 4 represents the quartile of advertisers with the highest ranks. Filters out all advertisers with a lower rank than the given quartile. For example if a 2 was given only advertisers with a payout rank of 25 or higher would be included. Optional. + * @return Advertisers + */ + public function listAdvertisers($role, $roleId, $optParams = array()) { + $params = array('role' => $role, 'roleId' => $roleId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Advertisers($data); + } else { + return $data; + } + } + /** + * Retrieves data about a single advertiser if that the requesting advertiser/publisher has access + * to it. Only publishers can lookup advertisers. Advertisers can request information about + * themselves by omitting the advertiserId query parameter. (advertisers.get) + * @param string $role The role of the requester. Valid values: 'advertisers' or 'publishers'. + * @param string $roleId The ID of the requesting advertiser or publisher. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string advertiserId The ID of the advertiser to look up. Optional. + * @return Advertiser + */ + public function get($role, $roleId, $optParams = array()) { + $params = array('role' => $role, 'roleId' => $roleId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Advertiser($data); + } else { + return $data; + } + } + } + + /** + * The "ccOffers" collection of methods. + * Typical usage is: + * + * $ganService = new apiGanService(...); + * $ccOffers = $ganService->ccOffers; + * + */ + class CcOffersServiceResource extends apiServiceResource { + + + /** + * Retrieves credit card offers for the given publisher. (ccOffers.list) + * @param string $publisher The ID of the publisher in question. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string advertiser The advertiser ID of a card issuer whose offers to include. Optional, may be repeated. + * @opt_param string projection The set of fields to return. + * @return CcOffers + */ + public function listCcOffers($publisher, $optParams = array()) { + $params = array('publisher' => $publisher); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CcOffers($data); + } else { + return $data; + } + } + } + + /** + * The "events" collection of methods. + * Typical usage is: + * + * $ganService = new apiGanService(...); + * $events = $ganService->events; + * + */ + class EventsServiceResource extends apiServiceResource { + + + /** + * Retrieves event data for a given advertiser/publisher. (events.list) + * @param string $role The role of the requester. Valid values: 'advertisers' or 'publishers'. + * @param string $roleId The ID of the requesting advertiser or publisher. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string orderId Caret(^) delimited list of order IDs. Filters out all events that do not reference one of the given order IDs. Optional. + * @opt_param string sku Caret(^) delimited list of SKUs. Filters out all events that do not reference one of the given SKU. Optional. + * @opt_param string eventDateMax Filters out all events later than given date. Optional. Defaults to 24 hours after eventMin. + * @opt_param string type Filters out all events that are not of the given type. Valid values: 'action', 'transaction', 'charge'. Optional. + * @opt_param string linkId Caret(^) delimited list of link IDs. Filters out all events that do not reference one of the given link IDs. Optional. + * @opt_param string status Filters out all events that do not have the given status. Valid values: 'active', 'canceled'. Optional. + * @opt_param string eventDateMin Filters out all events earlier than given date. Optional. Defaults to 24 hours from current date/time. + * @opt_param string memberId Caret(^) delimited list of member IDs. Filters out all events that do not reference one of the given member IDs. Optional. + * @opt_param string maxResults Max number of offers to return in this page. Optional. Defaults to 20. + * @opt_param string advertiserId Caret(^) delimited list of advertiser IDs. Filters out all events that do not reference one of the given advertiser IDs. Only used when under publishers role. Optional. + * @opt_param string pageToken The value of 'nextPageToken' from the previous page. Optional. + * @opt_param string productCategory Caret(^) delimited list of product categories. Filters out all events that do not reference a product in one of the given product categories. Optional. + * @opt_param string chargeType Filters out all charge events that are not of the given charge type. Valid values: 'other', 'slotting_fee', 'monthly_minimum', 'tier_bonus', 'credit', 'debit'. Optional. + * @opt_param string publisherId Caret(^) delimited list of publisher IDs. Filters out all events that do not reference one of the given publishers IDs. Only used when under advertiser role. Optional. + * @return Events + */ + public function listEvents($role, $roleId, $optParams = array()) { + $params = array('role' => $role, 'roleId' => $roleId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Events($data); + } else { + return $data; + } + } + } + + /** + * The "publishers" collection of methods. + * Typical usage is: + * + * $ganService = new apiGanService(...); + * $publishers = $ganService->publishers; + * + */ + class PublishersServiceResource extends apiServiceResource { + + + /** + * Retrieves data about all publishers that the requesting advertiser/publisher has access to. + * (publishers.list) + * @param string $role The role of the requester. Valid values: 'advertisers' or 'publishers'. + * @param string $roleId The ID of the requesting advertiser or publisher. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string publisherCategory Caret(^) delimted list of publisher categories. Valid categories: (unclassified|community_and_content|shopping_and_promotion|loyalty_and_rewards|network|search_specialist|comparison_shopping|email). Filters out all publishers not in one of the given advertiser categories. Optional. + * @opt_param string relationshipStatus Filters out all publishers for which do not have the given relationship status with the requesting publisher. + * @opt_param double minSevenDayEpc Filters out all publishers that have a seven day EPC average lower than the given value (inclusive). Min value 0.0. Optional. + * @opt_param double minNinetyDayEpc Filters out all publishers that have a ninety day EPC average lower than the given value (inclusive). Min value: 0.0. Optional. + * @opt_param string pageToken The value of 'nextPageToken' from the previous page. Optional. + * @opt_param string maxResults Max number of items to return in this page. Optional. Defaults to 20. + * @opt_param int minPayoutRank A value between 1 and 4, where 1 represents the quartile of publishers with the lowest ranks and 4 represents the quartile of publishers with the highest ranks. Filters out all publishers with a lower rank than the given quartile. For example if a 2 was given only publishers with a payout rank of 25 or higher would be included. Optional. + * @return Publishers + */ + public function listPublishers($role, $roleId, $optParams = array()) { + $params = array('role' => $role, 'roleId' => $roleId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Publishers($data); + } else { + return $data; + } + } + /** + * Retrieves data about a single advertiser if that the requesting advertiser/publisher has access + * to it. Only advertisers can look up publishers. Publishers can request information about + * themselves by omitting the publisherId query parameter. (publishers.get) + * @param string $role The role of the requester. Valid values: 'advertisers' or 'publishers'. + * @param string $roleId The ID of the requesting advertiser or publisher. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string publisherId The ID of the publisher to look up. Optional. + * @return Publisher + */ + public function get($role, $roleId, $optParams = array()) { + $params = array('role' => $role, 'roleId' => $roleId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Publisher($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Gan (v1beta1). + *

              + * Lets you have programmatic access to your Google Affiliate Network data + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiGanService extends apiService { + public $advertisers; + public $ccOffers; + public $events; + public $publishers; + /** + * Constructs the internal representation of the Gan service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/gan/v1beta1/'; + $this->version = 'v1beta1'; + $this->serviceName = 'gan'; + + $apiClient->addService($this->serviceName, $this->version); + $this->advertisers = new AdvertisersServiceResource($this, $this->serviceName, 'advertisers', json_decode('{"methods": {"list": {"parameters": {"relationshipStatus": {"enum": ["approved", "available", "deactivated", "declined", "pending"], "type": "string", "location": "query"}, "minSevenDayEpc": {"format": "double", "type": "number", "location": "query"}, "advertiserCategory": {"type": "string", "location": "query"}, "minNinetyDayEpc": {"format": "double", "type": "number", "location": "query"}, "pageToken": {"type": "string", "location": "query"}, "role": {"required": true, "enum": ["advertisers", "publishers"], "location": "path", "type": "string"}, "maxResults": {"format": "uint32", "maximum": "100", "minimum": "0", "location": "query", "type": "integer"}, "roleId": {"required": true, "type": "string", "location": "path"}, "minPayoutRank": {"format": "int32", "maximum": "4", "minimum": "1", "location": "query", "type": "integer"}}, "id": "gan.advertisers.list", "httpMethod": "GET", "path": "{role}/{roleId}/advertisers", "response": {"$ref": "Advertisers"}}, "get": {"parameters": {"advertiserId": {"type": "string", "location": "query"}, "roleId": {"required": true, "type": "string", "location": "path"}, "role": {"required": true, "enum": ["advertisers", "publishers"], "location": "path", "type": "string"}}, "id": "gan.advertisers.get", "httpMethod": "GET", "path": "{role}/{roleId}/advertiser", "response": {"$ref": "Advertiser"}}}}', true)); + $this->ccOffers = new CcOffersServiceResource($this, $this->serviceName, 'ccOffers', json_decode('{"methods": {"list": {"parameters": {"advertiser": {"repeated": true, "type": "string", "location": "query"}, "projection": {"enum": ["full", "summary"], "type": "string", "location": "query"}, "publisher": {"required": true, "type": "string", "location": "path"}}, "id": "gan.ccOffers.list", "httpMethod": "GET", "path": "publishers/{publisher}/ccOffers", "response": {"$ref": "CcOffers"}}}}', true)); + $this->events = new EventsServiceResource($this, $this->serviceName, 'events', json_decode('{"methods": {"list": {"parameters": {"orderId": {"type": "string", "location": "query"}, "sku": {"type": "string", "location": "query"}, "eventDateMax": {"type": "string", "location": "query"}, "linkId": {"type": "string", "location": "query"}, "eventDateMin": {"type": "string", "location": "query"}, "memberId": {"type": "string", "location": "query"}, "maxResults": {"format": "uint32", "maximum": "100", "minimum": "0", "location": "query", "type": "integer"}, "advertiserId": {"type": "string", "location": "query"}, "pageToken": {"type": "string", "location": "query"}, "publisherId": {"type": "string", "location": "query"}, "status": {"enum": ["active", "canceled"], "type": "string", "location": "query"}, "productCategory": {"type": "string", "location": "query"}, "chargeType": {"enum": ["credit", "debit", "monthly_minimum", "other", "slotting_fee", "tier_bonus"], "type": "string", "location": "query"}, "roleId": {"required": true, "type": "string", "location": "path"}, "role": {"required": true, "enum": ["advertisers", "publishers"], "location": "path", "type": "string"}, "type": {"enum": ["action", "charge", "transaction"], "type": "string", "location": "query"}}, "id": "gan.events.list", "httpMethod": "GET", "path": "{role}/{roleId}/events", "response": {"$ref": "Events"}}}}', true)); + $this->publishers = new PublishersServiceResource($this, $this->serviceName, 'publishers', json_decode('{"methods": {"list": {"parameters": {"publisherCategory": {"type": "string", "location": "query"}, "relationshipStatus": {"enum": ["approved", "available", "deactivated", "declined", "pending"], "type": "string", "location": "query"}, "minSevenDayEpc": {"format": "double", "type": "number", "location": "query"}, "minNinetyDayEpc": {"format": "double", "type": "number", "location": "query"}, "pageToken": {"type": "string", "location": "query"}, "role": {"required": true, "enum": ["advertisers", "publishers"], "location": "path", "type": "string"}, "maxResults": {"format": "uint32", "maximum": "100", "minimum": "0", "location": "query", "type": "integer"}, "roleId": {"required": true, "type": "string", "location": "path"}, "minPayoutRank": {"format": "int32", "maximum": "4", "minimum": "1", "location": "query", "type": "integer"}}, "id": "gan.publishers.list", "httpMethod": "GET", "path": "{role}/{roleId}/publishers", "response": {"$ref": "Publishers"}}, "get": {"parameters": {"publisherId": {"type": "string", "location": "query"}, "role": {"required": true, "enum": ["advertisers", "publishers"], "location": "path", "type": "string"}, "roleId": {"required": true, "type": "string", "location": "path"}}, "id": "gan.publishers.get", "httpMethod": "GET", "path": "{role}/{roleId}/publisher", "response": {"$ref": "Publisher"}}}}', true)); + } +} + +class Advertiser extends apiModel { + public $category; + public $productFeedsEnabled; + public $kind; + public $siteUrl; + public $contactPhone; + public $description; + public $payoutRank; + protected $__epcSevenDayAverageType = 'Money'; + protected $__epcSevenDayAverageDataType = ''; + public $epcSevenDayAverage; + public $commissionDuration; + public $status; + protected $__epcNinetyDayAverageType = 'Money'; + protected $__epcNinetyDayAverageDataType = ''; + public $epcNinetyDayAverage; + public $contactEmail; + protected $__itemType = 'Advertiser'; + protected $__itemDataType = ''; + public $item; + public $joinDate; + public $logoUrl; + public $id; + public $name; + public function setCategory($category) { + $this->category = $category; + } + public function getCategory() { + return $this->category; + } + public function setProductFeedsEnabled($productFeedsEnabled) { + $this->productFeedsEnabled = $productFeedsEnabled; + } + public function getProductFeedsEnabled() { + return $this->productFeedsEnabled; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setSiteUrl($siteUrl) { + $this->siteUrl = $siteUrl; + } + public function getSiteUrl() { + return $this->siteUrl; + } + public function setContactPhone($contactPhone) { + $this->contactPhone = $contactPhone; + } + public function getContactPhone() { + return $this->contactPhone; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setPayoutRank($payoutRank) { + $this->payoutRank = $payoutRank; + } + public function getPayoutRank() { + return $this->payoutRank; + } + public function setEpcSevenDayAverage(Money $epcSevenDayAverage) { + $this->epcSevenDayAverage = $epcSevenDayAverage; + } + public function getEpcSevenDayAverage() { + return $this->epcSevenDayAverage; + } + public function setCommissionDuration($commissionDuration) { + $this->commissionDuration = $commissionDuration; + } + public function getCommissionDuration() { + return $this->commissionDuration; + } + public function setStatus($status) { + $this->status = $status; + } + public function getStatus() { + return $this->status; + } + public function setEpcNinetyDayAverage(Money $epcNinetyDayAverage) { + $this->epcNinetyDayAverage = $epcNinetyDayAverage; + } + public function getEpcNinetyDayAverage() { + return $this->epcNinetyDayAverage; + } + public function setContactEmail($contactEmail) { + $this->contactEmail = $contactEmail; + } + public function getContactEmail() { + return $this->contactEmail; + } + public function setItem(Advertiser $item) { + $this->item = $item; + } + public function getItem() { + return $this->item; + } + public function setJoinDate($joinDate) { + $this->joinDate = $joinDate; + } + public function getJoinDate() { + return $this->joinDate; + } + public function setLogoUrl($logoUrl) { + $this->logoUrl = $logoUrl; + } + public function getLogoUrl() { + return $this->logoUrl; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class Advertisers extends apiModel { + public $nextPageToken; + protected $__itemsType = 'Advertiser'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(Advertiser) */ $items) { + $this->assertIsArray($items, 'Advertiser', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class CcOffer extends apiModel { + public $rewardsHaveBlackoutDates; + public $introPurchasePeriodLength; + public $introBalanceTransferRate; + public $cardBenefits; + public $introBalanceTransferAprDisplay; + public $issuer; + public $introBalanceTransferFeeRate; + public $cashAdvanceFeeDisplay; + public $annualFeeDisplay; + public $minimumFinanceCharge; + public $balanceTransferFeeDisplay; + public $landingPageUrl; + public $introPurchaseRate; + public $cashAdvanceAprDisplay; + public $maxCashAdvanceRate; + public $firstYearAnnualFee; + public $introBalanceTransferPeriodUnits; + public $variableRatesUpdateFrequency; + public $overLimitFee; + public $rewardsExpire; + public $additionalCardBenefits; + public $ageMinimum; + public $balanceTransferAprDisplay; + public $introBalanceTransferPeriodLength; + public $network; + public $introPurchaseRateType; + public $introAprDisplay; + public $flightAccidentInsurance; + public $annualRewardMaximum; + public $disclaimer; + public $creditLimitMin; + public $creditLimitMax; + public $gracePeriodDisplay; + public $cashAdvanceFeeAmount; + public $travelInsurance; + public $existingCustomerOnly; + public $initialSetupAndProcessingFee; + public $issuerId; + public $rewardUnit; + public $prohibitedCategories; + protected $__defaultFeesType = 'CcOfferDefaultFees'; + protected $__defaultFeesDataType = 'array'; + public $defaultFees; + public $introPurchasePeriodUnits; + public $trackingUrl; + public $latePaymentFee; + public $statementCopyFee; + public $variableRatesLastUpdated; + public $minBalanceTransferRate; + public $emergencyInsurance; + public $introPurchasePeriodEndDate; + public $cardName; + public $returnedPaymentFee; + public $cashAdvanceAdditionalDetails; + public $cashAdvanceLimit; + public $balanceTransferFeeRate; + public $balanceTransferRateType; + protected $__rewardsType = 'CcOfferRewards'; + protected $__rewardsDataType = 'array'; + public $rewards; + public $extendedWarranty; + public $carRentalInsurance; + public $cashAdvanceFeeRate; + public $rewardPartner; + public $foreignCurrencyTransactionFee; + public $kind; + public $introBalanceTransferFeeAmount; + public $creditRatingDisplay; + public $additionalCardHolderFee; + public $purchaseRateType; + public $cashAdvanceRateType; + protected $__bonusRewardsType = 'CcOfferBonusRewards'; + protected $__bonusRewardsDataType = 'array'; + public $bonusRewards; + public $balanceTransferLimit; + public $luggageInsurance; + public $minCashAdvanceRate; + public $offerId; + public $minPurchaseRate; + public $offersImmediateCashReward; + public $fraudLiability; + public $cardType; + public $approvedCategories; + public $annualFee; + public $maxBalanceTransferRate; + public $maxPurchaseRate; + public $issuerWebsite; + public $introBalanceTransferRateType; + public $aprDisplay; + public $imageUrl; + public $ageMinimumDetails; + public $balanceTransferFeeAmount; + public $introBalanceTransferPeriodEndDate; + public function setRewardsHaveBlackoutDates($rewardsHaveBlackoutDates) { + $this->rewardsHaveBlackoutDates = $rewardsHaveBlackoutDates; + } + public function getRewardsHaveBlackoutDates() { + return $this->rewardsHaveBlackoutDates; + } + public function setIntroPurchasePeriodLength($introPurchasePeriodLength) { + $this->introPurchasePeriodLength = $introPurchasePeriodLength; + } + public function getIntroPurchasePeriodLength() { + return $this->introPurchasePeriodLength; + } + public function setIntroBalanceTransferRate($introBalanceTransferRate) { + $this->introBalanceTransferRate = $introBalanceTransferRate; + } + public function getIntroBalanceTransferRate() { + return $this->introBalanceTransferRate; + } + public function setCardBenefits(/* array(string) */ $cardBenefits) { + $this->assertIsArray($cardBenefits, 'string', __METHOD__); + $this->cardBenefits = $cardBenefits; + } + public function getCardBenefits() { + return $this->cardBenefits; + } + public function setIntroBalanceTransferAprDisplay($introBalanceTransferAprDisplay) { + $this->introBalanceTransferAprDisplay = $introBalanceTransferAprDisplay; + } + public function getIntroBalanceTransferAprDisplay() { + return $this->introBalanceTransferAprDisplay; + } + public function setIssuer($issuer) { + $this->issuer = $issuer; + } + public function getIssuer() { + return $this->issuer; + } + public function setIntroBalanceTransferFeeRate($introBalanceTransferFeeRate) { + $this->introBalanceTransferFeeRate = $introBalanceTransferFeeRate; + } + public function getIntroBalanceTransferFeeRate() { + return $this->introBalanceTransferFeeRate; + } + public function setCashAdvanceFeeDisplay($cashAdvanceFeeDisplay) { + $this->cashAdvanceFeeDisplay = $cashAdvanceFeeDisplay; + } + public function getCashAdvanceFeeDisplay() { + return $this->cashAdvanceFeeDisplay; + } + public function setAnnualFeeDisplay($annualFeeDisplay) { + $this->annualFeeDisplay = $annualFeeDisplay; + } + public function getAnnualFeeDisplay() { + return $this->annualFeeDisplay; + } + public function setMinimumFinanceCharge($minimumFinanceCharge) { + $this->minimumFinanceCharge = $minimumFinanceCharge; + } + public function getMinimumFinanceCharge() { + return $this->minimumFinanceCharge; + } + public function setBalanceTransferFeeDisplay($balanceTransferFeeDisplay) { + $this->balanceTransferFeeDisplay = $balanceTransferFeeDisplay; + } + public function getBalanceTransferFeeDisplay() { + return $this->balanceTransferFeeDisplay; + } + public function setLandingPageUrl($landingPageUrl) { + $this->landingPageUrl = $landingPageUrl; + } + public function getLandingPageUrl() { + return $this->landingPageUrl; + } + public function setIntroPurchaseRate($introPurchaseRate) { + $this->introPurchaseRate = $introPurchaseRate; + } + public function getIntroPurchaseRate() { + return $this->introPurchaseRate; + } + public function setCashAdvanceAprDisplay($cashAdvanceAprDisplay) { + $this->cashAdvanceAprDisplay = $cashAdvanceAprDisplay; + } + public function getCashAdvanceAprDisplay() { + return $this->cashAdvanceAprDisplay; + } + public function setMaxCashAdvanceRate($maxCashAdvanceRate) { + $this->maxCashAdvanceRate = $maxCashAdvanceRate; + } + public function getMaxCashAdvanceRate() { + return $this->maxCashAdvanceRate; + } + public function setFirstYearAnnualFee($firstYearAnnualFee) { + $this->firstYearAnnualFee = $firstYearAnnualFee; + } + public function getFirstYearAnnualFee() { + return $this->firstYearAnnualFee; + } + public function setIntroBalanceTransferPeriodUnits($introBalanceTransferPeriodUnits) { + $this->introBalanceTransferPeriodUnits = $introBalanceTransferPeriodUnits; + } + public function getIntroBalanceTransferPeriodUnits() { + return $this->introBalanceTransferPeriodUnits; + } + public function setVariableRatesUpdateFrequency($variableRatesUpdateFrequency) { + $this->variableRatesUpdateFrequency = $variableRatesUpdateFrequency; + } + public function getVariableRatesUpdateFrequency() { + return $this->variableRatesUpdateFrequency; + } + public function setOverLimitFee($overLimitFee) { + $this->overLimitFee = $overLimitFee; + } + public function getOverLimitFee() { + return $this->overLimitFee; + } + public function setRewardsExpire($rewardsExpire) { + $this->rewardsExpire = $rewardsExpire; + } + public function getRewardsExpire() { + return $this->rewardsExpire; + } + public function setAdditionalCardBenefits(/* array(string) */ $additionalCardBenefits) { + $this->assertIsArray($additionalCardBenefits, 'string', __METHOD__); + $this->additionalCardBenefits = $additionalCardBenefits; + } + public function getAdditionalCardBenefits() { + return $this->additionalCardBenefits; + } + public function setAgeMinimum($ageMinimum) { + $this->ageMinimum = $ageMinimum; + } + public function getAgeMinimum() { + return $this->ageMinimum; + } + public function setBalanceTransferAprDisplay($balanceTransferAprDisplay) { + $this->balanceTransferAprDisplay = $balanceTransferAprDisplay; + } + public function getBalanceTransferAprDisplay() { + return $this->balanceTransferAprDisplay; + } + public function setIntroBalanceTransferPeriodLength($introBalanceTransferPeriodLength) { + $this->introBalanceTransferPeriodLength = $introBalanceTransferPeriodLength; + } + public function getIntroBalanceTransferPeriodLength() { + return $this->introBalanceTransferPeriodLength; + } + public function setNetwork($network) { + $this->network = $network; + } + public function getNetwork() { + return $this->network; + } + public function setIntroPurchaseRateType($introPurchaseRateType) { + $this->introPurchaseRateType = $introPurchaseRateType; + } + public function getIntroPurchaseRateType() { + return $this->introPurchaseRateType; + } + public function setIntroAprDisplay($introAprDisplay) { + $this->introAprDisplay = $introAprDisplay; + } + public function getIntroAprDisplay() { + return $this->introAprDisplay; + } + public function setFlightAccidentInsurance($flightAccidentInsurance) { + $this->flightAccidentInsurance = $flightAccidentInsurance; + } + public function getFlightAccidentInsurance() { + return $this->flightAccidentInsurance; + } + public function setAnnualRewardMaximum($annualRewardMaximum) { + $this->annualRewardMaximum = $annualRewardMaximum; + } + public function getAnnualRewardMaximum() { + return $this->annualRewardMaximum; + } + public function setDisclaimer($disclaimer) { + $this->disclaimer = $disclaimer; + } + public function getDisclaimer() { + return $this->disclaimer; + } + public function setCreditLimitMin($creditLimitMin) { + $this->creditLimitMin = $creditLimitMin; + } + public function getCreditLimitMin() { + return $this->creditLimitMin; + } + public function setCreditLimitMax($creditLimitMax) { + $this->creditLimitMax = $creditLimitMax; + } + public function getCreditLimitMax() { + return $this->creditLimitMax; + } + public function setGracePeriodDisplay($gracePeriodDisplay) { + $this->gracePeriodDisplay = $gracePeriodDisplay; + } + public function getGracePeriodDisplay() { + return $this->gracePeriodDisplay; + } + public function setCashAdvanceFeeAmount($cashAdvanceFeeAmount) { + $this->cashAdvanceFeeAmount = $cashAdvanceFeeAmount; + } + public function getCashAdvanceFeeAmount() { + return $this->cashAdvanceFeeAmount; + } + public function setTravelInsurance($travelInsurance) { + $this->travelInsurance = $travelInsurance; + } + public function getTravelInsurance() { + return $this->travelInsurance; + } + public function setExistingCustomerOnly($existingCustomerOnly) { + $this->existingCustomerOnly = $existingCustomerOnly; + } + public function getExistingCustomerOnly() { + return $this->existingCustomerOnly; + } + public function setInitialSetupAndProcessingFee($initialSetupAndProcessingFee) { + $this->initialSetupAndProcessingFee = $initialSetupAndProcessingFee; + } + public function getInitialSetupAndProcessingFee() { + return $this->initialSetupAndProcessingFee; + } + public function setIssuerId($issuerId) { + $this->issuerId = $issuerId; + } + public function getIssuerId() { + return $this->issuerId; + } + public function setRewardUnit($rewardUnit) { + $this->rewardUnit = $rewardUnit; + } + public function getRewardUnit() { + return $this->rewardUnit; + } + public function setProhibitedCategories(/* array(string) */ $prohibitedCategories) { + $this->assertIsArray($prohibitedCategories, 'string', __METHOD__); + $this->prohibitedCategories = $prohibitedCategories; + } + public function getProhibitedCategories() { + return $this->prohibitedCategories; + } + public function setDefaultFees(/* array(CcOfferDefaultFees) */ $defaultFees) { + $this->assertIsArray($defaultFees, 'CcOfferDefaultFees', __METHOD__); + $this->defaultFees = $defaultFees; + } + public function getDefaultFees() { + return $this->defaultFees; + } + public function setIntroPurchasePeriodUnits($introPurchasePeriodUnits) { + $this->introPurchasePeriodUnits = $introPurchasePeriodUnits; + } + public function getIntroPurchasePeriodUnits() { + return $this->introPurchasePeriodUnits; + } + public function setTrackingUrl($trackingUrl) { + $this->trackingUrl = $trackingUrl; + } + public function getTrackingUrl() { + return $this->trackingUrl; + } + public function setLatePaymentFee($latePaymentFee) { + $this->latePaymentFee = $latePaymentFee; + } + public function getLatePaymentFee() { + return $this->latePaymentFee; + } + public function setStatementCopyFee($statementCopyFee) { + $this->statementCopyFee = $statementCopyFee; + } + public function getStatementCopyFee() { + return $this->statementCopyFee; + } + public function setVariableRatesLastUpdated($variableRatesLastUpdated) { + $this->variableRatesLastUpdated = $variableRatesLastUpdated; + } + public function getVariableRatesLastUpdated() { + return $this->variableRatesLastUpdated; + } + public function setMinBalanceTransferRate($minBalanceTransferRate) { + $this->minBalanceTransferRate = $minBalanceTransferRate; + } + public function getMinBalanceTransferRate() { + return $this->minBalanceTransferRate; + } + public function setEmergencyInsurance($emergencyInsurance) { + $this->emergencyInsurance = $emergencyInsurance; + } + public function getEmergencyInsurance() { + return $this->emergencyInsurance; + } + public function setIntroPurchasePeriodEndDate($introPurchasePeriodEndDate) { + $this->introPurchasePeriodEndDate = $introPurchasePeriodEndDate; + } + public function getIntroPurchasePeriodEndDate() { + return $this->introPurchasePeriodEndDate; + } + public function setCardName($cardName) { + $this->cardName = $cardName; + } + public function getCardName() { + return $this->cardName; + } + public function setReturnedPaymentFee($returnedPaymentFee) { + $this->returnedPaymentFee = $returnedPaymentFee; + } + public function getReturnedPaymentFee() { + return $this->returnedPaymentFee; + } + public function setCashAdvanceAdditionalDetails($cashAdvanceAdditionalDetails) { + $this->cashAdvanceAdditionalDetails = $cashAdvanceAdditionalDetails; + } + public function getCashAdvanceAdditionalDetails() { + return $this->cashAdvanceAdditionalDetails; + } + public function setCashAdvanceLimit($cashAdvanceLimit) { + $this->cashAdvanceLimit = $cashAdvanceLimit; + } + public function getCashAdvanceLimit() { + return $this->cashAdvanceLimit; + } + public function setBalanceTransferFeeRate($balanceTransferFeeRate) { + $this->balanceTransferFeeRate = $balanceTransferFeeRate; + } + public function getBalanceTransferFeeRate() { + return $this->balanceTransferFeeRate; + } + public function setBalanceTransferRateType($balanceTransferRateType) { + $this->balanceTransferRateType = $balanceTransferRateType; + } + public function getBalanceTransferRateType() { + return $this->balanceTransferRateType; + } + public function setRewards(/* array(CcOfferRewards) */ $rewards) { + $this->assertIsArray($rewards, 'CcOfferRewards', __METHOD__); + $this->rewards = $rewards; + } + public function getRewards() { + return $this->rewards; + } + public function setExtendedWarranty($extendedWarranty) { + $this->extendedWarranty = $extendedWarranty; + } + public function getExtendedWarranty() { + return $this->extendedWarranty; + } + public function setCarRentalInsurance($carRentalInsurance) { + $this->carRentalInsurance = $carRentalInsurance; + } + public function getCarRentalInsurance() { + return $this->carRentalInsurance; + } + public function setCashAdvanceFeeRate($cashAdvanceFeeRate) { + $this->cashAdvanceFeeRate = $cashAdvanceFeeRate; + } + public function getCashAdvanceFeeRate() { + return $this->cashAdvanceFeeRate; + } + public function setRewardPartner($rewardPartner) { + $this->rewardPartner = $rewardPartner; + } + public function getRewardPartner() { + return $this->rewardPartner; + } + public function setForeignCurrencyTransactionFee($foreignCurrencyTransactionFee) { + $this->foreignCurrencyTransactionFee = $foreignCurrencyTransactionFee; + } + public function getForeignCurrencyTransactionFee() { + return $this->foreignCurrencyTransactionFee; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setIntroBalanceTransferFeeAmount($introBalanceTransferFeeAmount) { + $this->introBalanceTransferFeeAmount = $introBalanceTransferFeeAmount; + } + public function getIntroBalanceTransferFeeAmount() { + return $this->introBalanceTransferFeeAmount; + } + public function setCreditRatingDisplay($creditRatingDisplay) { + $this->creditRatingDisplay = $creditRatingDisplay; + } + public function getCreditRatingDisplay() { + return $this->creditRatingDisplay; + } + public function setAdditionalCardHolderFee($additionalCardHolderFee) { + $this->additionalCardHolderFee = $additionalCardHolderFee; + } + public function getAdditionalCardHolderFee() { + return $this->additionalCardHolderFee; + } + public function setPurchaseRateType($purchaseRateType) { + $this->purchaseRateType = $purchaseRateType; + } + public function getPurchaseRateType() { + return $this->purchaseRateType; + } + public function setCashAdvanceRateType($cashAdvanceRateType) { + $this->cashAdvanceRateType = $cashAdvanceRateType; + } + public function getCashAdvanceRateType() { + return $this->cashAdvanceRateType; + } + public function setBonusRewards(/* array(CcOfferBonusRewards) */ $bonusRewards) { + $this->assertIsArray($bonusRewards, 'CcOfferBonusRewards', __METHOD__); + $this->bonusRewards = $bonusRewards; + } + public function getBonusRewards() { + return $this->bonusRewards; + } + public function setBalanceTransferLimit($balanceTransferLimit) { + $this->balanceTransferLimit = $balanceTransferLimit; + } + public function getBalanceTransferLimit() { + return $this->balanceTransferLimit; + } + public function setLuggageInsurance($luggageInsurance) { + $this->luggageInsurance = $luggageInsurance; + } + public function getLuggageInsurance() { + return $this->luggageInsurance; + } + public function setMinCashAdvanceRate($minCashAdvanceRate) { + $this->minCashAdvanceRate = $minCashAdvanceRate; + } + public function getMinCashAdvanceRate() { + return $this->minCashAdvanceRate; + } + public function setOfferId($offerId) { + $this->offerId = $offerId; + } + public function getOfferId() { + return $this->offerId; + } + public function setMinPurchaseRate($minPurchaseRate) { + $this->minPurchaseRate = $minPurchaseRate; + } + public function getMinPurchaseRate() { + return $this->minPurchaseRate; + } + public function setOffersImmediateCashReward($offersImmediateCashReward) { + $this->offersImmediateCashReward = $offersImmediateCashReward; + } + public function getOffersImmediateCashReward() { + return $this->offersImmediateCashReward; + } + public function setFraudLiability($fraudLiability) { + $this->fraudLiability = $fraudLiability; + } + public function getFraudLiability() { + return $this->fraudLiability; + } + public function setCardType($cardType) { + $this->cardType = $cardType; + } + public function getCardType() { + return $this->cardType; + } + public function setApprovedCategories(/* array(string) */ $approvedCategories) { + $this->assertIsArray($approvedCategories, 'string', __METHOD__); + $this->approvedCategories = $approvedCategories; + } + public function getApprovedCategories() { + return $this->approvedCategories; + } + public function setAnnualFee($annualFee) { + $this->annualFee = $annualFee; + } + public function getAnnualFee() { + return $this->annualFee; + } + public function setMaxBalanceTransferRate($maxBalanceTransferRate) { + $this->maxBalanceTransferRate = $maxBalanceTransferRate; + } + public function getMaxBalanceTransferRate() { + return $this->maxBalanceTransferRate; + } + public function setMaxPurchaseRate($maxPurchaseRate) { + $this->maxPurchaseRate = $maxPurchaseRate; + } + public function getMaxPurchaseRate() { + return $this->maxPurchaseRate; + } + public function setIssuerWebsite($issuerWebsite) { + $this->issuerWebsite = $issuerWebsite; + } + public function getIssuerWebsite() { + return $this->issuerWebsite; + } + public function setIntroBalanceTransferRateType($introBalanceTransferRateType) { + $this->introBalanceTransferRateType = $introBalanceTransferRateType; + } + public function getIntroBalanceTransferRateType() { + return $this->introBalanceTransferRateType; + } + public function setAprDisplay($aprDisplay) { + $this->aprDisplay = $aprDisplay; + } + public function getAprDisplay() { + return $this->aprDisplay; + } + public function setImageUrl($imageUrl) { + $this->imageUrl = $imageUrl; + } + public function getImageUrl() { + return $this->imageUrl; + } + public function setAgeMinimumDetails($ageMinimumDetails) { + $this->ageMinimumDetails = $ageMinimumDetails; + } + public function getAgeMinimumDetails() { + return $this->ageMinimumDetails; + } + public function setBalanceTransferFeeAmount($balanceTransferFeeAmount) { + $this->balanceTransferFeeAmount = $balanceTransferFeeAmount; + } + public function getBalanceTransferFeeAmount() { + return $this->balanceTransferFeeAmount; + } + public function setIntroBalanceTransferPeriodEndDate($introBalanceTransferPeriodEndDate) { + $this->introBalanceTransferPeriodEndDate = $introBalanceTransferPeriodEndDate; + } + public function getIntroBalanceTransferPeriodEndDate() { + return $this->introBalanceTransferPeriodEndDate; + } +} + +class CcOfferBonusRewards extends apiModel { + public $amount; + public $details; + public function setAmount($amount) { + $this->amount = $amount; + } + public function getAmount() { + return $this->amount; + } + public function setDetails($details) { + $this->details = $details; + } + public function getDetails() { + return $this->details; + } +} + +class CcOfferDefaultFees extends apiModel { + public $category; + public $maxRate; + public $minRate; + public $rateType; + public function setCategory($category) { + $this->category = $category; + } + public function getCategory() { + return $this->category; + } + public function setMaxRate($maxRate) { + $this->maxRate = $maxRate; + } + public function getMaxRate() { + return $this->maxRate; + } + public function setMinRate($minRate) { + $this->minRate = $minRate; + } + public function getMinRate() { + return $this->minRate; + } + public function setRateType($rateType) { + $this->rateType = $rateType; + } + public function getRateType() { + return $this->rateType; + } +} + +class CcOfferRewards extends apiModel { + public $category; + public $minRewardTier; + public $maxRewardTier; + public $expirationMonths; + public $amount; + public $additionalDetails; + public function setCategory($category) { + $this->category = $category; + } + public function getCategory() { + return $this->category; + } + public function setMinRewardTier($minRewardTier) { + $this->minRewardTier = $minRewardTier; + } + public function getMinRewardTier() { + return $this->minRewardTier; + } + public function setMaxRewardTier($maxRewardTier) { + $this->maxRewardTier = $maxRewardTier; + } + public function getMaxRewardTier() { + return $this->maxRewardTier; + } + public function setExpirationMonths($expirationMonths) { + $this->expirationMonths = $expirationMonths; + } + public function getExpirationMonths() { + return $this->expirationMonths; + } + public function setAmount($amount) { + $this->amount = $amount; + } + public function getAmount() { + return $this->amount; + } + public function setAdditionalDetails($additionalDetails) { + $this->additionalDetails = $additionalDetails; + } + public function getAdditionalDetails() { + return $this->additionalDetails; + } +} + +class CcOffers extends apiModel { + protected $__itemsType = 'CcOffer'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(CcOffer) */ $items) { + $this->assertIsArray($items, 'CcOffer', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class Event extends apiModel { + protected $__networkFeeType = 'Money'; + protected $__networkFeeDataType = ''; + public $networkFee; + public $advertiserName; + public $kind; + public $modifyDate; + public $type; + public $orderId; + public $publisherName; + public $memberId; + public $advertiserId; + public $status; + public $chargeId; + protected $__productsType = 'EventProducts'; + protected $__productsDataType = 'array'; + public $products; + protected $__earningsType = 'Money'; + protected $__earningsDataType = ''; + public $earnings; + public $chargeType; + protected $__publisherFeeType = 'Money'; + protected $__publisherFeeDataType = ''; + public $publisherFee; + protected $__commissionableSalesType = 'Money'; + protected $__commissionableSalesDataType = ''; + public $commissionableSales; + public $publisherId; + public $eventDate; + public function setNetworkFee(Money $networkFee) { + $this->networkFee = $networkFee; + } + public function getNetworkFee() { + return $this->networkFee; + } + public function setAdvertiserName($advertiserName) { + $this->advertiserName = $advertiserName; + } + public function getAdvertiserName() { + return $this->advertiserName; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setModifyDate($modifyDate) { + $this->modifyDate = $modifyDate; + } + public function getModifyDate() { + return $this->modifyDate; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setOrderId($orderId) { + $this->orderId = $orderId; + } + public function getOrderId() { + return $this->orderId; + } + public function setPublisherName($publisherName) { + $this->publisherName = $publisherName; + } + public function getPublisherName() { + return $this->publisherName; + } + public function setMemberId($memberId) { + $this->memberId = $memberId; + } + public function getMemberId() { + return $this->memberId; + } + public function setAdvertiserId($advertiserId) { + $this->advertiserId = $advertiserId; + } + public function getAdvertiserId() { + return $this->advertiserId; + } + public function setStatus($status) { + $this->status = $status; + } + public function getStatus() { + return $this->status; + } + public function setChargeId($chargeId) { + $this->chargeId = $chargeId; + } + public function getChargeId() { + return $this->chargeId; + } + public function setProducts(/* array(EventProducts) */ $products) { + $this->assertIsArray($products, 'EventProducts', __METHOD__); + $this->products = $products; + } + public function getProducts() { + return $this->products; + } + public function setEarnings(Money $earnings) { + $this->earnings = $earnings; + } + public function getEarnings() { + return $this->earnings; + } + public function setChargeType($chargeType) { + $this->chargeType = $chargeType; + } + public function getChargeType() { + return $this->chargeType; + } + public function setPublisherFee(Money $publisherFee) { + $this->publisherFee = $publisherFee; + } + public function getPublisherFee() { + return $this->publisherFee; + } + public function setCommissionableSales(Money $commissionableSales) { + $this->commissionableSales = $commissionableSales; + } + public function getCommissionableSales() { + return $this->commissionableSales; + } + public function setPublisherId($publisherId) { + $this->publisherId = $publisherId; + } + public function getPublisherId() { + return $this->publisherId; + } + public function setEventDate($eventDate) { + $this->eventDate = $eventDate; + } + public function getEventDate() { + return $this->eventDate; + } +} + +class EventProducts extends apiModel { + protected $__networkFeeType = 'Money'; + protected $__networkFeeDataType = ''; + public $networkFee; + public $sku; + public $categoryName; + public $skuName; + protected $__publisherFeeType = 'Money'; + protected $__publisherFeeDataType = ''; + public $publisherFee; + protected $__earningsType = 'Money'; + protected $__earningsDataType = ''; + public $earnings; + protected $__unitPriceType = 'Money'; + protected $__unitPriceDataType = ''; + public $unitPrice; + public $categoryId; + public $quantity; + public function setNetworkFee(Money $networkFee) { + $this->networkFee = $networkFee; + } + public function getNetworkFee() { + return $this->networkFee; + } + public function setSku($sku) { + $this->sku = $sku; + } + public function getSku() { + return $this->sku; + } + public function setCategoryName($categoryName) { + $this->categoryName = $categoryName; + } + public function getCategoryName() { + return $this->categoryName; + } + public function setSkuName($skuName) { + $this->skuName = $skuName; + } + public function getSkuName() { + return $this->skuName; + } + public function setPublisherFee(Money $publisherFee) { + $this->publisherFee = $publisherFee; + } + public function getPublisherFee() { + return $this->publisherFee; + } + public function setEarnings(Money $earnings) { + $this->earnings = $earnings; + } + public function getEarnings() { + return $this->earnings; + } + public function setUnitPrice(Money $unitPrice) { + $this->unitPrice = $unitPrice; + } + public function getUnitPrice() { + return $this->unitPrice; + } + public function setCategoryId($categoryId) { + $this->categoryId = $categoryId; + } + public function getCategoryId() { + return $this->categoryId; + } + public function setQuantity($quantity) { + $this->quantity = $quantity; + } + public function getQuantity() { + return $this->quantity; + } +} + +class Events extends apiModel { + public $nextPageToken; + protected $__itemsType = 'Event'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(Event) */ $items) { + $this->assertIsArray($items, 'Event', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class Money extends apiModel { + public $amount; + public $currencyCode; + public function setAmount($amount) { + $this->amount = $amount; + } + public function getAmount() { + return $this->amount; + } + public function setCurrencyCode($currencyCode) { + $this->currencyCode = $currencyCode; + } + public function getCurrencyCode() { + return $this->currencyCode; + } +} + +class Publisher extends apiModel { + public $status; + public $kind; + public $name; + public $classification; + protected $__epcSevenDayAverageType = 'Money'; + protected $__epcSevenDayAverageDataType = ''; + public $epcSevenDayAverage; + public $payoutRank; + protected $__epcNinetyDayAverageType = 'Money'; + protected $__epcNinetyDayAverageDataType = ''; + public $epcNinetyDayAverage; + protected $__itemType = 'Publisher2'; + protected $__itemDataType = ''; + public $item; + public $joinDate; + public $sites; + public $id; + public function setStatus($status) { + $this->status = $status; + } + public function getStatus() { + return $this->status; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setClassification($classification) { + $this->classification = $classification; + } + public function getClassification() { + return $this->classification; + } + public function setEpcSevenDayAverage(Money $epcSevenDayAverage) { + $this->epcSevenDayAverage = $epcSevenDayAverage; + } + public function getEpcSevenDayAverage() { + return $this->epcSevenDayAverage; + } + public function setPayoutRank($payoutRank) { + $this->payoutRank = $payoutRank; + } + public function getPayoutRank() { + return $this->payoutRank; + } + public function setEpcNinetyDayAverage(Money $epcNinetyDayAverage) { + $this->epcNinetyDayAverage = $epcNinetyDayAverage; + } + public function getEpcNinetyDayAverage() { + return $this->epcNinetyDayAverage; + } + public function setItem(Publisher2 $item) { + $this->item = $item; + } + public function getItem() { + return $this->item; + } + public function setJoinDate($joinDate) { + $this->joinDate = $joinDate; + } + public function getJoinDate() { + return $this->joinDate; + } + public function setSites(/* array(string) */ $sites) { + $this->assertIsArray($sites, 'string', __METHOD__); + $this->sites = $sites; + } + public function getSites() { + return $this->sites; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class Publishers extends apiModel { + public $nextPageToken; + protected $__itemsType = 'Publisher'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(Publisher) */ $items) { + $this->assertIsArray($items, 'Publisher', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiLatitudeService.php b/inc/vendors/social-login/Google/contrib/apiLatitudeService.php new file mode 100755 index 00000000..fa7365f6 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiLatitudeService.php @@ -0,0 +1,270 @@ + + * $latitudeService = new apiLatitudeService(...); + * $currentLocation = $latitudeService->currentLocation; + * + */ + class CurrentLocationServiceResource extends apiServiceResource { + + + /** + * Updates or creates the user's current location. (currentLocation.insert) + * @param Location $postBody + * @return Location + */ + public function insert(Location $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Location($data); + } else { + return $data; + } + } + /** + * Returns the authenticated user's current location. (currentLocation.get) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string granularity Granularity of the requested location. + * @return Location + */ + public function get($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Location($data); + } else { + return $data; + } + } + /** + * Deletes the authenticated user's current location. (currentLocation.delete) + */ + public function delete($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "location" collection of methods. + * Typical usage is: + * + * $latitudeService = new apiLatitudeService(...); + * $location = $latitudeService->location; + * + */ + class LocationServiceResource extends apiServiceResource { + + + /** + * Inserts or updates a location in the user's location history. (location.insert) + * @param Location $postBody + * @return Location + */ + public function insert(Location $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Location($data); + } else { + return $data; + } + } + /** + * Reads a location from the user's location history. (location.get) + * @param string $locationId Timestamp of the location to read (ms since epoch). + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string granularity Granularity of the location to return. + * @return Location + */ + public function get($locationId, $optParams = array()) { + $params = array('locationId' => $locationId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Location($data); + } else { + return $data; + } + } + /** + * Lists the user's location history. (location.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string max-results Maximum number of locations to return. + * @opt_param string max-time Maximum timestamp of locations to return (ms since epoch). + * @opt_param string min-time Minimum timestamp of locations to return (ms since epoch). + * @opt_param string granularity Granularity of the requested locations. + * @return LocationFeed + */ + public function listLocation($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new LocationFeed($data); + } else { + return $data; + } + } + /** + * Deletes a location from the user's location history. (location.delete) + * @param string $locationId Timestamp of the location to delete (ms since epoch). + */ + public function delete($locationId, $optParams = array()) { + $params = array('locationId' => $locationId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + + +/** + * Service definition for Latitude (v1). + *

              + * Lets you read and update your current location and work with your location history + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiLatitudeService extends apiService { + public $currentLocation; + public $location; + /** + * Constructs the internal representation of the Latitude service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/latitude/v1/'; + $this->version = 'v1'; + $this->serviceName = 'latitude'; + + $apiClient->addService($this->serviceName, $this->version); + $this->currentLocation = new CurrentLocationServiceResource($this, $this->serviceName, 'currentLocation', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city", "https://www.googleapis.com/auth/latitude.current.best", "https://www.googleapis.com/auth/latitude.current.city"], "request": {"$ref": "LatitudeCurrentlocationResourceJson"}, "response": {"$ref": "LatitudeCurrentlocationResourceJson"}, "httpMethod": "POST", "path": "currentLocation", "id": "latitude.currentLocation.insert"}, "delete": {"id": "latitude.currentLocation.delete", "path": "currentLocation", "httpMethod": "DELETE", "scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city", "https://www.googleapis.com/auth/latitude.current.best", "https://www.googleapis.com/auth/latitude.current.city"]}, "get": {"scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city", "https://www.googleapis.com/auth/latitude.current.best", "https://www.googleapis.com/auth/latitude.current.city"], "parameters": {"granularity": {"type": "string", "location": "query"}}, "response": {"$ref": "LatitudeCurrentlocationResourceJson"}, "httpMethod": "GET", "path": "currentLocation", "id": "latitude.currentLocation.get"}}}', true)); + $this->location = new LocationServiceResource($this, $this->serviceName, 'location', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city"], "request": {"$ref": "Location"}, "response": {"$ref": "Location"}, "httpMethod": "POST", "path": "location", "id": "latitude.location.insert"}, "delete": {"scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city"], "parameters": {"locationId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "location/{locationId}", "id": "latitude.location.delete"}, "list": {"scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city"], "parameters": {"max-results": {"type": "string", "location": "query"}, "max-time": {"type": "string", "location": "query"}, "min-time": {"type": "string", "location": "query"}, "granularity": {"type": "string", "location": "query"}}, "response": {"$ref": "LocationFeed"}, "httpMethod": "GET", "path": "location", "id": "latitude.location.list"}, "get": {"scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city"], "parameters": {"locationId": {"required": true, "type": "string", "location": "path"}, "granularity": {"type": "string", "location": "query"}}, "id": "latitude.location.get", "httpMethod": "GET", "path": "location/{locationId}", "response": {"$ref": "Location"}}}}', true)); + } +} + +class Location extends apiModel { + public $kind; + public $altitude; + public $longitude; + public $activityId; + public $latitude; + public $altitudeAccuracy; + public $timestampMs; + public $speed; + public $heading; + public $accuracy; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setAltitude($altitude) { + $this->altitude = $altitude; + } + public function getAltitude() { + return $this->altitude; + } + public function setLongitude($longitude) { + $this->longitude = $longitude; + } + public function getLongitude() { + return $this->longitude; + } + public function setActivityId($activityId) { + $this->activityId = $activityId; + } + public function getActivityId() { + return $this->activityId; + } + public function setLatitude($latitude) { + $this->latitude = $latitude; + } + public function getLatitude() { + return $this->latitude; + } + public function setAltitudeAccuracy($altitudeAccuracy) { + $this->altitudeAccuracy = $altitudeAccuracy; + } + public function getAltitudeAccuracy() { + return $this->altitudeAccuracy; + } + public function setTimestampMs($timestampMs) { + $this->timestampMs = $timestampMs; + } + public function getTimestampMs() { + return $this->timestampMs; + } + public function setSpeed($speed) { + $this->speed = $speed; + } + public function getSpeed() { + return $this->speed; + } + public function setHeading($heading) { + $this->heading = $heading; + } + public function getHeading() { + return $this->heading; + } + public function setAccuracy($accuracy) { + $this->accuracy = $accuracy; + } + public function getAccuracy() { + return $this->accuracy; + } +} + +class LocationFeed extends apiModel { + protected $__itemsType = 'Location'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(Location) */ $items) { + $this->assertIsArray($items, 'Location', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiModeratorService.php b/inc/vendors/social-login/Google/contrib/apiModeratorService.php new file mode 100755 index 00000000..4ef81b5d --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiModeratorService.php @@ -0,0 +1,1850 @@ + + * $moderatorService = new apiModeratorService(...); + * $votes = $moderatorService->votes; + * + */ + class VotesServiceResource extends apiServiceResource { + + + /** + * Inserts a new vote by the authenticated user for the specified submission within the specified + * series. (votes.insert) + * @param string $seriesId The decimal ID of the Series. + * @param string $submissionId The decimal ID of the Submission within the Series. + * @param Vote $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string unauthToken User identifier for unauthenticated usage mode + * @return Vote + */ + public function insert($seriesId, $submissionId, Vote $postBody, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'submissionId' => $submissionId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Vote($data); + } else { + return $data; + } + } + /** + * Updates the votes by the authenticated user for the specified submission within the specified + * series. This method supports patch semantics. (votes.patch) + * @param string $seriesId The decimal ID of the Series. + * @param string $submissionId The decimal ID of the Submission within the Series. + * @param Vote $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string userId + * @opt_param string unauthToken User identifier for unauthenticated usage mode + * @return Vote + */ + public function patch($seriesId, $submissionId, Vote $postBody, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'submissionId' => $submissionId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('patch', array($params)); + if ($this->useObjects()) { + return new Vote($data); + } else { + return $data; + } + } + /** + * Lists the votes by the authenticated user for the given series. (votes.list) + * @param string $seriesId The decimal ID of the Series. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string max-results Maximum number of results to return. + * @opt_param string start-index Index of the first result to be retrieved. + * @return VoteList + */ + public function listVotes($seriesId, $optParams = array()) { + $params = array('seriesId' => $seriesId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new VoteList($data); + } else { + return $data; + } + } + /** + * Updates the votes by the authenticated user for the specified submission within the specified + * series. (votes.update) + * @param string $seriesId The decimal ID of the Series. + * @param string $submissionId The decimal ID of the Submission within the Series. + * @param Vote $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string userId + * @opt_param string unauthToken User identifier for unauthenticated usage mode + * @return Vote + */ + public function update($seriesId, $submissionId, Vote $postBody, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'submissionId' => $submissionId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new Vote($data); + } else { + return $data; + } + } + /** + * Returns the votes by the authenticated user for the specified submission within the specified + * series. (votes.get) + * @param string $seriesId The decimal ID of the Series. + * @param string $submissionId The decimal ID of the Submission within the Series. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string userId + * @opt_param string unauthToken User identifier for unauthenticated usage mode + * @return Vote + */ + public function get($seriesId, $submissionId, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'submissionId' => $submissionId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Vote($data); + } else { + return $data; + } + } + } + + /** + * The "responses" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $responses = $moderatorService->responses; + * + */ + class ResponsesServiceResource extends apiServiceResource { + + + /** + * Inserts a response for the specified submission in the specified topic within the specified + * series. (responses.insert) + * @param string $seriesId The decimal ID of the Series. + * @param string $topicId The decimal ID of the Topic within the Series. + * @param string $parentSubmissionId The decimal ID of the parent Submission within the Series. + * @param Submission $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string unauthToken User identifier for unauthenticated usage mode + * @opt_param bool anonymous Set to true to mark the new submission as anonymous. + * @return Submission + */ + public function insert($seriesId, $topicId, $parentSubmissionId, Submission $postBody, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'topicId' => $topicId, 'parentSubmissionId' => $parentSubmissionId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Submission($data); + } else { + return $data; + } + } + /** + * Lists or searches the responses for the specified submission within the specified series and + * returns the search results. (responses.list) + * @param string $seriesId The decimal ID of the Series. + * @param string $submissionId The decimal ID of the Submission within the Series. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string max-results Maximum number of results to return. + * @opt_param string sort Sort order. + * @opt_param string author Restricts the results to submissions by a specific author. + * @opt_param string start-index Index of the first result to be retrieved. + * @opt_param string q Search query. + * @opt_param bool hasAttachedVideo Specifies whether to restrict to submissions that have videos attached. + * @return SubmissionList + */ + public function listResponses($seriesId, $submissionId, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'submissionId' => $submissionId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new SubmissionList($data); + } else { + return $data; + } + } + } + + /** + * The "tags" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $tags = $moderatorService->tags; + * + */ + class TagsServiceResource extends apiServiceResource { + + + /** + * Inserts a new tag for the specified submission within the specified series. (tags.insert) + * @param string $seriesId The decimal ID of the Series. + * @param string $submissionId The decimal ID of the Submission within the Series. + * @param Tag $postBody + * @return Tag + */ + public function insert($seriesId, $submissionId, Tag $postBody, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'submissionId' => $submissionId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Tag($data); + } else { + return $data; + } + } + /** + * Lists all tags for the specified submission within the specified series. (tags.list) + * @param string $seriesId The decimal ID of the Series. + * @param string $submissionId The decimal ID of the Submission within the Series. + * @return TagList + */ + public function listTags($seriesId, $submissionId, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'submissionId' => $submissionId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new TagList($data); + } else { + return $data; + } + } + /** + * Deletes the specified tag from the specified submission within the specified series. + * (tags.delete) + * @param string $seriesId The decimal ID of the Series. + * @param string $submissionId The decimal ID of the Submission within the Series. + * @param string $tagId + */ + public function delete($seriesId, $submissionId, $tagId, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'submissionId' => $submissionId, 'tagId' => $tagId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "series" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $series = $moderatorService->series; + * + */ + class SeriesServiceResource extends apiServiceResource { + + + /** + * Inserts a new series. (series.insert) + * @param Series $postBody + * @return Series + */ + public function insert(Series $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Series($data); + } else { + return $data; + } + } + /** + * Updates the specified series. This method supports patch semantics. (series.patch) + * @param string $seriesId The decimal ID of the Series. + * @param Series $postBody + * @return Series + */ + public function patch($seriesId, Series $postBody, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('patch', array($params)); + if ($this->useObjects()) { + return new Series($data); + } else { + return $data; + } + } + /** + * Searches the series and returns the search results. (series.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string max-results Maximum number of results to return. + * @opt_param string q Search query. + * @opt_param string start-index Index of the first result to be retrieved. + * @return SeriesList + */ + public function listSeries($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new SeriesList($data); + } else { + return $data; + } + } + /** + * Updates the specified series. (series.update) + * @param string $seriesId The decimal ID of the Series. + * @param Series $postBody + * @return Series + */ + public function update($seriesId, Series $postBody, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new Series($data); + } else { + return $data; + } + } + /** + * Returns the specified series. (series.get) + * @param string $seriesId The decimal ID of the Series. + * @return Series + */ + public function get($seriesId, $optParams = array()) { + $params = array('seriesId' => $seriesId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Series($data); + } else { + return $data; + } + } + } + + + /** + * The "submissions" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $submissions = $moderatorService->submissions; + * + */ + class SeriesSubmissionsServiceResource extends apiServiceResource { + + + /** + * Searches the submissions for the specified series and returns the search results. + * (submissions.list) + * @param string $seriesId The decimal ID of the Series. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string lang The language code for the language the client prefers resuls in. + * @opt_param string max-results Maximum number of results to return. + * @opt_param bool includeVotes Specifies whether to include the current user's vote + * @opt_param string start-index Index of the first result to be retrieved. + * @opt_param string author Restricts the results to submissions by a specific author. + * @opt_param string sort Sort order. + * @opt_param string q Search query. + * @opt_param bool hasAttachedVideo Specifies whether to restrict to submissions that have videos attached. + * @return SubmissionList + */ + public function listSeriesSubmissions($seriesId, $optParams = array()) { + $params = array('seriesId' => $seriesId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new SubmissionList($data); + } else { + return $data; + } + } + } + /** + * The "responses" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $responses = $moderatorService->responses; + * + */ + class SeriesResponsesServiceResource extends apiServiceResource { + + + /** + * Searches the responses for the specified series and returns the search results. (responses.list) + * @param string $seriesId The decimal ID of the Series. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string max-results Maximum number of results to return. + * @opt_param string sort Sort order. + * @opt_param string author Restricts the results to submissions by a specific author. + * @opt_param string start-index Index of the first result to be retrieved. + * @opt_param string q Search query. + * @opt_param bool hasAttachedVideo Specifies whether to restrict to submissions that have videos attached. + * @return SeriesList + */ + public function listSeriesResponses($seriesId, $optParams = array()) { + $params = array('seriesId' => $seriesId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new SeriesList($data); + } else { + return $data; + } + } + } + + /** + * The "topics" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $topics = $moderatorService->topics; + * + */ + class TopicsServiceResource extends apiServiceResource { + + + /** + * Inserts a new topic into the specified series. (topics.insert) + * @param string $seriesId The decimal ID of the Series. + * @param Topic $postBody + * @return Topic + */ + public function insert($seriesId, Topic $postBody, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Topic($data); + } else { + return $data; + } + } + /** + * Searches the topics within the specified series and returns the search results. (topics.list) + * @param string $seriesId The decimal ID of the Series. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string max-results Maximum number of results to return. + * @opt_param string q Search query. + * @opt_param string start-index Index of the first result to be retrieved. + * @opt_param string mode + * @return TopicList + */ + public function listTopics($seriesId, $optParams = array()) { + $params = array('seriesId' => $seriesId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new TopicList($data); + } else { + return $data; + } + } + /** + * Updates the specified topic within the specified series. (topics.update) + * @param string $seriesId The decimal ID of the Series. + * @param string $topicId The decimal ID of the Topic within the Series. + * @param Topic $postBody + * @return Topic + */ + public function update($seriesId, $topicId, Topic $postBody, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'topicId' => $topicId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new Topic($data); + } else { + return $data; + } + } + /** + * Returns the specified topic from the specified series. (topics.get) + * @param string $seriesId The decimal ID of the Series. + * @param string $topicId The decimal ID of the Topic within the Series. + * @return Topic + */ + public function get($seriesId, $topicId, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'topicId' => $topicId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Topic($data); + } else { + return $data; + } + } + } + + + /** + * The "submissions" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $submissions = $moderatorService->submissions; + * + */ + class TopicsSubmissionsServiceResource extends apiServiceResource { + + + /** + * Searches the submissions for the specified topic within the specified series and returns the + * search results. (submissions.list) + * @param string $seriesId The decimal ID of the Series. + * @param string $topicId The decimal ID of the Topic within the Series. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string max-results Maximum number of results to return. + * @opt_param bool includeVotes Specifies whether to include the current user's vote + * @opt_param string start-index Index of the first result to be retrieved. + * @opt_param string author Restricts the results to submissions by a specific author. + * @opt_param string sort Sort order. + * @opt_param string q Search query. + * @opt_param bool hasAttachedVideo Specifies whether to restrict to submissions that have videos attached. + * @return SubmissionList + */ + public function listTopicsSubmissions($seriesId, $topicId, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'topicId' => $topicId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new SubmissionList($data); + } else { + return $data; + } + } + } + + /** + * The "global" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $global = $moderatorService->global; + * + */ + class ModeratorGlobalServiceResource extends apiServiceResource { + + + } + + + /** + * The "series" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $series = $moderatorService->series; + * + */ + class ModeratorGlobalSeriesServiceResource extends apiServiceResource { + + + /** + * Searches the public series and returns the search results. (series.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string max-results Maximum number of results to return. + * @opt_param string q Search query. + * @opt_param string start-index Index of the first result to be retrieved. + * @return SeriesList + */ + public function listModeratorGlobalSeries($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new SeriesList($data); + } else { + return $data; + } + } + } + + /** + * The "profiles" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $profiles = $moderatorService->profiles; + * + */ + class ProfilesServiceResource extends apiServiceResource { + + + /** + * Updates the profile information for the authenticated user. This method supports patch semantics. + * (profiles.patch) + * @param Profile $postBody + * @return Profile + */ + public function patch(Profile $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('patch', array($params)); + if ($this->useObjects()) { + return new Profile($data); + } else { + return $data; + } + } + /** + * Updates the profile information for the authenticated user. (profiles.update) + * @param Profile $postBody + * @return Profile + */ + public function update(Profile $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new Profile($data); + } else { + return $data; + } + } + /** + * Returns the profile information for the authenticated user. (profiles.get) + * @return Profile + */ + public function get($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Profile($data); + } else { + return $data; + } + } + } + + /** + * The "featured" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $featured = $moderatorService->featured; + * + */ + class FeaturedServiceResource extends apiServiceResource { + + + } + + + /** + * The "series" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $series = $moderatorService->series; + * + */ + class FeaturedSeriesServiceResource extends apiServiceResource { + + + /** + * Lists the featured series. (series.list) + * @return SeriesList + */ + public function listFeaturedSeries($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new SeriesList($data); + } else { + return $data; + } + } + } + + /** + * The "myrecent" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $myrecent = $moderatorService->myrecent; + * + */ + class MyrecentServiceResource extends apiServiceResource { + + + } + + + /** + * The "series" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $series = $moderatorService->series; + * + */ + class MyrecentSeriesServiceResource extends apiServiceResource { + + + /** + * Lists the series the authenticated user has visited. (series.list) + * @return SeriesList + */ + public function listMyrecentSeries($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new SeriesList($data); + } else { + return $data; + } + } + } + + /** + * The "my" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $my = $moderatorService->my; + * + */ + class MyServiceResource extends apiServiceResource { + + + } + + + /** + * The "series" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $series = $moderatorService->series; + * + */ + class MySeriesServiceResource extends apiServiceResource { + + + /** + * Lists all series created by the authenticated user. (series.list) + * @return SeriesList + */ + public function listMySeries($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new SeriesList($data); + } else { + return $data; + } + } + } + + /** + * The "submissions" collection of methods. + * Typical usage is: + * + * $moderatorService = new apiModeratorService(...); + * $submissions = $moderatorService->submissions; + * + */ + class SubmissionsServiceResource extends apiServiceResource { + + + /** + * Inserts a new submission in the specified topic within the specified series. (submissions.insert) + * @param string $seriesId The decimal ID of the Series. + * @param string $topicId The decimal ID of the Topic within the Series. + * @param Submission $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string unauthToken User identifier for unauthenticated usage mode + * @opt_param bool anonymous Set to true to mark the new submission as anonymous. + * @return Submission + */ + public function insert($seriesId, $topicId, Submission $postBody, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'topicId' => $topicId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Submission($data); + } else { + return $data; + } + } + /** + * Returns the specified submission within the specified series. (submissions.get) + * @param string $seriesId The decimal ID of the Series. + * @param string $submissionId The decimal ID of the Submission within the Series. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string lang The language code for the language the client prefers resuls in. + * @opt_param bool includeVotes Specifies whether to include the current user's vote + * @return Submission + */ + public function get($seriesId, $submissionId, $optParams = array()) { + $params = array('seriesId' => $seriesId, 'submissionId' => $submissionId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Submission($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Moderator (v1). + *

              + * Moderator API + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiModeratorService extends apiService { + public $votes; + public $responses; + public $tags; + public $series; + public $series_submissions; + public $series_submissions_submissions; + public $series_submissions_responses; + public $series_responses; + public $series_responses_submissions; + public $series_responses_responses; + public $topics; + public $topics_submissions; + public $topics_submissions_submissions; + public $global; + public $global_series; + public $global_series_series; + public $profiles; + public $featured; + public $featured_series; + public $featured_series_series; + public $myrecent; + public $myrecent_series; + public $myrecent_series_series; + public $my; + public $my_series; + public $my_series_series; + public $submissions; + /** + * Constructs the internal representation of the Moderator service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/moderator/v1/'; + $this->version = 'v1'; + $this->serviceName = 'moderator'; + + $apiClient->addService($this->serviceName, $this->version); + $this->votes = new VotesServiceResource($this, $this->serviceName, 'votes', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "unauthToken": {"type": "string", "location": "query"}, "submissionId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "request": {"$ref": "Vote"}, "id": "moderator.votes.insert", "httpMethod": "POST", "path": "series/{seriesId}/submissions/{submissionId}/votes/@me", "response": {"$ref": "Vote"}}, "get": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "userId": {"type": "string", "location": "query"}, "unauthToken": {"type": "string", "location": "query"}, "submissionId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "id": "moderator.votes.get", "httpMethod": "GET", "path": "series/{seriesId}/submissions/{submissionId}/votes/@me", "response": {"$ref": "Vote"}}, "list": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"max-results": {"format": "uint32", "type": "integer", "location": "query"}, "seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "start-index": {"format": "uint32", "type": "integer", "location": "query"}}, "id": "moderator.votes.list", "httpMethod": "GET", "path": "series/{seriesId}/votes/@me", "response": {"$ref": "VoteList"}}, "update": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "userId": {"type": "string", "location": "query"}, "unauthToken": {"type": "string", "location": "query"}, "submissionId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "request": {"$ref": "Vote"}, "id": "moderator.votes.update", "httpMethod": "PUT", "path": "series/{seriesId}/submissions/{submissionId}/votes/@me", "response": {"$ref": "Vote"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "userId": {"type": "string", "location": "query"}, "unauthToken": {"type": "string", "location": "query"}, "submissionId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "request": {"$ref": "Vote"}, "id": "moderator.votes.patch", "httpMethod": "PATCH", "path": "series/{seriesId}/submissions/{submissionId}/votes/@me", "response": {"$ref": "Vote"}}}}', true)); + $this->responses = new ResponsesServiceResource($this, $this->serviceName, 'responses', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "parentSubmissionId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "unauthToken": {"type": "string", "location": "query"}, "anonymous": {"type": "boolean", "location": "query"}, "topicId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "request": {"$ref": "Submission"}, "id": "moderator.responses.insert", "httpMethod": "POST", "path": "series/{seriesId}/topics/{topicId}/submissions/{parentSubmissionId}/responses", "response": {"$ref": "Submission"}}, "list": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"max-results": {"format": "uint32", "type": "integer", "location": "query"}, "sort": {"type": "string", "location": "query"}, "seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "author": {"type": "string", "location": "query"}, "start-index": {"format": "uint32", "type": "integer", "location": "query"}, "submissionId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "q": {"type": "string", "location": "query"}, "hasAttachedVideo": {"type": "boolean", "location": "query"}}, "id": "moderator.responses.list", "httpMethod": "GET", "path": "series/{seriesId}/submissions/{submissionId}/responses", "response": {"$ref": "SubmissionList"}}}}', true)); + $this->tags = new TagsServiceResource($this, $this->serviceName, 'tags', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "submissionId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "request": {"$ref": "Tag"}, "id": "moderator.tags.insert", "httpMethod": "POST", "path": "series/{seriesId}/submissions/{submissionId}/tags", "response": {"$ref": "Tag"}}, "list": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "submissionId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "id": "moderator.tags.list", "httpMethod": "GET", "path": "series/{seriesId}/submissions/{submissionId}/tags", "response": {"$ref": "TagList"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "tagId": {"required": true, "type": "string", "location": "path"}, "submissionId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "httpMethod": "DELETE", "path": "series/{seriesId}/submissions/{submissionId}/tags/{tagId}", "id": "moderator.tags.delete"}}}', true)); + $this->series = new SeriesServiceResource($this, $this->serviceName, 'series', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/moderator"], "request": {"$ref": "Series"}, "response": {"$ref": "Series"}, "httpMethod": "POST", "path": "series", "id": "moderator.series.insert"}, "get": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "id": "moderator.series.get", "httpMethod": "GET", "path": "series/{seriesId}", "response": {"$ref": "Series"}}, "list": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"max-results": {"format": "uint32", "type": "integer", "location": "query"}, "q": {"type": "string", "location": "query"}, "start-index": {"format": "uint32", "type": "integer", "location": "query"}}, "response": {"$ref": "SeriesList"}, "httpMethod": "GET", "path": "series", "id": "moderator.series.list"}, "update": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "request": {"$ref": "Series"}, "id": "moderator.series.update", "httpMethod": "PUT", "path": "series/{seriesId}", "response": {"$ref": "Series"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "request": {"$ref": "Series"}, "id": "moderator.series.patch", "httpMethod": "PATCH", "path": "series/{seriesId}", "response": {"$ref": "Series"}}}}', true)); + $this->series_submissions = new SeriesSubmissionsServiceResource($this, $this->serviceName, 'submissions', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"lang": {"type": "string", "location": "query"}, "max-results": {"format": "uint32", "type": "integer", "location": "query"}, "seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "author": {"type": "string", "location": "query"}, "start-index": {"format": "uint32", "type": "integer", "location": "query"}, "includeVotes": {"type": "boolean", "location": "query"}, "sort": {"type": "string", "location": "query"}, "q": {"type": "string", "location": "query"}, "hasAttachedVideo": {"type": "boolean", "location": "query"}}, "id": "moderator.series.submissions.list", "httpMethod": "GET", "path": "series/{seriesId}/submissions", "response": {"$ref": "SubmissionList"}}}}', true)); + $this->series_responses = new SeriesResponsesServiceResource($this, $this->serviceName, 'responses', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"max-results": {"format": "uint32", "type": "integer", "location": "query"}, "sort": {"type": "string", "location": "query"}, "seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "author": {"type": "string", "location": "query"}, "start-index": {"format": "uint32", "type": "integer", "location": "query"}, "q": {"type": "string", "location": "query"}, "hasAttachedVideo": {"type": "boolean", "location": "query"}}, "id": "moderator.series.responses.list", "httpMethod": "GET", "path": "series/{seriesId}/responses", "response": {"$ref": "SeriesList"}}}}', true)); + $this->topics = new TopicsServiceResource($this, $this->serviceName, 'topics', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "request": {"$ref": "Topic"}, "id": "moderator.topics.insert", "httpMethod": "POST", "path": "series/{seriesId}/topics", "response": {"$ref": "Topic"}}, "list": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"max-results": {"format": "uint32", "type": "integer", "location": "query"}, "q": {"type": "string", "location": "query"}, "start-index": {"format": "uint32", "type": "integer", "location": "query"}, "mode": {"type": "string", "location": "query"}, "seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "id": "moderator.topics.list", "httpMethod": "GET", "path": "series/{seriesId}/topics", "response": {"$ref": "TopicList"}}, "update": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "topicId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "request": {"$ref": "Topic"}, "id": "moderator.topics.update", "httpMethod": "PUT", "path": "series/{seriesId}/topics/{topicId}", "response": {"$ref": "Topic"}}, "get": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "topicId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "id": "moderator.topics.get", "httpMethod": "GET", "path": "series/{seriesId}/topics/{topicId}", "response": {"$ref": "Topic"}}}}', true)); + $this->topics_submissions = new TopicsSubmissionsServiceResource($this, $this->serviceName, 'submissions', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"max-results": {"format": "uint32", "type": "integer", "location": "query"}, "seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "includeVotes": {"type": "boolean", "location": "query"}, "topicId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "start-index": {"format": "uint32", "type": "integer", "location": "query"}, "author": {"type": "string", "location": "query"}, "sort": {"type": "string", "location": "query"}, "q": {"type": "string", "location": "query"}, "hasAttachedVideo": {"type": "boolean", "location": "query"}}, "id": "moderator.topics.submissions.list", "httpMethod": "GET", "path": "series/{seriesId}/topics/{topicId}/submissions", "response": {"$ref": "SubmissionList"}}}}', true)); + $this->global = new ModeratorGlobalServiceResource($this, $this->serviceName, 'global', json_decode('{}', true)); + $this->global_series = new ModeratorGlobalSeriesServiceResource($this, $this->serviceName, 'series', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"max-results": {"format": "uint32", "type": "integer", "location": "query"}, "q": {"type": "string", "location": "query"}, "start-index": {"format": "uint32", "type": "integer", "location": "query"}}, "response": {"$ref": "SeriesList"}, "httpMethod": "GET", "path": "search", "id": "moderator.global.series.list"}}}', true)); + $this->profiles = new ProfilesServiceResource($this, $this->serviceName, 'profiles', json_decode('{"methods": {"get": {"scopes": ["https://www.googleapis.com/auth/moderator"], "id": "moderator.profiles.get", "httpMethod": "GET", "path": "profiles/@me", "response": {"$ref": "Profile"}}, "update": {"scopes": ["https://www.googleapis.com/auth/moderator"], "request": {"$ref": "Profile"}, "response": {"$ref": "Profile"}, "httpMethod": "PUT", "path": "profiles/@me", "id": "moderator.profiles.update"}, "patch": {"scopes": ["https://www.googleapis.com/auth/moderator"], "request": {"$ref": "Profile"}, "response": {"$ref": "Profile"}, "httpMethod": "PATCH", "path": "profiles/@me", "id": "moderator.profiles.patch"}}}', true)); + $this->featured = new FeaturedServiceResource($this, $this->serviceName, 'featured', json_decode('{}', true)); + $this->featured_series = new FeaturedSeriesServiceResource($this, $this->serviceName, 'series', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/moderator"], "id": "moderator.featured.series.list", "httpMethod": "GET", "path": "series/featured", "response": {"$ref": "SeriesList"}}}}', true)); + $this->myrecent = new MyrecentServiceResource($this, $this->serviceName, 'myrecent', json_decode('{}', true)); + $this->myrecent_series = new MyrecentSeriesServiceResource($this, $this->serviceName, 'series', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/moderator"], "id": "moderator.myrecent.series.list", "httpMethod": "GET", "path": "series/@me/recent", "response": {"$ref": "SeriesList"}}}}', true)); + $this->my = new MyServiceResource($this, $this->serviceName, 'my', json_decode('{}', true)); + $this->my_series = new MySeriesServiceResource($this, $this->serviceName, 'series', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/moderator"], "id": "moderator.my.series.list", "httpMethod": "GET", "path": "series/@me/mine", "response": {"$ref": "SeriesList"}}}}', true)); + $this->submissions = new SubmissionsServiceResource($this, $this->serviceName, 'submissions', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "topicId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "unauthToken": {"type": "string", "location": "query"}, "anonymous": {"type": "boolean", "location": "query"}}, "request": {"$ref": "Submission"}, "id": "moderator.submissions.insert", "httpMethod": "POST", "path": "series/{seriesId}/topics/{topicId}/submissions", "response": {"$ref": "Submission"}}, "get": {"scopes": ["https://www.googleapis.com/auth/moderator"], "parameters": {"lang": {"type": "string", "location": "query"}, "seriesId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "includeVotes": {"type": "boolean", "location": "query"}, "submissionId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}}, "id": "moderator.submissions.get", "httpMethod": "GET", "path": "series/{seriesId}/submissions/{submissionId}", "response": {"$ref": "Submission"}}}}', true)); + } +} + +class ModeratorTopicsResourcePartial extends apiModel { + protected $__idType = 'ModeratorTopicsResourcePartialId'; + protected $__idDataType = ''; + public $id; + public function setId(ModeratorTopicsResourcePartialId $id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class ModeratorTopicsResourcePartialId extends apiModel { + public $seriesId; + public $topicId; + public function setSeriesId($seriesId) { + $this->seriesId = $seriesId; + } + public function getSeriesId() { + return $this->seriesId; + } + public function setTopicId($topicId) { + $this->topicId = $topicId; + } + public function getTopicId() { + return $this->topicId; + } +} + +class ModeratorVotesResourcePartial extends apiModel { + public $vote; + public $flag; + public function setVote($vote) { + $this->vote = $vote; + } + public function getVote() { + return $this->vote; + } + public function setFlag($flag) { + $this->flag = $flag; + } + public function getFlag() { + return $this->flag; + } +} + +class Profile extends apiModel { + public $kind; + protected $__attributionType = 'ProfileAttribution'; + protected $__attributionDataType = ''; + public $attribution; + protected $__idType = 'ProfileId'; + protected $__idDataType = ''; + public $id; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setAttribution(ProfileAttribution $attribution) { + $this->attribution = $attribution; + } + public function getAttribution() { + return $this->attribution; + } + public function setId(ProfileId $id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class ProfileAttribution extends apiModel { + protected $__geoType = 'ProfileAttributionGeo'; + protected $__geoDataType = ''; + public $geo; + public $displayName; + public $location; + public $avatarUrl; + public function setGeo(ProfileAttributionGeo $geo) { + $this->geo = $geo; + } + public function getGeo() { + return $this->geo; + } + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setLocation($location) { + $this->location = $location; + } + public function getLocation() { + return $this->location; + } + public function setAvatarUrl($avatarUrl) { + $this->avatarUrl = $avatarUrl; + } + public function getAvatarUrl() { + return $this->avatarUrl; + } +} + +class ProfileAttributionGeo extends apiModel { + public $latitude; + public $location; + public $longitude; + public function setLatitude($latitude) { + $this->latitude = $latitude; + } + public function getLatitude() { + return $this->latitude; + } + public function setLocation($location) { + $this->location = $location; + } + public function getLocation() { + return $this->location; + } + public function setLongitude($longitude) { + $this->longitude = $longitude; + } + public function getLongitude() { + return $this->longitude; + } +} + +class ProfileId extends apiModel { + public $user; + public function setUser($user) { + $this->user = $user; + } + public function getUser() { + return $this->user; + } +} + +class Series extends apiModel { + public $kind; + public $description; + protected $__rulesType = 'SeriesRules'; + protected $__rulesDataType = ''; + public $rules; + public $unauthVotingAllowed; + public $videoSubmissionAllowed; + public $name; + public $numTopics; + public $anonymousSubmissionAllowed; + public $unauthSubmissionAllowed; + protected $__idType = 'SeriesId'; + protected $__idDataType = ''; + public $id; + protected $__countersType = 'SeriesCounters'; + protected $__countersDataType = ''; + public $counters; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setRules(SeriesRules $rules) { + $this->rules = $rules; + } + public function getRules() { + return $this->rules; + } + public function setUnauthVotingAllowed($unauthVotingAllowed) { + $this->unauthVotingAllowed = $unauthVotingAllowed; + } + public function getUnauthVotingAllowed() { + return $this->unauthVotingAllowed; + } + public function setVideoSubmissionAllowed($videoSubmissionAllowed) { + $this->videoSubmissionAllowed = $videoSubmissionAllowed; + } + public function getVideoSubmissionAllowed() { + return $this->videoSubmissionAllowed; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setNumTopics($numTopics) { + $this->numTopics = $numTopics; + } + public function getNumTopics() { + return $this->numTopics; + } + public function setAnonymousSubmissionAllowed($anonymousSubmissionAllowed) { + $this->anonymousSubmissionAllowed = $anonymousSubmissionAllowed; + } + public function getAnonymousSubmissionAllowed() { + return $this->anonymousSubmissionAllowed; + } + public function setUnauthSubmissionAllowed($unauthSubmissionAllowed) { + $this->unauthSubmissionAllowed = $unauthSubmissionAllowed; + } + public function getUnauthSubmissionAllowed() { + return $this->unauthSubmissionAllowed; + } + public function setId(SeriesId $id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setCounters(SeriesCounters $counters) { + $this->counters = $counters; + } + public function getCounters() { + return $this->counters; + } +} + +class SeriesCounters extends apiModel { + public $users; + public $noneVotes; + public $videoSubmissions; + public $minusVotes; + public $anonymousSubmissions; + public $submissions; + public $plusVotes; + public function setUsers($users) { + $this->users = $users; + } + public function getUsers() { + return $this->users; + } + public function setNoneVotes($noneVotes) { + $this->noneVotes = $noneVotes; + } + public function getNoneVotes() { + return $this->noneVotes; + } + public function setVideoSubmissions($videoSubmissions) { + $this->videoSubmissions = $videoSubmissions; + } + public function getVideoSubmissions() { + return $this->videoSubmissions; + } + public function setMinusVotes($minusVotes) { + $this->minusVotes = $minusVotes; + } + public function getMinusVotes() { + return $this->minusVotes; + } + public function setAnonymousSubmissions($anonymousSubmissions) { + $this->anonymousSubmissions = $anonymousSubmissions; + } + public function getAnonymousSubmissions() { + return $this->anonymousSubmissions; + } + public function setSubmissions($submissions) { + $this->submissions = $submissions; + } + public function getSubmissions() { + return $this->submissions; + } + public function setPlusVotes($plusVotes) { + $this->plusVotes = $plusVotes; + } + public function getPlusVotes() { + return $this->plusVotes; + } +} + +class SeriesId extends apiModel { + public $seriesId; + public function setSeriesId($seriesId) { + $this->seriesId = $seriesId; + } + public function getSeriesId() { + return $this->seriesId; + } +} + +class SeriesList extends apiModel { + protected $__itemsType = 'Series'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(Series) */ $items) { + $this->assertIsArray($items, 'Series', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class SeriesRules extends apiModel { + protected $__votesType = 'SeriesRulesVotes'; + protected $__votesDataType = ''; + public $votes; + protected $__submissionsType = 'SeriesRulesSubmissions'; + protected $__submissionsDataType = ''; + public $submissions; + public function setVotes(SeriesRulesVotes $votes) { + $this->votes = $votes; + } + public function getVotes() { + return $this->votes; + } + public function setSubmissions(SeriesRulesSubmissions $submissions) { + $this->submissions = $submissions; + } + public function getSubmissions() { + return $this->submissions; + } +} + +class SeriesRulesSubmissions extends apiModel { + public $close; + public $open; + public function setClose($close) { + $this->close = $close; + } + public function getClose() { + return $this->close; + } + public function setOpen($open) { + $this->open = $open; + } + public function getOpen() { + return $this->open; + } +} + +class SeriesRulesVotes extends apiModel { + public $close; + public $open; + public function setClose($close) { + $this->close = $close; + } + public function getClose() { + return $this->close; + } + public function setOpen($open) { + $this->open = $open; + } + public function getOpen() { + return $this->open; + } +} + +class Submission extends apiModel { + public $kind; + protected $__attributionType = 'SubmissionAttribution'; + protected $__attributionDataType = ''; + public $attribution; + public $created; + public $text; + protected $__topicsType = 'ModeratorTopicsResourcePartial'; + protected $__topicsDataType = 'array'; + public $topics; + public $author; + protected $__translationsType = 'SubmissionTranslations'; + protected $__translationsDataType = 'array'; + public $translations; + protected $__parentSubmissionIdType = 'SubmissionParentSubmissionId'; + protected $__parentSubmissionIdDataType = ''; + public $parentSubmissionId; + protected $__voteType = 'ModeratorVotesResourcePartial'; + protected $__voteDataType = ''; + public $vote; + public $attachmentUrl; + protected $__geoType = 'SubmissionGeo'; + protected $__geoDataType = ''; + public $geo; + protected $__idType = 'SubmissionId'; + protected $__idDataType = ''; + public $id; + protected $__countersType = 'SubmissionCounters'; + protected $__countersDataType = ''; + public $counters; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setAttribution(SubmissionAttribution $attribution) { + $this->attribution = $attribution; + } + public function getAttribution() { + return $this->attribution; + } + public function setCreated($created) { + $this->created = $created; + } + public function getCreated() { + return $this->created; + } + public function setText($text) { + $this->text = $text; + } + public function getText() { + return $this->text; + } + public function setTopics(/* array(ModeratorTopicsResourcePartial) */ $topics) { + $this->assertIsArray($topics, 'ModeratorTopicsResourcePartial', __METHOD__); + $this->topics = $topics; + } + public function getTopics() { + return $this->topics; + } + public function setAuthor($author) { + $this->author = $author; + } + public function getAuthor() { + return $this->author; + } + public function setTranslations(/* array(SubmissionTranslations) */ $translations) { + $this->assertIsArray($translations, 'SubmissionTranslations', __METHOD__); + $this->translations = $translations; + } + public function getTranslations() { + return $this->translations; + } + public function setParentSubmissionId(SubmissionParentSubmissionId $parentSubmissionId) { + $this->parentSubmissionId = $parentSubmissionId; + } + public function getParentSubmissionId() { + return $this->parentSubmissionId; + } + public function setVote(ModeratorVotesResourcePartial $vote) { + $this->vote = $vote; + } + public function getVote() { + return $this->vote; + } + public function setAttachmentUrl($attachmentUrl) { + $this->attachmentUrl = $attachmentUrl; + } + public function getAttachmentUrl() { + return $this->attachmentUrl; + } + public function setGeo(SubmissionGeo $geo) { + $this->geo = $geo; + } + public function getGeo() { + return $this->geo; + } + public function setId(SubmissionId $id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setCounters(SubmissionCounters $counters) { + $this->counters = $counters; + } + public function getCounters() { + return $this->counters; + } +} + +class SubmissionAttribution extends apiModel { + public $displayName; + public $location; + public $avatarUrl; + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setLocation($location) { + $this->location = $location; + } + public function getLocation() { + return $this->location; + } + public function setAvatarUrl($avatarUrl) { + $this->avatarUrl = $avatarUrl; + } + public function getAvatarUrl() { + return $this->avatarUrl; + } +} + +class SubmissionCounters extends apiModel { + public $noneVotes; + public $minusVotes; + public $plusVotes; + public function setNoneVotes($noneVotes) { + $this->noneVotes = $noneVotes; + } + public function getNoneVotes() { + return $this->noneVotes; + } + public function setMinusVotes($minusVotes) { + $this->minusVotes = $minusVotes; + } + public function getMinusVotes() { + return $this->minusVotes; + } + public function setPlusVotes($plusVotes) { + $this->plusVotes = $plusVotes; + } + public function getPlusVotes() { + return $this->plusVotes; + } +} + +class SubmissionGeo extends apiModel { + public $latitude; + public $location; + public $longitude; + public function setLatitude($latitude) { + $this->latitude = $latitude; + } + public function getLatitude() { + return $this->latitude; + } + public function setLocation($location) { + $this->location = $location; + } + public function getLocation() { + return $this->location; + } + public function setLongitude($longitude) { + $this->longitude = $longitude; + } + public function getLongitude() { + return $this->longitude; + } +} + +class SubmissionId extends apiModel { + public $seriesId; + public $submissionId; + public function setSeriesId($seriesId) { + $this->seriesId = $seriesId; + } + public function getSeriesId() { + return $this->seriesId; + } + public function setSubmissionId($submissionId) { + $this->submissionId = $submissionId; + } + public function getSubmissionId() { + return $this->submissionId; + } +} + +class SubmissionList extends apiModel { + protected $__itemsType = 'Submission'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(Submission) */ $items) { + $this->assertIsArray($items, 'Submission', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class SubmissionParentSubmissionId extends apiModel { + public $seriesId; + public $submissionId; + public function setSeriesId($seriesId) { + $this->seriesId = $seriesId; + } + public function getSeriesId() { + return $this->seriesId; + } + public function setSubmissionId($submissionId) { + $this->submissionId = $submissionId; + } + public function getSubmissionId() { + return $this->submissionId; + } +} + +class SubmissionTranslations extends apiModel { + public $lang; + public $text; + public function setLang($lang) { + $this->lang = $lang; + } + public function getLang() { + return $this->lang; + } + public function setText($text) { + $this->text = $text; + } + public function getText() { + return $this->text; + } +} + +class Tag extends apiModel { + public $text; + public $kind; + protected $__idType = 'TagId'; + protected $__idDataType = ''; + public $id; + public function setText($text) { + $this->text = $text; + } + public function getText() { + return $this->text; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setId(TagId $id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class TagId extends apiModel { + public $seriesId; + public $tagId; + public $submissionId; + public function setSeriesId($seriesId) { + $this->seriesId = $seriesId; + } + public function getSeriesId() { + return $this->seriesId; + } + public function setTagId($tagId) { + $this->tagId = $tagId; + } + public function getTagId() { + return $this->tagId; + } + public function setSubmissionId($submissionId) { + $this->submissionId = $submissionId; + } + public function getSubmissionId() { + return $this->submissionId; + } +} + +class TagList extends apiModel { + protected $__itemsType = 'Tag'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(Tag) */ $items) { + $this->assertIsArray($items, 'Tag', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class Topic extends apiModel { + public $kind; + public $description; + protected $__rulesType = 'TopicRules'; + protected $__rulesDataType = ''; + public $rules; + protected $__featuredSubmissionType = 'Submission'; + protected $__featuredSubmissionDataType = ''; + public $featuredSubmission; + public $presenter; + protected $__countersType = 'TopicCounters'; + protected $__countersDataType = ''; + public $counters; + protected $__idType = 'TopicId'; + protected $__idDataType = ''; + public $id; + public $name; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setRules(TopicRules $rules) { + $this->rules = $rules; + } + public function getRules() { + return $this->rules; + } + public function setFeaturedSubmission(Submission $featuredSubmission) { + $this->featuredSubmission = $featuredSubmission; + } + public function getFeaturedSubmission() { + return $this->featuredSubmission; + } + public function setPresenter($presenter) { + $this->presenter = $presenter; + } + public function getPresenter() { + return $this->presenter; + } + public function setCounters(TopicCounters $counters) { + $this->counters = $counters; + } + public function getCounters() { + return $this->counters; + } + public function setId(TopicId $id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class TopicCounters extends apiModel { + public $users; + public $noneVotes; + public $videoSubmissions; + public $minusVotes; + public $submissions; + public $plusVotes; + public function setUsers($users) { + $this->users = $users; + } + public function getUsers() { + return $this->users; + } + public function setNoneVotes($noneVotes) { + $this->noneVotes = $noneVotes; + } + public function getNoneVotes() { + return $this->noneVotes; + } + public function setVideoSubmissions($videoSubmissions) { + $this->videoSubmissions = $videoSubmissions; + } + public function getVideoSubmissions() { + return $this->videoSubmissions; + } + public function setMinusVotes($minusVotes) { + $this->minusVotes = $minusVotes; + } + public function getMinusVotes() { + return $this->minusVotes; + } + public function setSubmissions($submissions) { + $this->submissions = $submissions; + } + public function getSubmissions() { + return $this->submissions; + } + public function setPlusVotes($plusVotes) { + $this->plusVotes = $plusVotes; + } + public function getPlusVotes() { + return $this->plusVotes; + } +} + +class TopicId extends apiModel { + public $seriesId; + public $topicId; + public function setSeriesId($seriesId) { + $this->seriesId = $seriesId; + } + public function getSeriesId() { + return $this->seriesId; + } + public function setTopicId($topicId) { + $this->topicId = $topicId; + } + public function getTopicId() { + return $this->topicId; + } +} + +class TopicList extends apiModel { + protected $__itemsType = 'Topic'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(Topic) */ $items) { + $this->assertIsArray($items, 'Topic', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class TopicRules extends apiModel { + protected $__votesType = 'TopicRulesVotes'; + protected $__votesDataType = ''; + public $votes; + protected $__submissionsType = 'TopicRulesSubmissions'; + protected $__submissionsDataType = ''; + public $submissions; + public function setVotes(TopicRulesVotes $votes) { + $this->votes = $votes; + } + public function getVotes() { + return $this->votes; + } + public function setSubmissions(TopicRulesSubmissions $submissions) { + $this->submissions = $submissions; + } + public function getSubmissions() { + return $this->submissions; + } +} + +class TopicRulesSubmissions extends apiModel { + public $close; + public $open; + public function setClose($close) { + $this->close = $close; + } + public function getClose() { + return $this->close; + } + public function setOpen($open) { + $this->open = $open; + } + public function getOpen() { + return $this->open; + } +} + +class TopicRulesVotes extends apiModel { + public $close; + public $open; + public function setClose($close) { + $this->close = $close; + } + public function getClose() { + return $this->close; + } + public function setOpen($open) { + $this->open = $open; + } + public function getOpen() { + return $this->open; + } +} + +class Vote extends apiModel { + public $vote; + public $flag; + protected $__idType = 'VoteId'; + protected $__idDataType = ''; + public $id; + public $kind; + public function setVote($vote) { + $this->vote = $vote; + } + public function getVote() { + return $this->vote; + } + public function setFlag($flag) { + $this->flag = $flag; + } + public function getFlag() { + return $this->flag; + } + public function setId(VoteId $id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class VoteId extends apiModel { + public $seriesId; + public $submissionId; + public function setSeriesId($seriesId) { + $this->seriesId = $seriesId; + } + public function getSeriesId() { + return $this->seriesId; + } + public function setSubmissionId($submissionId) { + $this->submissionId = $submissionId; + } + public function getSubmissionId() { + return $this->submissionId; + } +} + +class VoteList extends apiModel { + protected $__itemsType = 'Vote'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(Vote) */ $items) { + $this->assertIsArray($items, 'Vote', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiOauth2Service.php b/inc/vendors/social-login/Google/contrib/apiOauth2Service.php new file mode 100755 index 00000000..28e5b996 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiOauth2Service.php @@ -0,0 +1,296 @@ + + * $oauth2Service = new apiOauth2Service(...); + * $userinfo = $oauth2Service->userinfo; + * + */ + class UserinfoServiceResource extends apiServiceResource { + + + /** + * (userinfo.get) + * @return Userinfo + */ + public function get($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Userinfo($data); + } else { + return $data; + } + } + } + + + /** + * The "v2" collection of methods. + * Typical usage is: + * + * $oauth2Service = new apiOauth2Service(...); + * $v2 = $oauth2Service->v2; + * + */ + class UserinfoV2ServiceResource extends apiServiceResource { + + + } + + + /** + * The "me" collection of methods. + * Typical usage is: + * + * $oauth2Service = new apiOauth2Service(...); + * $me = $oauth2Service->me; + * + */ + class UserinfoV2MeServiceResource extends apiServiceResource { + + + /** + * (me.get) + * @return Userinfo + */ + public function get($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Userinfo($data); + } else { + return $data; + } + } + } + + + /** + * The "tokeninfo" collection of methods. + * Typical usage is: + * + * $oauth2Service = new apiOauth2Service(...); + * $tokeninfo = $oauth2Service->tokeninfo; + * + */ + class TokeninfoServiceResource extends apiServiceResource { + /** + * (tokeninfo.tokeninfo) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string access_token + * @opt_param string id_token + * @return Tokeninfo + */ + public function tokeninfo($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('tokeninfo', array($params)); + if ($this->useObjects()) { + return new Tokeninfo($data); + } else { + return $data; + } + } + + } + + +/** + * Service definition for Oauth2 (v2). + *

              + * OAuth2 API + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiOauth2Service extends apiService { + public $tokeninfo; + public $userinfo; + public $userinfo_v2; + /** + * Constructs the internal representation of the Oauth2 service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/'; + $this->version = 'v2'; + $this->serviceName = 'oauth2'; + + $apiClient->addService($this->serviceName, $this->version); + $this->userinfo = new UserinfoServiceResource($this, $this->serviceName, 'userinfo', json_decode('{"methods": {"get": {"path": "oauth2/v2/userinfo", "response": {"$ref": "Userinfo"}, "httpMethod": "GET", "id": "oauth2.userinfo.get"}}}', true)); + $this->userinfo_v2 = new UserinfoV2ServiceResource($this, $this->serviceName, 'v2', json_decode('{}', true)); + $this->tokeninfo = new TokeninfoServiceResource($this, $this->serviceName, 'tokeninfo', json_decode('{"id": "oauth2.tokeninfo", "path": "oauth2/v2/tokeninfo", "response": {"$ref": "Tokeninfo"}, "parameters": {"access_token": {"type": "string", "location": "query"}, "id_token": {"type": "string", "location": "query"}}, "httpMethod": "GET"}', true)); + } +} + +class Tokeninfo extends apiModel { + public $issued_to; + public $user_id; + public $expires_in; + public $access_type; + public $audience; + public $scope; + public $email; + public $verified_email; + public function setIssued_to($issued_to) { + $this->issued_to = $issued_to; + } + public function getIssued_to() { + return $this->issued_to; + } + public function setUser_id($user_id) { + $this->user_id = $user_id; + } + public function getUser_id() { + return $this->user_id; + } + public function setExpires_in($expires_in) { + $this->expires_in = $expires_in; + } + public function getExpires_in() { + return $this->expires_in; + } + public function setAccess_type($access_type) { + $this->access_type = $access_type; + } + public function getAccess_type() { + return $this->access_type; + } + public function setAudience($audience) { + $this->audience = $audience; + } + public function getAudience() { + return $this->audience; + } + public function setScope($scope) { + $this->scope = $scope; + } + public function getScope() { + return $this->scope; + } + public function setEmail($email) { + $this->email = $email; + } + public function getEmail() { + return $this->email; + } + public function setVerified_email($verified_email) { + $this->verified_email = $verified_email; + } + public function getVerified_email() { + return $this->verified_email; + } +} + +class Userinfo extends apiModel { + public $family_name; + public $name; + public $picture; + public $locale; + public $gender; + public $email; + public $birthday; + public $link; + public $given_name; + public $timezone; + public $id; + public $verified_email; + public function setFamily_name($family_name) { + $this->family_name = $family_name; + } + public function getFamily_name() { + return $this->family_name; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setPicture($picture) { + $this->picture = $picture; + } + public function getPicture() { + return $this->picture; + } + public function setLocale($locale) { + $this->locale = $locale; + } + public function getLocale() { + return $this->locale; + } + public function setGender($gender) { + $this->gender = $gender; + } + public function getGender() { + return $this->gender; + } + public function setEmail($email) { + $this->email = $email; + } + public function getEmail() { + return $this->email; + } + public function setBirthday($birthday) { + $this->birthday = $birthday; + } + public function getBirthday() { + return $this->birthday; + } + public function setLink($link) { + $this->link = $link; + } + public function getLink() { + return $this->link; + } + public function setGiven_name($given_name) { + $this->given_name = $given_name; + } + public function getGiven_name() { + return $this->given_name; + } + public function setTimezone($timezone) { + $this->timezone = $timezone; + } + public function getTimezone() { + return $this->timezone; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setVerified_email($verified_email) { + $this->verified_email = $verified_email; + } + public function getVerified_email() { + return $this->verified_email; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiOrkutService.php b/inc/vendors/social-login/Google/contrib/apiOrkutService.php new file mode 100755 index 00000000..200d893f --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiOrkutService.php @@ -0,0 +1,2474 @@ + + * $orkutService = new apiOrkutService(...); + * $communityMembers = $orkutService->communityMembers; + * + */ + class CommunityMembersServiceResource extends apiServiceResource { + + + /** + * Makes the user join a community. (communityMembers.insert) + * @param int $communityId ID of the community. + * @param string $userId ID of the user. + * @return CommunityMembers + */ + public function insert($communityId, $userId, $optParams = array()) { + $params = array('communityId' => $communityId, 'userId' => $userId); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new CommunityMembers($data); + } else { + return $data; + } + } + /** + * Retrieves the relationship between a user and a community. (communityMembers.get) + * @param int $communityId ID of the community. + * @param string $userId ID of the user. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return CommunityMembers + */ + public function get($communityId, $userId, $optParams = array()) { + $params = array('communityId' => $communityId, 'userId' => $userId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new CommunityMembers($data); + } else { + return $data; + } + } + /** + * Lists members of a community. (communityMembers.list) + * @param int $communityId The ID of the community whose members will be listed. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token that allows pagination. + * @opt_param bool friendsOnly Whether to list only community members who are friends of the user. + * @opt_param string maxResults The maximum number of members to include in the response. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return CommunityMembersList + */ + public function listCommunityMembers($communityId, $optParams = array()) { + $params = array('communityId' => $communityId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CommunityMembersList($data); + } else { + return $data; + } + } + /** + * Makes the user leave a community. (communityMembers.delete) + * @param int $communityId ID of the community. + * @param string $userId ID of the user. + */ + public function delete($communityId, $userId, $optParams = array()) { + $params = array('communityId' => $communityId, 'userId' => $userId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "activities" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $activities = $orkutService->activities; + * + */ + class ActivitiesServiceResource extends apiServiceResource { + + + /** + * Retrieves a list of activities. (activities.list) + * @param string $userId The ID of the user whose activities will be listed. Can be me to refer to the viewer (i.e. the authenticated user). + * @param string $collection The collection of activities to list. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token that allows pagination. + * @opt_param string maxResults The maximum number of activities to include in the response. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return ActivityList + */ + public function listActivities($userId, $collection, $optParams = array()) { + $params = array('userId' => $userId, 'collection' => $collection); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new ActivityList($data); + } else { + return $data; + } + } + /** + * Deletes an existing activity, if the access controls allow it. (activities.delete) + * @param string $activityId ID of the activity to remove. + */ + public function delete($activityId, $optParams = array()) { + $params = array('activityId' => $activityId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "communityPollComments" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $communityPollComments = $orkutService->communityPollComments; + * + */ + class CommunityPollCommentsServiceResource extends apiServiceResource { + + + /** + * Adds a comment on a community poll. (communityPollComments.insert) + * @param int $communityId The ID of the community whose poll is being commented. + * @param string $pollId The ID of the poll being commented. + * @param CommunityPollComment $postBody + * @return CommunityPollComment + */ + public function insert($communityId, $pollId, CommunityPollComment $postBody, $optParams = array()) { + $params = array('communityId' => $communityId, 'pollId' => $pollId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new CommunityPollComment($data); + } else { + return $data; + } + } + /** + * Retrieves the comments of a community poll. (communityPollComments.list) + * @param int $communityId The ID of the community whose poll is having its comments listed. + * @param string $pollId The ID of the community whose polls will be listed. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token that allows pagination. + * @opt_param string maxResults The maximum number of comments to include in the response. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return CommunityPollCommentList + */ + public function listCommunityPollComments($communityId, $pollId, $optParams = array()) { + $params = array('communityId' => $communityId, 'pollId' => $pollId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CommunityPollCommentList($data); + } else { + return $data; + } + } + } + + /** + * The "communityPolls" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $communityPolls = $orkutService->communityPolls; + * + */ + class CommunityPollsServiceResource extends apiServiceResource { + + + /** + * Retrieves the polls of a community. (communityPolls.list) + * @param string $communityId The ID of the community which polls will be listed. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token that allows pagination. + * @opt_param string maxResults The maximum number of polls to include in the response. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return CommunityPollList + */ + public function listCommunityPolls($communityId, $optParams = array()) { + $params = array('communityId' => $communityId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CommunityPollList($data); + } else { + return $data; + } + } + /** + * Retrieves one specific poll of a community. (communityPolls.get) + * @param int $communityId The ID of the community for whose poll will be retrieved. + * @param string $pollId The ID of the poll to get. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return CommunityPoll + */ + public function get($communityId, $pollId, $optParams = array()) { + $params = array('communityId' => $communityId, 'pollId' => $pollId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new CommunityPoll($data); + } else { + return $data; + } + } + } + + /** + * The "communityMessages" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $communityMessages = $orkutService->communityMessages; + * + */ + class CommunityMessagesServiceResource extends apiServiceResource { + + + /** + * Adds a message to a given community topic. (communityMessages.insert) + * @param int $communityId The ID of the community the message should be added to. + * @param string $topicId The ID of the topic the message should be added to. + * @param CommunityMessage $postBody + * @return CommunityMessage + */ + public function insert($communityId, $topicId, CommunityMessage $postBody, $optParams = array()) { + $params = array('communityId' => $communityId, 'topicId' => $topicId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new CommunityMessage($data); + } else { + return $data; + } + } + /** + * Retrieves the messages of a topic of a community. (communityMessages.list) + * @param int $communityId The ID of the community which messages will be listed. + * @param string $topicId The ID of the topic which messages will be listed. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token that allows pagination. + * @opt_param string maxResults The maximum number of messages to include in the response. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return CommunityMessageList + */ + public function listCommunityMessages($communityId, $topicId, $optParams = array()) { + $params = array('communityId' => $communityId, 'topicId' => $topicId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CommunityMessageList($data); + } else { + return $data; + } + } + /** + * Moves a message of the community to the trash folder. (communityMessages.delete) + * @param int $communityId The ID of the community whose message will be moved to the trash folder. + * @param string $topicId The ID of the topic whose message will be moved to the trash folder. + * @param string $messageId The ID of the message to be moved to the trash folder. + */ + public function delete($communityId, $topicId, $messageId, $optParams = array()) { + $params = array('communityId' => $communityId, 'topicId' => $topicId, 'messageId' => $messageId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "communityTopics" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $communityTopics = $orkutService->communityTopics; + * + */ + class CommunityTopicsServiceResource extends apiServiceResource { + + + /** + * Adds a topic to a given community. (communityTopics.insert) + * @param int $communityId The ID of the community the topic should be added to. + * @param CommunityTopic $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool isShout Whether this topic is a shout. + * @return CommunityTopic + */ + public function insert($communityId, CommunityTopic $postBody, $optParams = array()) { + $params = array('communityId' => $communityId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new CommunityTopic($data); + } else { + return $data; + } + } + /** + * Retrieves a topic of a community. (communityTopics.get) + * @param int $communityId The ID of the community whose topic will be retrieved. + * @param string $topicId The ID of the topic to get. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return CommunityTopic + */ + public function get($communityId, $topicId, $optParams = array()) { + $params = array('communityId' => $communityId, 'topicId' => $topicId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new CommunityTopic($data); + } else { + return $data; + } + } + /** + * Retrieves the topics of a community. (communityTopics.list) + * @param int $communityId The ID of the community which topics will be listed. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken A continuation token that allows pagination. + * @opt_param string maxResults The maximum number of topics to include in the response. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return CommunityTopicList + */ + public function listCommunityTopics($communityId, $optParams = array()) { + $params = array('communityId' => $communityId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CommunityTopicList($data); + } else { + return $data; + } + } + /** + * Moves a topic of the community to the trash folder. (communityTopics.delete) + * @param int $communityId The ID of the community whose topic will be moved to the trash folder. + * @param string $topicId The ID of the topic to be moved to the trash folder. + */ + public function delete($communityId, $topicId, $optParams = array()) { + $params = array('communityId' => $communityId, 'topicId' => $topicId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "comments" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $comments = $orkutService->comments; + * + */ + class CommentsServiceResource extends apiServiceResource { + + + /** + * Inserts a new comment to an activity. (comments.insert) + * @param string $activityId The ID of the activity to contain the new comment. + * @param Comment $postBody + * @return Comment + */ + public function insert($activityId, Comment $postBody, $optParams = array()) { + $params = array('activityId' => $activityId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Comment($data); + } else { + return $data; + } + } + /** + * Retrieves an existing comment. (comments.get) + * @param string $commentId ID of the comment to get. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return Comment + */ + public function get($commentId, $optParams = array()) { + $params = array('commentId' => $commentId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Comment($data); + } else { + return $data; + } + } + /** + * Retrieves a list of comments, possibly filtered. (comments.list) + * @param string $activityId The ID of the activity containing the comments. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string orderBy Sort search results. + * @opt_param string pageToken A continuation token that allows pagination. + * @opt_param string maxResults The maximum number of activities to include in the response. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return CommentList + */ + public function listComments($activityId, $optParams = array()) { + $params = array('activityId' => $activityId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CommentList($data); + } else { + return $data; + } + } + /** + * Deletes an existing comment. (comments.delete) + * @param string $commentId ID of the comment to remove. + */ + public function delete($commentId, $optParams = array()) { + $params = array('commentId' => $commentId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "acl" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $acl = $orkutService->acl; + * + */ + class AclServiceResource extends apiServiceResource { + + + /** + * Excludes an element from the ACL of the activity. (acl.delete) + * @param string $activityId ID of the activity. + * @param string $userId ID of the user to be removed from the activity. + */ + public function delete($activityId, $userId, $optParams = array()) { + $params = array('activityId' => $activityId, 'userId' => $userId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "communityRelated" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $communityRelated = $orkutService->communityRelated; + * + */ + class CommunityRelatedServiceResource extends apiServiceResource { + + + /** + * Retrieves the communities related to another one. (communityRelated.list) + * @param int $communityId The ID of the community whose related communities will be listed. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return CommunityList + */ + public function listCommunityRelated($communityId, $optParams = array()) { + $params = array('communityId' => $communityId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CommunityList($data); + } else { + return $data; + } + } + } + + /** + * The "scraps" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $scraps = $orkutService->scraps; + * + */ + class ScrapsServiceResource extends apiServiceResource { + + + /** + * Creates a new scrap. (scraps.insert) + * @param Activity $postBody + * @return Activity + */ + public function insert(Activity $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Activity($data); + } else { + return $data; + } + } + } + + /** + * The "communityPollVotes" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $communityPollVotes = $orkutService->communityPollVotes; + * + */ + class CommunityPollVotesServiceResource extends apiServiceResource { + + + /** + * Votes on a community poll. (communityPollVotes.insert) + * @param int $communityId The ID of the community whose poll is being voted. + * @param string $pollId The ID of the poll being voted. + * @param CommunityPollVote $postBody + * @return CommunityPollVote + */ + public function insert($communityId, $pollId, CommunityPollVote $postBody, $optParams = array()) { + $params = array('communityId' => $communityId, 'pollId' => $pollId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new CommunityPollVote($data); + } else { + return $data; + } + } + } + + /** + * The "communities" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $communities = $orkutService->communities; + * + */ + class CommunitiesServiceResource extends apiServiceResource { + + + /** + * Retrieves the communities an user is member of. (communities.list) + * @param string $userId The ID of the user whose communities will be listed. Can be me to refer to caller. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string orderBy How to order the communities by. + * @opt_param string maxResults The maximum number of communities to include in the response. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return CommunityList + */ + public function listCommunities($userId, $optParams = array()) { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CommunityList($data); + } else { + return $data; + } + } + /** + * Retrieves the profile of a community. (communities.get) + * @param int $communityId The ID of the community to get. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string hl Specifies the interface language (host language) of your user interface. + * @return Community + */ + public function get($communityId, $optParams = array()) { + $params = array('communityId' => $communityId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Community($data); + } else { + return $data; + } + } + } + + /** + * The "communityFollow" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $communityFollow = $orkutService->communityFollow; + * + */ + class CommunityFollowServiceResource extends apiServiceResource { + + + /** + * Adds an user as a follower of a community. (communityFollow.insert) + * @param int $communityId ID of the community. + * @param string $userId ID of the user. + * @return CommunityMembers + */ + public function insert($communityId, $userId, $optParams = array()) { + $params = array('communityId' => $communityId, 'userId' => $userId); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new CommunityMembers($data); + } else { + return $data; + } + } + /** + * Removes an user from the followers of a community. (communityFollow.delete) + * @param int $communityId ID of the community. + * @param string $userId ID of the user. + */ + public function delete($communityId, $userId, $optParams = array()) { + $params = array('communityId' => $communityId, 'userId' => $userId); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "activityVisibility" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $activityVisibility = $orkutService->activityVisibility; + * + */ + class ActivityVisibilityServiceResource extends apiServiceResource { + + + /** + * Updates the visibility of an existing activity. This method supports patch semantics. + * (activityVisibility.patch) + * @param string $activityId ID of the activity. + * @param Visibility $postBody + * @return Visibility + */ + public function patch($activityId, Visibility $postBody, $optParams = array()) { + $params = array('activityId' => $activityId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('patch', array($params)); + if ($this->useObjects()) { + return new Visibility($data); + } else { + return $data; + } + } + /** + * Updates the visibility of an existing activity. (activityVisibility.update) + * @param string $activityId ID of the activity. + * @param Visibility $postBody + * @return Visibility + */ + public function update($activityId, Visibility $postBody, $optParams = array()) { + $params = array('activityId' => $activityId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new Visibility($data); + } else { + return $data; + } + } + /** + * Gets the visibility of an existing activity. (activityVisibility.get) + * @param string $activityId ID of the activity to get the visibility. + * @return Visibility + */ + public function get($activityId, $optParams = array()) { + $params = array('activityId' => $activityId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Visibility($data); + } else { + return $data; + } + } + } + + /** + * The "badges" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $badges = $orkutService->badges; + * + */ + class BadgesServiceResource extends apiServiceResource { + + + /** + * Retrieves the list of visible badges of a user. (badges.list) + * @param string $userId The id of the user whose badges will be listed. Can be me to refer to caller. + * @return BadgeList + */ + public function listBadges($userId, $optParams = array()) { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new BadgeList($data); + } else { + return $data; + } + } + /** + * Retrieves a badge from a user. (badges.get) + * @param string $userId The ID of the user whose badges will be listed. Can be me to refer to caller. + * @param string $badgeId The ID of the badge that will be retrieved. + * @return Badge + */ + public function get($userId, $badgeId, $optParams = array()) { + $params = array('userId' => $userId, 'badgeId' => $badgeId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Badge($data); + } else { + return $data; + } + } + } + + /** + * The "counters" collection of methods. + * Typical usage is: + * + * $orkutService = new apiOrkutService(...); + * $counters = $orkutService->counters; + * + */ + class CountersServiceResource extends apiServiceResource { + + + /** + * Retrieves the counters of an user. (counters.list) + * @param string $userId The ID of the user whose counters will be listed. Can be me to refer to caller. + * @return Counters + */ + public function listCounters($userId, $optParams = array()) { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Counters($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Orkut (v2). + *

              + * Lets you manage activities, comments and badges in Orkut. More stuff coming in time. + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiOrkutService extends apiService { + public $communityMembers; + public $activities; + public $communityPollComments; + public $communityPolls; + public $communityMessages; + public $communityTopics; + public $comments; + public $acl; + public $communityRelated; + public $scraps; + public $communityPollVotes; + public $communities; + public $communityFollow; + public $activityVisibility; + public $badges; + public $counters; + /** + * Constructs the internal representation of the Orkut service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/orkut/v2/'; + $this->version = 'v2'; + $this->serviceName = 'orkut'; + + $apiClient->addService($this->serviceName, $this->version); + $this->communityMembers = new CommunityMembersServiceResource($this, $this->serviceName, 'communityMembers', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "userId": {"required": true, "type": "string", "location": "path"}}, "id": "orkut.communityMembers.insert", "httpMethod": "POST", "path": "communities/{communityId}/members/{userId}", "response": {"$ref": "CommunityMembers"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "userId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "communities/{communityId}/members/{userId}", "id": "orkut.communityMembers.delete"}, "list": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "friendsOnly": {"type": "boolean", "location": "query"}, "communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "hl": {"type": "string", "location": "query"}, "maxResults": {"format": "uint32", "minimum": "1", "type": "integer", "location": "query"}}, "id": "orkut.communityMembers.list", "httpMethod": "GET", "path": "communities/{communityId}/members", "response": {"$ref": "CommunityMembersList"}}, "get": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "userId": {"required": true, "type": "string", "location": "path"}, "hl": {"type": "string", "location": "query"}}, "id": "orkut.communityMembers.get", "httpMethod": "GET", "path": "communities/{communityId}/members/{userId}", "response": {"$ref": "CommunityMembers"}}}}', true)); + $this->activities = new ActivitiesServiceResource($this, $this->serviceName, 'activities', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"collection": {"required": true, "enum": ["all", "scraps", "stream"], "location": "path", "type": "string"}, "pageToken": {"type": "string", "location": "query"}, "userId": {"required": true, "type": "string", "location": "path"}, "hl": {"type": "string", "location": "query"}, "maxResults": {"format": "uint32", "maximum": "100", "minimum": "1", "location": "query", "type": "integer"}}, "id": "orkut.activities.list", "httpMethod": "GET", "path": "people/{userId}/activities/{collection}", "response": {"$ref": "ActivityList"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"activityId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "activities/{activityId}", "id": "orkut.activities.delete"}}}', true)); + $this->communityPollComments = new CommunityPollCommentsServiceResource($this, $this->serviceName, 'communityPollComments', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "pollId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "CommunityPollComment"}, "id": "orkut.communityPollComments.insert", "httpMethod": "POST", "path": "communities/{communityId}/polls/{pollId}/comments", "response": {"$ref": "CommunityPollComment"}}, "list": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "hl": {"type": "string", "location": "query"}, "maxResults": {"format": "uint32", "minimum": "1", "type": "integer", "location": "query"}, "pollId": {"required": true, "type": "string", "location": "path"}}, "id": "orkut.communityPollComments.list", "httpMethod": "GET", "path": "communities/{communityId}/polls/{pollId}/comments", "response": {"$ref": "CommunityPollCommentList"}}}}', true)); + $this->communityPolls = new CommunityPollsServiceResource($this, $this->serviceName, 'communityPolls', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "communityId": {"required": true, "type": "string", "location": "path"}, "hl": {"type": "string", "location": "query"}, "maxResults": {"format": "uint32", "minimum": "1", "type": "integer", "location": "query"}}, "id": "orkut.communityPolls.list", "httpMethod": "GET", "path": "communities/{communityId}/polls", "response": {"$ref": "CommunityPollList"}}, "get": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "hl": {"type": "string", "location": "query"}, "pollId": {"required": true, "type": "string", "location": "path"}}, "id": "orkut.communityPolls.get", "httpMethod": "GET", "path": "communities/{communityId}/polls/{pollId}", "response": {"$ref": "CommunityPoll"}}}}', true)); + $this->communityMessages = new CommunityMessagesServiceResource($this, $this->serviceName, 'communityMessages', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"topicId": {"format": "uint64", "required": true, "type": "string", "location": "path"}, "communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}}, "request": {"$ref": "CommunityMessage"}, "id": "orkut.communityMessages.insert", "httpMethod": "POST", "path": "communities/{communityId}/topics/{topicId}/messages", "response": {"$ref": "CommunityMessage"}}, "list": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "hl": {"type": "string", "location": "query"}, "maxResults": {"format": "uint32", "maximum": "100", "minimum": "1", "location": "query", "type": "integer"}, "topicId": {"format": "uint64", "required": true, "type": "string", "location": "path"}}, "id": "orkut.communityMessages.list", "httpMethod": "GET", "path": "communities/{communityId}/topics/{topicId}/messages", "response": {"$ref": "CommunityMessageList"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"topicId": {"format": "uint64", "required": true, "type": "string", "location": "path"}, "communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "messageId": {"format": "uint64", "required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "communities/{communityId}/topics/{topicId}/messages/{messageId}", "id": "orkut.communityMessages.delete"}}}', true)); + $this->communityTopics = new CommunityTopicsServiceResource($this, $this->serviceName, 'communityTopics', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"isShout": {"type": "boolean", "location": "query"}, "communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}}, "request": {"$ref": "CommunityTopic"}, "id": "orkut.communityTopics.insert", "httpMethod": "POST", "path": "communities/{communityId}/topics", "response": {"$ref": "CommunityTopic"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"topicId": {"format": "uint64", "required": true, "type": "string", "location": "path"}, "communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}}, "httpMethod": "DELETE", "path": "communities/{communityId}/topics/{topicId}", "id": "orkut.communityTopics.delete"}, "list": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "hl": {"type": "string", "location": "query"}, "maxResults": {"format": "uint32", "maximum": "100", "minimum": "1", "location": "query", "type": "integer"}}, "id": "orkut.communityTopics.list", "httpMethod": "GET", "path": "communities/{communityId}/topics", "response": {"$ref": "CommunityTopicList"}}, "get": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"topicId": {"format": "uint64", "required": true, "type": "string", "location": "path"}, "communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "hl": {"type": "string", "location": "query"}}, "id": "orkut.communityTopics.get", "httpMethod": "GET", "path": "communities/{communityId}/topics/{topicId}", "response": {"$ref": "CommunityTopic"}}}}', true)); + $this->comments = new CommentsServiceResource($this, $this->serviceName, 'comments', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"activityId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Comment"}, "id": "orkut.comments.insert", "httpMethod": "POST", "path": "activities/{activityId}/comments", "response": {"$ref": "Comment"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"commentId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "comments/{commentId}", "id": "orkut.comments.delete"}, "list": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"orderBy": {"default": "DESCENDING_SORT", "enum": ["ascending", "descending"], "location": "query", "type": "string"}, "pageToken": {"type": "string", "location": "query"}, "activityId": {"required": true, "type": "string", "location": "path"}, "hl": {"type": "string", "location": "query"}, "maxResults": {"format": "uint32", "minimum": "1", "type": "integer", "location": "query"}}, "id": "orkut.comments.list", "httpMethod": "GET", "path": "activities/{activityId}/comments", "response": {"$ref": "CommentList"}}, "get": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"commentId": {"required": true, "type": "string", "location": "path"}, "hl": {"type": "string", "location": "query"}}, "id": "orkut.comments.get", "httpMethod": "GET", "path": "comments/{commentId}", "response": {"$ref": "Comment"}}}}', true)); + $this->acl = new AclServiceResource($this, $this->serviceName, 'acl', json_decode('{"methods": {"delete": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"activityId": {"required": true, "type": "string", "location": "path"}, "userId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "activities/{activityId}/acl/{userId}", "id": "orkut.acl.delete"}}}', true)); + $this->communityRelated = new CommunityRelatedServiceResource($this, $this->serviceName, 'communityRelated', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "hl": {"type": "string", "location": "query"}}, "id": "orkut.communityRelated.list", "httpMethod": "GET", "path": "communities/{communityId}/related", "response": {"$ref": "CommunityList"}}}}', true)); + $this->scraps = new ScrapsServiceResource($this, $this->serviceName, 'scraps', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/orkut"], "request": {"$ref": "Activity"}, "response": {"$ref": "Activity"}, "httpMethod": "POST", "path": "activities/scraps", "id": "orkut.scraps.insert"}}}', true)); + $this->communityPollVotes = new CommunityPollVotesServiceResource($this, $this->serviceName, 'communityPollVotes', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "pollId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "CommunityPollVote"}, "id": "orkut.communityPollVotes.insert", "httpMethod": "POST", "path": "communities/{communityId}/polls/{pollId}/votes", "response": {"$ref": "CommunityPollVote"}}}}', true)); + $this->communities = new CommunitiesServiceResource($this, $this->serviceName, 'communities', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"orderBy": {"enum": ["id", "ranked"], "type": "string", "location": "query"}, "userId": {"required": true, "type": "string", "location": "path"}, "hl": {"type": "string", "location": "query"}, "maxResults": {"format": "uint32", "minimum": "1", "type": "integer", "location": "query"}}, "id": "orkut.communities.list", "httpMethod": "GET", "path": "people/{userId}/communities", "response": {"$ref": "CommunityList"}}, "get": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "hl": {"type": "string", "location": "query"}}, "id": "orkut.communities.get", "httpMethod": "GET", "path": "communities/{communityId}", "response": {"$ref": "Community"}}}}', true)); + $this->communityFollow = new CommunityFollowServiceResource($this, $this->serviceName, 'communityFollow', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "userId": {"required": true, "type": "string", "location": "path"}}, "id": "orkut.communityFollow.insert", "httpMethod": "POST", "path": "communities/{communityId}/followers/{userId}", "response": {"$ref": "CommunityMembers"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"communityId": {"format": "int32", "required": true, "type": "integer", "location": "path"}, "userId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "communities/{communityId}/followers/{userId}", "id": "orkut.communityFollow.delete"}}}', true)); + $this->activityVisibility = new ActivityVisibilityServiceResource($this, $this->serviceName, 'activityVisibility', json_decode('{"methods": {"get": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"activityId": {"required": true, "type": "string", "location": "path"}}, "id": "orkut.activityVisibility.get", "httpMethod": "GET", "path": "activities/{activityId}/visibility", "response": {"$ref": "Visibility"}}, "update": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"activityId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Visibility"}, "id": "orkut.activityVisibility.update", "httpMethod": "PUT", "path": "activities/{activityId}/visibility", "response": {"$ref": "Visibility"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/orkut"], "parameters": {"activityId": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Visibility"}, "id": "orkut.activityVisibility.patch", "httpMethod": "PATCH", "path": "activities/{activityId}/visibility", "response": {"$ref": "Visibility"}}}}', true)); + $this->badges = new BadgesServiceResource($this, $this->serviceName, 'badges', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"userId": {"required": true, "type": "string", "location": "path"}}, "id": "orkut.badges.list", "httpMethod": "GET", "path": "people/{userId}/badges", "response": {"$ref": "BadgeList"}}, "get": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"userId": {"required": true, "type": "string", "location": "path"}, "badgeId": {"format": "int64", "required": true, "type": "string", "location": "path"}}, "id": "orkut.badges.get", "httpMethod": "GET", "path": "people/{userId}/badges/{badgeId}", "response": {"$ref": "Badge"}}}}', true)); + $this->counters = new CountersServiceResource($this, $this->serviceName, 'counters', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/orkut", "https://www.googleapis.com/auth/orkut.readonly"], "parameters": {"userId": {"required": true, "type": "string", "location": "path"}}, "id": "orkut.counters.list", "httpMethod": "GET", "path": "people/{userId}/counters", "response": {"$ref": "Counters"}}}}', true)); + } +} + +class Acl extends apiModel { + protected $__itemsType = 'AclItems'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $description; + public $totalParticipants; + public function setItems(/* array(AclItems) */ $items) { + $this->assertIsArray($items, 'AclItems', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setTotalParticipants($totalParticipants) { + $this->totalParticipants = $totalParticipants; + } + public function getTotalParticipants() { + return $this->totalParticipants; + } +} + +class AclItems extends apiModel { + public $type; + public $id; + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class Activity extends apiModel { + public $kind; + protected $__linksType = 'OrkutLinkResource'; + protected $__linksDataType = 'array'; + public $links; + public $title; + protected $__objectType = 'ActivityObject'; + protected $__objectDataType = ''; + public $object; + public $updated; + protected $__actorType = 'OrkutAuthorResource'; + protected $__actorDataType = ''; + public $actor; + protected $__accessType = 'Acl'; + protected $__accessDataType = ''; + public $access; + public $verb; + public $published; + public $id; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setLinks(/* array(OrkutLinkResource) */ $links) { + $this->assertIsArray($links, 'OrkutLinkResource', __METHOD__); + $this->links = $links; + } + public function getLinks() { + return $this->links; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setObject(ActivityObject $object) { + $this->object = $object; + } + public function getObject() { + return $this->object; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setActor(OrkutAuthorResource $actor) { + $this->actor = $actor; + } + public function getActor() { + return $this->actor; + } + public function setAccess(Acl $access) { + $this->access = $access; + } + public function getAccess() { + return $this->access; + } + public function setVerb($verb) { + $this->verb = $verb; + } + public function getVerb() { + return $this->verb; + } + public function setPublished($published) { + $this->published = $published; + } + public function getPublished() { + return $this->published; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class ActivityList extends apiModel { + public $nextPageToken; + protected $__itemsType = 'Activity'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(Activity) */ $items) { + $this->assertIsArray($items, 'Activity', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class ActivityObject extends apiModel { + public $content; + protected $__itemsType = 'OrkutActivityobjectsResource'; + protected $__itemsDataType = 'array'; + public $items; + protected $__repliesType = 'ActivityObjectReplies'; + protected $__repliesDataType = ''; + public $replies; + public $objectType; + public function setContent($content) { + $this->content = $content; + } + public function getContent() { + return $this->content; + } + public function setItems(/* array(OrkutActivityobjectsResource) */ $items) { + $this->assertIsArray($items, 'OrkutActivityobjectsResource', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setReplies(ActivityObjectReplies $replies) { + $this->replies = $replies; + } + public function getReplies() { + return $this->replies; + } + public function setObjectType($objectType) { + $this->objectType = $objectType; + } + public function getObjectType() { + return $this->objectType; + } +} + +class ActivityObjectReplies extends apiModel { + public $totalItems; + protected $__itemsType = 'Comment'; + protected $__itemsDataType = 'array'; + public $items; + public $url; + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } + public function setItems(/* array(Comment) */ $items) { + $this->assertIsArray($items, 'Comment', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } +} + +class Badge extends apiModel { + public $badgeSmallLogo; + public $kind; + public $description; + public $sponsorLogo; + public $sponsorName; + public $badgeLargeLogo; + public $caption; + public $sponsorUrl; + public $id; + public function setBadgeSmallLogo($badgeSmallLogo) { + $this->badgeSmallLogo = $badgeSmallLogo; + } + public function getBadgeSmallLogo() { + return $this->badgeSmallLogo; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setSponsorLogo($sponsorLogo) { + $this->sponsorLogo = $sponsorLogo; + } + public function getSponsorLogo() { + return $this->sponsorLogo; + } + public function setSponsorName($sponsorName) { + $this->sponsorName = $sponsorName; + } + public function getSponsorName() { + return $this->sponsorName; + } + public function setBadgeLargeLogo($badgeLargeLogo) { + $this->badgeLargeLogo = $badgeLargeLogo; + } + public function getBadgeLargeLogo() { + return $this->badgeLargeLogo; + } + public function setCaption($caption) { + $this->caption = $caption; + } + public function getCaption() { + return $this->caption; + } + public function setSponsorUrl($sponsorUrl) { + $this->sponsorUrl = $sponsorUrl; + } + public function getSponsorUrl() { + return $this->sponsorUrl; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class BadgeList extends apiModel { + protected $__itemsType = 'Badge'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(Badge) */ $items) { + $this->assertIsArray($items, 'Badge', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class Comment extends apiModel { + protected $__inReplyToType = 'CommentInReplyTo'; + protected $__inReplyToDataType = ''; + public $inReplyTo; + public $kind; + protected $__linksType = 'OrkutLinkResource'; + protected $__linksDataType = 'array'; + public $links; + protected $__actorType = 'OrkutAuthorResource'; + protected $__actorDataType = ''; + public $actor; + public $content; + public $published; + public $id; + public function setInReplyTo(CommentInReplyTo $inReplyTo) { + $this->inReplyTo = $inReplyTo; + } + public function getInReplyTo() { + return $this->inReplyTo; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setLinks(/* array(OrkutLinkResource) */ $links) { + $this->assertIsArray($links, 'OrkutLinkResource', __METHOD__); + $this->links = $links; + } + public function getLinks() { + return $this->links; + } + public function setActor(OrkutAuthorResource $actor) { + $this->actor = $actor; + } + public function getActor() { + return $this->actor; + } + public function setContent($content) { + $this->content = $content; + } + public function getContent() { + return $this->content; + } + public function setPublished($published) { + $this->published = $published; + } + public function getPublished() { + return $this->published; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class CommentInReplyTo extends apiModel { + public $type; + public $href; + public $ref; + public $rel; + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setHref($href) { + $this->href = $href; + } + public function getHref() { + return $this->href; + } + public function setRef($ref) { + $this->ref = $ref; + } + public function getRef() { + return $this->ref; + } + public function setRel($rel) { + $this->rel = $rel; + } + public function getRel() { + return $this->rel; + } +} + +class CommentList extends apiModel { + public $nextPageToken; + protected $__itemsType = 'Comment'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $previousPageToken; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(Comment) */ $items) { + $this->assertIsArray($items, 'Comment', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setPreviousPageToken($previousPageToken) { + $this->previousPageToken = $previousPageToken; + } + public function getPreviousPageToken() { + return $this->previousPageToken; + } +} + +class Community extends apiModel { + public $category; + public $kind; + public $member_count; + public $description; + public $language; + protected $__linksType = 'OrkutLinkResource'; + protected $__linksDataType = 'array'; + public $links; + public $creation_date; + protected $__ownerType = 'OrkutAuthorResource'; + protected $__ownerDataType = ''; + public $owner; + protected $__moderatorsType = 'OrkutAuthorResource'; + protected $__moderatorsDataType = 'array'; + public $moderators; + public $location; + protected $__co_ownersType = 'OrkutAuthorResource'; + protected $__co_ownersDataType = 'array'; + public $co_owners; + public $photo_url; + public $id; + public $name; + public function setCategory($category) { + $this->category = $category; + } + public function getCategory() { + return $this->category; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setMember_count($member_count) { + $this->member_count = $member_count; + } + public function getMember_count() { + return $this->member_count; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setLanguage($language) { + $this->language = $language; + } + public function getLanguage() { + return $this->language; + } + public function setLinks(/* array(OrkutLinkResource) */ $links) { + $this->assertIsArray($links, 'OrkutLinkResource', __METHOD__); + $this->links = $links; + } + public function getLinks() { + return $this->links; + } + public function setCreation_date($creation_date) { + $this->creation_date = $creation_date; + } + public function getCreation_date() { + return $this->creation_date; + } + public function setOwner(OrkutAuthorResource $owner) { + $this->owner = $owner; + } + public function getOwner() { + return $this->owner; + } + public function setModerators(/* array(OrkutAuthorResource) */ $moderators) { + $this->assertIsArray($moderators, 'OrkutAuthorResource', __METHOD__); + $this->moderators = $moderators; + } + public function getModerators() { + return $this->moderators; + } + public function setLocation($location) { + $this->location = $location; + } + public function getLocation() { + return $this->location; + } + public function setCo_owners(/* array(OrkutAuthorResource) */ $co_owners) { + $this->assertIsArray($co_owners, 'OrkutAuthorResource', __METHOD__); + $this->co_owners = $co_owners; + } + public function getCo_owners() { + return $this->co_owners; + } + public function setPhoto_url($photo_url) { + $this->photo_url = $photo_url; + } + public function getPhoto_url() { + return $this->photo_url; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class CommunityList extends apiModel { + protected $__itemsType = 'Community'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(Community) */ $items) { + $this->assertIsArray($items, 'Community', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class CommunityMembers extends apiModel { + protected $__communityMembershipStatusType = 'CommunityMembershipStatus'; + protected $__communityMembershipStatusDataType = ''; + public $communityMembershipStatus; + protected $__personType = 'OrkutActivitypersonResource'; + protected $__personDataType = ''; + public $person; + public $kind; + public function setCommunityMembershipStatus(CommunityMembershipStatus $communityMembershipStatus) { + $this->communityMembershipStatus = $communityMembershipStatus; + } + public function getCommunityMembershipStatus() { + return $this->communityMembershipStatus; + } + public function setPerson(OrkutActivitypersonResource $person) { + $this->person = $person; + } + public function getPerson() { + return $this->person; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class CommunityMembersList extends apiModel { + public $nextPageToken; + public $kind; + protected $__itemsType = 'CommunityMembers'; + protected $__itemsDataType = 'array'; + public $items; + public $prevPageToken; + public $lastPageToken; + public $firstPageToken; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setItems(/* array(CommunityMembers) */ $items) { + $this->assertIsArray($items, 'CommunityMembers', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setPrevPageToken($prevPageToken) { + $this->prevPageToken = $prevPageToken; + } + public function getPrevPageToken() { + return $this->prevPageToken; + } + public function setLastPageToken($lastPageToken) { + $this->lastPageToken = $lastPageToken; + } + public function getLastPageToken() { + return $this->lastPageToken; + } + public function setFirstPageToken($firstPageToken) { + $this->firstPageToken = $firstPageToken; + } + public function getFirstPageToken() { + return $this->firstPageToken; + } +} + +class CommunityMembershipStatus extends apiModel { + public $status; + public $isFollowing; + public $isRestoreAvailable; + public $isModerator; + public $kind; + public $isCoOwner; + public $canCreatePoll; + public $canShout; + public $isOwner; + public $canCreateTopic; + public $isTakebackAvailable; + public function setStatus($status) { + $this->status = $status; + } + public function getStatus() { + return $this->status; + } + public function setIsFollowing($isFollowing) { + $this->isFollowing = $isFollowing; + } + public function getIsFollowing() { + return $this->isFollowing; + } + public function setIsRestoreAvailable($isRestoreAvailable) { + $this->isRestoreAvailable = $isRestoreAvailable; + } + public function getIsRestoreAvailable() { + return $this->isRestoreAvailable; + } + public function setIsModerator($isModerator) { + $this->isModerator = $isModerator; + } + public function getIsModerator() { + return $this->isModerator; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setIsCoOwner($isCoOwner) { + $this->isCoOwner = $isCoOwner; + } + public function getIsCoOwner() { + return $this->isCoOwner; + } + public function setCanCreatePoll($canCreatePoll) { + $this->canCreatePoll = $canCreatePoll; + } + public function getCanCreatePoll() { + return $this->canCreatePoll; + } + public function setCanShout($canShout) { + $this->canShout = $canShout; + } + public function getCanShout() { + return $this->canShout; + } + public function setIsOwner($isOwner) { + $this->isOwner = $isOwner; + } + public function getIsOwner() { + return $this->isOwner; + } + public function setCanCreateTopic($canCreateTopic) { + $this->canCreateTopic = $canCreateTopic; + } + public function getCanCreateTopic() { + return $this->canCreateTopic; + } + public function setIsTakebackAvailable($isTakebackAvailable) { + $this->isTakebackAvailable = $isTakebackAvailable; + } + public function getIsTakebackAvailable() { + return $this->isTakebackAvailable; + } +} + +class CommunityMessage extends apiModel { + public $body; + public $kind; + protected $__linksType = 'OrkutLinkResource'; + protected $__linksDataType = 'array'; + public $links; + protected $__authorType = 'OrkutAuthorResource'; + protected $__authorDataType = ''; + public $author; + public $id; + public $addedDate; + public $isSpam; + public $subject; + public function setBody($body) { + $this->body = $body; + } + public function getBody() { + return $this->body; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setLinks(/* array(OrkutLinkResource) */ $links) { + $this->assertIsArray($links, 'OrkutLinkResource', __METHOD__); + $this->links = $links; + } + public function getLinks() { + return $this->links; + } + public function setAuthor(OrkutAuthorResource $author) { + $this->author = $author; + } + public function getAuthor() { + return $this->author; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setAddedDate($addedDate) { + $this->addedDate = $addedDate; + } + public function getAddedDate() { + return $this->addedDate; + } + public function setIsSpam($isSpam) { + $this->isSpam = $isSpam; + } + public function getIsSpam() { + return $this->isSpam; + } + public function setSubject($subject) { + $this->subject = $subject; + } + public function getSubject() { + return $this->subject; + } +} + +class CommunityMessageList extends apiModel { + public $nextPageToken; + public $kind; + protected $__itemsType = 'CommunityMessage'; + protected $__itemsDataType = 'array'; + public $items; + public $prevPageToken; + public $lastPageToken; + public $firstPageToken; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setItems(/* array(CommunityMessage) */ $items) { + $this->assertIsArray($items, 'CommunityMessage', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setPrevPageToken($prevPageToken) { + $this->prevPageToken = $prevPageToken; + } + public function getPrevPageToken() { + return $this->prevPageToken; + } + public function setLastPageToken($lastPageToken) { + $this->lastPageToken = $lastPageToken; + } + public function getLastPageToken() { + return $this->lastPageToken; + } + public function setFirstPageToken($firstPageToken) { + $this->firstPageToken = $firstPageToken; + } + public function getFirstPageToken() { + return $this->firstPageToken; + } +} + +class CommunityPoll extends apiModel { + protected $__linksType = 'OrkutLinkResource'; + protected $__linksDataType = 'array'; + public $links; + public $isMultipleAnswers; + protected $__imageType = 'CommunityPollImage'; + protected $__imageDataType = ''; + public $image; + public $endingTime; + public $isVotingAllowedForNonMembers; + public $isSpam; + public $totalNumberOfVotes; + protected $__authorType = 'OrkutAuthorResource'; + protected $__authorDataType = ''; + public $author; + public $question; + public $id; + public $isRestricted; + public $communityId; + public $isUsersVotePublic; + public $lastUpdate; + public $description; + public $votedOptions; + public $isOpenForVoting; + public $isClosed; + public $hasVoted; + public $kind; + public $creationTime; + protected $__optionsType = 'OrkutCommunitypolloptionResource'; + protected $__optionsDataType = 'array'; + public $options; + public function setLinks(/* array(OrkutLinkResource) */ $links) { + $this->assertIsArray($links, 'OrkutLinkResource', __METHOD__); + $this->links = $links; + } + public function getLinks() { + return $this->links; + } + public function setIsMultipleAnswers($isMultipleAnswers) { + $this->isMultipleAnswers = $isMultipleAnswers; + } + public function getIsMultipleAnswers() { + return $this->isMultipleAnswers; + } + public function setImage(CommunityPollImage $image) { + $this->image = $image; + } + public function getImage() { + return $this->image; + } + public function setEndingTime($endingTime) { + $this->endingTime = $endingTime; + } + public function getEndingTime() { + return $this->endingTime; + } + public function setIsVotingAllowedForNonMembers($isVotingAllowedForNonMembers) { + $this->isVotingAllowedForNonMembers = $isVotingAllowedForNonMembers; + } + public function getIsVotingAllowedForNonMembers() { + return $this->isVotingAllowedForNonMembers; + } + public function setIsSpam($isSpam) { + $this->isSpam = $isSpam; + } + public function getIsSpam() { + return $this->isSpam; + } + public function setTotalNumberOfVotes($totalNumberOfVotes) { + $this->totalNumberOfVotes = $totalNumberOfVotes; + } + public function getTotalNumberOfVotes() { + return $this->totalNumberOfVotes; + } + public function setAuthor(OrkutAuthorResource $author) { + $this->author = $author; + } + public function getAuthor() { + return $this->author; + } + public function setQuestion($question) { + $this->question = $question; + } + public function getQuestion() { + return $this->question; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setIsRestricted($isRestricted) { + $this->isRestricted = $isRestricted; + } + public function getIsRestricted() { + return $this->isRestricted; + } + public function setCommunityId($communityId) { + $this->communityId = $communityId; + } + public function getCommunityId() { + return $this->communityId; + } + public function setIsUsersVotePublic($isUsersVotePublic) { + $this->isUsersVotePublic = $isUsersVotePublic; + } + public function getIsUsersVotePublic() { + return $this->isUsersVotePublic; + } + public function setLastUpdate($lastUpdate) { + $this->lastUpdate = $lastUpdate; + } + public function getLastUpdate() { + return $this->lastUpdate; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setVotedOptions(/* array(int) */ $votedOptions) { + $this->assertIsArray($votedOptions, 'int', __METHOD__); + $this->votedOptions = $votedOptions; + } + public function getVotedOptions() { + return $this->votedOptions; + } + public function setIsOpenForVoting($isOpenForVoting) { + $this->isOpenForVoting = $isOpenForVoting; + } + public function getIsOpenForVoting() { + return $this->isOpenForVoting; + } + public function setIsClosed($isClosed) { + $this->isClosed = $isClosed; + } + public function getIsClosed() { + return $this->isClosed; + } + public function setHasVoted($hasVoted) { + $this->hasVoted = $hasVoted; + } + public function getHasVoted() { + return $this->hasVoted; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setCreationTime($creationTime) { + $this->creationTime = $creationTime; + } + public function getCreationTime() { + return $this->creationTime; + } + public function setOptions(/* array(OrkutCommunitypolloptionResource) */ $options) { + $this->assertIsArray($options, 'OrkutCommunitypolloptionResource', __METHOD__); + $this->options = $options; + } + public function getOptions() { + return $this->options; + } +} + +class CommunityPollComment extends apiModel { + public $body; + public $kind; + public $addedDate; + public $id; + protected $__authorType = 'OrkutAuthorResource'; + protected $__authorDataType = ''; + public $author; + public function setBody($body) { + $this->body = $body; + } + public function getBody() { + return $this->body; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setAddedDate($addedDate) { + $this->addedDate = $addedDate; + } + public function getAddedDate() { + return $this->addedDate; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setAuthor(OrkutAuthorResource $author) { + $this->author = $author; + } + public function getAuthor() { + return $this->author; + } +} + +class CommunityPollCommentList extends apiModel { + public $nextPageToken; + public $kind; + protected $__itemsType = 'CommunityPollComment'; + protected $__itemsDataType = 'array'; + public $items; + public $prevPageToken; + public $lastPageToken; + public $firstPageToken; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setItems(/* array(CommunityPollComment) */ $items) { + $this->assertIsArray($items, 'CommunityPollComment', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setPrevPageToken($prevPageToken) { + $this->prevPageToken = $prevPageToken; + } + public function getPrevPageToken() { + return $this->prevPageToken; + } + public function setLastPageToken($lastPageToken) { + $this->lastPageToken = $lastPageToken; + } + public function getLastPageToken() { + return $this->lastPageToken; + } + public function setFirstPageToken($firstPageToken) { + $this->firstPageToken = $firstPageToken; + } + public function getFirstPageToken() { + return $this->firstPageToken; + } +} + +class CommunityPollImage extends apiModel { + public $url; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } +} + +class CommunityPollList extends apiModel { + public $nextPageToken; + public $kind; + protected $__itemsType = 'CommunityPoll'; + protected $__itemsDataType = 'array'; + public $items; + public $prevPageToken; + public $lastPageToken; + public $firstPageToken; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setItems(/* array(CommunityPoll) */ $items) { + $this->assertIsArray($items, 'CommunityPoll', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setPrevPageToken($prevPageToken) { + $this->prevPageToken = $prevPageToken; + } + public function getPrevPageToken() { + return $this->prevPageToken; + } + public function setLastPageToken($lastPageToken) { + $this->lastPageToken = $lastPageToken; + } + public function getLastPageToken() { + return $this->lastPageToken; + } + public function setFirstPageToken($firstPageToken) { + $this->firstPageToken = $firstPageToken; + } + public function getFirstPageToken() { + return $this->firstPageToken; + } +} + +class CommunityPollVote extends apiModel { + public $kind; + public $optionIds; + public $isVotevisible; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setOptionIds(/* array(int) */ $optionIds) { + $this->assertIsArray($optionIds, 'int', __METHOD__); + $this->optionIds = $optionIds; + } + public function getOptionIds() { + return $this->optionIds; + } + public function setIsVotevisible($isVotevisible) { + $this->isVotevisible = $isVotevisible; + } + public function getIsVotevisible() { + return $this->isVotevisible; + } +} + +class CommunityTopic extends apiModel { + public $body; + public $lastUpdate; + public $kind; + protected $__linksType = 'OrkutLinkResource'; + protected $__linksDataType = 'array'; + public $links; + protected $__authorType = 'OrkutAuthorResource'; + protected $__authorDataType = ''; + public $author; + public $title; + protected $__messagesType = 'CommunityMessage'; + protected $__messagesDataType = 'array'; + public $messages; + public $latestMessageSnippet; + public $isClosed; + public $numberOfReplies; + public $id; + public function setBody($body) { + $this->body = $body; + } + public function getBody() { + return $this->body; + } + public function setLastUpdate($lastUpdate) { + $this->lastUpdate = $lastUpdate; + } + public function getLastUpdate() { + return $this->lastUpdate; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setLinks(/* array(OrkutLinkResource) */ $links) { + $this->assertIsArray($links, 'OrkutLinkResource', __METHOD__); + $this->links = $links; + } + public function getLinks() { + return $this->links; + } + public function setAuthor(OrkutAuthorResource $author) { + $this->author = $author; + } + public function getAuthor() { + return $this->author; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setMessages(/* array(CommunityMessage) */ $messages) { + $this->assertIsArray($messages, 'CommunityMessage', __METHOD__); + $this->messages = $messages; + } + public function getMessages() { + return $this->messages; + } + public function setLatestMessageSnippet($latestMessageSnippet) { + $this->latestMessageSnippet = $latestMessageSnippet; + } + public function getLatestMessageSnippet() { + return $this->latestMessageSnippet; + } + public function setIsClosed($isClosed) { + $this->isClosed = $isClosed; + } + public function getIsClosed() { + return $this->isClosed; + } + public function setNumberOfReplies($numberOfReplies) { + $this->numberOfReplies = $numberOfReplies; + } + public function getNumberOfReplies() { + return $this->numberOfReplies; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class CommunityTopicList extends apiModel { + public $nextPageToken; + public $kind; + protected $__itemsType = 'CommunityTopic'; + protected $__itemsDataType = 'array'; + public $items; + public $prevPageToken; + public $lastPageToken; + public $firstPageToken; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setItems(/* array(CommunityTopic) */ $items) { + $this->assertIsArray($items, 'CommunityTopic', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setPrevPageToken($prevPageToken) { + $this->prevPageToken = $prevPageToken; + } + public function getPrevPageToken() { + return $this->prevPageToken; + } + public function setLastPageToken($lastPageToken) { + $this->lastPageToken = $lastPageToken; + } + public function getLastPageToken() { + return $this->lastPageToken; + } + public function setFirstPageToken($firstPageToken) { + $this->firstPageToken = $firstPageToken; + } + public function getFirstPageToken() { + return $this->firstPageToken; + } +} + +class Counters extends apiModel { + protected $__itemsType = 'OrkutCounterResource'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(OrkutCounterResource) */ $items) { + $this->assertIsArray($items, 'OrkutCounterResource', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} + +class OrkutActivityobjectsResource extends apiModel { + public $displayName; + protected $__linksType = 'OrkutLinkResource'; + protected $__linksDataType = 'array'; + public $links; + public $content; + protected $__personType = 'OrkutActivitypersonResource'; + protected $__personDataType = ''; + public $person; + public $id; + public $objectType; + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setLinks(/* array(OrkutLinkResource) */ $links) { + $this->assertIsArray($links, 'OrkutLinkResource', __METHOD__); + $this->links = $links; + } + public function getLinks() { + return $this->links; + } + public function setContent($content) { + $this->content = $content; + } + public function getContent() { + return $this->content; + } + public function setPerson(OrkutActivitypersonResource $person) { + $this->person = $person; + } + public function getPerson() { + return $this->person; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setObjectType($objectType) { + $this->objectType = $objectType; + } + public function getObjectType() { + return $this->objectType; + } +} + +class OrkutActivitypersonResource extends apiModel { + protected $__nameType = 'OrkutActivitypersonResourceName'; + protected $__nameDataType = ''; + public $name; + public $url; + public $gender; + protected $__imageType = 'OrkutActivitypersonResourceImage'; + protected $__imageDataType = ''; + public $image; + public $birthday; + public $id; + public function setName(OrkutActivitypersonResourceName $name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setGender($gender) { + $this->gender = $gender; + } + public function getGender() { + return $this->gender; + } + public function setImage(OrkutActivitypersonResourceImage $image) { + $this->image = $image; + } + public function getImage() { + return $this->image; + } + public function setBirthday($birthday) { + $this->birthday = $birthday; + } + public function getBirthday() { + return $this->birthday; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class OrkutActivitypersonResourceImage extends apiModel { + public $url; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } +} + +class OrkutActivitypersonResourceName extends apiModel { + public $givenName; + public $familyName; + public function setGivenName($givenName) { + $this->givenName = $givenName; + } + public function getGivenName() { + return $this->givenName; + } + public function setFamilyName($familyName) { + $this->familyName = $familyName; + } + public function getFamilyName() { + return $this->familyName; + } +} + +class OrkutAuthorResource extends apiModel { + public $url; + protected $__imageType = 'OrkutAuthorResourceImage'; + protected $__imageDataType = ''; + public $image; + public $displayName; + public $id; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setImage(OrkutAuthorResourceImage $image) { + $this->image = $image; + } + public function getImage() { + return $this->image; + } + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class OrkutAuthorResourceImage extends apiModel { + public $url; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } +} + +class OrkutCommunitypolloptionResource extends apiModel { + protected $__imageType = 'OrkutCommunitypolloptionResourceImage'; + protected $__imageDataType = ''; + public $image; + public $optionId; + public $description; + public $numberOfVotes; + public function setImage(OrkutCommunitypolloptionResourceImage $image) { + $this->image = $image; + } + public function getImage() { + return $this->image; + } + public function setOptionId($optionId) { + $this->optionId = $optionId; + } + public function getOptionId() { + return $this->optionId; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setNumberOfVotes($numberOfVotes) { + $this->numberOfVotes = $numberOfVotes; + } + public function getNumberOfVotes() { + return $this->numberOfVotes; + } +} + +class OrkutCommunitypolloptionResourceImage extends apiModel { + public $url; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } +} + +class OrkutCounterResource extends apiModel { + public $total; + protected $__linkType = 'OrkutLinkResource'; + protected $__linkDataType = ''; + public $link; + public $name; + public function setTotal($total) { + $this->total = $total; + } + public function getTotal() { + return $this->total; + } + public function setLink(OrkutLinkResource $link) { + $this->link = $link; + } + public function getLink() { + return $this->link; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class OrkutLinkResource extends apiModel { + public $href; + public $type; + public $rel; + public $title; + public function setHref($href) { + $this->href = $href; + } + public function getHref() { + return $this->href; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setRel($rel) { + $this->rel = $rel; + } + public function getRel() { + return $this->rel; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } +} + +class Visibility extends apiModel { + public $kind; + public $visibility; + protected $__linksType = 'OrkutLinkResource'; + protected $__linksDataType = 'array'; + public $links; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setVisibility($visibility) { + $this->visibility = $visibility; + } + public function getVisibility() { + return $this->visibility; + } + public function setLinks(/* array(OrkutLinkResource) */ $links) { + $this->assertIsArray($links, 'OrkutLinkResource', __METHOD__); + $this->links = $links; + } + public function getLinks() { + return $this->links; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiPagespeedonlineService.php b/inc/vendors/social-login/Google/contrib/apiPagespeedonlineService.php new file mode 100755 index 00000000..f0ba9122 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiPagespeedonlineService.php @@ -0,0 +1,473 @@ + + * $pagespeedonlineService = new apiPagespeedonlineService(...); + * $pagespeedapi = $pagespeedonlineService->pagespeedapi; + * + */ + class PagespeedapiServiceResource extends apiServiceResource { + + + /** + * Runs Page Speed analysis on the page at the specified URL, and returns a Page Speed score, a list + * of suggestions to make that page faster, and other information. (pagespeedapi.runpagespeed) + * @param string $url The URL to fetch and analyze + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string locale The locale used to localize formatted results + * @opt_param string rule A Page Speed rule to run; if none are given, all rules are run + * @opt_param string strategy The analysis strategy to use + * @return Result + */ + public function runpagespeed($url, $optParams = array()) { + $params = array('url' => $url); + $params = array_merge($params, $optParams); + $data = $this->__call('runpagespeed', array($params)); + if ($this->useObjects()) { + return new Result($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Pagespeedonline (v1). + *

              + * Lets you analyze the performance of a web page and get tailored suggestions to make that page faster. + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiPagespeedonlineService extends apiService { + public $pagespeedapi; + /** + * Constructs the internal representation of the Pagespeedonline service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/pagespeedonline/v1/'; + $this->version = 'v1'; + $this->serviceName = 'pagespeedonline'; + + $apiClient->addService($this->serviceName, $this->version); + $this->pagespeedapi = new PagespeedapiServiceResource($this, $this->serviceName, 'pagespeedapi', json_decode('{"methods": {"runpagespeed": {"parameters": {"locale": {"type": "string", "location": "query"}, "url": {"required": true, "type": "string", "location": "query"}, "rule": {"repeated": true, "type": "string", "location": "query"}, "strategy": {"enum": ["desktop", "mobile"], "type": "string", "location": "query"}}, "id": "pagespeedonline.pagespeedapi.runpagespeed", "httpMethod": "GET", "path": "runPagespeed", "response": {"$ref": "Result"}}}}', true)); + } +} + +class Result extends apiModel { + public $kind; + protected $__formattedResultsType = 'ResultFormattedResults'; + protected $__formattedResultsDataType = ''; + public $formattedResults; + public $title; + protected $__versionType = 'ResultVersion'; + protected $__versionDataType = ''; + public $version; + public $score; + public $responseCode; + public $invalidRules; + protected $__pageStatsType = 'ResultPageStats'; + protected $__pageStatsDataType = ''; + public $pageStats; + public $id; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setFormattedResults(ResultFormattedResults $formattedResults) { + $this->formattedResults = $formattedResults; + } + public function getFormattedResults() { + return $this->formattedResults; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setVersion(ResultVersion $version) { + $this->version = $version; + } + public function getVersion() { + return $this->version; + } + public function setScore($score) { + $this->score = $score; + } + public function getScore() { + return $this->score; + } + public function setResponseCode($responseCode) { + $this->responseCode = $responseCode; + } + public function getResponseCode() { + return $this->responseCode; + } + public function setInvalidRules(/* array(string) */ $invalidRules) { + $this->assertIsArray($invalidRules, 'string', __METHOD__); + $this->invalidRules = $invalidRules; + } + public function getInvalidRules() { + return $this->invalidRules; + } + public function setPageStats(ResultPageStats $pageStats) { + $this->pageStats = $pageStats; + } + public function getPageStats() { + return $this->pageStats; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class ResultFormattedResults extends apiModel { + public $locale; + protected $__ruleResultsType = 'ResultFormattedResultsRuleResults'; + protected $__ruleResultsDataType = 'map'; + public $ruleResults; + public function setLocale($locale) { + $this->locale = $locale; + } + public function getLocale() { + return $this->locale; + } + public function setRuleResults(ResultFormattedResultsRuleResults $ruleResults) { + $this->ruleResults = $ruleResults; + } + public function getRuleResults() { + return $this->ruleResults; + } +} + +class ResultFormattedResultsRuleResults extends apiModel { + public $localizedRuleName; + protected $__urlBlocksType = 'ResultFormattedResultsRuleResultsUrlBlocks'; + protected $__urlBlocksDataType = 'array'; + public $urlBlocks; + public $ruleScore; + public $ruleImpact; + public function setLocalizedRuleName($localizedRuleName) { + $this->localizedRuleName = $localizedRuleName; + } + public function getLocalizedRuleName() { + return $this->localizedRuleName; + } + public function setUrlBlocks(/* array(ResultFormattedResultsRuleResultsUrlBlocks) */ $urlBlocks) { + $this->assertIsArray($urlBlocks, 'ResultFormattedResultsRuleResultsUrlBlocks', __METHOD__); + $this->urlBlocks = $urlBlocks; + } + public function getUrlBlocks() { + return $this->urlBlocks; + } + public function setRuleScore($ruleScore) { + $this->ruleScore = $ruleScore; + } + public function getRuleScore() { + return $this->ruleScore; + } + public function setRuleImpact($ruleImpact) { + $this->ruleImpact = $ruleImpact; + } + public function getRuleImpact() { + return $this->ruleImpact; + } +} + +class ResultFormattedResultsRuleResultsUrlBlocks extends apiModel { + protected $__headerType = 'ResultFormattedResultsRuleResultsUrlBlocksHeader'; + protected $__headerDataType = ''; + public $header; + protected $__urlsType = 'ResultFormattedResultsRuleResultsUrlBlocksUrls'; + protected $__urlsDataType = 'array'; + public $urls; + public function setHeader(ResultFormattedResultsRuleResultsUrlBlocksHeader $header) { + $this->header = $header; + } + public function getHeader() { + return $this->header; + } + public function setUrls(/* array(ResultFormattedResultsRuleResultsUrlBlocksUrls) */ $urls) { + $this->assertIsArray($urls, 'ResultFormattedResultsRuleResultsUrlBlocksUrls', __METHOD__); + $this->urls = $urls; + } + public function getUrls() { + return $this->urls; + } +} + +class ResultFormattedResultsRuleResultsUrlBlocksHeader extends apiModel { + protected $__argsType = 'ResultFormattedResultsRuleResultsUrlBlocksHeaderArgs'; + protected $__argsDataType = 'array'; + public $args; + public $format; + public function setArgs(/* array(ResultFormattedResultsRuleResultsUrlBlocksHeaderArgs) */ $args) { + $this->assertIsArray($args, 'ResultFormattedResultsRuleResultsUrlBlocksHeaderArgs', __METHOD__); + $this->args = $args; + } + public function getArgs() { + return $this->args; + } + public function setFormat($format) { + $this->format = $format; + } + public function getFormat() { + return $this->format; + } +} + +class ResultFormattedResultsRuleResultsUrlBlocksHeaderArgs extends apiModel { + public $type; + public $value; + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setValue($value) { + $this->value = $value; + } + public function getValue() { + return $this->value; + } +} + +class ResultFormattedResultsRuleResultsUrlBlocksUrls extends apiModel { + protected $__detailsType = 'ResultFormattedResultsRuleResultsUrlBlocksUrlsDetails'; + protected $__detailsDataType = 'array'; + public $details; + protected $__resultType = 'ResultFormattedResultsRuleResultsUrlBlocksUrlsResult'; + protected $__resultDataType = ''; + public $result; + public function setDetails(/* array(ResultFormattedResultsRuleResultsUrlBlocksUrlsDetails) */ $details) { + $this->assertIsArray($details, 'ResultFormattedResultsRuleResultsUrlBlocksUrlsDetails', __METHOD__); + $this->details = $details; + } + public function getDetails() { + return $this->details; + } + public function setResult(ResultFormattedResultsRuleResultsUrlBlocksUrlsResult $result) { + $this->result = $result; + } + public function getResult() { + return $this->result; + } +} + +class ResultFormattedResultsRuleResultsUrlBlocksUrlsDetails extends apiModel { + protected $__argsType = 'ResultFormattedResultsRuleResultsUrlBlocksUrlsDetailsArgs'; + protected $__argsDataType = 'array'; + public $args; + public $format; + public function setArgs(/* array(ResultFormattedResultsRuleResultsUrlBlocksUrlsDetailsArgs) */ $args) { + $this->assertIsArray($args, 'ResultFormattedResultsRuleResultsUrlBlocksUrlsDetailsArgs', __METHOD__); + $this->args = $args; + } + public function getArgs() { + return $this->args; + } + public function setFormat($format) { + $this->format = $format; + } + public function getFormat() { + return $this->format; + } +} + +class ResultFormattedResultsRuleResultsUrlBlocksUrlsDetailsArgs extends apiModel { + public $type; + public $value; + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setValue($value) { + $this->value = $value; + } + public function getValue() { + return $this->value; + } +} + +class ResultFormattedResultsRuleResultsUrlBlocksUrlsResult extends apiModel { + protected $__argsType = 'ResultFormattedResultsRuleResultsUrlBlocksUrlsResultArgs'; + protected $__argsDataType = 'array'; + public $args; + public $format; + public function setArgs(/* array(ResultFormattedResultsRuleResultsUrlBlocksUrlsResultArgs) */ $args) { + $this->assertIsArray($args, 'ResultFormattedResultsRuleResultsUrlBlocksUrlsResultArgs', __METHOD__); + $this->args = $args; + } + public function getArgs() { + return $this->args; + } + public function setFormat($format) { + $this->format = $format; + } + public function getFormat() { + return $this->format; + } +} + +class ResultFormattedResultsRuleResultsUrlBlocksUrlsResultArgs extends apiModel { + public $type; + public $value; + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setValue($value) { + $this->value = $value; + } + public function getValue() { + return $this->value; + } +} + +class ResultPageStats extends apiModel { + public $otherResponseBytes; + public $flashResponseBytes; + public $totalRequestBytes; + public $numberCssResources; + public $numberResources; + public $cssResponseBytes; + public $javascriptResponseBytes; + public $imageResponseBytes; + public $numberHosts; + public $numberStaticResources; + public $htmlResponseBytes; + public $numberJsResources; + public $textResponseBytes; + public function setOtherResponseBytes($otherResponseBytes) { + $this->otherResponseBytes = $otherResponseBytes; + } + public function getOtherResponseBytes() { + return $this->otherResponseBytes; + } + public function setFlashResponseBytes($flashResponseBytes) { + $this->flashResponseBytes = $flashResponseBytes; + } + public function getFlashResponseBytes() { + return $this->flashResponseBytes; + } + public function setTotalRequestBytes($totalRequestBytes) { + $this->totalRequestBytes = $totalRequestBytes; + } + public function getTotalRequestBytes() { + return $this->totalRequestBytes; + } + public function setNumberCssResources($numberCssResources) { + $this->numberCssResources = $numberCssResources; + } + public function getNumberCssResources() { + return $this->numberCssResources; + } + public function setNumberResources($numberResources) { + $this->numberResources = $numberResources; + } + public function getNumberResources() { + return $this->numberResources; + } + public function setCssResponseBytes($cssResponseBytes) { + $this->cssResponseBytes = $cssResponseBytes; + } + public function getCssResponseBytes() { + return $this->cssResponseBytes; + } + public function setJavascriptResponseBytes($javascriptResponseBytes) { + $this->javascriptResponseBytes = $javascriptResponseBytes; + } + public function getJavascriptResponseBytes() { + return $this->javascriptResponseBytes; + } + public function setImageResponseBytes($imageResponseBytes) { + $this->imageResponseBytes = $imageResponseBytes; + } + public function getImageResponseBytes() { + return $this->imageResponseBytes; + } + public function setNumberHosts($numberHosts) { + $this->numberHosts = $numberHosts; + } + public function getNumberHosts() { + return $this->numberHosts; + } + public function setNumberStaticResources($numberStaticResources) { + $this->numberStaticResources = $numberStaticResources; + } + public function getNumberStaticResources() { + return $this->numberStaticResources; + } + public function setHtmlResponseBytes($htmlResponseBytes) { + $this->htmlResponseBytes = $htmlResponseBytes; + } + public function getHtmlResponseBytes() { + return $this->htmlResponseBytes; + } + public function setNumberJsResources($numberJsResources) { + $this->numberJsResources = $numberJsResources; + } + public function getNumberJsResources() { + return $this->numberJsResources; + } + public function setTextResponseBytes($textResponseBytes) { + $this->textResponseBytes = $textResponseBytes; + } + public function getTextResponseBytes() { + return $this->textResponseBytes; + } +} + +class ResultVersion extends apiModel { + public $major; + public $minor; + public function setMajor($major) { + $this->major = $major; + } + public function getMajor() { + return $this->major; + } + public function setMinor($minor) { + $this->minor = $minor; + } + public function getMinor() { + return $this->minor; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiPlusService.php b/inc/vendors/social-login/Google/contrib/apiPlusService.php new file mode 100755 index 00000000..a1690fc4 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiPlusService.php @@ -0,0 +1,1505 @@ + + * $plusService = new apiPlusService(...); + * $activities = $plusService->activities; + * + */ + class ActivitiesServiceResource extends apiServiceResource { + + + /** + * Search public activities. (activities.search) + * @param string $query Full-text search query string. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string orderBy Specifies how to order search results. + * @opt_param string pageToken The continuation token, used to page through large result sets. To get the next page of results, set this parameter to the value of "nextPageToken" from the previous response. This token may be of any length. + * @opt_param string maxResults The maximum number of activities to include in the response, used for paging. For any response, the actual number returned may be less than the specified maxResults. + * @opt_param string language Specify the preferred language to search with. See search language codes for available values. + * @return ActivityFeed + */ + public function search($query, $optParams = array()) { + $params = array('query' => $query); + $params = array_merge($params, $optParams); + $data = $this->__call('search', array($params)); + if ($this->useObjects()) { + return new ActivityFeed($data); + } else { + return $data; + } + } + /** + * List all of the activities in the specified collection for a particular user. (activities.list) + * @param string $userId The ID of the user to get activities for. The special value "me" can be used to indicate the authenticated user. + * @param string $collection The collection of activities to list. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken The continuation token, used to page through large result sets. To get the next page of results, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param string maxResults The maximum number of activities to include in the response, used for paging. For any response, the actual number returned may be less than the specified maxResults. + * @return ActivityFeed + */ + public function listActivities($userId, $collection, $optParams = array()) { + $params = array('userId' => $userId, 'collection' => $collection); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new ActivityFeed($data); + } else { + return $data; + } + } + /** + * Get an activity. (activities.get) + * @param string $activityId The ID of the activity to get. + * @return Activity + */ + public function get($activityId, $optParams = array()) { + $params = array('activityId' => $activityId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Activity($data); + } else { + return $data; + } + } + } + + /** + * The "comments" collection of methods. + * Typical usage is: + * + * $plusService = new apiPlusService(...); + * $comments = $plusService->comments; + * + */ + class CommentsServiceResource extends apiServiceResource { + + + /** + * List all of the comments for an activity. (comments.list) + * @param string $activityId The ID of the activity to get comments for. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken The continuation token, used to page through large result sets. To get the next page of results, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param string maxResults The maximum number of comments to include in the response, used for paging. For any response, the actual number returned may be less than the specified maxResults. + * @return CommentFeed + */ + public function listComments($activityId, $optParams = array()) { + $params = array('activityId' => $activityId); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new CommentFeed($data); + } else { + return $data; + } + } + /** + * Get a comment. (comments.get) + * @param string $commentId The ID of the comment to get. + * @return Comment + */ + public function get($commentId, $optParams = array()) { + $params = array('commentId' => $commentId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Comment($data); + } else { + return $data; + } + } + } + + /** + * The "people" collection of methods. + * Typical usage is: + * + * $plusService = new apiPlusService(...); + * $people = $plusService->people; + * + */ + class PeopleServiceResource extends apiServiceResource { + + + /** + * List all of the people in the specified collection for a particular activity. + * (people.listByActivity) + * @param string $activityId The ID of the activity to get the list of people for. + * @param string $collection The collection of people to list. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken The continuation token, used to page through large result sets. To get the next page of results, set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param string maxResults The maximum number of people to include in the response, used for paging. For any response, the actual number returned may be less than the specified maxResults. + * @return PeopleFeed + */ + public function listByActivity($activityId, $collection, $optParams = array()) { + $params = array('activityId' => $activityId, 'collection' => $collection); + $params = array_merge($params, $optParams); + $data = $this->__call('listByActivity', array($params)); + if ($this->useObjects()) { + return new PeopleFeed($data); + } else { + return $data; + } + } + /** + * Search all public profiles. (people.search) + * @param string $query Full-text search query string. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken The continuation token, used to page through large result sets. To get the next page of results, set this parameter to the value of "nextPageToken" from the previous response. This token may be of any length. + * @opt_param string maxResults The maximum number of people to include in the response, used for paging. For any response, the actual number returned may be less than the specified maxResults. + * @opt_param string language Specify the preferred language to search with. See search language codes for available values. + * @return PeopleFeed + */ + public function search($query, $optParams = array()) { + $params = array('query' => $query); + $params = array_merge($params, $optParams); + $data = $this->__call('search', array($params)); + if ($this->useObjects()) { + return new PeopleFeed($data); + } else { + return $data; + } + } + /** + * Get a person's profile. (people.get) + * @param string $userId The ID of the person to get the profile for. The special value "me" can be used to indicate the authenticated user. + * @return Person + */ + public function get($userId, $optParams = array()) { + $params = array('userId' => $userId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Person($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Plus (v1). + *

              + * The Google+ API enables developers to build on top of the Google+ platform. + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiPlusService extends apiService { + public $activities; + public $comments; + public $people; + /** + * Constructs the internal representation of the Plus service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/plus/v1/'; + $this->version = 'v1'; + $this->serviceName = 'plus'; + + $apiClient->addService($this->serviceName, $this->version); + $this->activities = new ActivitiesServiceResource($this, $this->serviceName, 'activities', json_decode('{"methods": {"search": {"scopes": ["https://www.googleapis.com/auth/plus.me"], "parameters": {"orderBy": {"default": "recent", "enum": ["best", "recent"], "location": "query", "type": "string"}, "pageToken": {"type": "string", "location": "query"}, "language": {"default": "", "type": "string", "location": "query"}, "maxResults": {"format": "uint32", "default": "10", "maximum": "20", "minimum": "1", "location": "query", "type": "integer"}, "query": {"required": true, "type": "string", "location": "query"}}, "id": "plus.activities.search", "httpMethod": "GET", "path": "activities", "response": {"$ref": "ActivityFeed"}}, "list": {"scopes": ["https://www.googleapis.com/auth/plus.me"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "alt": {"default": "json", "enum": ["json"], "location": "query", "type": "string"}, "userId": {"required": true, "type": "string", "location": "path"}, "collection": {"required": true, "enum": ["public"], "location": "path", "type": "string"}, "maxResults": {"format": "uint32", "default": "20", "maximum": "100", "minimum": "1", "location": "query", "type": "integer"}}, "id": "plus.activities.list", "httpMethod": "GET", "path": "people/{userId}/activities/{collection}", "response": {"$ref": "ActivityFeed"}}, "get": {"scopes": ["https://www.googleapis.com/auth/plus.me"], "parameters": {"activityId": {"required": true, "type": "string", "location": "path"}, "alt": {"default": "json", "enum": ["json"], "location": "query", "type": "string"}}, "id": "plus.activities.get", "httpMethod": "GET", "path": "activities/{activityId}", "response": {"$ref": "Activity"}}}}', true)); + $this->comments = new CommentsServiceResource($this, $this->serviceName, 'comments', json_decode('{"methods": {"list": {"scopes": ["https://www.googleapis.com/auth/plus.me"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "activityId": {"required": true, "type": "string", "location": "path"}, "alt": {"default": "json", "enum": ["json"], "location": "query", "type": "string"}, "maxResults": {"format": "uint32", "default": "20", "maximum": "100", "minimum": "0", "location": "query", "type": "integer"}}, "id": "plus.comments.list", "httpMethod": "GET", "path": "activities/{activityId}/comments", "response": {"$ref": "CommentFeed"}}, "get": {"scopes": ["https://www.googleapis.com/auth/plus.me"], "parameters": {"commentId": {"required": true, "type": "string", "location": "path"}}, "id": "plus.comments.get", "httpMethod": "GET", "path": "comments/{commentId}", "response": {"$ref": "Comment"}}}}', true)); + $this->people = new PeopleServiceResource($this, $this->serviceName, 'people', json_decode('{"methods": {"listByActivity": {"scopes": ["https://www.googleapis.com/auth/plus.me"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "activityId": {"required": true, "type": "string", "location": "path"}, "collection": {"required": true, "enum": ["plusoners", "resharers"], "location": "path", "type": "string"}, "maxResults": {"format": "uint32", "default": "20", "maximum": "100", "minimum": "1", "location": "query", "type": "integer"}}, "id": "plus.people.listByActivity", "httpMethod": "GET", "path": "activities/{activityId}/people/{collection}", "response": {"$ref": "PeopleFeed"}}, "search": {"scopes": ["https://www.googleapis.com/auth/plus.me"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "language": {"default": "", "type": "string", "location": "query"}, "maxResults": {"format": "uint32", "default": "10", "maximum": "20", "minimum": "1", "location": "query", "type": "integer"}, "query": {"required": true, "type": "string", "location": "query"}}, "id": "plus.people.search", "httpMethod": "GET", "path": "people", "response": {"$ref": "PeopleFeed"}}, "get": {"scopes": ["https://www.googleapis.com/auth/plus.me", "https://www.googleapis.com/auth/userinfo.email"], "parameters": {"userId": {"required": true, "type": "string", "location": "path"}}, "id": "plus.people.get", "httpMethod": "GET", "path": "people/{userId}", "response": {"$ref": "Person"}}}}', true)); + } +} + +class Acl extends apiModel { + protected $__itemsType = 'PlusAclentryResource'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $description; + public function setItems(/* array(PlusAclentryResource) */ $items) { + $this->assertIsArray($items, 'PlusAclentryResource', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } +} + +class Activity extends apiModel { + public $placeName; + public $kind; + public $updated; + protected $__providerType = 'ActivityProvider'; + protected $__providerDataType = ''; + public $provider; + public $title; + public $url; + public $geocode; + protected $__objectType = 'ActivityObject'; + protected $__objectDataType = ''; + public $object; + public $placeId; + protected $__actorType = 'ActivityActor'; + protected $__actorDataType = ''; + public $actor; + public $id; + protected $__accessType = 'Acl'; + protected $__accessDataType = ''; + public $access; + public $verb; + public $etag; + public $radius; + public $address; + public $crosspostSource; + public $placeholder; + public $annotation; + public $published; + public function setPlaceName($placeName) { + $this->placeName = $placeName; + } + public function getPlaceName() { + return $this->placeName; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setProvider(ActivityProvider $provider) { + $this->provider = $provider; + } + public function getProvider() { + return $this->provider; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setGeocode($geocode) { + $this->geocode = $geocode; + } + public function getGeocode() { + return $this->geocode; + } + public function setObject(ActivityObject $object) { + $this->object = $object; + } + public function getObject() { + return $this->object; + } + public function setPlaceId($placeId) { + $this->placeId = $placeId; + } + public function getPlaceId() { + return $this->placeId; + } + public function setActor(ActivityActor $actor) { + $this->actor = $actor; + } + public function getActor() { + return $this->actor; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setAccess(Acl $access) { + $this->access = $access; + } + public function getAccess() { + return $this->access; + } + public function setVerb($verb) { + $this->verb = $verb; + } + public function getVerb() { + return $this->verb; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setRadius($radius) { + $this->radius = $radius; + } + public function getRadius() { + return $this->radius; + } + public function setAddress($address) { + $this->address = $address; + } + public function getAddress() { + return $this->address; + } + public function setCrosspostSource($crosspostSource) { + $this->crosspostSource = $crosspostSource; + } + public function getCrosspostSource() { + return $this->crosspostSource; + } + public function setPlaceholder($placeholder) { + $this->placeholder = $placeholder; + } + public function getPlaceholder() { + return $this->placeholder; + } + public function setAnnotation($annotation) { + $this->annotation = $annotation; + } + public function getAnnotation() { + return $this->annotation; + } + public function setPublished($published) { + $this->published = $published; + } + public function getPublished() { + return $this->published; + } +} + +class ActivityActor extends apiModel { + public $displayName; + public $url; + protected $__imageType = 'ActivityActorImage'; + protected $__imageDataType = ''; + public $image; + public $familyName; + public $givenName; + public $id; + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setImage(ActivityActorImage $image) { + $this->image = $image; + } + public function getImage() { + return $this->image; + } + public function setFamilyName($familyName) { + $this->familyName = $familyName; + } + public function getFamilyName() { + return $this->familyName; + } + public function setGivenName($givenName) { + $this->givenName = $givenName; + } + public function getGivenName() { + return $this->givenName; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class ActivityActorImage extends apiModel { + public $url; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } +} + +class ActivityFeed extends apiModel { + public $nextPageToken; + public $kind; + public $title; + protected $__itemsType = 'Activity'; + protected $__itemsDataType = 'array'; + public $items; + public $updated; + public $nextLink; + public $etag; + public $id; + public $selfLink; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setItems(/* array(Activity) */ $items) { + $this->assertIsArray($items, 'Activity', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setNextLink($nextLink) { + $this->nextLink = $nextLink; + } + public function getNextLink() { + return $this->nextLink; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class ActivityObject extends apiModel { + protected $__resharersType = 'ActivityObjectResharers'; + protected $__resharersDataType = ''; + public $resharers; + protected $__attachmentsType = 'ActivityObjectAttachments'; + protected $__attachmentsDataType = 'array'; + public $attachments; + public $originalContent; + protected $__plusonersType = 'ActivityObjectPlusoners'; + protected $__plusonersDataType = ''; + public $plusoners; + protected $__actorType = 'ActivityObjectActor'; + protected $__actorDataType = ''; + public $actor; + public $content; + public $url; + protected $__repliesType = 'ActivityObjectReplies'; + protected $__repliesDataType = ''; + public $replies; + public $id; + public $objectType; + public function setResharers(ActivityObjectResharers $resharers) { + $this->resharers = $resharers; + } + public function getResharers() { + return $this->resharers; + } + public function setAttachments(/* array(ActivityObjectAttachments) */ $attachments) { + $this->assertIsArray($attachments, 'ActivityObjectAttachments', __METHOD__); + $this->attachments = $attachments; + } + public function getAttachments() { + return $this->attachments; + } + public function setOriginalContent($originalContent) { + $this->originalContent = $originalContent; + } + public function getOriginalContent() { + return $this->originalContent; + } + public function setPlusoners(ActivityObjectPlusoners $plusoners) { + $this->plusoners = $plusoners; + } + public function getPlusoners() { + return $this->plusoners; + } + public function setActor(ActivityObjectActor $actor) { + $this->actor = $actor; + } + public function getActor() { + return $this->actor; + } + public function setContent($content) { + $this->content = $content; + } + public function getContent() { + return $this->content; + } + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setReplies(ActivityObjectReplies $replies) { + $this->replies = $replies; + } + public function getReplies() { + return $this->replies; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setObjectType($objectType) { + $this->objectType = $objectType; + } + public function getObjectType() { + return $this->objectType; + } +} + +class ActivityObjectActor extends apiModel { + public $url; + protected $__imageType = 'ActivityObjectActorImage'; + protected $__imageDataType = ''; + public $image; + public $displayName; + public $id; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setImage(ActivityObjectActorImage $image) { + $this->image = $image; + } + public function getImage() { + return $this->image; + } + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class ActivityObjectActorImage extends apiModel { + public $url; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } +} + +class ActivityObjectAttachments extends apiModel { + public $displayName; + protected $__fullImageType = 'ActivityObjectAttachmentsFullImage'; + protected $__fullImageDataType = ''; + public $fullImage; + public $url; + protected $__imageType = 'ActivityObjectAttachmentsImage'; + protected $__imageDataType = ''; + public $image; + public $content; + protected $__embedType = 'ActivityObjectAttachmentsEmbed'; + protected $__embedDataType = ''; + public $embed; + public $id; + public $objectType; + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setFullImage(ActivityObjectAttachmentsFullImage $fullImage) { + $this->fullImage = $fullImage; + } + public function getFullImage() { + return $this->fullImage; + } + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setImage(ActivityObjectAttachmentsImage $image) { + $this->image = $image; + } + public function getImage() { + return $this->image; + } + public function setContent($content) { + $this->content = $content; + } + public function getContent() { + return $this->content; + } + public function setEmbed(ActivityObjectAttachmentsEmbed $embed) { + $this->embed = $embed; + } + public function getEmbed() { + return $this->embed; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setObjectType($objectType) { + $this->objectType = $objectType; + } + public function getObjectType() { + return $this->objectType; + } +} + +class ActivityObjectAttachmentsEmbed extends apiModel { + public $url; + public $type; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } +} + +class ActivityObjectAttachmentsFullImage extends apiModel { + public $url; + public $width; + public $type; + public $height; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setWidth($width) { + $this->width = $width; + } + public function getWidth() { + return $this->width; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setHeight($height) { + $this->height = $height; + } + public function getHeight() { + return $this->height; + } +} + +class ActivityObjectAttachmentsImage extends apiModel { + public $url; + public $width; + public $type; + public $height; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setWidth($width) { + $this->width = $width; + } + public function getWidth() { + return $this->width; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setHeight($height) { + $this->height = $height; + } + public function getHeight() { + return $this->height; + } +} + +class ActivityObjectPlusoners extends apiModel { + public $totalItems; + public $selfLink; + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class ActivityObjectReplies extends apiModel { + public $totalItems; + public $selfLink; + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class ActivityObjectResharers extends apiModel { + public $totalItems; + public $selfLink; + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class ActivityProvider extends apiModel { + public $title; + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } +} + +class Comment extends apiModel { + protected $__inReplyToType = 'CommentInReplyTo'; + protected $__inReplyToDataType = 'array'; + public $inReplyTo; + public $kind; + protected $__objectType = 'CommentObject'; + protected $__objectDataType = ''; + public $object; + public $updated; + protected $__actorType = 'CommentActor'; + protected $__actorDataType = ''; + public $actor; + public $verb; + public $etag; + public $published; + public $id; + public $selfLink; + public function setInReplyTo(/* array(CommentInReplyTo) */ $inReplyTo) { + $this->assertIsArray($inReplyTo, 'CommentInReplyTo', __METHOD__); + $this->inReplyTo = $inReplyTo; + } + public function getInReplyTo() { + return $this->inReplyTo; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setObject(CommentObject $object) { + $this->object = $object; + } + public function getObject() { + return $this->object; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setActor(CommentActor $actor) { + $this->actor = $actor; + } + public function getActor() { + return $this->actor; + } + public function setVerb($verb) { + $this->verb = $verb; + } + public function getVerb() { + return $this->verb; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setPublished($published) { + $this->published = $published; + } + public function getPublished() { + return $this->published; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class CommentActor extends apiModel { + public $url; + protected $__imageType = 'CommentActorImage'; + protected $__imageDataType = ''; + public $image; + public $displayName; + public $id; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setImage(CommentActorImage $image) { + $this->image = $image; + } + public function getImage() { + return $this->image; + } + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class CommentActorImage extends apiModel { + public $url; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } +} + +class CommentFeed extends apiModel { + public $nextPageToken; + public $kind; + public $title; + protected $__itemsType = 'Comment'; + protected $__itemsDataType = 'array'; + public $items; + public $updated; + public $nextLink; + public $etag; + public $id; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setItems(/* array(Comment) */ $items) { + $this->assertIsArray($items, 'Comment', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setNextLink($nextLink) { + $this->nextLink = $nextLink; + } + public function getNextLink() { + return $this->nextLink; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class CommentInReplyTo extends apiModel { + public $url; + public $id; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class CommentObject extends apiModel { + public $content; + public $objectType; + public function setContent($content) { + $this->content = $content; + } + public function getContent() { + return $this->content; + } + public function setObjectType($objectType) { + $this->objectType = $objectType; + } + public function getObjectType() { + return $this->objectType; + } +} + +class PeopleFeed extends apiModel { + public $nextPageToken; + public $kind; + public $title; + protected $__itemsType = 'Person'; + protected $__itemsDataType = 'array'; + public $items; + public $etag; + public $selfLink; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setItems(/* array(Person) */ $items) { + $this->assertIsArray($items, 'Person', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class Person extends apiModel { + public $relationshipStatus; + protected $__organizationsType = 'PersonOrganizations'; + protected $__organizationsDataType = 'array'; + public $organizations; + public $kind; + public $displayName; + protected $__nameType = 'PersonName'; + protected $__nameDataType = ''; + public $name; + public $url; + public $gender; + public $aboutMe; + public $tagline; + protected $__urlsType = 'PersonUrls'; + protected $__urlsDataType = 'array'; + public $urls; + protected $__placesLivedType = 'PersonPlacesLived'; + protected $__placesLivedDataType = 'array'; + public $placesLived; + protected $__emailsType = 'PersonEmails'; + protected $__emailsDataType = 'array'; + public $emails; + public $nickname; + public $birthday; + public $etag; + protected $__imageType = 'PersonImage'; + protected $__imageDataType = ''; + public $image; + public $hasApp; + public $id; + public $languagesSpoken; + public $currentLocation; + public $objectType; + public function setRelationshipStatus($relationshipStatus) { + $this->relationshipStatus = $relationshipStatus; + } + public function getRelationshipStatus() { + return $this->relationshipStatus; + } + public function setOrganizations(/* array(PersonOrganizations) */ $organizations) { + $this->assertIsArray($organizations, 'PersonOrganizations', __METHOD__); + $this->organizations = $organizations; + } + public function getOrganizations() { + return $this->organizations; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setName(PersonName $name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setGender($gender) { + $this->gender = $gender; + } + public function getGender() { + return $this->gender; + } + public function setAboutMe($aboutMe) { + $this->aboutMe = $aboutMe; + } + public function getAboutMe() { + return $this->aboutMe; + } + public function setTagline($tagline) { + $this->tagline = $tagline; + } + public function getTagline() { + return $this->tagline; + } + public function setUrls(/* array(PersonUrls) */ $urls) { + $this->assertIsArray($urls, 'PersonUrls', __METHOD__); + $this->urls = $urls; + } + public function getUrls() { + return $this->urls; + } + public function setPlacesLived(/* array(PersonPlacesLived) */ $placesLived) { + $this->assertIsArray($placesLived, 'PersonPlacesLived', __METHOD__); + $this->placesLived = $placesLived; + } + public function getPlacesLived() { + return $this->placesLived; + } + public function setEmails(/* array(PersonEmails) */ $emails) { + $this->assertIsArray($emails, 'PersonEmails', __METHOD__); + $this->emails = $emails; + } + public function getEmails() { + return $this->emails; + } + public function setNickname($nickname) { + $this->nickname = $nickname; + } + public function getNickname() { + return $this->nickname; + } + public function setBirthday($birthday) { + $this->birthday = $birthday; + } + public function getBirthday() { + return $this->birthday; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setImage(PersonImage $image) { + $this->image = $image; + } + public function getImage() { + return $this->image; + } + public function setHasApp($hasApp) { + $this->hasApp = $hasApp; + } + public function getHasApp() { + return $this->hasApp; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setLanguagesSpoken(/* array(string) */ $languagesSpoken) { + $this->assertIsArray($languagesSpoken, 'string', __METHOD__); + $this->languagesSpoken = $languagesSpoken; + } + public function getLanguagesSpoken() { + return $this->languagesSpoken; + } + public function setCurrentLocation($currentLocation) { + $this->currentLocation = $currentLocation; + } + public function getCurrentLocation() { + return $this->currentLocation; + } + public function setObjectType($objectType) { + $this->objectType = $objectType; + } + public function getObjectType() { + return $this->objectType; + } +} + +class PersonEmails extends apiModel { + public $type; + public $primary; + public $value; + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setPrimary($primary) { + $this->primary = $primary; + } + public function getPrimary() { + return $this->primary; + } + public function setValue($value) { + $this->value = $value; + } + public function getValue() { + return $this->value; + } +} + +class PersonImage extends apiModel { + public $url; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } +} + +class PersonName extends apiModel { + public $honorificPrefix; + public $middleName; + public $familyName; + public $formatted; + public $givenName; + public $honorificSuffix; + public function setHonorificPrefix($honorificPrefix) { + $this->honorificPrefix = $honorificPrefix; + } + public function getHonorificPrefix() { + return $this->honorificPrefix; + } + public function setMiddleName($middleName) { + $this->middleName = $middleName; + } + public function getMiddleName() { + return $this->middleName; + } + public function setFamilyName($familyName) { + $this->familyName = $familyName; + } + public function getFamilyName() { + return $this->familyName; + } + public function setFormatted($formatted) { + $this->formatted = $formatted; + } + public function getFormatted() { + return $this->formatted; + } + public function setGivenName($givenName) { + $this->givenName = $givenName; + } + public function getGivenName() { + return $this->givenName; + } + public function setHonorificSuffix($honorificSuffix) { + $this->honorificSuffix = $honorificSuffix; + } + public function getHonorificSuffix() { + return $this->honorificSuffix; + } +} + +class PersonOrganizations extends apiModel { + public $startDate; + public $endDate; + public $description; + public $title; + public $primary; + public $location; + public $department; + public $type; + public $name; + public function setStartDate($startDate) { + $this->startDate = $startDate; + } + public function getStartDate() { + return $this->startDate; + } + public function setEndDate($endDate) { + $this->endDate = $endDate; + } + public function getEndDate() { + return $this->endDate; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setPrimary($primary) { + $this->primary = $primary; + } + public function getPrimary() { + return $this->primary; + } + public function setLocation($location) { + $this->location = $location; + } + public function getLocation() { + return $this->location; + } + public function setDepartment($department) { + $this->department = $department; + } + public function getDepartment() { + return $this->department; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class PersonPlacesLived extends apiModel { + public $primary; + public $value; + public function setPrimary($primary) { + $this->primary = $primary; + } + public function getPrimary() { + return $this->primary; + } + public function setValue($value) { + $this->value = $value; + } + public function getValue() { + return $this->value; + } +} + +class PersonUrls extends apiModel { + public $type; + public $primary; + public $value; + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setPrimary($primary) { + $this->primary = $primary; + } + public function getPrimary() { + return $this->primary; + } + public function setValue($value) { + $this->value = $value; + } + public function getValue() { + return $this->value; + } +} + +class PlusAclentryResource extends apiModel { + public $type; + public $id; + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiPredictionService.php b/inc/vendors/social-login/Google/contrib/apiPredictionService.php new file mode 100755 index 00000000..b4937b90 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiPredictionService.php @@ -0,0 +1,418 @@ + + * $predictionService = new apiPredictionService(...); + * $trainedmodels = $predictionService->trainedmodels; + * + */ + class TrainedmodelsServiceResource extends apiServiceResource { + + + /** + * Submit model id and request a prediction (trainedmodels.predict) + * @param string $id The unique name for the predictive model. + * @param Input $postBody + * @return Output + */ + public function predict($id, Input $postBody, $optParams = array()) { + $params = array('id' => $id, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('predict', array($params)); + if ($this->useObjects()) { + return new Output($data); + } else { + return $data; + } + } + /** + * Begin training your model. (trainedmodels.insert) + * @param Training $postBody + * @return Training + */ + public function insert(Training $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Training($data); + } else { + return $data; + } + } + /** + * Check training status of your model. (trainedmodels.get) + * @param string $id The unique name for the predictive model. + * @return Training + */ + public function get($id, $optParams = array()) { + $params = array('id' => $id); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Training($data); + } else { + return $data; + } + } + /** + * Add new data to a trained model. (trainedmodels.update) + * @param string $id The unique name for the predictive model. + * @param Update $postBody + * @return Training + */ + public function update($id, Update $postBody, $optParams = array()) { + $params = array('id' => $id, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new Training($data); + } else { + return $data; + } + } + /** + * Delete a trained model. (trainedmodels.delete) + * @param string $id The unique name for the predictive model. + */ + public function delete($id, $optParams = array()) { + $params = array('id' => $id); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "hostedmodels" collection of methods. + * Typical usage is: + * + * $predictionService = new apiPredictionService(...); + * $hostedmodels = $predictionService->hostedmodels; + * + */ + class HostedmodelsServiceResource extends apiServiceResource { + + + /** + * Submit input and request an output against a hosted model. (hostedmodels.predict) + * @param string $hostedModelName The name of a hosted model. + * @param Input $postBody + * @return Output + */ + public function predict($hostedModelName, Input $postBody, $optParams = array()) { + $params = array('hostedModelName' => $hostedModelName, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('predict', array($params)); + if ($this->useObjects()) { + return new Output($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Prediction (v1.4). + *

              + * Lets you access a cloud hosted machine learning service that makes it easy to build smart apps + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiPredictionService extends apiService { + public $trainedmodels; + public $hostedmodels; + /** + * Constructs the internal representation of the Prediction service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/prediction/v1.4/'; + $this->version = 'v1.4'; + $this->serviceName = 'prediction'; + + $apiClient->addService($this->serviceName, $this->version); + $this->trainedmodels = new TrainedmodelsServiceResource($this, $this->serviceName, 'trainedmodels', json_decode('{"methods": {"predict": {"scopes": ["https://www.googleapis.com/auth/prediction"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Input"}, "id": "prediction.trainedmodels.predict", "httpMethod": "POST", "path": "trainedmodels/{id}/predict", "response": {"$ref": "Output"}}, "insert": {"scopes": ["https://www.googleapis.com/auth/prediction"], "request": {"$ref": "Training"}, "response": {"$ref": "Training"}, "httpMethod": "POST", "path": "trainedmodels", "id": "prediction.trainedmodels.insert"}, "delete": {"scopes": ["https://www.googleapis.com/auth/prediction"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "trainedmodels/{id}", "id": "prediction.trainedmodels.delete"}, "update": {"scopes": ["https://www.googleapis.com/auth/prediction"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Update"}, "id": "prediction.trainedmodels.update", "httpMethod": "PUT", "path": "trainedmodels/{id}", "response": {"$ref": "Training"}}, "get": {"scopes": ["https://www.googleapis.com/auth/prediction"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "id": "prediction.trainedmodels.get", "httpMethod": "GET", "path": "trainedmodels/{id}", "response": {"$ref": "Training"}}}}', true)); + $this->hostedmodels = new HostedmodelsServiceResource($this, $this->serviceName, 'hostedmodels', json_decode('{"methods": {"predict": {"scopes": ["https://www.googleapis.com/auth/prediction"], "parameters": {"hostedModelName": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Input"}, "id": "prediction.hostedmodels.predict", "httpMethod": "POST", "path": "hostedmodels/{hostedModelName}/predict", "response": {"$ref": "Output"}}}}', true)); + } +} + +class Input extends apiModel { + protected $__inputType = 'InputInput'; + protected $__inputDataType = ''; + public $input; + public function setInput(InputInput $input) { + $this->input = $input; + } + public function getInput() { + return $this->input; + } +} + +class InputInput extends apiModel { + public $csvInstance; + public function setCsvInstance(/* array(object) */ $csvInstance) { + $this->assertIsArray($csvInstance, 'object', __METHOD__); + $this->csvInstance = $csvInstance; + } + public function getCsvInstance() { + return $this->csvInstance; + } +} + +class Output extends apiModel { + public $kind; + public $outputLabel; + public $id; + protected $__outputMultiType = 'OutputOutputMulti'; + protected $__outputMultiDataType = 'array'; + public $outputMulti; + public $outputValue; + public $selfLink; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setOutputLabel($outputLabel) { + $this->outputLabel = $outputLabel; + } + public function getOutputLabel() { + return $this->outputLabel; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setOutputMulti(/* array(OutputOutputMulti) */ $outputMulti) { + $this->assertIsArray($outputMulti, 'OutputOutputMulti', __METHOD__); + $this->outputMulti = $outputMulti; + } + public function getOutputMulti() { + return $this->outputMulti; + } + public function setOutputValue($outputValue) { + $this->outputValue = $outputValue; + } + public function getOutputValue() { + return $this->outputValue; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class OutputOutputMulti extends apiModel { + public $score; + public $label; + public function setScore($score) { + $this->score = $score; + } + public function getScore() { + return $this->score; + } + public function setLabel($label) { + $this->label = $label; + } + public function getLabel() { + return $this->label; + } +} + +class Training extends apiModel { + public $kind; + public $storageDataLocation; + public $storagePMMLModelLocation; + protected $__dataAnalysisType = 'TrainingDataAnalysis'; + protected $__dataAnalysisDataType = ''; + public $dataAnalysis; + public $trainingStatus; + protected $__modelInfoType = 'TrainingModelInfo'; + protected $__modelInfoDataType = ''; + public $modelInfo; + public $storagePMMLLocation; + public $id; + public $selfLink; + public $utility; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setStorageDataLocation($storageDataLocation) { + $this->storageDataLocation = $storageDataLocation; + } + public function getStorageDataLocation() { + return $this->storageDataLocation; + } + public function setStoragePMMLModelLocation($storagePMMLModelLocation) { + $this->storagePMMLModelLocation = $storagePMMLModelLocation; + } + public function getStoragePMMLModelLocation() { + return $this->storagePMMLModelLocation; + } + public function setDataAnalysis(TrainingDataAnalysis $dataAnalysis) { + $this->dataAnalysis = $dataAnalysis; + } + public function getDataAnalysis() { + return $this->dataAnalysis; + } + public function setTrainingStatus($trainingStatus) { + $this->trainingStatus = $trainingStatus; + } + public function getTrainingStatus() { + return $this->trainingStatus; + } + public function setModelInfo(TrainingModelInfo $modelInfo) { + $this->modelInfo = $modelInfo; + } + public function getModelInfo() { + return $this->modelInfo; + } + public function setStoragePMMLLocation($storagePMMLLocation) { + $this->storagePMMLLocation = $storagePMMLLocation; + } + public function getStoragePMMLLocation() { + return $this->storagePMMLLocation; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } + public function setUtility(/* array(double) */ $utility) { + $this->assertIsArray($utility, 'double', __METHOD__); + $this->utility = $utility; + } + public function getUtility() { + return $this->utility; + } +} + +class TrainingDataAnalysis extends apiModel { + public $warnings; + public function setWarnings(/* array(string) */ $warnings) { + $this->assertIsArray($warnings, 'string', __METHOD__); + $this->warnings = $warnings; + } + public function getWarnings() { + return $this->warnings; + } +} + +class TrainingModelInfo extends apiModel { + public $confusionMatrixRowTotals; + public $numberLabels; + public $confusionMatrix; + public $meanSquaredError; + public $modelType; + public $numberInstances; + public $classWeightedAccuracy; + public $classificationAccuracy; + public function setConfusionMatrixRowTotals($confusionMatrixRowTotals) { + $this->confusionMatrixRowTotals = $confusionMatrixRowTotals; + } + public function getConfusionMatrixRowTotals() { + return $this->confusionMatrixRowTotals; + } + public function setNumberLabels($numberLabels) { + $this->numberLabels = $numberLabels; + } + public function getNumberLabels() { + return $this->numberLabels; + } + public function setConfusionMatrix($confusionMatrix) { + $this->confusionMatrix = $confusionMatrix; + } + public function getConfusionMatrix() { + return $this->confusionMatrix; + } + public function setMeanSquaredError($meanSquaredError) { + $this->meanSquaredError = $meanSquaredError; + } + public function getMeanSquaredError() { + return $this->meanSquaredError; + } + public function setModelType($modelType) { + $this->modelType = $modelType; + } + public function getModelType() { + return $this->modelType; + } + public function setNumberInstances($numberInstances) { + $this->numberInstances = $numberInstances; + } + public function getNumberInstances() { + return $this->numberInstances; + } + public function setClassWeightedAccuracy($classWeightedAccuracy) { + $this->classWeightedAccuracy = $classWeightedAccuracy; + } + public function getClassWeightedAccuracy() { + return $this->classWeightedAccuracy; + } + public function setClassificationAccuracy($classificationAccuracy) { + $this->classificationAccuracy = $classificationAccuracy; + } + public function getClassificationAccuracy() { + return $this->classificationAccuracy; + } +} + +class Update extends apiModel { + public $csvInstance; + public $label; + public function setCsvInstance(/* array(object) */ $csvInstance) { + $this->assertIsArray($csvInstance, 'object', __METHOD__); + $this->csvInstance = $csvInstance; + } + public function getCsvInstance() { + return $this->csvInstance; + } + public function setLabel($label) { + $this->label = $label; + } + public function getLabel() { + return $this->label; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiShoppingService.php b/inc/vendors/social-login/Google/contrib/apiShoppingService.php new file mode 100755 index 00000000..29eb1ac9 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiShoppingService.php @@ -0,0 +1,1249 @@ + + * $shoppingService = new apiShoppingService(...); + * $products = $shoppingService->products; + * + */ + class ProductsServiceResource extends apiServiceResource { + + + /** + * Returns a list of products and content modules (products.list) + * @param string $source Query source + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param bool sayt.useGcsConfig Google Internal + * @opt_param string rankBy Ranking specification + * @opt_param bool debug.enableLogging Google Internal + * @opt_param bool facets.enabled Whether to return facet information + * @opt_param bool relatedQueries.useGcsConfig This parameter is currently ignored + * @opt_param bool promotions.enabled Whether to return promotion information + * @opt_param bool debug.enabled Google Internal + * @opt_param string facets.include Facets to include (applies when useGcsConfig == false) + * @opt_param string productFields Google Internal + * @opt_param string channels Channels specification + * @opt_param string currency Currency restriction (ISO 4217) + * @opt_param string startIndex Index (1-based) of first product to return + * @opt_param string facets.discover Facets to discover + * @opt_param bool debug.searchResponse Google Internal + * @opt_param string crowdBy Crowding specification + * @opt_param bool spelling.enabled Whether to return spelling suggestions + * @opt_param string taxonomy Taxonomy name + * @opt_param bool debug.geocodeRequest Google Internal + * @opt_param bool spelling.useGcsConfig This parameter is currently ignored + * @opt_param string useCase One of CommerceSearchUseCase, ShoppingApiUseCase + * @opt_param string location Location used to determine tax and shipping + * @opt_param string maxVariants Maximum number of variant results to return per result + * @opt_param bool debug.rdcRequest Google Internal + * @opt_param string categories.include Category specification + * @opt_param string boostBy Boosting specification + * @opt_param bool redirects.useGcsConfig Whether to return redirect information as configured in the GCS account + * @opt_param bool safe Whether safe search is enabled. Default: true + * @opt_param bool categories.useGcsConfig This parameter is currently ignored + * @opt_param string maxResults Maximum number of results to return + * @opt_param bool facets.useGcsConfig Whether to return facet information as configured in the GCS account + * @opt_param bool categories.enabled Whether to return category information + * @opt_param string attributeFilter Comma separated list of attributes to return + * @opt_param bool sayt.enabled Google Internal + * @opt_param bool promotions.useGcsConfig Whether to return promotion information as configured in the GCS account + * @opt_param string thumbnails Image thumbnails specification + * @opt_param string language Language restriction (BCP 47) + * @opt_param string country Country restriction (ISO 3166) + * @opt_param bool debug.geocodeResponse Google Internal + * @opt_param string restrictBy Restriction specification + * @opt_param bool debug.rdcResponse Google Internal + * @opt_param string q Search query + * @opt_param bool redirects.enabled Whether to return redirect information + * @opt_param bool debug.searchRequest Google Internal + * @opt_param bool relatedQueries.enabled Whether to return related queries + * @opt_param string minAvailability + * @opt_param string plusOne +1 rendering specification. + * @return Products + */ + public function listProducts($source, $optParams = array()) { + $params = array('source' => $source); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Products($data); + } else { + return $data; + } + } + /** + * Returns a single product (products.get) + * @param string $source Query source + * @param string $accountId Merchant center account id + * @param string $productIdType Type of productId + * @param string $productId Id of product + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string categories.include Category specification + * @opt_param bool recommendations.enabled Whether to return recommendation information + * @opt_param bool debug.enableLogging Google Internal + * @opt_param string taxonomy Merchant taxonomy + * @opt_param bool categories.useGcsConfig This parameter is currently ignored + * @opt_param bool debug.searchResponse Google Internal + * @opt_param bool debug.enabled Google Internal + * @opt_param string recommendations.include Recommendation specification + * @opt_param bool categories.enabled Whether to return category information + * @opt_param string productFields Google Internal + * @opt_param string location Location used to determine tax and shipping + * @opt_param bool debug.searchRequest Google Internal + * @opt_param string attributeFilter Comma separated list of attributes to return + * @opt_param bool recommendations.useGcsConfig This parameter is currently ignored + * @opt_param string plusOne +1 rendering specification. + * @opt_param string thumbnails Thumbnail specification + * @return Product + */ + public function get($source, $accountId, $productIdType, $productId, $optParams = array()) { + $params = array('source' => $source, 'accountId' => $accountId, 'productIdType' => $productIdType, 'productId' => $productId); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Product($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Shopping (v1). + *

              + * Lets you search over product data + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiShoppingService extends apiService { + public $products; + /** + * Constructs the internal representation of the Shopping service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/shopping/search/v1/'; + $this->version = 'v1'; + $this->serviceName = 'shopping'; + + $apiClient->addService($this->serviceName, $this->version); + $this->products = new ProductsServiceResource($this, $this->serviceName, 'products', json_decode('{"methods": {"list": {"parameters": {"sayt.useGcsConfig": {"type": "boolean", "location": "query"}, "debug.geocodeResponse": {"type": "boolean", "location": "query"}, "debug.enableLogging": {"type": "boolean", "location": "query"}, "facets.enabled": {"type": "boolean", "location": "query"}, "relatedQueries.useGcsConfig": {"type": "boolean", "location": "query"}, "promotions.enabled": {"type": "boolean", "location": "query"}, "debug.enabled": {"type": "boolean", "location": "query"}, "facets.include": {"type": "string", "location": "query"}, "productFields": {"type": "string", "location": "query"}, "channels": {"type": "string", "location": "query"}, "currency": {"type": "string", "location": "query"}, "startIndex": {"format": "uint32", "type": "integer", "location": "query"}, "facets.discover": {"type": "string", "location": "query"}, "debug.searchResponse": {"type": "boolean", "location": "query"}, "crowdBy": {"type": "string", "location": "query"}, "spelling.enabled": {"type": "boolean", "location": "query"}, "debug.geocodeRequest": {"type": "boolean", "location": "query"}, "source": {"required": true, "type": "string", "location": "path"}, "spelling.useGcsConfig": {"type": "boolean", "location": "query"}, "useCase": {"type": "string", "location": "query"}, "location": {"type": "string", "location": "query"}, "taxonomy": {"type": "string", "location": "query"}, "debug.rdcRequest": {"type": "boolean", "location": "query"}, "categories.include": {"type": "string", "location": "query"}, "debug.searchRequest": {"type": "boolean", "location": "query"}, "safe": {"type": "boolean", "location": "query"}, "boostBy": {"type": "string", "location": "query"}, "maxVariants": {"format": "uint32", "type": "integer", "location": "query"}, "categories.useGcsConfig": {"type": "boolean", "location": "query"}, "maxResults": {"format": "uint32", "type": "integer", "location": "query"}, "facets.useGcsConfig": {"type": "boolean", "location": "query"}, "categories.enabled": {"type": "boolean", "location": "query"}, "attributeFilter": {"type": "string", "location": "query"}, "sayt.enabled": {"type": "boolean", "location": "query"}, "plusOne": {"type": "string", "location": "query"}, "thumbnails": {"type": "string", "location": "query"}, "language": {"type": "string", "location": "query"}, "redirects.useGcsConfig": {"type": "boolean", "location": "query"}, "rankBy": {"type": "string", "location": "query"}, "restrictBy": {"type": "string", "location": "query"}, "debug.rdcResponse": {"type": "boolean", "location": "query"}, "q": {"type": "string", "location": "query"}, "redirects.enabled": {"type": "boolean", "location": "query"}, "country": {"type": "string", "location": "query"}, "relatedQueries.enabled": {"type": "boolean", "location": "query"}, "minAvailability": {"enum": ["inStock", "limited", "outOfStock", "unknown"], "type": "string", "location": "query"}, "promotions.useGcsConfig": {"type": "boolean", "location": "query"}}, "id": "shopping.products.list", "httpMethod": "GET", "path": "{source}/products", "response": {"$ref": "Products"}}, "get": {"parameters": {"categories.include": {"type": "string", "location": "query"}, "recommendations.enabled": {"type": "boolean", "location": "query"}, "plusOne": {"type": "string", "location": "query"}, "debug.enableLogging": {"type": "boolean", "location": "query"}, "thumbnails": {"type": "string", "location": "query"}, "recommendations.include": {"type": "string", "location": "query"}, "taxonomy": {"type": "string", "location": "query"}, "productIdType": {"required": true, "type": "string", "location": "path"}, "categories.useGcsConfig": {"type": "boolean", "location": "query"}, "attributeFilter": {"type": "string", "location": "query"}, "debug.enabled": {"type": "boolean", "location": "query"}, "source": {"required": true, "type": "string", "location": "path"}, "categories.enabled": {"type": "boolean", "location": "query"}, "location": {"type": "string", "location": "query"}, "debug.searchRequest": {"type": "boolean", "location": "query"}, "debug.searchResponse": {"type": "boolean", "location": "query"}, "recommendations.useGcsConfig": {"type": "boolean", "location": "query"}, "productFields": {"type": "string", "location": "query"}, "accountId": {"format": "uint32", "required": true, "type": "integer", "location": "path"}, "productId": {"required": true, "type": "string", "location": "path"}}, "id": "shopping.products.get", "httpMethod": "GET", "path": "{source}/products/{accountId}/{productIdType}/{productId}", "response": {"$ref": "Product"}}}}', true)); + } +} + +class Product extends apiModel { + public $selfLink; + public $kind; + protected $__productType = 'ShoppingModelProductJsonV1'; + protected $__productDataType = ''; + public $product; + public $requestId; + protected $__recommendationsType = 'ProductRecommendations'; + protected $__recommendationsDataType = 'array'; + public $recommendations; + protected $__debugType = 'ShoppingModelDebugJsonV1'; + protected $__debugDataType = ''; + public $debug; + public $id; + protected $__categoriesType = 'ShoppingModelCategoryJsonV1'; + protected $__categoriesDataType = 'array'; + public $categories; + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setProduct(ShoppingModelProductJsonV1 $product) { + $this->product = $product; + } + public function getProduct() { + return $this->product; + } + public function setRequestId($requestId) { + $this->requestId = $requestId; + } + public function getRequestId() { + return $this->requestId; + } + public function setRecommendations(/* array(ProductRecommendations) */ $recommendations) { + $this->assertIsArray($recommendations, 'ProductRecommendations', __METHOD__); + $this->recommendations = $recommendations; + } + public function getRecommendations() { + return $this->recommendations; + } + public function setDebug(ShoppingModelDebugJsonV1 $debug) { + $this->debug = $debug; + } + public function getDebug() { + return $this->debug; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setCategories(/* array(ShoppingModelCategoryJsonV1) */ $categories) { + $this->assertIsArray($categories, 'ShoppingModelCategoryJsonV1', __METHOD__); + $this->categories = $categories; + } + public function getCategories() { + return $this->categories; + } +} + +class ProductRecommendations extends apiModel { + protected $__recommendationListType = 'ProductRecommendationsRecommendationList'; + protected $__recommendationListDataType = 'array'; + public $recommendationList; + public $type; + public function setRecommendationList(/* array(ProductRecommendationsRecommendationList) */ $recommendationList) { + $this->assertIsArray($recommendationList, 'ProductRecommendationsRecommendationList', __METHOD__); + $this->recommendationList = $recommendationList; + } + public function getRecommendationList() { + return $this->recommendationList; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } +} + +class ProductRecommendationsRecommendationList extends apiModel { + protected $__productType = 'ShoppingModelProductJsonV1'; + protected $__productDataType = ''; + public $product; + public function setProduct(ShoppingModelProductJsonV1 $product) { + $this->product = $product; + } + public function getProduct() { + return $this->product; + } +} + +class Products extends apiModel { + protected $__promotionsType = 'ProductsPromotions'; + protected $__promotionsDataType = 'array'; + public $promotions; + public $selfLink; + public $kind; + protected $__storesType = 'ProductsStores'; + protected $__storesDataType = 'array'; + public $stores; + public $currentItemCount; + protected $__itemsType = 'Product'; + protected $__itemsDataType = 'array'; + public $items; + protected $__facetsType = 'ProductsFacets'; + protected $__facetsDataType = 'array'; + public $facets; + public $itemsPerPage; + public $redirects; + public $nextLink; + protected $__shelfSpaceAdsType = 'ProductsShelfSpaceAds'; + protected $__shelfSpaceAdsDataType = 'array'; + public $shelfSpaceAds; + public $startIndex; + public $etag; + public $requestId; + public $relatedQueries; + protected $__debugType = 'ShoppingModelDebugJsonV1'; + protected $__debugDataType = ''; + public $debug; + protected $__spellingType = 'ProductsSpelling'; + protected $__spellingDataType = ''; + public $spelling; + public $previousLink; + public $totalItems; + public $id; + protected $__categoriesType = 'ShoppingModelCategoryJsonV1'; + protected $__categoriesDataType = 'array'; + public $categories; + public function setPromotions(/* array(ProductsPromotions) */ $promotions) { + $this->assertIsArray($promotions, 'ProductsPromotions', __METHOD__); + $this->promotions = $promotions; + } + public function getPromotions() { + return $this->promotions; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setStores(/* array(ProductsStores) */ $stores) { + $this->assertIsArray($stores, 'ProductsStores', __METHOD__); + $this->stores = $stores; + } + public function getStores() { + return $this->stores; + } + public function setCurrentItemCount($currentItemCount) { + $this->currentItemCount = $currentItemCount; + } + public function getCurrentItemCount() { + return $this->currentItemCount; + } + public function setItems(/* array(Product) */ $items) { + $this->assertIsArray($items, 'Product', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setFacets(/* array(ProductsFacets) */ $facets) { + $this->assertIsArray($facets, 'ProductsFacets', __METHOD__); + $this->facets = $facets; + } + public function getFacets() { + return $this->facets; + } + public function setItemsPerPage($itemsPerPage) { + $this->itemsPerPage = $itemsPerPage; + } + public function getItemsPerPage() { + return $this->itemsPerPage; + } + public function setRedirects(/* array(string) */ $redirects) { + $this->assertIsArray($redirects, 'string', __METHOD__); + $this->redirects = $redirects; + } + public function getRedirects() { + return $this->redirects; + } + public function setNextLink($nextLink) { + $this->nextLink = $nextLink; + } + public function getNextLink() { + return $this->nextLink; + } + public function setShelfSpaceAds(/* array(ProductsShelfSpaceAds) */ $shelfSpaceAds) { + $this->assertIsArray($shelfSpaceAds, 'ProductsShelfSpaceAds', __METHOD__); + $this->shelfSpaceAds = $shelfSpaceAds; + } + public function getShelfSpaceAds() { + return $this->shelfSpaceAds; + } + public function setStartIndex($startIndex) { + $this->startIndex = $startIndex; + } + public function getStartIndex() { + return $this->startIndex; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setRequestId($requestId) { + $this->requestId = $requestId; + } + public function getRequestId() { + return $this->requestId; + } + public function setRelatedQueries(/* array(string) */ $relatedQueries) { + $this->assertIsArray($relatedQueries, 'string', __METHOD__); + $this->relatedQueries = $relatedQueries; + } + public function getRelatedQueries() { + return $this->relatedQueries; + } + public function setDebug(ShoppingModelDebugJsonV1 $debug) { + $this->debug = $debug; + } + public function getDebug() { + return $this->debug; + } + public function setSpelling(ProductsSpelling $spelling) { + $this->spelling = $spelling; + } + public function getSpelling() { + return $this->spelling; + } + public function setPreviousLink($previousLink) { + $this->previousLink = $previousLink; + } + public function getPreviousLink() { + return $this->previousLink; + } + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setCategories(/* array(ShoppingModelCategoryJsonV1) */ $categories) { + $this->assertIsArray($categories, 'ShoppingModelCategoryJsonV1', __METHOD__); + $this->categories = $categories; + } + public function getCategories() { + return $this->categories; + } +} + +class ProductsFacets extends apiModel { + public $count; + public $displayName; + public $name; + protected $__bucketsType = 'ProductsFacetsBuckets'; + protected $__bucketsDataType = 'array'; + public $buckets; + public $property; + public $type; + public $unit; + public function setCount($count) { + $this->count = $count; + } + public function getCount() { + return $this->count; + } + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setBuckets(/* array(ProductsFacetsBuckets) */ $buckets) { + $this->assertIsArray($buckets, 'ProductsFacetsBuckets', __METHOD__); + $this->buckets = $buckets; + } + public function getBuckets() { + return $this->buckets; + } + public function setProperty($property) { + $this->property = $property; + } + public function getProperty() { + return $this->property; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setUnit($unit) { + $this->unit = $unit; + } + public function getUnit() { + return $this->unit; + } +} + +class ProductsFacetsBuckets extends apiModel { + public $count; + public $minExclusive; + public $min; + public $max; + public $value; + public $maxExclusive; + public function setCount($count) { + $this->count = $count; + } + public function getCount() { + return $this->count; + } + public function setMinExclusive($minExclusive) { + $this->minExclusive = $minExclusive; + } + public function getMinExclusive() { + return $this->minExclusive; + } + public function setMin($min) { + $this->min = $min; + } + public function getMin() { + return $this->min; + } + public function setMax($max) { + $this->max = $max; + } + public function getMax() { + return $this->max; + } + public function setValue($value) { + $this->value = $value; + } + public function getValue() { + return $this->value; + } + public function setMaxExclusive($maxExclusive) { + $this->maxExclusive = $maxExclusive; + } + public function getMaxExclusive() { + return $this->maxExclusive; + } +} + +class ProductsPromotions extends apiModel { + protected $__productType = 'ShoppingModelProductJsonV1'; + protected $__productDataType = ''; + public $product; + public $description; + public $imageLink; + public $destLink; + public $customHtml; + public $link; + protected $__customFieldsType = 'ProductsPromotionsCustomFields'; + protected $__customFieldsDataType = 'array'; + public $customFields; + public $type; + public $name; + public function setProduct(ShoppingModelProductJsonV1 $product) { + $this->product = $product; + } + public function getProduct() { + return $this->product; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setImageLink($imageLink) { + $this->imageLink = $imageLink; + } + public function getImageLink() { + return $this->imageLink; + } + public function setDestLink($destLink) { + $this->destLink = $destLink; + } + public function getDestLink() { + return $this->destLink; + } + public function setCustomHtml($customHtml) { + $this->customHtml = $customHtml; + } + public function getCustomHtml() { + return $this->customHtml; + } + public function setLink($link) { + $this->link = $link; + } + public function getLink() { + return $this->link; + } + public function setCustomFields(/* array(ProductsPromotionsCustomFields) */ $customFields) { + $this->assertIsArray($customFields, 'ProductsPromotionsCustomFields', __METHOD__); + $this->customFields = $customFields; + } + public function getCustomFields() { + return $this->customFields; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } +} + +class ProductsPromotionsCustomFields extends apiModel { + public $name; + public $value; + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setValue($value) { + $this->value = $value; + } + public function getValue() { + return $this->value; + } +} + +class ProductsShelfSpaceAds extends apiModel { + protected $__productType = 'ShoppingModelProductJsonV1'; + protected $__productDataType = ''; + public $product; + public function setProduct(ShoppingModelProductJsonV1 $product) { + $this->product = $product; + } + public function getProduct() { + return $this->product; + } +} + +class ProductsSpelling extends apiModel { + public $suggestion; + public function setSuggestion($suggestion) { + $this->suggestion = $suggestion; + } + public function getSuggestion() { + return $this->suggestion; + } +} + +class ProductsStores extends apiModel { + public $storeCode; + public $name; + public $storeId; + public $telephone; + public $location; + public $address; + public function setStoreCode($storeCode) { + $this->storeCode = $storeCode; + } + public function getStoreCode() { + return $this->storeCode; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setStoreId($storeId) { + $this->storeId = $storeId; + } + public function getStoreId() { + return $this->storeId; + } + public function setTelephone($telephone) { + $this->telephone = $telephone; + } + public function getTelephone() { + return $this->telephone; + } + public function setLocation($location) { + $this->location = $location; + } + public function getLocation() { + return $this->location; + } + public function setAddress($address) { + $this->address = $address; + } + public function getAddress() { + return $this->address; + } +} + +class ShoppingModelCategoryJsonV1 extends apiModel { + public $url; + public $shortName; + public $parents; + public $id; + public function setUrl($url) { + $this->url = $url; + } + public function getUrl() { + return $this->url; + } + public function setShortName($shortName) { + $this->shortName = $shortName; + } + public function getShortName() { + return $this->shortName; + } + public function setParents(/* array(string) */ $parents) { + $this->assertIsArray($parents, 'string', __METHOD__); + $this->parents = $parents; + } + public function getParents() { + return $this->parents; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class ShoppingModelDebugJsonV1 extends apiModel { + public $searchResponse; + public $searchRequest; + public $rdcResponse; + protected $__backendTimesType = 'ShoppingModelDebugJsonV1BackendTimes'; + protected $__backendTimesDataType = 'array'; + public $backendTimes; + public $elapsedMillis; + public function setSearchResponse($searchResponse) { + $this->searchResponse = $searchResponse; + } + public function getSearchResponse() { + return $this->searchResponse; + } + public function setSearchRequest($searchRequest) { + $this->searchRequest = $searchRequest; + } + public function getSearchRequest() { + return $this->searchRequest; + } + public function setRdcResponse($rdcResponse) { + $this->rdcResponse = $rdcResponse; + } + public function getRdcResponse() { + return $this->rdcResponse; + } + public function setBackendTimes(/* array(ShoppingModelDebugJsonV1BackendTimes) */ $backendTimes) { + $this->assertIsArray($backendTimes, 'ShoppingModelDebugJsonV1BackendTimes', __METHOD__); + $this->backendTimes = $backendTimes; + } + public function getBackendTimes() { + return $this->backendTimes; + } + public function setElapsedMillis($elapsedMillis) { + $this->elapsedMillis = $elapsedMillis; + } + public function getElapsedMillis() { + return $this->elapsedMillis; + } +} + +class ShoppingModelDebugJsonV1BackendTimes extends apiModel { + public $serverMillis; + public $hostName; + public $name; + public $elapsedMillis; + public function setServerMillis($serverMillis) { + $this->serverMillis = $serverMillis; + } + public function getServerMillis() { + return $this->serverMillis; + } + public function setHostName($hostName) { + $this->hostName = $hostName; + } + public function getHostName() { + return $this->hostName; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setElapsedMillis($elapsedMillis) { + $this->elapsedMillis = $elapsedMillis; + } + public function getElapsedMillis() { + return $this->elapsedMillis; + } +} + +class ShoppingModelProductJsonV1 extends apiModel { + public $queryMatched; + public $gtin; + protected $__imagesType = 'ShoppingModelProductJsonV1Images'; + protected $__imagesDataType = 'array'; + public $images; + protected $__inventoriesType = 'ShoppingModelProductJsonV1Inventories'; + protected $__inventoriesDataType = 'array'; + public $inventories; + protected $__authorType = 'ShoppingModelProductJsonV1Author'; + protected $__authorDataType = ''; + public $author; + public $condition; + public $providedId; + public $internal8; + public $description; + public $gtins; + public $internal1; + public $brand; + public $internal3; + protected $__internal4Type = 'ShoppingModelProductJsonV1Internal4'; + protected $__internal4DataType = 'array'; + public $internal4; + public $internal6; + public $internal7; + public $link; + protected $__attributesType = 'ShoppingModelProductJsonV1Attributes'; + protected $__attributesDataType = 'array'; + public $attributes; + public $totalMatchingVariants; + protected $__variantsType = 'ShoppingModelProductJsonV1Variants'; + protected $__variantsDataType = 'array'; + public $variants; + public $modificationTime; + public $categories; + public $language; + public $country; + public $title; + public $creationTime; + public $internal14; + public $internal12; + public $internal13; + public $internal10; + public $plusOne; + public $googleId; + public $internal15; + public function setQueryMatched($queryMatched) { + $this->queryMatched = $queryMatched; + } + public function getQueryMatched() { + return $this->queryMatched; + } + public function setGtin($gtin) { + $this->gtin = $gtin; + } + public function getGtin() { + return $this->gtin; + } + public function setImages(/* array(ShoppingModelProductJsonV1Images) */ $images) { + $this->assertIsArray($images, 'ShoppingModelProductJsonV1Images', __METHOD__); + $this->images = $images; + } + public function getImages() { + return $this->images; + } + public function setInventories(/* array(ShoppingModelProductJsonV1Inventories) */ $inventories) { + $this->assertIsArray($inventories, 'ShoppingModelProductJsonV1Inventories', __METHOD__); + $this->inventories = $inventories; + } + public function getInventories() { + return $this->inventories; + } + public function setAuthor(ShoppingModelProductJsonV1Author $author) { + $this->author = $author; + } + public function getAuthor() { + return $this->author; + } + public function setCondition($condition) { + $this->condition = $condition; + } + public function getCondition() { + return $this->condition; + } + public function setProvidedId($providedId) { + $this->providedId = $providedId; + } + public function getProvidedId() { + return $this->providedId; + } + public function setInternal8(/* array(string) */ $internal8) { + $this->assertIsArray($internal8, 'string', __METHOD__); + $this->internal8 = $internal8; + } + public function getInternal8() { + return $this->internal8; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } + public function setGtins(/* array(string) */ $gtins) { + $this->assertIsArray($gtins, 'string', __METHOD__); + $this->gtins = $gtins; + } + public function getGtins() { + return $this->gtins; + } + public function setInternal1(/* array(string) */ $internal1) { + $this->assertIsArray($internal1, 'string', __METHOD__); + $this->internal1 = $internal1; + } + public function getInternal1() { + return $this->internal1; + } + public function setBrand($brand) { + $this->brand = $brand; + } + public function getBrand() { + return $this->brand; + } + public function setInternal3($internal3) { + $this->internal3 = $internal3; + } + public function getInternal3() { + return $this->internal3; + } + public function setInternal4(/* array(ShoppingModelProductJsonV1Internal4) */ $internal4) { + $this->assertIsArray($internal4, 'ShoppingModelProductJsonV1Internal4', __METHOD__); + $this->internal4 = $internal4; + } + public function getInternal4() { + return $this->internal4; + } + public function setInternal6($internal6) { + $this->internal6 = $internal6; + } + public function getInternal6() { + return $this->internal6; + } + public function setInternal7($internal7) { + $this->internal7 = $internal7; + } + public function getInternal7() { + return $this->internal7; + } + public function setLink($link) { + $this->link = $link; + } + public function getLink() { + return $this->link; + } + public function setAttributes(/* array(ShoppingModelProductJsonV1Attributes) */ $attributes) { + $this->assertIsArray($attributes, 'ShoppingModelProductJsonV1Attributes', __METHOD__); + $this->attributes = $attributes; + } + public function getAttributes() { + return $this->attributes; + } + public function setTotalMatchingVariants($totalMatchingVariants) { + $this->totalMatchingVariants = $totalMatchingVariants; + } + public function getTotalMatchingVariants() { + return $this->totalMatchingVariants; + } + public function setVariants(/* array(ShoppingModelProductJsonV1Variants) */ $variants) { + $this->assertIsArray($variants, 'ShoppingModelProductJsonV1Variants', __METHOD__); + $this->variants = $variants; + } + public function getVariants() { + return $this->variants; + } + public function setModificationTime($modificationTime) { + $this->modificationTime = $modificationTime; + } + public function getModificationTime() { + return $this->modificationTime; + } + public function setCategories(/* array(string) */ $categories) { + $this->assertIsArray($categories, 'string', __METHOD__); + $this->categories = $categories; + } + public function getCategories() { + return $this->categories; + } + public function setLanguage($language) { + $this->language = $language; + } + public function getLanguage() { + return $this->language; + } + public function setCountry($country) { + $this->country = $country; + } + public function getCountry() { + return $this->country; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setCreationTime($creationTime) { + $this->creationTime = $creationTime; + } + public function getCreationTime() { + return $this->creationTime; + } + public function setInternal14($internal14) { + $this->internal14 = $internal14; + } + public function getInternal14() { + return $this->internal14; + } + public function setInternal12($internal12) { + $this->internal12 = $internal12; + } + public function getInternal12() { + return $this->internal12; + } + public function setInternal13($internal13) { + $this->internal13 = $internal13; + } + public function getInternal13() { + return $this->internal13; + } + public function setInternal10(/* array(string) */ $internal10) { + $this->assertIsArray($internal10, 'string', __METHOD__); + $this->internal10 = $internal10; + } + public function getInternal10() { + return $this->internal10; + } + public function setPlusOne($plusOne) { + $this->plusOne = $plusOne; + } + public function getPlusOne() { + return $this->plusOne; + } + public function setGoogleId($googleId) { + $this->googleId = $googleId; + } + public function getGoogleId() { + return $this->googleId; + } + public function setInternal15($internal15) { + $this->internal15 = $internal15; + } + public function getInternal15() { + return $this->internal15; + } +} + +class ShoppingModelProductJsonV1Attributes extends apiModel { + public $type; + public $value; + public $displayName; + public $name; + public $unit; + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setValue($value) { + $this->value = $value; + } + public function getValue() { + return $this->value; + } + public function setDisplayName($displayName) { + $this->displayName = $displayName; + } + public function getDisplayName() { + return $this->displayName; + } + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setUnit($unit) { + $this->unit = $unit; + } + public function getUnit() { + return $this->unit; + } +} + +class ShoppingModelProductJsonV1Author extends apiModel { + public $name; + public $accountId; + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setAccountId($accountId) { + $this->accountId = $accountId; + } + public function getAccountId() { + return $this->accountId; + } +} + +class ShoppingModelProductJsonV1Images extends apiModel { + public $link; + protected $__thumbnailsType = 'ShoppingModelProductJsonV1ImagesThumbnails'; + protected $__thumbnailsDataType = 'array'; + public $thumbnails; + public function setLink($link) { + $this->link = $link; + } + public function getLink() { + return $this->link; + } + public function setThumbnails(/* array(ShoppingModelProductJsonV1ImagesThumbnails) */ $thumbnails) { + $this->assertIsArray($thumbnails, 'ShoppingModelProductJsonV1ImagesThumbnails', __METHOD__); + $this->thumbnails = $thumbnails; + } + public function getThumbnails() { + return $this->thumbnails; + } +} + +class ShoppingModelProductJsonV1ImagesThumbnails extends apiModel { + public $content; + public $width; + public $link; + public $height; + public function setContent($content) { + $this->content = $content; + } + public function getContent() { + return $this->content; + } + public function setWidth($width) { + $this->width = $width; + } + public function getWidth() { + return $this->width; + } + public function setLink($link) { + $this->link = $link; + } + public function getLink() { + return $this->link; + } + public function setHeight($height) { + $this->height = $height; + } + public function getHeight() { + return $this->height; + } +} + +class ShoppingModelProductJsonV1Internal4 extends apiModel { + public $node; + public $confidence; + public function setNode($node) { + $this->node = $node; + } + public function getNode() { + return $this->node; + } + public function setConfidence($confidence) { + $this->confidence = $confidence; + } + public function getConfidence() { + return $this->confidence; + } +} + +class ShoppingModelProductJsonV1Inventories extends apiModel { + public $distance; + public $price; + public $storeId; + public $tax; + public $shipping; + public $currency; + public $distanceUnit; + public $availability; + public $channel; + public function setDistance($distance) { + $this->distance = $distance; + } + public function getDistance() { + return $this->distance; + } + public function setPrice($price) { + $this->price = $price; + } + public function getPrice() { + return $this->price; + } + public function setStoreId($storeId) { + $this->storeId = $storeId; + } + public function getStoreId() { + return $this->storeId; + } + public function setTax($tax) { + $this->tax = $tax; + } + public function getTax() { + return $this->tax; + } + public function setShipping($shipping) { + $this->shipping = $shipping; + } + public function getShipping() { + return $this->shipping; + } + public function setCurrency($currency) { + $this->currency = $currency; + } + public function getCurrency() { + return $this->currency; + } + public function setDistanceUnit($distanceUnit) { + $this->distanceUnit = $distanceUnit; + } + public function getDistanceUnit() { + return $this->distanceUnit; + } + public function setAvailability($availability) { + $this->availability = $availability; + } + public function getAvailability() { + return $this->availability; + } + public function setChannel($channel) { + $this->channel = $channel; + } + public function getChannel() { + return $this->channel; + } +} + +class ShoppingModelProductJsonV1Variants extends apiModel { + protected $__variantType = 'ShoppingModelProductJsonV1'; + protected $__variantDataType = ''; + public $variant; + public function setVariant(ShoppingModelProductJsonV1 $variant) { + $this->variant = $variant; + } + public function getVariant() { + return $this->variant; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiSiteVerificationService.php b/inc/vendors/social-login/Google/contrib/apiSiteVerificationService.php new file mode 100755 index 00000000..198c9add --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiSiteVerificationService.php @@ -0,0 +1,277 @@ + + * $siteVerificationService = new apiSiteVerificationService(...); + * $webResource = $siteVerificationService->webResource; + * + */ + class WebResourceServiceResource extends apiServiceResource { + + + /** + * Attempt verification of a website or domain. (webResource.insert) + * @param string $verificationMethod The method to use for verifying a site or domain. + * @param SiteVerificationWebResourceResource $postBody + * @return SiteVerificationWebResourceResource + */ + public function insert($verificationMethod, SiteVerificationWebResourceResource $postBody, $optParams = array()) { + $params = array('verificationMethod' => $verificationMethod, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new SiteVerificationWebResourceResource($data); + } else { + return $data; + } + } + /** + * Get the most current data for a website or domain. (webResource.get) + * @param string $id The id of a verified site or domain. + * @return SiteVerificationWebResourceResource + */ + public function get($id, $optParams = array()) { + $params = array('id' => $id); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new SiteVerificationWebResourceResource($data); + } else { + return $data; + } + } + /** + * Get the list of your verified websites and domains. (webResource.list) + * @return SiteVerificationWebResourceListResponse + */ + public function listWebResource($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new SiteVerificationWebResourceListResponse($data); + } else { + return $data; + } + } + /** + * Modify the list of owners for your website or domain. (webResource.update) + * @param string $id The id of a verified site or domain. + * @param SiteVerificationWebResourceResource $postBody + * @return SiteVerificationWebResourceResource + */ + public function update($id, SiteVerificationWebResourceResource $postBody, $optParams = array()) { + $params = array('id' => $id, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new SiteVerificationWebResourceResource($data); + } else { + return $data; + } + } + /** + * Modify the list of owners for your website or domain. This method supports patch semantics. + * (webResource.patch) + * @param string $id The id of a verified site or domain. + * @param SiteVerificationWebResourceResource $postBody + * @return SiteVerificationWebResourceResource + */ + public function patch($id, SiteVerificationWebResourceResource $postBody, $optParams = array()) { + $params = array('id' => $id, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('patch', array($params)); + if ($this->useObjects()) { + return new SiteVerificationWebResourceResource($data); + } else { + return $data; + } + } + /** + * Get a verification token for placing on a website or domain. (webResource.getToken) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string verificationMethod The method to use for verifying a site or domain. + * @opt_param string identifier The URL or domain to verify. + * @opt_param string type Type of resource to verify. Can be 'site' (URL) or 'inet_domain' (domain name). + * @return SiteVerificationWebResourceGettokenResponse + */ + public function getToken($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('getToken', array($params)); + if ($this->useObjects()) { + return new SiteVerificationWebResourceGettokenResponse($data); + } else { + return $data; + } + } + /** + * Relinquish ownership of a website or domain. (webResource.delete) + * @param string $id The id of a verified site or domain. + */ + public function delete($id, $optParams = array()) { + $params = array('id' => $id); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + + +/** + * Service definition for SiteVerification (v1). + *

              + * Lets you programatically verify ownership of websites or domains with Google. + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiSiteVerificationService extends apiService { + public $webResource; + /** + * Constructs the internal representation of the SiteVerification service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/siteVerification/v1/'; + $this->version = 'v1'; + $this->serviceName = 'siteVerification'; + + $apiClient->addService($this->serviceName, $this->version); + $this->webResource = new WebResourceServiceResource($this, $this->serviceName, 'webResource', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "parameters": {"verificationMethod": {"required": true, "type": "string", "location": "query"}}, "request": {"$ref": "SiteVerificationWebResourceResource"}, "id": "siteVerification.webResource.insert", "httpMethod": "POST", "path": "webResource", "response": {"$ref": "SiteVerificationWebResourceResource"}}, "get": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "id": "siteVerification.webResource.get", "httpMethod": "GET", "path": "webResource/{id}", "response": {"$ref": "SiteVerificationWebResourceResource"}}, "list": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "id": "siteVerification.webResource.list", "httpMethod": "GET", "path": "webResource", "response": {"$ref": "SiteVerificationWebResourceListResponse"}}, "update": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "SiteVerificationWebResourceResource"}, "id": "siteVerification.webResource.update", "httpMethod": "PUT", "path": "webResource/{id}", "response": {"$ref": "SiteVerificationWebResourceResource"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "SiteVerificationWebResourceResource"}, "id": "siteVerification.webResource.patch", "httpMethod": "PATCH", "path": "webResource/{id}", "response": {"$ref": "SiteVerificationWebResourceResource"}}, "getToken": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "parameters": {"type": {"type": "string", "location": "query"}, "identifier": {"type": "string", "location": "query"}, "verificationMethod": {"type": "string", "location": "query"}}, "response": {"$ref": "SiteVerificationWebResourceGettokenResponse"}, "httpMethod": "GET", "path": "token", "id": "siteVerification.webResource.getToken"}, "delete": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "webResource/{id}", "id": "siteVerification.webResource.delete"}}}', true)); + } +} + +class SiteVerificationWebResourceGettokenRequest extends apiModel { + public $verificationMethod; + protected $__siteType = 'SiteVerificationWebResourceGettokenRequestSite'; + protected $__siteDataType = ''; + public $site; + public function setVerificationMethod($verificationMethod) { + $this->verificationMethod = $verificationMethod; + } + public function getVerificationMethod() { + return $this->verificationMethod; + } + public function setSite(SiteVerificationWebResourceGettokenRequestSite $site) { + $this->site = $site; + } + public function getSite() { + return $this->site; + } +} + +class SiteVerificationWebResourceGettokenRequestSite extends apiModel { + public $identifier; + public $type; + public function setIdentifier($identifier) { + $this->identifier = $identifier; + } + public function getIdentifier() { + return $this->identifier; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } +} + +class SiteVerificationWebResourceGettokenResponse extends apiModel { + public $token; + public $method; + public function setToken($token) { + $this->token = $token; + } + public function getToken() { + return $this->token; + } + public function setMethod($method) { + $this->method = $method; + } + public function getMethod() { + return $this->method; + } +} + +class SiteVerificationWebResourceListResponse extends apiModel { + protected $__itemsType = 'SiteVerificationWebResourceResource'; + protected $__itemsDataType = 'array'; + public $items; + public function setItems(/* array(SiteVerificationWebResourceResource) */ $items) { + $this->assertIsArray($items, 'SiteVerificationWebResourceResource', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } +} + +class SiteVerificationWebResourceResource extends apiModel { + public $owners; + public $id; + protected $__siteType = 'SiteVerificationWebResourceResourceSite'; + protected $__siteDataType = ''; + public $site; + public function setOwners(/* array(string) */ $owners) { + $this->assertIsArray($owners, 'string', __METHOD__); + $this->owners = $owners; + } + public function getOwners() { + return $this->owners; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSite(SiteVerificationWebResourceResourceSite $site) { + $this->site = $site; + } + public function getSite() { + return $this->site; + } +} + +class SiteVerificationWebResourceResourceSite extends apiModel { + public $identifier; + public $type; + public function setIdentifier($identifier) { + $this->identifier = $identifier; + } + public function getIdentifier() { + return $this->identifier; + } + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiTasksService.php b/inc/vendors/social-login/Google/contrib/apiTasksService.php new file mode 100755 index 00000000..4e20fb00 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiTasksService.php @@ -0,0 +1,546 @@ + + * $tasksService = new apiTasksService(...); + * $tasks = $tasksService->tasks; + * + */ + class TasksServiceResource extends apiServiceResource { + + + /** + * Creates a new task on the specified task list. (tasks.insert) + * @param string $tasklist Task list identifier. + * @param Task $postBody + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string parent Parent task identifier. If the task is created at the top level, this parameter is omitted. Optional. + * @opt_param string previous Previous sibling task identifier. If the task is created at the first position among its siblings, this parameter is omitted. Optional. + * @return Task + */ + public function insert($tasklist, Task $postBody, $optParams = array()) { + $params = array('tasklist' => $tasklist, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Task($data); + } else { + return $data; + } + } + /** + * Returns the specified task. (tasks.get) + * @param string $tasklist Task list identifier. + * @param string $task Task identifier. + * @return Task + */ + public function get($tasklist, $task, $optParams = array()) { + $params = array('tasklist' => $tasklist, 'task' => $task); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Task($data); + } else { + return $data; + } + } + /** + * Clears all completed tasks from the specified task list. The affected tasks will be marked as + * 'hidden' and no longer be returned by default when retrieving all tasks for a task list. + * (tasks.clear) + * @param string $tasklist Task list identifier. + */ + public function clear($tasklist, $optParams = array()) { + $params = array('tasklist' => $tasklist); + $params = array_merge($params, $optParams); + $data = $this->__call('clear', array($params)); + return $data; + } + /** + * Moves the specified task to another position in the task list. This can include putting it as a + * child task under a new parent and/or move it to a different position among its sibling tasks. + * (tasks.move) + * @param string $tasklist Task list identifier. + * @param string $task Task identifier. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string parent New parent task identifier. If the task is moved to the top level, this parameter is omitted. Optional. + * @opt_param string previous New previous sibling task identifier. If the task is moved to the first position among its siblings, this parameter is omitted. Optional. + * @return Task + */ + public function move($tasklist, $task, $optParams = array()) { + $params = array('tasklist' => $tasklist, 'task' => $task); + $params = array_merge($params, $optParams); + $data = $this->__call('move', array($params)); + if ($this->useObjects()) { + return new Task($data); + } else { + return $data; + } + } + /** + * Returns all tasks in the specified task list. (tasks.list) + * @param string $tasklist Task list identifier. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string dueMax Upper bound for a task's due date (as a RFC 3339 timestamp) to filter by. Optional. The default is not to filter by due date. + * @opt_param bool showDeleted Flag indicating whether deleted tasks are returned in the result. Optional. The default is False. + * @opt_param string updatedMin Lower bound for a task's last modification time (as a RFC 3339 timestamp) to filter by. Optional. The default is not to filter by last modification time. + * @opt_param string completedMin Lower bound for a task's completion date (as a RFC 3339 timestamp) to filter by. Optional. The default is not to filter by completion date. + * @opt_param string maxResults Maximum number of task lists returned on one page. Optional. The default is 100. + * @opt_param bool showCompleted Flag indicating whether completed tasks are returned in the result. Optional. The default is True. + * @opt_param string pageToken Token specifying the result page to return. Optional. + * @opt_param string completedMax Upper bound for a task's completion date (as a RFC 3339 timestamp) to filter by. Optional. The default is not to filter by completion date. + * @opt_param bool showHidden Flag indicating whether hidden tasks are returned in the result. Optional. The default is False. + * @opt_param string dueMin Lower bound for a task's due date (as a RFC 3339 timestamp) to filter by. Optional. The default is not to filter by due date. + * @return Tasks + */ + public function listTasks($tasklist, $optParams = array()) { + $params = array('tasklist' => $tasklist); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new Tasks($data); + } else { + return $data; + } + } + /** + * Updates the specified task. (tasks.update) + * @param string $tasklist Task list identifier. + * @param string $task Task identifier. + * @param Task $postBody + * @return Task + */ + public function update($tasklist, $task, Task $postBody, $optParams = array()) { + $params = array('tasklist' => $tasklist, 'task' => $task, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new Task($data); + } else { + return $data; + } + } + /** + * Updates the specified task. This method supports patch semantics. (tasks.patch) + * @param string $tasklist Task list identifier. + * @param string $task Task identifier. + * @param Task $postBody + * @return Task + */ + public function patch($tasklist, $task, Task $postBody, $optParams = array()) { + $params = array('tasklist' => $tasklist, 'task' => $task, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('patch', array($params)); + if ($this->useObjects()) { + return new Task($data); + } else { + return $data; + } + } + /** + * Deletes the specified task from the task list. (tasks.delete) + * @param string $tasklist Task list identifier. + * @param string $task Task identifier. + */ + public function delete($tasklist, $task, $optParams = array()) { + $params = array('tasklist' => $tasklist, 'task' => $task); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + /** + * The "tasklists" collection of methods. + * Typical usage is: + * + * $tasksService = new apiTasksService(...); + * $tasklists = $tasksService->tasklists; + * + */ + class TasklistsServiceResource extends apiServiceResource { + + + /** + * Creates a new task list and adds it to the authenticated user's task lists. (tasklists.insert) + * @param TaskList $postBody + * @return TaskList + */ + public function insert(TaskList $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new TaskList($data); + } else { + return $data; + } + } + /** + * Returns the authenticated user's specified task list. (tasklists.get) + * @param string $tasklist Task list identifier. + * @return TaskList + */ + public function get($tasklist, $optParams = array()) { + $params = array('tasklist' => $tasklist); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new TaskList($data); + } else { + return $data; + } + } + /** + * Returns all the authenticated user's task lists. (tasklists.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string pageToken Token specifying the result page to return. Optional. + * @opt_param string maxResults Maximum number of task lists returned on one page. Optional. The default is 100. + * @return TaskLists + */ + public function listTasklists($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new TaskLists($data); + } else { + return $data; + } + } + /** + * Updates the authenticated user's specified task list. (tasklists.update) + * @param string $tasklist Task list identifier. + * @param TaskList $postBody + * @return TaskList + */ + public function update($tasklist, TaskList $postBody, $optParams = array()) { + $params = array('tasklist' => $tasklist, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('update', array($params)); + if ($this->useObjects()) { + return new TaskList($data); + } else { + return $data; + } + } + /** + * Updates the authenticated user's specified task list. This method supports patch semantics. + * (tasklists.patch) + * @param string $tasklist Task list identifier. + * @param TaskList $postBody + * @return TaskList + */ + public function patch($tasklist, TaskList $postBody, $optParams = array()) { + $params = array('tasklist' => $tasklist, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('patch', array($params)); + if ($this->useObjects()) { + return new TaskList($data); + } else { + return $data; + } + } + /** + * Deletes the authenticated user's specified task list. (tasklists.delete) + * @param string $tasklist Task list identifier. + */ + public function delete($tasklist, $optParams = array()) { + $params = array('tasklist' => $tasklist); + $params = array_merge($params, $optParams); + $data = $this->__call('delete', array($params)); + return $data; + } + } + + + +/** + * Service definition for Tasks (v1). + *

              + * Lets you manage your tasks and task lists. + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiTasksService extends apiService { + public $tasks; + public $tasklists; + /** + * Constructs the internal representation of the Tasks service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/tasks/v1/'; + $this->version = 'v1'; + $this->serviceName = 'tasks'; + + $apiClient->addService($this->serviceName, $this->version); + $this->tasks = new TasksServiceResource($this, $this->serviceName, 'tasks', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}, "parent": {"type": "string", "location": "query"}, "previous": {"type": "string", "location": "query"}}, "request": {"$ref": "Task"}, "id": "tasks.tasks.insert", "httpMethod": "POST", "path": "lists/{tasklist}/tasks", "response": {"$ref": "Task"}}, "get": {"scopes": ["https://www.googleapis.com/auth/tasks", "https://www.googleapis.com/auth/tasks.readonly"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}, "task": {"required": true, "type": "string", "location": "path"}}, "id": "tasks.tasks.get", "httpMethod": "GET", "path": "lists/{tasklist}/tasks/{task}", "response": {"$ref": "Task"}}, "clear": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "POST", "path": "lists/{tasklist}/clear", "id": "tasks.tasks.clear"}, "move": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"previous": {"type": "string", "location": "query"}, "tasklist": {"required": true, "type": "string", "location": "path"}, "parent": {"type": "string", "location": "query"}, "task": {"required": true, "type": "string", "location": "path"}}, "id": "tasks.tasks.move", "httpMethod": "POST", "path": "lists/{tasklist}/tasks/{task}/move", "response": {"$ref": "Task"}}, "list": {"scopes": ["https://www.googleapis.com/auth/tasks", "https://www.googleapis.com/auth/tasks.readonly"], "parameters": {"dueMax": {"type": "string", "location": "query"}, "tasklist": {"required": true, "type": "string", "location": "path"}, "pageToken": {"type": "string", "location": "query"}, "updatedMin": {"type": "string", "location": "query"}, "completedMin": {"type": "string", "location": "query"}, "maxResults": {"format": "int64", "type": "string", "location": "query"}, "showCompleted": {"type": "boolean", "location": "query"}, "showDeleted": {"type": "boolean", "location": "query"}, "completedMax": {"type": "string", "location": "query"}, "showHidden": {"type": "boolean", "location": "query"}, "dueMin": {"type": "string", "location": "query"}}, "id": "tasks.tasks.list", "httpMethod": "GET", "path": "lists/{tasklist}/tasks", "response": {"$ref": "Tasks"}}, "update": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}, "task": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Task"}, "id": "tasks.tasks.update", "httpMethod": "PUT", "path": "lists/{tasklist}/tasks/{task}", "response": {"$ref": "Task"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}, "task": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Task"}, "id": "tasks.tasks.patch", "httpMethod": "PATCH", "path": "lists/{tasklist}/tasks/{task}", "response": {"$ref": "Task"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}, "task": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "lists/{tasklist}/tasks/{task}", "id": "tasks.tasks.delete"}}}', true)); + $this->tasklists = new TasklistsServiceResource($this, $this->serviceName, 'tasklists', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/tasks"], "request": {"$ref": "TaskList"}, "response": {"$ref": "TaskList"}, "httpMethod": "POST", "path": "users/@me/lists", "id": "tasks.tasklists.insert"}, "get": {"scopes": ["https://www.googleapis.com/auth/tasks", "https://www.googleapis.com/auth/tasks.readonly"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}}, "id": "tasks.tasklists.get", "httpMethod": "GET", "path": "users/@me/lists/{tasklist}", "response": {"$ref": "TaskList"}}, "list": {"scopes": ["https://www.googleapis.com/auth/tasks", "https://www.googleapis.com/auth/tasks.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "maxResults": {"format": "int64", "type": "string", "location": "query"}}, "response": {"$ref": "TaskLists"}, "httpMethod": "GET", "path": "users/@me/lists", "id": "tasks.tasklists.list"}, "update": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "TaskList"}, "id": "tasks.tasklists.update", "httpMethod": "PUT", "path": "users/@me/lists/{tasklist}", "response": {"$ref": "TaskList"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "TaskList"}, "id": "tasks.tasklists.patch", "httpMethod": "PATCH", "path": "users/@me/lists/{tasklist}", "response": {"$ref": "TaskList"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "users/@me/lists/{tasklist}", "id": "tasks.tasklists.delete"}}}', true)); + } +} + +class Task extends apiModel { + public $status; + public $kind; + public $updated; + public $parent; + protected $__linksType = 'TaskLinks'; + protected $__linksDataType = 'array'; + public $links; + public $title; + public $deleted; + public $completed; + public $due; + public $etag; + public $notes; + public $position; + public $hidden; + public $id; + public $selfLink; + public function setStatus($status) { + $this->status = $status; + } + public function getStatus() { + return $this->status; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setUpdated($updated) { + $this->updated = $updated; + } + public function getUpdated() { + return $this->updated; + } + public function setParent($parent) { + $this->parent = $parent; + } + public function getParent() { + return $this->parent; + } + public function setLinks(/* array(TaskLinks) */ $links) { + $this->assertIsArray($links, 'TaskLinks', __METHOD__); + $this->links = $links; + } + public function getLinks() { + return $this->links; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } + public function setDeleted($deleted) { + $this->deleted = $deleted; + } + public function getDeleted() { + return $this->deleted; + } + public function setCompleted($completed) { + $this->completed = $completed; + } + public function getCompleted() { + return $this->completed; + } + public function setDue($due) { + $this->due = $due; + } + public function getDue() { + return $this->due; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setNotes($notes) { + $this->notes = $notes; + } + public function getNotes() { + return $this->notes; + } + public function setPosition($position) { + $this->position = $position; + } + public function getPosition() { + return $this->position; + } + public function setHidden($hidden) { + $this->hidden = $hidden; + } + public function getHidden() { + return $this->hidden; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } +} + +class TaskLinks extends apiModel { + public $type; + public $link; + public $description; + public function setType($type) { + $this->type = $type; + } + public function getType() { + return $this->type; + } + public function setLink($link) { + $this->link = $link; + } + public function getLink() { + return $this->link; + } + public function setDescription($description) { + $this->description = $description; + } + public function getDescription() { + return $this->description; + } +} + +class TaskList extends apiModel { + public $kind; + public $etag; + public $id; + public $selfLink; + public $title; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } + public function setSelfLink($selfLink) { + $this->selfLink = $selfLink; + } + public function getSelfLink() { + return $this->selfLink; + } + public function setTitle($title) { + $this->title = $title; + } + public function getTitle() { + return $this->title; + } +} + +class TaskLists extends apiModel { + public $nextPageToken; + protected $__itemsType = 'TaskList'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $etag; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(TaskList) */ $items) { + $this->assertIsArray($items, 'TaskList', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } +} + +class Tasks extends apiModel { + public $nextPageToken; + protected $__itemsType = 'Task'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $etag; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(Task) */ $items) { + $this->assertIsArray($items, 'Task', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setEtag($etag) { + $this->etag = $etag; + } + public function getEtag() { + return $this->etag; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiTranslateService.php b/inc/vendors/social-login/Google/contrib/apiTranslateService.php new file mode 100755 index 00000000..d3816466 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiTranslateService.php @@ -0,0 +1,242 @@ + + * $translateService = new apiTranslateService(...); + * $languages = $translateService->languages; + * + */ + class LanguagesServiceResource extends apiServiceResource { + + + /** + * List the source/target languages supported by the API (languages.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string target the language and collation in which the localized results should be returned + * @return LanguagesListResponse + */ + public function listLanguages($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new LanguagesListResponse($data); + } else { + return $data; + } + } + } + + /** + * The "detections" collection of methods. + * Typical usage is: + * + * $translateService = new apiTranslateService(...); + * $detections = $translateService->detections; + * + */ + class DetectionsServiceResource extends apiServiceResource { + + + /** + * Detect the language of text. (detections.list) + * @param string $q The text to detect + * @return DetectionsListResponse + */ + public function listDetections($q, $optParams = array()) { + $params = array('q' => $q); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new DetectionsListResponse($data); + } else { + return $data; + } + } + } + + /** + * The "translations" collection of methods. + * Typical usage is: + * + * $translateService = new apiTranslateService(...); + * $translations = $translateService->translations; + * + */ + class TranslationsServiceResource extends apiServiceResource { + + + /** + * Returns text translations from one language to another. (translations.list) + * @param string $q The text to translate + * @param string $target The target language into which the text should be translated + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string source The source language of the text + * @opt_param string format The format of the text + * @opt_param string cid The customization id for translate + * @return TranslationsListResponse + */ + public function listTranslations($q, $target, $optParams = array()) { + $params = array('q' => $q, 'target' => $target); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new TranslationsListResponse($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Translate (v2). + *

              + * Lets you translate text from one language to another + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiTranslateService extends apiService { + public $languages; + public $detections; + public $translations; + /** + * Constructs the internal representation of the Translate service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/language/translate/'; + $this->version = 'v2'; + $this->serviceName = 'translate'; + + $apiClient->addService($this->serviceName, $this->version); + $this->languages = new LanguagesServiceResource($this, $this->serviceName, 'languages', json_decode('{"methods": {"list": {"parameters": {"target": {"type": "string", "location": "query"}}, "id": "language.languages.list", "httpMethod": "GET", "path": "v2/languages", "response": {"$ref": "LanguagesListResponse"}}}}', true)); + $this->detections = new DetectionsServiceResource($this, $this->serviceName, 'detections', json_decode('{"methods": {"list": {"parameters": {"q": {"repeated": true, "required": true, "type": "string", "location": "query"}}, "id": "language.detections.list", "httpMethod": "GET", "path": "v2/detect", "response": {"$ref": "DetectionsListResponse"}}}}', true)); + $this->translations = new TranslationsServiceResource($this, $this->serviceName, 'translations', json_decode('{"methods": {"list": {"parameters": {"q": {"repeated": true, "required": true, "type": "string", "location": "query"}, "source": {"type": "string", "location": "query"}, "cid": {"repeated": true, "type": "string", "location": "query"}, "target": {"required": true, "type": "string", "location": "query"}, "format": {"enum": ["html", "text"], "type": "string", "location": "query"}}, "id": "language.translations.list", "httpMethod": "GET", "path": "v2", "response": {"$ref": "TranslationsListResponse"}}}}', true)); + } +} + +class DetectionsListResponse extends apiModel { + protected $__detectionsType = 'DetectionsResourceItems'; + protected $__detectionsDataType = 'array'; + public $detections; + public function setDetections(/* array(DetectionsResourceItems) */ $detections) { + $this->assertIsArray($detections, 'DetectionsResourceItems', __METHOD__); + $this->detections = $detections; + } + public function getDetections() { + return $this->detections; + } +} + +class DetectionsResource extends apiModel { +} + +class DetectionsResourceItems extends apiModel { + public $isReliable; + public $confidence; + public $language; + public function setIsReliable($isReliable) { + $this->isReliable = $isReliable; + } + public function getIsReliable() { + return $this->isReliable; + } + public function setConfidence($confidence) { + $this->confidence = $confidence; + } + public function getConfidence() { + return $this->confidence; + } + public function setLanguage($language) { + $this->language = $language; + } + public function getLanguage() { + return $this->language; + } +} + +class LanguagesListResponse extends apiModel { + protected $__languagesType = 'LanguagesResource'; + protected $__languagesDataType = 'array'; + public $languages; + public function setLanguages(/* array(LanguagesResource) */ $languages) { + $this->assertIsArray($languages, 'LanguagesResource', __METHOD__); + $this->languages = $languages; + } + public function getLanguages() { + return $this->languages; + } +} + +class LanguagesResource extends apiModel { + public $name; + public $language; + public function setName($name) { + $this->name = $name; + } + public function getName() { + return $this->name; + } + public function setLanguage($language) { + $this->language = $language; + } + public function getLanguage() { + return $this->language; + } +} + +class TranslationsListResponse extends apiModel { + protected $__translationsType = 'TranslationsResource'; + protected $__translationsDataType = 'array'; + public $translations; + public function setTranslations(/* array(TranslationsResource) */ $translations) { + $this->assertIsArray($translations, 'TranslationsResource', __METHOD__); + $this->translations = $translations; + } + public function getTranslations() { + return $this->translations; + } +} + +class TranslationsResource extends apiModel { + public $detectedSourceLanguage; + public $translatedText; + public function setDetectedSourceLanguage($detectedSourceLanguage) { + $this->detectedSourceLanguage = $detectedSourceLanguage; + } + public function getDetectedSourceLanguage() { + return $this->detectedSourceLanguage; + } + public function setTranslatedText($translatedText) { + $this->translatedText = $translatedText; + } + public function getTranslatedText() { + return $this->translatedText; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiUrlshortenerService.php b/inc/vendors/social-login/Google/contrib/apiUrlshortenerService.php new file mode 100755 index 00000000..dfbb7a57 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiUrlshortenerService.php @@ -0,0 +1,320 @@ + + * $urlshortenerService = new apiUrlshortenerService(...); + * $url = $urlshortenerService->url; + * + */ + class UrlServiceResource extends apiServiceResource { + + + /** + * Creates a new short URL. (url.insert) + * @param Url $postBody + * @return Url + */ + public function insert(Url $postBody, $optParams = array()) { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + $data = $this->__call('insert', array($params)); + if ($this->useObjects()) { + return new Url($data); + } else { + return $data; + } + } + /** + * Retrieves a list of URLs shortened by a user. (url.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string start-token Token for requesting successive pages of results. + * @opt_param string projection Additional information to return. + * @return UrlHistory + */ + public function listUrl($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new UrlHistory($data); + } else { + return $data; + } + } + /** + * Expands a short URL or gets creation time and analytics. (url.get) + * @param string $shortUrl The short URL, including the protocol. + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string projection Additional information to return. + * @return Url + */ + public function get($shortUrl, $optParams = array()) { + $params = array('shortUrl' => $shortUrl); + $params = array_merge($params, $optParams); + $data = $this->__call('get', array($params)); + if ($this->useObjects()) { + return new Url($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Urlshortener (v1). + *

              + * Lets you create, inspect, and manage goo.gl short URLs + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiUrlshortenerService extends apiService { + public $url; + /** + * Constructs the internal representation of the Urlshortener service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/urlshortener/v1/'; + $this->version = 'v1'; + $this->serviceName = 'urlshortener'; + + $apiClient->addService($this->serviceName, $this->version); + $this->url = new UrlServiceResource($this, $this->serviceName, 'url', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/urlshortener"], "request": {"$ref": "Url"}, "response": {"$ref": "Url"}, "httpMethod": "POST", "path": "url", "id": "urlshortener.url.insert"}, "list": {"scopes": ["https://www.googleapis.com/auth/urlshortener"], "parameters": {"start-token": {"type": "string", "location": "query"}, "projection": {"enum": ["ANALYTICS_CLICKS", "FULL"], "type": "string", "location": "query"}}, "response": {"$ref": "UrlHistory"}, "httpMethod": "GET", "path": "url/history", "id": "urlshortener.url.list"}, "get": {"parameters": {"shortUrl": {"required": true, "type": "string", "location": "query"}, "projection": {"enum": ["ANALYTICS_CLICKS", "ANALYTICS_TOP_STRINGS", "FULL"], "type": "string", "location": "query"}}, "id": "urlshortener.url.get", "httpMethod": "GET", "path": "url", "response": {"$ref": "Url"}}}}', true)); + } +} + +class AnalyticsSnapshot extends apiModel { + public $shortUrlClicks; + protected $__countriesType = 'StringCount'; + protected $__countriesDataType = 'array'; + public $countries; + protected $__platformsType = 'StringCount'; + protected $__platformsDataType = 'array'; + public $platforms; + protected $__browsersType = 'StringCount'; + protected $__browsersDataType = 'array'; + public $browsers; + protected $__referrersType = 'StringCount'; + protected $__referrersDataType = 'array'; + public $referrers; + public $longUrlClicks; + public function setShortUrlClicks($shortUrlClicks) { + $this->shortUrlClicks = $shortUrlClicks; + } + public function getShortUrlClicks() { + return $this->shortUrlClicks; + } + public function setCountries(/* array(StringCount) */ $countries) { + $this->assertIsArray($countries, 'StringCount', __METHOD__); + $this->countries = $countries; + } + public function getCountries() { + return $this->countries; + } + public function setPlatforms(/* array(StringCount) */ $platforms) { + $this->assertIsArray($platforms, 'StringCount', __METHOD__); + $this->platforms = $platforms; + } + public function getPlatforms() { + return $this->platforms; + } + public function setBrowsers(/* array(StringCount) */ $browsers) { + $this->assertIsArray($browsers, 'StringCount', __METHOD__); + $this->browsers = $browsers; + } + public function getBrowsers() { + return $this->browsers; + } + public function setReferrers(/* array(StringCount) */ $referrers) { + $this->assertIsArray($referrers, 'StringCount', __METHOD__); + $this->referrers = $referrers; + } + public function getReferrers() { + return $this->referrers; + } + public function setLongUrlClicks($longUrlClicks) { + $this->longUrlClicks = $longUrlClicks; + } + public function getLongUrlClicks() { + return $this->longUrlClicks; + } +} + +class AnalyticsSummary extends apiModel { + protected $__weekType = 'AnalyticsSnapshot'; + protected $__weekDataType = ''; + public $week; + protected $__allTimeType = 'AnalyticsSnapshot'; + protected $__allTimeDataType = ''; + public $allTime; + protected $__twoHoursType = 'AnalyticsSnapshot'; + protected $__twoHoursDataType = ''; + public $twoHours; + protected $__dayType = 'AnalyticsSnapshot'; + protected $__dayDataType = ''; + public $day; + protected $__monthType = 'AnalyticsSnapshot'; + protected $__monthDataType = ''; + public $month; + public function setWeek(AnalyticsSnapshot $week) { + $this->week = $week; + } + public function getWeek() { + return $this->week; + } + public function setAllTime(AnalyticsSnapshot $allTime) { + $this->allTime = $allTime; + } + public function getAllTime() { + return $this->allTime; + } + public function setTwoHours(AnalyticsSnapshot $twoHours) { + $this->twoHours = $twoHours; + } + public function getTwoHours() { + return $this->twoHours; + } + public function setDay(AnalyticsSnapshot $day) { + $this->day = $day; + } + public function getDay() { + return $this->day; + } + public function setMonth(AnalyticsSnapshot $month) { + $this->month = $month; + } + public function getMonth() { + return $this->month; + } +} + +class StringCount extends apiModel { + public $count; + public $id; + public function setCount($count) { + $this->count = $count; + } + public function getCount() { + return $this->count; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class Url extends apiModel { + public $status; + public $kind; + public $created; + protected $__analyticsType = 'AnalyticsSummary'; + protected $__analyticsDataType = ''; + public $analytics; + public $longUrl; + public $id; + public function setStatus($status) { + $this->status = $status; + } + public function getStatus() { + return $this->status; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setCreated($created) { + $this->created = $created; + } + public function getCreated() { + return $this->created; + } + public function setAnalytics(AnalyticsSummary $analytics) { + $this->analytics = $analytics; + } + public function getAnalytics() { + return $this->analytics; + } + public function setLongUrl($longUrl) { + $this->longUrl = $longUrl; + } + public function getLongUrl() { + return $this->longUrl; + } + public function setId($id) { + $this->id = $id; + } + public function getId() { + return $this->id; + } +} + +class UrlHistory extends apiModel { + public $nextPageToken; + protected $__itemsType = 'Url'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public $itemsPerPage; + public $totalItems; + public function setNextPageToken($nextPageToken) { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() { + return $this->nextPageToken; + } + public function setItems(/* array(Url) */ $items) { + $this->assertIsArray($items, 'Url', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setItemsPerPage($itemsPerPage) { + $this->itemsPerPage = $itemsPerPage; + } + public function getItemsPerPage() { + return $this->itemsPerPage; + } + public function setTotalItems($totalItems) { + $this->totalItems = $totalItems; + } + public function getTotalItems() { + return $this->totalItems; + } +} diff --git a/inc/vendors/social-login/Google/contrib/apiWebfontsService.php b/inc/vendors/social-login/Google/contrib/apiWebfontsService.php new file mode 100755 index 00000000..bd89de02 --- /dev/null +++ b/inc/vendors/social-login/Google/contrib/apiWebfontsService.php @@ -0,0 +1,129 @@ + + * $webfontsService = new apiWebfontsService(...); + * $webfonts = $webfontsService->webfonts; + * + */ + class WebfontsServiceResource extends apiServiceResource { + + + /** + * Retrieves the list of fonts currently served by the Google Web Fonts Developer API + * (webfonts.list) + * @param array $optParams Optional parameters. Valid optional parameters are listed below. + * @opt_param string sort Enables sorting of the list + * @return WebfontList + */ + public function listWebfonts($optParams = array()) { + $params = array(); + $params = array_merge($params, $optParams); + $data = $this->__call('list', array($params)); + if ($this->useObjects()) { + return new WebfontList($data); + } else { + return $data; + } + } + } + + + +/** + * Service definition for Webfonts (v1). + *

              + * The Google Web Fonts Developer API. + *

              + *

              + * For more information about this service, see the + * API Documentation + *

              + * @author Google, Inc. + */ +class apiWebfontsService extends apiService { + public $webfonts; + /** + * Constructs the internal representation of the Webfonts service. + * @param apiClient apiClient + */ + public function __construct(apiClient $apiClient) { + $this->rpcPath = '/rpc'; + $this->restBasePath = '/webfonts/v1/'; + $this->version = 'v1'; + $this->serviceName = 'webfonts'; + + $apiClient->addService($this->serviceName, $this->version); + $this->webfonts = new WebfontsServiceResource($this, $this->serviceName, 'webfonts', json_decode('{"methods": {"list": {"parameters": {"sort": {"enum": ["alpha", "date", "popularity", "style", "trending"], "type": "string", "location": "query"}}, "id": "webfonts.webfonts.list", "httpMethod": "GET", "path": "webfonts", "response": {"$ref": "WebfontList"}}}}', true)); + } +} + +class Webfont extends apiModel { + public $kind; + public $variants; + public $subsets; + public $family; + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } + public function setVariants($variants) { + $this->variants = $variants; + } + public function getVariants() { + return $this->variants; + } + public function setSubsets($subsets) { + $this->subsets = $subsets; + } + public function getSubsets() { + return $this->subsets; + } + public function setFamily($family) { + $this->family = $family; + } + public function getFamily() { + return $this->family; + } +} + +class WebfontList extends apiModel { + protected $__itemsType = 'Webfont'; + protected $__itemsDataType = 'array'; + public $items; + public $kind; + public function setItems(/* array(Webfont) */ $items) { + $this->assertIsArray($items, 'Webfont', __METHOD__); + $this->items = $items; + } + public function getItems() { + return $this->items; + } + public function setKind($kind) { + $this->kind = $kind; + } + public function getKind() { + return $this->kind; + } +} diff --git a/inc/vendors/social-login/Google/external/OAuth.php b/inc/vendors/social-login/Google/external/OAuth.php new file mode 100755 index 00000000..08e6f9fe --- /dev/null +++ b/inc/vendors/social-login/Google/external/OAuth.php @@ -0,0 +1,482 @@ +key = $key; + $this->secret = $secret; + $this->callback_url = $callback_url; + } +} + +class apiClientOAuthToken { + // access tokens and request tokens + public $key; + public $secret; + + /** + * key = the token + * secret = the token secret + */ + function __construct($key, $secret) { + $this->key = $key; + $this->secret = $secret; + } + + /** + * generates the basic string serialization of a token that a server + * would respond to request_token and access_token calls with + */ + function to_string() { + return "oauth_token=" . apiClientOAuthUtil::urlencodeRFC3986($this->key) . + "&oauth_token_secret=" . apiClientOAuthUtil::urlencodeRFC3986($this->secret); + } + + function __toString() { + return $this->to_string(); + } +} + +class apiClientOAuthSignatureMethod { + public function check_signature(&$request, $consumer, $token, $signature) { + $built = $this->build_signature($request, $consumer, $token); + return $built == $signature; + } +} + +class apiClientOAuthSignatureMethod_HMAC_SHA1 extends apiClientOAuthSignatureMethod { + function get_name() { + return "HMAC-SHA1"; + } + + public function build_signature($request, $consumer, $token, $privKey=NULL) { + $base_string = $request->get_signature_base_string(); + $request->base_string = $base_string; + + $key_parts = array( + $consumer->secret, + ($token) ? $token->secret : "" + ); + + $key_parts = array_map(array('apiClientOAuthUtil','urlencodeRFC3986'), $key_parts); + $key = implode('&', $key_parts); + + return base64_encode( hash_hmac('sha1', $base_string, $key, true)); + } +} + +class apiClientOAuthSignatureMethod_RSA_SHA1 extends apiClientOAuthSignatureMethod { + public function get_name() { + return "RSA-SHA1"; + } + + protected function fetch_public_cert(&$request) { + // not implemented yet, ideas are: + // (1) do a lookup in a table of trusted certs keyed off of consumer + // (2) fetch via http using a url provided by the requester + // (3) some sort of specific discovery code based on request + // + // either way should return a string representation of the certificate + throw Exception("fetch_public_cert not implemented"); + } + + protected function fetch_private_cert($privKey) {//&$request) { + // not implemented yet, ideas are: + // (1) do a lookup in a table of trusted certs keyed off of consumer + // + // either way should return a string representation of the certificate + throw Exception("fetch_private_cert not implemented"); + } + + public function build_signature(&$request, $consumer, $token, $privKey) { + $base_string = $request->get_signature_base_string(); + + // Fetch the private key cert based on the request + //$cert = $this->fetch_private_cert($consumer->privKey); + + //Pull the private key ID from the certificate + //$privatekeyid = openssl_get_privatekey($cert); + + // hacked in + if ($privKey == '') { + $fp = fopen($GLOBALS['PRIV_KEY_FILE'], "r"); + $privKey = fread($fp, 8192); + fclose($fp); + } + $privatekeyid = openssl_get_privatekey($privKey); + + //Check the computer signature against the one passed in the query + $ok = openssl_sign($base_string, $signature, $privatekeyid); + + //Release the key resource + openssl_free_key($privatekeyid); + + return base64_encode($signature); + } + + public function check_signature(&$request, $consumer, $token, $signature) { + $decoded_sig = base64_decode($signature); + + $base_string = $request->get_signature_base_string(); + + // Fetch the public key cert based on the request + $cert = $this->fetch_public_cert($request); + + //Pull the public key ID from the certificate + $publickeyid = openssl_get_publickey($cert); + + //Check the computer signature against the one passed in the query + $ok = openssl_verify($base_string, $decoded_sig, $publickeyid); + + //Release the key resource + openssl_free_key($publickeyid); + + return $ok == 1; + } +} + +class apiClientOAuthRequest { + private $parameters; + private $http_method; + private $http_url; + // for debug purposes + public $base_string; + public static $version = '1.0'; + + function __construct($http_method, $http_url, $parameters=NULL) { + @$parameters or $parameters = array(); + $this->parameters = $parameters; + $this->http_method = $http_method; + $this->http_url = $http_url; + } + + + /** + * attempt to build up a request from what was passed to the server + */ + public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) { + $scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") ? 'http' : 'https'; + @$http_url or $http_url = $scheme . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; + @$http_method or $http_method = $_SERVER['REQUEST_METHOD']; + + $request_headers = apiClientOAuthRequest::get_headers(); + + // let the library user override things however they'd like, if they know + // which parameters to use then go for it, for example XMLRPC might want to + // do this + if ($parameters) { + $req = new apiClientOAuthRequest($http_method, $http_url, $parameters); + } + // next check for the auth header, we need to do some extra stuff + // if that is the case, namely suck in the parameters from GET or POST + // so that we can include them in the signature + else if (@substr($request_headers['Authorization'], 0, 5) == "OAuth") { + $header_parameters = apiClientOAuthRequest::split_header($request_headers['Authorization']); + if ($http_method == "GET") { + $req_parameters = $_GET; + } + else if ($http_method = "POST") { + $req_parameters = $_POST; + } + $parameters = array_merge($header_parameters, $req_parameters); + $req = new apiClientOAuthRequest($http_method, $http_url, $parameters); + } + else if ($http_method == "GET") { + $req = new apiClientOAuthRequest($http_method, $http_url, $_GET); + } + else if ($http_method == "POST") { + $req = new apiClientOAuthRequest($http_method, $http_url, $_POST); + } + return $req; + } + + /** + * pretty much a helper function to set up the request + */ + public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) { + @$parameters or $parameters = array(); + $defaults = array("oauth_version" => apiClientOAuthRequest::$version, + "oauth_nonce" => apiClientOAuthRequest::generate_nonce(), + "oauth_timestamp" => apiClientOAuthRequest::generate_timestamp(), + "oauth_consumer_key" => $consumer->key); + $parameters = array_merge($defaults, $parameters); + + if ($token) { + $parameters['oauth_token'] = $token->key; + } + + // oauth v1.0a + /*if (isset($_REQUEST['oauth_verifier'])) { + $parameters['oauth_verifier'] = $_REQUEST['oauth_verifier']; + }*/ + + + return new apiClientOAuthRequest($http_method, $http_url, $parameters); + } + + public function set_parameter($name, $value) { + $this->parameters[$name] = $value; + } + + public function get_parameter($name) { + return $this->parameters[$name]; + } + + public function get_parameters() { + return $this->parameters; + } + + /** + * Returns the normalized parameters of the request + * This will be all (except oauth_signature) parameters, + * sorted first by key, and if duplicate keys, then by + * value. + * The returned string will be all the key=value pairs + * concated by &. + * @return string + */ + public function get_signable_parameters() { + // Grab all parameters + $params = $this->parameters; + + // Remove oauth_signature if present + if (isset($params['oauth_signature'])) { + unset($params['oauth_signature']); + } + + // Urlencode both keys and values + $keys = array_map(array('apiClientOAuthUtil', 'urlencodeRFC3986'), array_keys($params)); + $values = array_map(array('apiClientOAuthUtil', 'urlencodeRFC3986'), array_values($params)); + $params = array_combine($keys, $values); + + // Sort by keys (natsort) + uksort($params, 'strnatcmp'); + +if(isset($params['title']) && isset($params['title-exact'])) { + $temp = $params['title-exact']; + $title = $params['title']; + + unset($params['title']); + unset($params['title-exact']); + + $params['title-exact'] = $temp; + $params['title'] = $title; +} + + // Generate key=value pairs + $pairs = array(); + foreach ($params as $key=>$value ) { + if (is_array($value)) { + // If the value is an array, it's because there are multiple + // with the same key, sort them, then add all the pairs + natsort($value); + foreach ($value as $v2) { + $pairs[] = $key . '=' . $v2; + } + } else { + $pairs[] = $key . '=' . $value; + } + } + + // Return the pairs, concated with & + return implode('&', $pairs); + } + + /** + * Returns the base string of this request + * The base string defined as the method, the url + * and the parameters (normalized), each urlencoded + * and the concated with &. + */ + public function get_signature_base_string() { + $parts = array( + $this->get_normalized_http_method(), + $this->get_normalized_http_url(), + $this->get_signable_parameters() + ); + + $parts = array_map(array('apiClientOAuthUtil', 'urlencodeRFC3986'), $parts); + + return implode('&', $parts); + } + + /** + * just uppercases the http method + */ + public function get_normalized_http_method() { + return strtoupper($this->http_method); + } + + /** + * parses the url and rebuilds it to be + * scheme://host/path + */ + public function get_normalized_http_url() { + $parts = parse_url($this->http_url); + + // FIXME: port should handle according to http://groups.google.com/group/oauth/browse_thread/thread/1b203a51d9590226 + $port = (isset($parts['port']) && $parts['port'] != '80') ? ':' . $parts['port'] : ''; + $path = (isset($parts['path'])) ? $parts['path'] : ''; + + return $parts['scheme'] . '://' . $parts['host'] . $port . $path; + } + + /** + * builds a url usable for a GET request + */ + public function to_url() { + $out = $this->get_normalized_http_url() . "?"; + $out .= $this->to_postdata(); + return $out; + } + + /** + * builds the data one would send in a POST request + */ + public function to_postdata() { + $total = array(); + foreach ($this->parameters as $k => $v) { + $total[] = apiClientOAuthUtil::urlencodeRFC3986($k) . "=" . apiClientOAuthUtil::urlencodeRFC3986($v); + } + $out = implode("&", $total); + return $out; + } + + /** + * builds the Authorization: header + */ + public function to_header() { + $out ='Authorization: OAuth '; + $total = array(); + foreach ($this->parameters as $k => $v) { + if (substr($k, 0, 5) != "oauth") continue; + $out .= apiClientOAuthUtil::urlencodeRFC3986($k) . '="' . apiClientOAuthUtil::urlencodeRFC3986($v) . '", '; + } + $out = substr_replace($out, '', strlen($out) - 2); + return $out; + } + + public function __toString() { + return $this->to_url(); + } + + + public function sign_request($signature_method, $consumer, $token, $privKey=NULL) { + $this->set_parameter("oauth_signature_method", $signature_method->get_name()); + $signature = $this->build_signature($signature_method, $consumer, $token, $privKey); + $this->set_parameter("oauth_signature", $signature); + } + + public function build_signature($signature_method, $consumer, $token, $privKey=NULL) { + $signature = $signature_method->build_signature($this, $consumer, $token, $privKey); + return $signature; + } + + /** + * util function: current timestamp + */ + private static function generate_timestamp() { + return time(); + } + + /** + * util function: current nonce + */ + private static function generate_nonce() { + $mt = microtime(); + $rand = mt_rand(); + + return md5($mt . $rand); // md5s look nicer than numbers + } + + /** + * util function for turning the Authorization: header into + * parameters, has to do some unescaping + */ + private static function split_header($header) { + // this should be a regex + // error cases: commas in parameter values + $parts = explode(",", $header); + $out = array(); + foreach ($parts as $param) { + $param = ltrim($param); + // skip the "realm" param, nobody ever uses it anyway + if (substr($param, 0, 5) != "oauth") continue; + + $param_parts = explode("=", $param); + + // rawurldecode() used because urldecode() will turn a "+" in the + // value into a space + $out[$param_parts[0]] = rawurldecode(substr($param_parts[1], 1, -1)); + } + return $out; + } + + /** + * helper to try to sort out headers for people who aren't running apache + */ + private static function get_headers() { + if (function_exists('apache_request_headers')) { + // we need this to get the actual Authorization: header + // because apache tends to tell us it doesn't exist + return apache_request_headers(); + } + // otherwise we don't have apache and are just going to have to hope + // that $_SERVER actually contains what we need + $out = array(); + foreach ($_SERVER as $key => $value) { + if (substr($key, 0, 5) == "HTTP_") { + // this is chaos, basically it is just there to capitalize the first + // letter of every word that is not an initial HTTP and strip HTTP + // code from przemek + $key = str_replace(" ", "-", ucwords(strtolower(str_replace("_", " ", substr($key, 5))))); + $out[$key] = $value; + } + } + return $out; + } +} + +class apiClientOAuthDataStore { + function lookup_consumer($consumer_key) { + // implement me + } + + function lookup_token($consumer, $token_type, $token) { + // implement me + } + + function lookup_nonce($consumer, $token, $nonce, $timestamp) { + // implement me + } + + function fetch_request_token($consumer) { + // return a new token attached to this consumer + } + + function fetch_access_token($token, $consumer) { + // return a new access token attached to this consumer + // for the user associated with this token if the request token + // is authorized + // should also invalidate the request token + } + +} + +class apiClientOAuthUtil { + public static function urlencodeRFC3986($string) { + return str_replace('%7E', '~', rawurlencode($string)); + } + + public static function urldecodeRFC3986($string) { + return rawurldecode($string); + } +} diff --git a/inc/vendors/social-login/Google/external/URITemplateParser.php b/inc/vendors/social-login/Google/external/URITemplateParser.php new file mode 100755 index 00000000..594adbb1 --- /dev/null +++ b/inc/vendors/social-login/Google/external/URITemplateParser.php @@ -0,0 +1,209 @@ +template = $template; + } + + public function expand($data) { + // Modification to make this a bit more performant (since gettype is very slow) + if (! is_array($data)) { + $data = (array)$data; + } + /* + // Original code, which uses a slow gettype() statement, kept in place for if the assumption that is_array always works here is incorrect + switch (gettype($data)) { + case "boolean": + case "integer": + case "double": + case "string": + case "object": + $data = (array)$data; + break; + } +*/ + + // Resolve template vars + preg_match_all('/\{([^\}]*)\}/', $this->template, $em); + + foreach ($em[1] as $i => $bare_expression) { + preg_match('/^([\+\;\?\/\.]{1})?(.*)$/', $bare_expression, $lm); + $exp = new StdClass(); + $exp->expression = $em[0][$i]; + $exp->operator = $lm[1]; + $exp->variable_list = $lm[2]; + $exp->varspecs = explode(',', $exp->variable_list); + $exp->vars = array(); + foreach ($exp->varspecs as $varspec) { + preg_match('/^([a-zA-Z0-9_]+)([\*\+]{1})?([\:\^][0-9-]+)?(\=[^,]+)?$/', $varspec, $vm); + $var = new StdClass(); + $var->name = $vm[1]; + $var->modifier = isset($vm[2]) && $vm[2] ? $vm[2] : null; + $var->modifier = isset($vm[3]) && $vm[3] ? $vm[3] : $var->modifier; + $var->default = isset($vm[4]) ? substr($vm[4], 1) : null; + $exp->vars[] = $var; + } + + // Add processing flags + $exp->reserved = false; + $exp->prefix = ''; + $exp->delimiter = ','; + switch ($exp->operator) { + case '+': + $exp->reserved = 'true'; + break; + case ';': + $exp->prefix = ';'; + $exp->delimiter = ';'; + break; + case '?': + $exp->prefix = '?'; + $exp->delimiter = '&'; + break; + case '/': + $exp->prefix = '/'; + $exp->delimiter = '/'; + break; + case '.': + $exp->prefix = '.'; + $exp->delimiter = '.'; + break; + } + $expressions[] = $exp; + } + + // Expansion + $this->expansion = $this->template; + + foreach ($expressions as $exp) { + $part = $exp->prefix; + $exp->one_var_defined = false; + foreach ($exp->vars as $var) { + $val = ''; + if ($exp->one_var_defined && isset($data[$var->name])) { + $part .= $exp->delimiter; + } + // Variable present + if (isset($data[$var->name])) { + $exp->one_var_defined = true; + $var->data = $data[$var->name]; + + $val = self::val_from_var($var, $exp); + + // Variable missing + } else { + if ($var->default) { + $exp->one_var_defined = true; + $val = $var->default; + } + } + $part .= $val; + } + if (! $exp->one_var_defined) $part = ''; + $this->expansion = str_replace($exp->expression, $part, $this->expansion); + } + + return $this->expansion; + } + + private function val_from_var($var, $exp) { + $val = ''; + if (is_array($var->data)) { + $i = 0; + if ($exp->operator == '?' && ! $var->modifier) { + $val .= $var->name . '='; + } + foreach ($var->data as $k => $v) { + $del = $var->modifier ? $exp->delimiter : ','; + $ek = rawurlencode($k); + $ev = rawurlencode($v); + + // Array + if ($k !== $i) { + if ($var->modifier == '+') { + $val .= $var->name . '.'; + } + if ($exp->operator == '?' && $var->modifier || $exp->operator == ';' && $var->modifier == '*' || $exp->operator == ';' && $var->modifier == '+') { + $val .= $ek . '='; + } else { + $val .= $ek . $del; + } + + // List + } else { + if ($var->modifier == '+') { + if ($exp->operator == ';' && $var->modifier == '*' || $exp->operator == ';' && $var->modifier == '+' || $exp->operator == '?' && $var->modifier == '+') { + $val .= $var->name . '='; + } else { + $val .= $var->name . '.'; + } + } + } + $val .= $ev . $del; + $i ++; + } + $val = trim($val, $del); + + // Strings, numbers, etc. + } else { + if ($exp->operator == '?') { + $val = $var->name . (isset($var->data) ? '=' : ''); + } else if ($exp->operator == ';') { + $val = $var->name . ($var->data ? '=' : ''); + } + $val .= rawurlencode($var->data); + if ($exp->operator == '+') { + $val = str_replace(self::$reserved_pct, self::$reserved, $val); + } + } + return $val; + } + + public function match($uri) {} + + public function __toString() { + return $this->template; + } +} diff --git a/inc/vendors/social-login/Google/index.html b/inc/vendors/social-login/Google/index.html new file mode 100755 index 00000000..e69de29b diff --git a/inc/vendors/social-login/Google/io/apiCacheParser.php b/inc/vendors/social-login/Google/io/apiCacheParser.php new file mode 100755 index 00000000..1800508b --- /dev/null +++ b/inc/vendors/social-login/Google/io/apiCacheParser.php @@ -0,0 +1,167 @@ + + */ +class apiCacheParser { + public static $CACHEABLE_HTTP_METHODS = array('GET', 'HEAD'); + public static $CACHEABLE_STATUS_CODES = array('200', '203', '300', '301'); + + private function __construct() {} + + /** + * Check if an HTTP request can be cached by a private local cache. + * @static + * @param apiHttpRequest $resp + * @return bool True if the request is cacheable. + * False if the request is uncacheable. + */ + public static function isRequestCacheable (apiHttpRequest $resp) { + $method = $resp->getRequestMethod(); + if (! in_array($method, self::$CACHEABLE_HTTP_METHODS)) { + return false; + } + + // Don't cache authorized requests/responses. + // [rfc2616-14.8] When a shared cache receives a request containing an + // Authorization field, it MUST NOT return the corresponding response + // as a reply to any other request... + if ($resp->getRequestHeader("authorization")) { + return false; + } + + return true; + } + + /** + * Check if an HTTP response can be cached by a private local cache. + * @static + * @param apiHttpRequest $resp + * @return bool True if the response is cacheable. + * False if the response is un-cacheable. + */ + public static function isResponseCacheable (apiHttpRequest $resp) { + // First, check if the HTTP request was cacheable before inspecting the + // HTTP response. + if (false == self::isRequestCacheable($resp)) { + return false; + } + + $code = $resp->getResponseHttpCode(); + if (! in_array($code, self::$CACHEABLE_STATUS_CODES)) { + return false; + } + + // The resource is uncacheable if the resource is already expired and + // the resource doesn't have an ETag for revalidation. + $etag = $resp->getResponseHeader("etag"); + if (self::isExpired($resp) && $etag == false) { + return false; + } + + // [rfc2616-14.9.2] If [no-store is] sent in a response, a cache MUST NOT + // store any part of either this response or the request that elicited it. + $cacheControl = $resp->getParsedCacheControl(); + if (isset($cacheControl['no-store'])) { + return false; + } + + // Pragma: no-cache is an http request directive, but is occasionally + // used as a response header incorrectly. + $pragma = $resp->getResponseHeader('pragma'); + if ($pragma == 'no-cache' || strpos($pragma, 'no-cache') !== false) { + return false; + } + + // [rfc2616-14.44] Vary: * is extremely difficult to cache. "It implies that + // a cache cannot determine from the request headers of a subsequent request + // whether this response is the appropriate representation." + // Given this, we deem responses with the Vary header as uncacheable. + $vary = $resp->getResponseHeader('vary'); + if ($vary) { + return false; + } + + return true; + } + + /** + * @static + * @param apiHttpRequest $resp + * @return bool True if the HTTP response is considered to be expired. + * False if it is considered to be fresh. + */ + public static function isExpired(apiHttpRequest $resp) { + // HTTP/1.1 clients and caches MUST treat other invalid date formats, + // especially including the value “0”, as in the past. + $parsedExpires = false; + $responseHeaders = $resp->getResponseHeaders(); + if (isset($responseHeaders['expires'])) { + $rawExpires = $responseHeaders['expires']; + // Check for a malformed expires header first. + if (empty($rawExpires) || (is_numeric($rawExpires) && $rawExpires <= 0)) { + return true; + } + + // See if we can parse the expires header. + $parsedExpires = strtotime($rawExpires); + if (false == $parsedExpires || $parsedExpires <= 0) { + return true; + } + } + + // Calculate the freshness of an http response. + $freshnessLifetime = false; + $cacheControl = $resp->getParsedCacheControl(); + if (isset($cacheControl['max-age'])) { + $freshnessLifetime = $cacheControl['max-age']; + } + + $rawDate = $resp->getResponseHeader('date'); + $parsedDate = strtotime($rawDate); + + if (empty($rawDate) || false == $parsedDate) { + $parsedDate = time(); + } + if (false == $freshnessLifetime && isset($responseHeaders['expires'])) { + $freshnessLifetime = $parsedExpires - $parsedDate; + } + + if (false == $freshnessLifetime) { + return true; + } + + // Calculate the age of an http response. + $age = max(0, time() - $parsedDate); + if (isset($responseHeaders['age'])) { + $age = max($age, strtotime($responseHeaders['age'])); + } + + return $freshnessLifetime <= $age; + } + + /** + * Determine if a cache entry should be revalidated with by the origin. + * @param apiHttpRequest $response + * @return bool True if the entry is expired, else return false. + */ + public static function mustRevalidate(apiHttpRequest $response) { + // [13.3] When a cache has a stale entry that it would like to use as a + // response to a client's request, it first has to check with the origin + // server to see if its cached entry is still usable. + return self::isExpired($response); + } +} \ No newline at end of file diff --git a/inc/vendors/social-login/Google/io/apiCurlIO.php b/inc/vendors/social-login/Google/io/apiCurlIO.php new file mode 100755 index 00000000..1befc3e4 --- /dev/null +++ b/inc/vendors/social-login/Google/io/apiCurlIO.php @@ -0,0 +1,248 @@ + + * @author Chirag Shah + */ + +require_once 'apiCacheParser.php'; + +class apiCurlIO implements apiIO { + const CONNECTION_ESTABLISHED = "HTTP/1.0 200 Connection established\r\n\r\n"; + const FORM_URLENCODED = 'application/x-www-form-urlencoded'; + + private static $ENTITY_HTTP_METHODS = array("POST" => null, "PUT" => null); + private static $HOP_BY_HOP = array( + 'connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', + 'te', 'trailers', 'transfer-encoding', 'upgrade'); + + private static $DEFAULT_CURL_PARAMS = array ( + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FOLLOWLOCATION => 0, + CURLOPT_FAILONERROR => false, + CURLOPT_SSL_VERIFYPEER => true, + CURLOPT_HEADER => true, + ); + + /** + * Perform an authenticated / signed apiHttpRequest. + * This function takes the apiHttpRequest, calls apiAuth->sign on it + * (which can modify the request in what ever way fits the auth mechanism) + * and then calls apiCurlIO::makeRequest on the signed request + * @param apiHttpRequest $request + * @return apiHttpRequest The resulting HTTP response including the + * responseHttpCode, responseHeaders and responseBody. + */ + public function authenticatedRequest(apiHttpRequest $request) { + $request = apiClient::$auth->sign($request); + return $this->makeRequest($request); + } + + /** + * Execute a apiHttpRequest + * @param apiHttpRequest $request the http request to be executed + * @return apiHttpRequest http request with the response http code, response + * headers and response body filled in + * @throws apiIOException on curl or IO error + */ + public function makeRequest(apiHttpRequest $request) { + // First, check to see if we have a valid cached version. + $cached = $this->getCachedRequest($request); + if ($cached !== false) { + if (apiCacheParser::mustRevalidate($cached)) { + $addHeaders = array(); + if ($cached->getResponseHeader('etag')) { + // [13.3.4] If an entity tag has been provided by the origin server, + // we must use that entity tag in any cache-conditional request. + $addHeaders['If-None-Match'] = $cached->getResponseHeader('etag'); + } elseif ($cached->getResponseHeader('date')) { + $addHeaders['If-Modified-Since'] = $cached->getResponseHeader('date'); + } + + $request->setRequestHeaders($addHeaders); + } else { + // No need to revalidate the request, return it directly + return $cached; + } + } + + if (array_key_exists($request->getRequestMethod(), + self::$ENTITY_HTTP_METHODS)) { + $request = $this->processEntityRequest($request); + } + + $ch = curl_init(); + curl_setopt_array($ch, self::$DEFAULT_CURL_PARAMS); + curl_setopt($ch, CURLOPT_URL, $request->getUrl()); + if ($request->getPostBody()) { + curl_setopt($ch, CURLOPT_POSTFIELDS, $request->getPostBody()); + } + + $requestHeaders = $request->getRequestHeaders(); + if ($requestHeaders && is_array($requestHeaders)) { + $parsed = array(); + foreach ($requestHeaders as $k => $v) { + $parsed[] = "$k: $v"; + } + curl_setopt($ch, CURLOPT_HTTPHEADER, $parsed); + } + + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $request->getRequestMethod()); + curl_setopt($ch, CURLOPT_USERAGENT, $request->getUserAgent()); + $respData = curl_exec($ch); + + // Retry if certificates are missing. + if (curl_errno($ch) == CURLE_SSL_CACERT) { + error_log('SSL certificate problem, verify that the CA cert is OK.' + . ' Retrying with the CA cert bundle from google-api-php-client.'); + curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacerts.pem'); + $respData = curl_exec($ch); + } + + $respHeaderSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); + $respHttpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curlErrorNum = curl_errno($ch); + $curlError = curl_error($ch); + curl_close($ch); + if ($curlErrorNum != CURLE_OK) { + throw new apiIOException("HTTP Error: ($respHttpCode) $curlError"); + } + + // Parse out the raw response into usable bits + list($responseHeaders, $responseBody) = + $this->parseHttpResponseBody($respData, $respHeaderSize); + + if ($respHttpCode == 304 && $cached) { + // If the server responded NOT_MODIFIED, return the cached request. + if (isset($responseHeaders['connection'])) { + $hopByHop = array_merge( + self::$HOP_BY_HOP, + explode(',', $responseHeaders['connection']) + ); + + $endToEnd = array(); + foreach($hopByHop as $key) { + if (isset($responseHeaders[$key])) { + $endToEnd[$key] = $responseHeaders[$key]; + } + } + $cached->setResponseHeaders($endToEnd); + } + return $cached; + } + + // Fill in the apiHttpRequest with the response values + $request->setResponseHttpCode($respHttpCode); + $request->setResponseHeaders($responseHeaders); + $request->setResponseBody($responseBody); + // Store the request in cache (the function checks to see if the request + // can actually be cached) + $this->setCachedRequest($request); + // And finally return it + return $request; + } + + /** + * @visible for testing. + * Cache the response to an HTTP request if it is cacheable. + * @param apiHttpRequest $request + * @return bool Returns true if the insertion was successful. + * Otherwise, return false. + */ + public function setCachedRequest(apiHttpRequest $request) { + // Determine if the request is cacheable. + if (apiCacheParser::isResponseCacheable($request)) { + apiClient::$cache->set($request->getCacheKey(), $request); + return true; + } + + return false; + } + + /** + * @visible for testing. + * @param apiHttpRequest $request + * @return apiHttpRequest|bool Returns the cached object or + * false if the operation was unsuccessful. + */ + public function getCachedRequest(apiHttpRequest $request) { + if (false == apiCacheParser::isRequestCacheable($request)) { + false; + } + + return apiClient::$cache->get($request->getCacheKey()); + } + + /** + * @param $respData + * @param $headerSize + * @return array + */ + public function parseHttpResponseBody($respData, $headerSize) { + if (stripos($respData, self::CONNECTION_ESTABLISHED) !== false) { + $respData = str_ireplace(self::CONNECTION_ESTABLISHED, '', $respData); + } + + $responseBody = substr($respData, $headerSize); + $responseHeaderLines = explode("\r\n", substr($respData, 0, $headerSize)); + $responseHeaders = array(); + + foreach ($responseHeaderLines as $headerLine) { + if ($headerLine && strpos($headerLine, ':') !== false) { + list($header, $value) = explode(': ', $headerLine, 2); + $header = strtolower($header); + if (isset($responseHeaders[$header])) { + $responseHeaders[$header] .= "\n" . $value; + } else { + $responseHeaders[$header] = $value; + } + } + } + + return array($responseHeaders, $responseBody); + } + + /** + * @visible for testing + * Process an http request that contains an enclosed entity. + * @param apiHttpRequest $request + * @return apiHttpRequest Processed request with the enclosed entity. + */ + public function processEntityRequest(apiHttpRequest $request) { + $postBody = $request->getPostBody(); + $contentType = $request->getRequestHeader("content-type"); + + // Set the default content-type as application/x-www-form-urlencoded. + if (false == $contentType) { + $contentType = self::FORM_URLENCODED; + $request->setRequestHeaders(array('content-type' => $contentType)); + } + + // Force the payload to match the content-type asserted in the header. + if ($contentType == self::FORM_URLENCODED && is_array($postBody)) { + $postBody = http_build_query($postBody, '', '&'); + $request->setPostBody($postBody); + } + + // Make sure the content-length header is set. + if (!$postBody || is_string($postBody)) { + $postsLength = strlen($postBody); + $request->setRequestHeaders(array('content-length' => $postsLength)); + } + + return $request; + } +} \ No newline at end of file diff --git a/inc/vendors/social-login/Google/io/apiHttpRequest.php b/inc/vendors/social-login/Google/io/apiHttpRequest.php new file mode 100755 index 00000000..c65086a8 --- /dev/null +++ b/inc/vendors/social-login/Google/io/apiHttpRequest.php @@ -0,0 +1,256 @@ + + * @author Chirag Shah + */ +class apiHttpRequest { + const USER_AGENT_SUFFIX = "google-api-php-client/0.5.0"; + + protected $url; + protected $requestMethod; + protected $requestHeaders; + protected $postBody; + protected $userAgent; + + protected $responseHttpCode; + protected $responseHeaders; + protected $responseBody; + + public $accessKey; + + public function __construct($url, $method = 'GET', $headers = array(), $postBody = null) { + $this->url = $url; + $this->setRequestMethod($method); + $this->setRequestHeaders($headers); + $this->setPostBody($postBody); + + global $apiConfig; + if (empty($apiConfig['application_name'])) { + $this->userAgent = self::USER_AGENT_SUFFIX; + } else { + $this->userAgent = $apiConfig['application_name'] . " " . self::USER_AGENT_SUFFIX; + } + } + + /** + * Misc function that returns the base url component of the $url + * used by the OAuth signing class to calculate the base string + * @return string The base url component of the $url. + * @see http://oauth.net/core/1.0a/#anchor13 + */ + public function getBaseUrl() { + if ($pos = strpos($this->url, '?')) { + return substr($this->url, 0, $pos); + } + return $this->url; + } + + /** + * Misc function that returns an array of the query parameters of the current + * url used by the OAuth signing class to calculate the signature + * @return array Query parameters in the query string. + */ + public function getQueryParams() { + if ($pos = strpos($this->url, '?')) { + $queryStr = substr($this->url, $pos + 1); + $params = array(); + parse_str($queryStr, $params); + return $params; + } + return array(); + } + + /** + * @return string HTTP Response Code. + */ + public function getResponseHttpCode() { + return (int) $this->responseHttpCode; + } + + /** + * @param int $responseHttpCode HTTP Response Code. + */ + public function setResponseHttpCode($responseHttpCode) { + $this->responseHttpCode = $responseHttpCode; + } + + /** + * @return $responseHeaders (array) HTTP Response Headers. + */ + public function getResponseHeaders() { + return $this->responseHeaders; + } + + /** + * @return string HTTP Response Body + */ + public function getResponseBody() { + return $this->responseBody; + } + + /** + * @param array $headers The HTTP response headers + * to be normalized. + */ + public function setResponseHeaders($headers) { + $headers = apiUtils::normalize($headers); + if ($this->responseHeaders) { + $headers = array_merge($this->responseHeaders, $headers); + } + + $this->responseHeaders = $headers; + } + + /** + * @param string $key + * @return array|boolean Returns the requested HTTP header or + * false if unavailable. + */ + public function getResponseHeader($key) { + return isset($this->responseHeaders[$key]) + ? $this->responseHeaders[$key] + : false; + } + + /** + * @param string $responseBody The HTTP response body. + */ + public function setResponseBody($responseBody) { + $this->responseBody = $responseBody; + } + + /** + * @return string $url The request URL. + */ + + public function getUrl() { + return $this->url; + } + + /** + * @return string $method HTTP Request Method. + */ + public function getRequestMethod() { + return $this->requestMethod; + } + + /** + * @return array $headers HTTP Request Headers. + */ + public function getRequestHeaders() { + return $this->requestHeaders; + } + + /** + * @param string $key + * @return array|boolean Returns the requested HTTP header or + * false if unavailable. + */ + public function getRequestHeader($key) { + return isset($this->requestHeaders[$key]) + ? $this->requestHeaders[$key] + : false; + } + + /** + * @return string $postBody HTTP Request Body. + */ + public function getPostBody() { + return $this->postBody; + } + + /** + * @param string $url the url to set + */ + public function setUrl($url) { + $this->url = $url; + } + + /** + * @param string $method Set he HTTP Method and normalize + * it to upper-case, as required by HTTP. + */ + public function setRequestMethod($method) { + $this->requestMethod = strtoupper($method); + } + + /** + * @param array $headers The HTTP request headers + * to be set and normalized. + */ + public function setRequestHeaders($headers) { + $headers = apiUtils::normalize($headers); + if ($this->requestHeaders) { + $headers = array_merge($this->requestHeaders, $headers); + } + $this->requestHeaders = $headers; + } + + /** + * @param string $postBody the postBody to set + */ + public function setPostBody($postBody) { + $this->postBody = $postBody; + } + + /** + * Set the User-Agent Header. + * @param string $userAgent The User-Agent. + */ + public function setUserAgent($userAgent) { + $this->userAgent = $userAgent; + } + + /** + * @return string The User-Agent. + */ + public function getUserAgent() { + return $this->userAgent; + } + + /** + * Returns a cache key depending on if this was an OAuth signed request + * in which case it will use the non-signed url and access key to make this + * cache key unique per authenticated user, else use the plain request url + * @return The md5 hash of the request cache key. + */ + public function getCacheKey() { + $key = $this->getUrl(); + + if (isset($this->accessKey)) { + $key .= $this->accessKey; + } + + if (isset($this->requestHeaders['authorization'])) { + $key .= $this->requestHeaders['authorization']; + } + + return md5($key); + } + + public function getParsedCacheControl() { + $parsed = array(); + $rawCacheControl = $this->getResponseHeader('cache-control'); + if ($rawCacheControl) { + $rawCacheControl = str_replace(", ", "&", $rawCacheControl); + parse_str($rawCacheControl, $parsed); + } + + return $parsed; + } +} diff --git a/inc/vendors/social-login/Google/io/apiIO.php b/inc/vendors/social-login/Google/io/apiIO.php new file mode 100755 index 00000000..769f0b83 --- /dev/null +++ b/inc/vendors/social-login/Google/io/apiIO.php @@ -0,0 +1,39 @@ + + */ +interface apiIO { + /** + * An utility function that first calls $this->auth->sign($request) and then executes makeRequest() + * on that signed request. Used for when a request should be authenticated + * @param apiHttpRequest $request + * @return apiHttpRequest $request + */ + public function authenticatedRequest(apiHttpRequest $request); + + /** + * Executes a apIHttpRequest and returns the resulting populated httpRequest + * @param apiHttpRequest $request + * @return apiHttpRequest $request + */ + public function makeRequest(apiHttpRequest $request); +} diff --git a/inc/vendors/social-login/Google/io/apiREST.php b/inc/vendors/social-login/Google/io/apiREST.php new file mode 100755 index 00000000..f18dce40 --- /dev/null +++ b/inc/vendors/social-login/Google/io/apiREST.php @@ -0,0 +1,143 @@ + + * @author Chirag Shah + */ +class apiREST { + /** + * Executes a apiServiceRequest using a RESTful call by transforming it into + * an apiHttpRequest, and executed via apiIO::authenticatedRequest(). + * @param apiServiceRequest $req + * @return array decoded result + * @throws apiServiceException on server side error (ie: not authenticated, invalid or + * malformed post body, invalid url) + */ + static public function execute(apiServiceRequest $req) { + $result = null; + $postBody = $req->getPostBody(); + $url = self::createRequestUri( + $req->getRestBasePath(), $req->getRestPath(), $req->getParameters()); + + $httpRequest = new apiHttpRequest($url, $req->getHttpMethod(), null, $postBody); + if ($postBody) { + $contentTypeHeader = array(); + if (isset($req->contentType) && $req->contentType) { + $contentTypeHeader['content-type'] = $req->contentType; + } else { + $contentTypeHeader['content-type'] = 'application/json; charset=UTF-8'; + $contentTypeHeader['content-length'] = apiUtils::getStrLen($postBody); + } + $httpRequest->setRequestHeaders($contentTypeHeader); + } + + $httpRequest = apiClient::$io->authenticatedRequest($httpRequest); + $decodedResponse = self::decodeHttpResponse($httpRequest); + + //FIXME currently everything is wrapped in a data envelope, but hopefully this might change some day + $ret = isset($decodedResponse['data']) ? $decodedResponse['data'] : $decodedResponse; + return $ret; + } + + + /** + * Decode an HTTP Response. + * @static + * @throws apiServiceException + * @param apiHttpRequest $response The http response to be decoded. + * @return mixed|null + */ + static function decodeHttpResponse($response) { + $code = $response->getResponseHttpCode(); + $body = $response->getResponseBody(); + $decoded = null; + + if ($code != '200' && $code != '201' && $code != '204') { + $decoded = json_decode($body, true); + $err = 'Error calling ' . $response->getRequestMethod() . ' ' . $response->getUrl(); + if ($decoded != null && isset($decoded['error']['message']) && isset($decoded['error']['code'])) { + // if we're getting a json encoded error definition, use that instead of the raw response + // body for improved readability + $err .= ": ({$decoded['error']['code']}) {$decoded['error']['message']}"; + } else { + $err .= ": ($code) $body"; + } + throw new apiServiceException($err, $code); + } + + // Only attempt to decode the response, if the response code wasn't (204) 'no content' + if ($code != '204') { + $decoded = json_decode($body, true); + if ($decoded == null) { + throw new apiServiceException("Invalid json in service response: $body"); + } + } + return $decoded; + } + + /** + * Parse/expand request parameters and create a fully qualified + * request uri. + * @static + * @param string $basePath + * @param string $restPath + * @param array $params + * @return string $requestUrl + */ + static function createRequestUri($basePath, $restPath, $params) { + $requestUrl = $basePath . $restPath; + $uriTemplateVars = array(); + $queryVars = array(); + foreach ($params as $paramName => $paramSpec) { + // Discovery v1.0 puts the canonical location under the 'location' field. + if (! isset($paramSpec['location'])) { + $paramSpec['location'] = $paramSpec['restParameterType']; + } + + if ($paramSpec['type'] == 'boolean') { + $paramSpec['value'] = ($paramSpec['value']) ? 'true' : 'false'; + } + if ($paramSpec['location'] == 'path') { + $uriTemplateVars[$paramName] = $paramSpec['value']; + } else { + if (isset($paramSpec['repeated']) && is_array($paramSpec['value'])) { + foreach ($paramSpec['value'] as $value) { + $queryVars[] = $paramName . '=' . rawurlencode($value); + } + } else { + $queryVars[] = $paramName . '=' . rawurlencode($paramSpec['value']); + } + } + } + + if (count($uriTemplateVars)) { + $uriTemplateParser = new URI_Template_Parser($requestUrl); + $requestUrl = $uriTemplateParser->expand($uriTemplateVars); + } + //FIXME work around for the the uri template lib which url encodes + // the @'s & confuses our servers. + $requestUrl = str_replace('%40', '@', $requestUrl); + + if (count($queryVars)) { + $requestUrl .= '?' . implode($queryVars, '&'); + } + + return $requestUrl; + } +} diff --git a/inc/vendors/social-login/Google/io/apiRPC.php b/inc/vendors/social-login/Google/io/apiRPC.php new file mode 100755 index 00000000..90f8e36a --- /dev/null +++ b/inc/vendors/social-login/Google/io/apiRPC.php @@ -0,0 +1,59 @@ + + */ +class apiRPC { + static public function execute($requests) { + $jsonRpcRequest = array(); + foreach ($requests as $request) { + $parameters = array(); + foreach ($request->getParameters() as $parameterName => $parameterVal) { + $parameters[$parameterName] = $parameterVal['value']; + } + $jsonRpcRequest[] = array( + 'id' => $request->getBatchKey(), + 'method' => $request->getRpcName(), + 'params' => $parameters, + 'apiVersion' => 'v1' + ); + } + $httpRequest = new apiHttpRequest($request->getRpcPath()); + $httpRequest->setRequestHeaders(array('Content-Type' => 'application/json')); + $httpRequest->setRequestMethod('POST'); + $httpRequest->setPostBody(json_encode($jsonRpcRequest)); + $httpRequest = apiClient::$io->authenticatedRequest($httpRequest); + if (($decodedResponse = json_decode($httpRequest->getResponseBody(), true)) != false) { + $ret = array(); + foreach ($decodedResponse as $response) { + $ret[$response['id']] = self::checkNextLink($response['result']); + } + return $ret; + } else { + throw new apiServiceException("Invalid json returned by the json-rpc end-point"); + } + } + + static private function checkNextLink($response) { + if (isset($response['links']) && isset($response['links']['next'][0]['href'])) { + parse_str($response['links']['next'][0]['href'], $params); + if (isset($params['c'])) { + $response['continuationToken'] = $params['c']; + } + } + return $response; + } +} \ No newline at end of file diff --git a/inc/vendors/social-login/Google/io/cacerts.pem b/inc/vendors/social-login/Google/io/cacerts.pem new file mode 100755 index 00000000..da36ed1b --- /dev/null +++ b/inc/vendors/social-login/Google/io/cacerts.pem @@ -0,0 +1,714 @@ +# Certifcate Authority certificates for validating SSL connections. +# +# This file contains PEM format certificates generated from +# http://mxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt +# +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is the Netscape security libraries. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1994-2000 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** + +Verisign/RSA Secure Server CA +============================= + +-----BEGIN CERTIFICATE----- +MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD +VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0 +MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV +BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy +dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ +ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII +0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI +uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI +hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3 +YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc +1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== +-----END CERTIFICATE----- + +Thawte Personal Basic CA +======================== + +-----BEGIN CERTIFICATE----- +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj +IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X +DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw +EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE +ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy +dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD +QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 +dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK +wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 +G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF +AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 +c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P +9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== +-----END CERTIFICATE----- + +Thawte Personal Premium CA +========================== + +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p +dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv +bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa +QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY +BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u +IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl +bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu +Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs +Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI +Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD +ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH +b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh +KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ +-----END CERTIFICATE----- + +Thawte Personal Freemail CA +=========================== + +-----BEGIN CERTIFICATE----- +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD +VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT +ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt +YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu +Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa +MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG +cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh +d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY +DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E +rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq +uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN +BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP +MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa +/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei +gQ== +-----END CERTIFICATE----- + +Thawte Server CA +================ + +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== + +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= + +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority +======================================================= + +-----BEGIN CERTIFICATE----- +MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 +NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD +VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp +bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N +H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR +4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN +BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo +EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 +FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx +lA== +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority +======================================================= + +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh +YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 +FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg +J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc +r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= + +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G2 +============================================================ + +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK +VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm +Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J +h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 +DzFc6PLZ +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G2 +============================================================ + +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns +YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe +Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj +IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx +KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM +HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw +DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji +nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn +jBJ7xUS0rg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ + +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G2 +============================================================ + +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM +HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK +qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj +cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y +cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP +T8qAkbYp +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G3 +============================================================ + +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 +nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO +8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV +ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb +PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr +n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a +qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 +wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs +pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 +E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G3 +============================================================ + +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy +aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp +Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g +Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU +J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO +JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY +wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o +koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E +Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe +xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u +7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI +sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP +cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ + +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ + +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== + +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= + +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 2 +============================= + +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj +dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 +NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD +VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G +vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ +BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl +IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw +NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq +y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 +E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +-----END CERTIFICATE----- + +Thawte Time Stamping CA +======================= + +-----BEGIN CERTIFICATE----- +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN +BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd +BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN +MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g +Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG +A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l +c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT +6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa +Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL +8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC +9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ +pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ +CayJSdM= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== + +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ + +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +Entrust.net Secure Server Certification Authority +================================================= + +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Go Daddy Certification Authority Root Certificate Bundle +======================================================== + +-----BEGIN CERTIFICATE----- +MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx +ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw +MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH +QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j +b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j +b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H +KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm +VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR +SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT +cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ +6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu +MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS +kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB +BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f +BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv +c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH +AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO +BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG +OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU +A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o +0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX +RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH +qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV +U+4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh +bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu +Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g +QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe +BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX +DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE +YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC +ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q +N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO +r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN +f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH +U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU +TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb +VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg +SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv +biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg +MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw +AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv +ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu +Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd +IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv +bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1 +QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O +WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf +SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- + diff --git a/inc/vendors/social-login/Google/service/apiBatch.php b/inc/vendors/social-login/Google/service/apiBatch.php new file mode 100755 index 00000000..216a86e9 --- /dev/null +++ b/inc/vendors/social-login/Google/service/apiBatch.php @@ -0,0 +1,35 @@ + + */ +class apiBatch { + + /** + * Execute one or multiple Google API requests, takes one or multiple requests as param + * Example usage: + * $ret = apiBatch::execute( + * $apiClient->activities->list(array('@public', '@me'), 'listActivitiesKey'), + * $apiClient->people->get(array('userId' => '@me'), 'getPeopleKey') + * ); + * print_r($ret['getPeopleKey']); + */ + static public function execute( /* polymorphic */) { + $requests = func_get_args(); + return apiRPC::execute($requests); + } + +} \ No newline at end of file diff --git a/inc/vendors/social-login/Google/service/apiMediaFileUpload.php b/inc/vendors/social-login/Google/service/apiMediaFileUpload.php new file mode 100755 index 00000000..2a53e94e --- /dev/null +++ b/inc/vendors/social-login/Google/service/apiMediaFileUpload.php @@ -0,0 +1,85 @@ + + */ +class apiMediaFileUpload { + public $mimeType; + public $fileName; + public $chunkSize; + + public static function process($metadata, $method, &$params) { + $payload = array(); + + $data = isset($params['data']) ? $params['data']['value'] : false; + $mimeType = isset($params['mimeType']) ? $params['mimeType']['value'] : false; + $file = isset($params['file']) ? $params['file']['value'] : false; + $uploadPath = $method['mediaUpload']['protocols']['simple']['path']; + + unset($params['data']); + unset($params['mimeType']); + unset($params['file']); + + if ($file) { + if (substr($file, 0, 1) != '@') { + $file = '@' . $file; + } + $payload['file'] = $file; + $payload['content-type'] = 'multipart/form-data'; + $payload['restBasePath'] = $uploadPath; + + // This is a standard file upload with curl. + return $payload; + } + + $parsedMeta = is_string($metadata) ? json_decode($metadata, true) : $metadata; + if ($metadata && false == $data) { + // Process as a normal API request. + return false; + } + + // Process as a media upload request. + $params['uploadType'] = array( + 'type' => 'string', + 'location' => 'query', + 'value' => 'media', + ); + + // Determine which type. + $payload['restBasePath'] = $uploadPath; + if (false == $metadata || false == $parsedMeta) { + // This is a simple media upload. + $payload['content-type'] = $mimeType; + $payload['data'] = $data; + } else { + // This is a multipart/related upload. + $boundary = isset($params['boundary']) ? $params['boundary'] : mt_rand(); + $boundary = str_replace('"', '', $boundary); + $payload['content-type'] = 'multipart/related; boundary=' . $boundary; + + $related = "--$boundary\r\n"; + $related .= "Content-Type: application/json; charset=UTF-8\r\n"; + $related .= "\r\n" . $metadata . "\r\n"; + $related .= "--$boundary\r\n"; + $related .= "Content-Type: $mimeType\r\n"; + $related .= "Content-Transfer-Encoding: base64\r\n"; + $related .= "\r\n" . base64_encode($data) . "\r\n"; + $related .= "--$boundary--"; + $payload['data'] = $related; + } + + return $payload; + } +} \ No newline at end of file diff --git a/inc/vendors/social-login/Google/service/apiModel.php b/inc/vendors/social-login/Google/service/apiModel.php new file mode 100755 index 00000000..f8964a36 --- /dev/null +++ b/inc/vendors/social-login/Google/service/apiModel.php @@ -0,0 +1,109 @@ + + */ +class apiModel { + public function __construct( /* polymorphic */ ) { + if (func_num_args() == 1 && is_array(func_get_arg(0))) { + // Initialize the model with the array's contents. + $array = func_get_arg(0); + $this->mapTypes($array); + } + } + + /** + * Initialize this object's properties from an array. + * + * @param array Used to seed this object's properties. + * @return void + */ + private function mapTypes($array) { + foreach ($array as $key => $val) { + $this->$key = $val; + + $keyTypeName = "__$key" . 'Type'; + $keyDataType = "__$key" . 'DataType'; + if ($this->useObjects() && property_exists($this, $keyTypeName)) { + if ($this->isAssociativeArray($val)) { + if (isset($this->$keyDataType) && 'map' == $this->$keyDataType) { + foreach($val as $arrayKey => $arrayItem) { + $val[$arrayKey] = $this->createObjectFromName($keyTypeName, $arrayItem); + } + $this->$key = $val; + } else { + $this->$key = $this->createObjectFromName($keyTypeName, $val); + } + } else if (is_array($val)) { + $arrayObject = array(); + foreach ($val as $arrayIndex => $arrayItem) { + $arrayObject[$arrayIndex] = $this->createObjectFromName($keyTypeName, $arrayItem); + } + $this->$key = $arrayObject; + } + } + } + } + + /** + * Returns true only if the array is associative. + * @param array $array + * @return bool True if the array is associative. + */ + private function isAssociativeArray($array) { + if (!is_array($array)) { + return false; + } + $keys = array_keys($array); + foreach($keys as $key) { + if (is_string($key)) { + return true; + } + } + return false; + } + + /** + * Given a variable name, discover its type. + * @param $name + * @param $item + * @return object The object from the item. + */ + private function createObjectFromName($name, $item) { + $type = $this->$name; + return new $type($item); + } + + protected function useObjects() { + global $apiConfig; + return (isset($apiConfig['use_objects']) && $apiConfig['use_objects']); + } + + /** + * Verify if $obj is an array. + * @throws apiException Thrown if $obj isn't an array. + * @param array $obj Items that should be validated. + * @param string $type Array items should be of this type. + * @param string $method Method expecting an array as an argument. + */ + protected function assertIsArray($obj, $type, $method) { + if ($obj && !is_array($obj)) { + throw new apiException("Incorrect parameter type passed to $method(), expected an" + . " array containing items of type $type."); + } + } +} \ No newline at end of file diff --git a/inc/vendors/social-login/Google/service/apiService.php b/inc/vendors/social-login/Google/service/apiService.php new file mode 100755 index 00000000..10609fb5 --- /dev/null +++ b/inc/vendors/social-login/Google/service/apiService.php @@ -0,0 +1,58 @@ +activities, $this->comments, $this->people, etc. + * @author Chris Chabot + */ +class apiService { + public $version = null; + public $restBasePath; + public $rpcPath; + public $resource = null; + + public function __construct($serviceName, $discoveryDocument) { + global $apiConfig; + if (!isset($discoveryDocument['version']) || !isset($discoveryDocument['restBasePath']) || !isset($discoveryDocument['rpcPath'])) { + throw new apiServiceException("Invalid discovery document"); + } + $this->version = $discoveryDocument['version']; + $this->restBasePath = $apiConfig['basePath'] . $discoveryDocument['restBasePath']; + $this->rpcPath = $apiConfig['basePath'] . $discoveryDocument['rpcPath']; + foreach ($discoveryDocument['resources'] as $resourceName => $resourceTypes) { + $this->$resourceName = new apiServiceResource($this, $serviceName, $resourceName, $resourceTypes); + } + } + + /** + * @return string $restBasePath + */ + public function getRestBasePath() { + return $this->restBasePath; + } + + /** + * @return string $rpcPath + */ + public function getRpcPath() { + return $this->rpcPath; + } +} diff --git a/inc/vendors/social-login/Google/service/apiServiceRequest.php b/inc/vendors/social-login/Google/service/apiServiceRequest.php new file mode 100755 index 00000000..b7d25973 --- /dev/null +++ b/inc/vendors/social-login/Google/service/apiServiceRequest.php @@ -0,0 +1,130 @@ + + * @author Chirag Shah + */ +class apiServiceRequest { + public $restBasePath; + public $restPath; + public $rpcPath; + public $rpcName; + public $httpMethod; + public $parameters; + public $postBody; + public $batchKey; + public $contentType; + + /** + * @param string $restBasePath + * @param string $rpcPath + * @param string $restPath + * @param string $rpcName + * @param string $httpMethod + * @param array $parameters + * @param string $postBody + */ + public function __construct($restBasePath, $rpcPath, $restPath, $rpcName, $httpMethod, $parameters, $postBody = null) { + if (substr($restBasePath, 0, 4) == 'http') { + $this->restBasePath = $restBasePath; + } else { + global $apiConfig; + $this->restBasePath = $apiConfig['basePath'] . $restBasePath; + } + + $this->restPath = $restPath; + $this->rpcPath = $rpcPath; + $this->rpcName = $rpcName; + $this->httpMethod = $httpMethod; + $this->parameters = $parameters; + $this->postBody = $postBody; + } + + /** + * @return string $postBody + */ + public function getPostBody() { + return $this->postBody; + } + + /** + * @param string $postBody The post body. + */ + public function setPostBody($postBody) { + $this->postBody = $postBody; + } + /** + * @return string restBasePath + */ + public function getRestBasePath() { + return $this->restBasePath; + } + /** + * @return string restPath + */ + public function getRestPath() { + return $this->restPath; + } + + /** + * @return string $rpcPath + */ + public function getRpcPath() { + return $this->rpcPath; + } + + /** + * @return string $rpcName + */ + public function getRpcName() { + return $this->rpcName; + } + + /** + * @return string $httpMethod + */ + public function getHttpMethod() { + return $this->httpMethod; + } + + /** + * @return array $parameters + */ + public function getParameters() { + return $this->parameters; + } + + /** + * @return string $batchKey + */ + public function getBatchKey() { + return $this->batchKey; + } + + /** + * @param $batchKey the $batchKey to set + */ + public function setBatchKey($batchKey) { + $this->batchKey = $batchKey; + } + + public function setContentType($type) { + $this->contentType = $type; + } +} diff --git a/inc/vendors/social-login/Google/service/apiServiceResource.php b/inc/vendors/social-login/Google/service/apiServiceResource.php new file mode 100755 index 00000000..5daa5336 --- /dev/null +++ b/inc/vendors/social-login/Google/service/apiServiceResource.php @@ -0,0 +1,202 @@ + + * @author Chirag Shah + */ +class apiServiceResource { + // Valid query parameters that work, but don't appear in discovery. + private $stackParameters = array( + 'alt' => array('type' => 'string', 'location' => 'query'), + 'fields' => array('type' => 'string', 'location' => 'query'), + 'trace' => array('type' => 'string', 'location' => 'query'), + 'userIp' => array('type' => 'string', 'location' => 'query'), + 'userip' => array('type' => 'string', 'location' => 'query'), + 'file' => array('type' => 'complex', 'location' => 'body'), + 'data' => array('type' => 'string', 'location' => 'body'), + 'mimeType' => array('type' => 'string', 'location' => 'header'), + 'uploadType' => array('type' => 'string', 'location' => 'query'), + ); + + /** @var apiService $service */ + private $service; + + /** @var string $serviceName */ + private $serviceName; + + /** @var string $resourceName */ + private $resourceName; + + /** @var array $methods */ + private $methods; + + public function __construct($service, $serviceName, $resourceName, $resource) { + $this->service = $service; + $this->serviceName = $serviceName; + $this->resourceName = $resourceName; + $this->methods = isset($resource['methods']) ? $resource['methods'] : array($resourceName => $resource); + } + + /** + * @param $name + * @param $arguments + * @return apiServiceRequest|array + * @throws apiException + */ + public function __call($name, $arguments) { + if (count($arguments) != 1 && count($arguments) != 2) { + throw new apiException("client method calls expect 1 or 2 parameter (\$client->plus->activities->list(array('userId' => 'me'))"); + } + if (! is_array($arguments[0])) { + throw new apiException("client method parameter should be an array (\$client->plus->activities->list(array('userId' => 'me'))"); + } + $batchKey = false; + if (isset($arguments[1])) { + if (! is_string($arguments[1])) { + throw new apiException("The batch key parameter should be a string (\$client->plus->activities->list( array('userId' => 'me'), 'batchKey'))"); + } + $batchKey = $arguments[1]; + } + if (! isset($this->methods[$name])) { + throw new apiException("Unknown function: {$this->serviceName}->{$this->resourceName}->{$name}()"); + } + $method = $this->methods[$name]; + $parameters = $arguments[0]; + // postBody is a special case since it's not defined in the discovery document as parameter, but we abuse the param entry for storing it + $postBody = null; + if (isset($parameters['postBody'])) { + if (is_object($parameters['postBody'])) { + $this->stripNull($parameters['postBody']); + } + + // Some APIs require the postBody to be set under the data key. + if (is_array($parameters['postBody']) && 'latitude' == $this->serviceName) { + if (!isset($parameters['postBody']['data'])) { + $rawBody = $parameters['postBody']; + unset($parameters['postBody']); + $parameters['postBody']['data'] = $rawBody; + } + } + + $postBody = is_array($parameters['postBody']) || is_object($parameters['postBody']) + ? json_encode($parameters['postBody']) + : $parameters['postBody']; + unset($parameters['postBody']); + + if (isset($parameters['optParams'])) { + $optParams = $parameters['optParams']; + unset($parameters['optParams']); + $parameters = array_merge($parameters, $optParams); + } + } + + if (!isset($method['parameters'])) { + $method['parameters'] = array(); + } + + $method['parameters'] = array_merge($method['parameters'], $this->stackParameters); + foreach ($parameters as $key => $val) { + if ($key != 'postBody' && ! isset($method['parameters'][$key])) { + throw new apiException("($name) unknown parameter: '$key'"); + } + } + if (isset($method['parameters'])) { + foreach ($method['parameters'] as $paramName => $paramSpec) { + if (isset($paramSpec['required']) && $paramSpec['required'] && ! isset($parameters[$paramName])) { + throw new apiException("($name) missing required param: '$paramName'"); + } + if (isset($parameters[$paramName])) { + $value = $parameters[$paramName]; + $parameters[$paramName] = $paramSpec; + $parameters[$paramName]['value'] = $value; + unset($parameters[$paramName]['required']); + } else { + unset($parameters[$paramName]); + } + } + } + + // Discovery v1.0 puts the canonical method id under the 'id' field. + if (! isset($method['id'])) { + $method['id'] = $method['rpcMethod']; + } + + // Discovery v1.0 puts the canonical path under the 'path' field. + if (! isset($method['path'])) { + $method['path'] = $method['restPath']; + } + + $restBasePath = $this->service->restBasePath; + + // Process Media Request + $contentType = false; + if (isset($method['mediaUpload'])) { + $media = apiMediaFileUpload::process($postBody, $method, $parameters); + if (isset($media['content-type'])) { + $contentType = $media['content-type']; + } + + if (isset($media['data'])) { + $postBody = $media['data']; + } + + if (isset($media['file'])) { + $postBody = array('file' => $media['file']); + } + + if (isset($media['restBasePath'])) { + $restBasePath = $media['restBasePath']; + $method['path'] = ''; + } + } + + $request = new apiServiceRequest( + $restBasePath, + $this->service->rpcPath, + $method['path'], + $method['id'], + $method['httpMethod'], + $parameters, $postBody + ); + + $request->setContentType($contentType); + if ($batchKey) { + $request->setBatchKey($batchKey); + return $request; + } else { + return apiREST::execute($request); + } + } + + protected function useObjects() { + global $apiConfig; + return (isset($apiConfig['use_objects']) && $apiConfig['use_objects']); + } + + protected function stripNull(&$o) { + $o = (array) $o; + foreach ($o as $k => $v) { + if ($v === null || strstr($k, "\0*\0__")) { + unset($o[$k]); + } + elseif (is_object($v) || is_array($v)) { + $this->stripNull($o[$k]); + } + } + } +} diff --git a/inc/vendors/social-login/Google/service/apiUtils.php b/inc/vendors/social-login/Google/service/apiUtils.php new file mode 100755 index 00000000..e5749515 --- /dev/null +++ b/inc/vendors/social-login/Google/service/apiUtils.php @@ -0,0 +1,111 @@ + + */ +class apiUtils { + public static function urlSafeB64Encode($data) { + $b64 = base64_encode($data); + $b64 = str_replace(array('+', '/', '\r', '\n', '='), + array('-', '_'), + $b64); + return $b64; + } + + public static function urlSafeB64Decode($b64) { + $b64 = str_replace(array('-', '_'), + array('+', '/'), + $b64); + return base64_decode($b64); + } + + /** + * Misc function used to count the number of bytes in a post body, in the world of multi-byte chars + * and the unpredictability of strlen/mb_strlen/sizeof, this is the only way to do that in a sane + * manner at the moment. + * This algorithm was originally developed for the + * Solar Framework by Paul M. Jones + * @link http://solarphp.com/ + * @link http://svn.solarphp.com/core/trunk/Solar/Json.php + * @link http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Json/Decoder.php + * @param string $str + * @return int The number of bytes in a string. + */ + static public function getStrLen($str) { + $strlenVar = strlen($str); + $d = $ret = 0; + for ($count = 0; $count < $strlenVar; ++ $count) { + $ordinalValue = ord($str{$ret}); + switch (true) { + case (($ordinalValue >= 0x20) && ($ordinalValue <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ret ++; + break; + + case (($ordinalValue & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $ret += 2; + break; + + case (($ordinalValue & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $ret += 3; + break; + + case (($ordinalValue & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $ret += 4; + break; + + case (($ordinalValue & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $ret += 5; + break; + + case (($ordinalValue & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $ret += 6; + break; + default: + $ret ++; + } + } + return $ret; + } + + /** + * Normalize all keys in an array to lower-case. + * @param array $arr + * @return array Normalized array. + */ + public static function normalize($arr) { + if (!is_array($arr)) { + return array(); + } + + $normalized = array(); + foreach ($arr as $key => $val) { + $normalized[strtolower($key)] = $val; + } + return $normalized; + } +} \ No newline at end of file diff --git a/inc/vendors/social-login/class-opalestate-facebook-login.php b/inc/vendors/social-login/class-opalestate-facebook-login.php new file mode 100755 index 00000000..96b31955 --- /dev/null +++ b/inc/vendors/social-login/class-opalestate-facebook-login.php @@ -0,0 +1,315 @@ +facebook_app_id = opalestate_get_option( 'facebook_app_id', '' ); + $this->facebook_secret = opalestate_get_option( 'facebook_secret', '' ); + + $this->includes(); + + add_action( 'query_vars', [ $this, 'add_query_vars' ] ); + add_action( 'parse_request', [ $this, 'process' ] ); + add_action( 'wp_ajax_opalestate_ajax_redirect_facebook_login_link', [ $this, 'ajax_redirect_facebook_login_link' ] ); + add_action( 'wp_ajax_nopriv_opalestate_ajax_redirect_facebook_login_link', [ $this, 'ajax_redirect_facebook_login_link' ] ); + } + + /** + * Includes. + */ + public function includes() { + if ( ! class_exists( 'Facebook/Facebook' ) ) { + require_once 'Facebook/autoload.php'; + } + } + + /** + * Add query vars. + * + * @param $vars + * @return array + */ + public function add_query_vars( $vars ) { + $vars[] = 'opal_facebook_login'; + + return $vars; + } + + /** + * Redirect facebook login link via AJAX. + * + * @throws \Facebook\Exceptions\FacebookSDKException + */ + public function ajax_redirect_facebook_login_link() { + if ( 'off' === opalestate_get_option( 'enable_facebook_login' ) ) { + wp_send_json_error( 'This feature is disabled.', 404 ); + } + + $facebook_app_id = $this->facebook_app_id; + $facebook_secret = $this->facebook_secret; + + if ( ! $facebook_app_id || ! $facebook_secret ) { + wp_send_json_error( 'Missing keys!', 404 ); + } + + $fb = new Facebook\Facebook( [ + 'app_id' => $facebook_app_id, + 'app_secret' => $facebook_secret, + 'default_graph_version' => 'v3.2', + ] ); + + $helper = $fb->getRedirectLoginHelper(); + $permissions = [ 'email' ]; + $link = add_query_arg( 'opal_facebook_login', '1', home_url( '/' ) ); + $login_url = $helper->getLoginUrl( $link, $permissions ); + + if ( ! $facebook_app_id || ! $facebook_secret ) { + wp_send_json_error( 'Missing keys!', 404 ); + } else { + wp_send_json_success( $login_url, 200 ); + } + wp_die(); + } + + /** + * Process. + * + * @param $wp + */ + public function process( $wp ) { + if ( array_key_exists( 'opal_facebook_login', $wp->query_vars ) ) { + if ( isset( $wp->query_vars['opal_facebook_login'] ) && $wp->query_vars['opal_facebook_login'] == '1' ) { + if ( ( isset( $_GET['code'] ) && isset( $_GET['state'] ) ) ) { + $vsessionid = session_id(); + if ( empty( $vsessionid ) ) { + session_name( 'PHPSESSID' ); + session_start(); + } + $this->login(); + } + } + wp_die(); + } + } + + /** + * Handle login. + * + * @throws \Facebook\Exceptions\FacebookSDKException + */ + public function login() { + $facebook_app_id = $this->facebook_app_id; + $facebook_secret = $this->facebook_secret; + + $fb = new Facebook\Facebook( [ + 'app_id' => $facebook_app_id, + 'app_secret' => $facebook_secret, + 'default_graph_version' => 'v3.2', + ] ); + + $helper = $fb->getRedirectLoginHelper(); + + try { + $accessToken = $helper->getAccessToken(); + } catch ( Facebook\Exceptions\FacebookResponseException $e ) { + // When Graph returns an error + echo 'Graph returned an error: ' . $e->getMessage(); + exit; + } catch ( Facebook\Exceptions\FacebookSDKException $e ) { + // When validation fails or other local issues + echo 'Facebook SDK returned an error: ' . $e->getMessage(); + exit; + } + + if ( ! isset( $accessToken ) ) { + if ( $helper->getError() ) { + header( 'HTTP/1.0 401 Unauthorized' ); + echo "Error: " . $helper->getError() . "\n"; + echo "Error Code: " . $helper->getErrorCode() . "\n"; + echo "Error Reason: " . $helper->getErrorReason() . "\n"; + echo "Error Description: " . $helper->getErrorDescription() . "\n"; + } else { + header( 'HTTP/1.0 400 Bad Request' ); + echo 'Bad request'; + } + exit; + } + + // Logged in + // echo '

              Access Token

              '; + // var_dump( $accessToken->getValue() ); + + // The OAuth 2.0 client handler helps us manage access tokens + $oAuth2Client = $fb->getOAuth2Client(); + + // Get the access token metadata from /debug_token + $tokenMetadata = $oAuth2Client->debugToken( $accessToken ); + // echo '

              Metadata

              '; + // var_dump( $tokenMetadata ); + + // Validation (these will throw FacebookSDKException's when they fail) + $tokenMetadata->validateAppId( $facebook_app_id ); // Replace {app-id} with your app id + // If you know the user ID this access token belongs to, you can validate it here + //$tokenMetadata->validateUserId('123'); + $tokenMetadata->validateExpiration(); + + if ( ! $accessToken->isLongLived() ) { + // Exchanges a short-lived access token for a long-lived one + try { + $accessToken = $oAuth2Client->getLongLivedAccessToken( $accessToken ); + } catch ( Facebook\Exceptions\FacebookSDKException $e ) { + echo "

              Error getting long-lived access token: " . $e->getMessage() . "

              \n\n"; + exit; + } + + // echo '

              Long-lived

              '; + // var_dump( $accessToken->getValue() ); + } + + $_SESSION['fb_access_token'] = (string) $accessToken; + + try { + // Returns a `Facebook\FacebookResponse` object + $response = $fb->get( '/me?fields=id,email,name,first_name,last_name', $accessToken ); + } catch ( Facebook\Exceptions\FacebookResponseException $e ) { + print 'Graph returned an error: ' . $e->getMessage(); + exit; + } catch ( Facebook\Exceptions\FacebookSDKException $e ) { + print 'Facebook SDK returned an error: ' . $e->getMessage(); + exit; + } + + $u = $response->getGraphUser(); + + $email = filter_var( $u['email'], FILTER_SANITIZE_EMAIL ); + + if ( ! is_user_logged_in() ) { + $ID = email_exists( $email ); + $random_password = wp_generate_password( 12, false ); + + if ( $ID ) { + // Login. + $user_info = get_userdata( $ID ); + wp_set_password( $random_password, $ID ); + + // Update user meta. + update_user_meta( $ID, 'opal_user_last_activity_date', strtotime( date( 'd-m-Y H:i:s' ) ) ); + + $credentials = []; + $credentials['user_login'] = $user_info->user_login; + $credentials['user_password'] = $random_password; + $credentials['remember'] = true; + + $this->signon( $credentials ); + } else { + // Register. + $sanitized_user_login = sanitize_user( 'Facebook - ' . $u['name'] ); + if ( ! validate_username( $sanitized_user_login ) ) { + $sanitized_user_login = sanitize_user( 'facebook' . $u['id'] ); + } + $defaul_user_name = $sanitized_user_login; + $i = 1; + while ( username_exists( $sanitized_user_login ) ) { + $sanitized_user_login = $defaul_user_name . $i; + $i++; + } + + $credentials = []; + $credentials['user_login'] = $sanitized_user_login; + $credentials['user_password'] = $random_password; + $credentials['remember'] = true; + + $user_id = wp_create_user( $sanitized_user_login, $random_password, $email ); + + // Update user meta. + update_user_meta( $user_id, 'opal_user_registered', 'facebook' ); + + /** + * After create Google user. + */ + do_action( 'opalestate_after_create_facebook_user_new_email', $user_id ); + + wp_update_user( [ + 'ID' => $user_id, + 'display_name' => $u['name'], + 'first_name' => isset( $u['first_name'] ) && $u['first_name'] ? $u['first_name'] : '', + 'last_name' => isset( $u['last_name'] ) && $u['last_name'] ? $u['last_name'] : '', + ] ); + + $this->signon( $credentials ); + } + exit(); + } else { + $user_info = wp_get_current_user(); + set_site_transient( $user_info->ID . '_facebook_admin_notice', 'Facebook logged', 3600 ); + } + exit(); + } + + /** + * Set facebook unique id. + * + * @return mixed|string + */ + public function get_uniqid() { + if ( isset( $_COOKIE['opal_facebook_uniqid'] ) ) { + if ( get_site_transient( 'n_' . $_COOKIE['opal_facebook_uniqid'] ) !== false ) { + return $_COOKIE['opal_facebook_uniqid']; + } + } + + $_COOKIE['opal_facebook_uniqid'] = uniqid( 'nextend', true ); + setcookie( 'opal_facebook_uniqid', $_COOKIE['opal_facebook_uniqid'], time() + 3600, '/' ); + set_site_transient( 'n_' . $_COOKIE['opal_facebook_uniqid'], 1, 3600 ); + + return $_COOKIE['opal_facebook_uniqid']; + } + + /** + * Redirect. + */ + public function redirect() { + $redirect = Opalestate_Social_Login::get_redirect_url(); + + header( 'LOCATION: ' . $redirect ); + delete_site_transient( $this->get_uniqid() . '_facebook_redirect' ); + exit(); + } + + public function signon( $credentials ) { + $user_signon = wp_signon( $credentials, true ); + + if ( is_wp_error( $user_signon ) ) { + wp_redirect( esc_url( home_url() ) ); + } else { + /** + * After signon successfully. + */ + do_action( 'opalestate_after_signon_successfully', $credentials ); + + $redirect = opalestate_get_user_management_page_uri(); + + if ( ! empty( $_REQUEST['redirect'] ) ) { + $redirect = sanitize_text_field( $_REQUEST['redirect'] ); + } + + $redirect = apply_filters( 'opalestate_signon_redirect_url', $redirect ); + wp_redirect( $redirect ); + } + } +} diff --git a/inc/vendors/social-login/class-opalestate-google-login.php b/inc/vendors/social-login/class-opalestate-google-login.php new file mode 100755 index 00000000..7489a425 --- /dev/null +++ b/inc/vendors/social-login/class-opalestate-google-login.php @@ -0,0 +1,309 @@ +google_client_id = opalestate_get_option( 'google_client_id', '' ); + $this->google_client_secret = opalestate_get_option( 'google_client_secret', '' ); + $this->google_api_key = opalestate_get_option( 'google_api_key', '' ); + + $this->includes(); + + add_filter( 'init', [ $this, 'add_query_var' ] ); + add_action( 'parse_request', [ $this, 'google_login_request' ] ); + add_action( 'login_init', [ $this, 'google_login' ] ); + add_action( 'wp_ajax_opalestate_ajax_redirect_google_login_link', [ $this, 'ajax_redirect_google_login_link' ] ); + add_action( 'wp_ajax_nopriv_opalestate_ajax_redirect_google_login_link', [ $this, 'ajax_redirect_google_login_link' ] ); + } + + /** + * Includes. + */ + public function includes() { + if ( ! class_exists( 'apiClient' ) && ! class_exists( 'apiOauth2Service' ) ) { + require_once 'Google/apiClient.php'; + require_once 'Google/contrib/apiOauth2Service.php'; + } + } + + /** + * Get login url. + * + * @return string + */ + public static function get_login_url() { + return home_url( 'wp-login.php' ) . '?opal_google_login=1'; + } + + /** + * Redirect google login link via AJAX. + */ + public function ajax_redirect_google_login_link() { + if ( 'off' === opalestate_get_option( 'enable_google_login' ) ) { + wp_send_json_error( 'This feature is disabled.', 404 ); + } + + $google_client_id = $this->google_client_id; + $google_client_secret = $this->google_client_secret; + $google_api_key = $this->google_api_key; + $google_redirect_url = static::get_login_url(); + + if ( ! $google_client_id || ! $google_client_secret || ! $google_api_key ) { + wp_send_json_error( 'Missing keys!', 404 ); + } else { + wp_send_json_success( $google_redirect_url, 200 ); + } + wp_die(); + } + + /** + * Add query var. + */ + public function add_query_var() { + global $wp; + $wp->add_query_var( 'opal_google_login' ); + } + + /** + * Login when parse request. + */ + public function google_login_request() { + global $wp; + if ( $wp->request == 'opal_google_login' || isset( $wp->query_vars['opal_google_login'] ) ) { + $this->login(); + } + } + + /** + * Login in login page. + */ + public function google_login() { + if ( isset( $_REQUEST['opal_google_login'] ) && $_REQUEST['opal_google_login'] == '1' ) { + $this->login(); + } + } + + /** + * Handle login. + * + * @throws \apiAuthException + */ + public function login() { + $google_client_id = $this->google_client_id; + $google_client_secret = $this->google_client_secret; + $google_api_key = $this->google_api_key; + $google_redirect_url = static::get_login_url(); + + if ( ! $google_client_id || ! $google_client_secret || ! $google_api_key ) { + wp_redirect( esc_url( home_url() ) ); + exit(); + } + + $client = new apiClient(); + $client->setClientId( $google_client_id ); + $client->setClientSecret( $google_client_secret ); + $client->setDeveloperKey( $google_api_key ); + $client->setRedirectUri( $google_redirect_url ); + $client->setApprovalPrompt( 'auto' ); + $oauth2 = new apiOauth2Service( $client ); + + // If isset code, redirect to google redirect url. + if ( isset( $_GET['code'] ) ) { + $_GET['redirect'] = $google_redirect_url; + + set_site_transient( $this->get_uniqid() . '_google_redirect', sanitize_text_field( $_GET['redirect'] ), 3600 ); + $client->authenticate(); + $access_token = $client->getAccessToken(); + set_site_transient( $this->get_uniqid() . '_google_atoken', $access_token, 3600 ); + header( 'Location: ' . filter_var( $google_redirect_url, FILTER_SANITIZE_URL ) ); + exit(); + } + + $access_token = get_site_transient( $this->get_uniqid() . '_google_atoken' ); + if ( $access_token !== false ) { + $client->setAccessToken( $access_token ); + } + + // Delete transient if logout. + if ( isset( $_REQUEST['logout'] ) ) { + delete_site_transient( $this->get_uniqid() . '_google_atoken' ); + $client->revokeToken(); + } + + // Process user data if has data, else redirect to createAuthUrl. + if ( $client->getAccessToken() ) { + try { + $u = $oauth2->userinfo->get(); + + // The access token may have been updated lazily. + set_site_transient( $this->get_uniqid() . '_google_atoken', $client->getAccessToken(), 3600 ); + + $email = filter_var( $u['email'], FILTER_SANITIZE_EMAIL ); + + if ( ! is_user_logged_in() ) { + $ID = email_exists( $email ); + $random_password = wp_generate_password( 12, false ); + + if ( $ID ) { + // Login. + $user_info = get_userdata( $ID ); + wp_set_password( $random_password, $ID ); + + // Update user meta. + update_user_meta( $ID, 'opal_user_last_activity_date', strtotime( date( 'd-m-Y H:i:s' ) ) ); + + $credentials = []; + $credentials['user_login'] = $user_info->user_login; + $credentials['user_password'] = $random_password; + $credentials['remember'] = true; + + $this->signon( $credentials ); + } else { + // Register. + $sanitized_user_login = sanitize_user( 'Google - ' . $u['name'] ); + if ( ! validate_username( $sanitized_user_login ) ) { + $sanitized_user_login = sanitize_user( 'google' . $u['id'] ); + } + $defaul_user_name = $sanitized_user_login; + $i = 1; + while ( username_exists( $sanitized_user_login ) ) { + $sanitized_user_login = $defaul_user_name . $i; + $i++; + } + + $credentials = []; + $credentials['user_login'] = $sanitized_user_login; + $credentials['user_password'] = $random_password; + $credentials['remember'] = true; + + $user_id = wp_create_user( $sanitized_user_login, $random_password, $email ); + + // Update user meta. + update_user_meta( $user_id, 'opal_user_registered', 'google' ); + + if ( isset( $u['picture'] ) && $u['picture'] ) { + update_user_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'avatar', esc_url( $u['picture'] ) ); + } + + /** + * After create Google user. + */ + do_action( 'opalestate_after_create_google_user_new_email', $user_id ); + + wp_update_user( [ + 'ID' => $user_id, + 'display_name' => $u['name'], + 'first_name' => isset( $u['given_name'] ) && $u['given_name'] ? $u['given_name'] : '', + 'last_name' => isset( $u['family_name'] ) && $u['family_name'] ? $u['family_name'] : '', + ] ); + + $this->signon( $credentials ); + } + exit(); + } else { + $user_info = wp_get_current_user(); + set_site_transient( $user_info->ID . '_google_admin_notice', 'Google logged', 3600 ); + } + } catch ( Google_ServiceException $e ) { + echo sprintf( '

              ' . 'Service error' . ' %s

              ', htmlspecialchars( $e->getMessage() ) ); + exit(); + } catch ( Google_Exception $e ) { + echo sprintf( '

              ' . 'Client error' . ' %s

              ', htmlspecialchars( $e->getMessage() ) ); + exit(); + } catch ( apiServiceException $e ) { + // Handle exception. You can also catch Exception here. + // You can also get the error code from $e->getCode(); + echo ( 'google_error_code' ) . ': ' . $e->getCode() . '
              '; + echo( 'google_authencitcation_failed' ); + exit(); + } + // End If + } else { + if ( isset( $_GET['redirect'] ) ) { + set_site_transient( $this->get_uniqid() . '_google_redirect', $_GET['redirect'], 3600 ); + } + + $redirect = get_site_transient( $this->get_uniqid() . '_google_redirect' ); + + if ( $redirect || $redirect == $google_redirect_url ) { + $redirect = esc_url( home_url( '/' ) ); + set_site_transient( $this->get_uniqid() . '_google_redirect', $redirect, 3600 ); + } + header( 'LOCATION: ' . $client->createAuthUrl() ); + exit(); + } + $this->redirect(); + } + + /** + * Set google unique id. + * + * @return mixed|string + */ + public function get_uniqid() { + if ( isset( $_COOKIE['opal_google_uniqid'] ) ) { + if ( get_site_transient( 'n_' . $_COOKIE['opal_google_uniqid'] ) !== false ) { + return $_COOKIE['opal_google_uniqid']; + } + } + + $_COOKIE['opal_google_uniqid'] = uniqid( 'nextend', true ); + setcookie( 'opal_google_uniqid', $_COOKIE['opal_google_uniqid'], time() + 3600, '/' ); + set_site_transient( 'n_' . $_COOKIE['opal_google_uniqid'], 1, 3600 ); + + return $_COOKIE['opal_google_uniqid']; + } + + /** + * Redirect. + */ + public function redirect() { + $redirect = Opalestate_Social_Login::get_redirect_url(); + + header( 'LOCATION: ' . $redirect ); + delete_site_transient( $this->get_uniqid() . '_google_redirect' ); + exit(); + } + + public function signon( $credentials ) { + $user_signon = wp_signon( $credentials, true ); + + if ( is_wp_error( $user_signon ) ) { + wp_redirect( esc_url( home_url() ) ); + } else { + /** + * After signon successfully. + */ + do_action( 'opalestate_after_signon_successfully', $credentials ); + + $redirect = opalestate_get_user_management_page_uri(); + + if ( ! empty( $_REQUEST['redirect'] ) ) { + $redirect = sanitize_text_field( $_REQUEST['redirect'] ); + } + + $redirect = apply_filters( 'opalestate_signon_redirect_url', $redirect ); + wp_redirect( $redirect ); + } + } +} diff --git a/inc/vendors/social-login/class-opalestate-social-login.php b/inc/vendors/social-login/class-opalestate-social-login.php new file mode 100755 index 00000000..9092490f --- /dev/null +++ b/inc/vendors/social-login/class-opalestate-social-login.php @@ -0,0 +1,144 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +class Opalestate_Social_Login { + public function __construct() { + add_action( 'opalestate_member_after_login_form', [ $this, 'login_template' ] ); + add_action( 'opalelementor_after_render_login_form', [ $this, 'login_template' ] ); + + if ( is_admin() ) { + add_filter( 'opalestate_settings_3rd_party_subtabs_nav', [ $this, 'register_admin_setting_tab' ], 1 ); + add_filter( 'opalestate_settings_3rd_party_subtabs_social_login_fields', [ $this, 'register_admin_settings' ], 10, 1 ); + } + + $this->inludes(); + $this->process(); + } + + public function inludes() { + require_once 'class-opalestate-facebook-login.php'; + require_once 'class-opalestate-google-login.php'; + } + + public function process() { + new Opalestate_Facebook_Login(); + new Opalestate_Google_Login(); + } + + public function login_template() { + echo opalestate_load_template_path( 'user/social-login/social-login' ); + } + + public function register_admin_setting_tab( $tabs ) { + $tabs['social_login'] = esc_html__( 'Social Login', 'opalestate-pro' ); + + return $tabs; + } + + public function register_admin_settings( $fields ) { + $fields = apply_filters( 'opalestate_settings_review', [ + [ + 'name' => esc_html__( 'Google', 'opalestate-pro' ), + 'desc' => '', + 'type' => 'opalestate_title', + 'id' => 'opalestate_title_general_settings_google', + 'after_row' => '
              ', + ], + [ + 'name' => esc_html__( 'Enable Google login', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable Google login', 'opalestate-pro' ), + 'id' => 'enable_google_login', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + 'default' => 'off', + ], + [ + 'name' => esc_html__( 'Google Client ID', 'opalestate-pro' ), + 'desc' => esc_html__( 'Google Client ID is required for Google Login.', 'opalestate-pro' ), + 'id' => 'google_client_id', + 'type' => 'text', + ], + [ + 'name' => esc_html__( 'Google Client Secret', 'opalestate-pro' ), + 'desc' => esc_html__( 'Google Client Secret is required for Google Login.', 'opalestate-pro' ), + 'id' => 'google_client_secret', + 'type' => 'text', + ], + [ + 'name' => esc_html__( 'Google API key', 'opalestate-pro' ), + 'desc' => esc_html__( 'Google API key is required for Google Login.', 'opalestate-pro' ), + 'id' => 'google_api_key', + 'type' => 'text', + ], + [ + 'name' => esc_html__( 'Facebook', 'opalestate-pro' ), + 'desc' => '', + 'type' => 'opalestate_title', + 'id' => 'opalestate_title_general_settings_facebook', + 'before_row' => '
              ', + 'after_row' => '
              ', + ], + [ + 'name' => esc_html__( 'Enable Facebook login', 'opalestate-pro' ), + 'desc' => esc_html__( 'Enable Facebook login', 'opalestate-pro' ), + 'id' => 'enable_facebook_login', + 'type' => 'switch', + 'options' => [ + 'on' => esc_html__( 'Enable', 'opalestate-pro' ), + 'off' => esc_html__( 'Disable', 'opalestate-pro' ), + ], + 'default' => 'off', + ], + [ + 'name' => esc_html__( 'Facebook Application ID', 'opalestate-pro' ), + 'desc' => esc_html__( 'Facebook Application ID is required for Facebook login.', 'opalestate-pro' ), + 'id' => 'facebook_app_id', + 'type' => 'text', + ], + [ + 'name' => esc_html__( 'Facebook Secret', 'opalestate-pro' ), + 'desc' => esc_html__( 'Facebook Secret is required for Facebook login.', 'opalestate-pro' ), + 'id' => 'facebook_secret', + 'type' => 'text', + ], + ] ); + + return $fields; + } + + /** + * Gets redirect URL. + * + * @return mixed|void + */ + public static function get_redirect_url() { + if ( isset( $_GET['redirect_to'] ) && $_GET['redirect_to'] != '' ) { + $redirect = get_permalink( sanitize_text_field( $_GET['redirect_to'] ) ); + } else { + $redirect = esc_url( home_url( '/' ) ); + } + + return apply_filters( 'opal_social_login_redirect_to', $redirect ); + } +} + +new Opalestate_Social_Login(); diff --git a/inc/widgets/featured-properties.php b/inc/widgets/featured-properties.php new file mode 100755 index 00000000..49b477e5 --- /dev/null +++ b/inc/widgets/featured-properties.php @@ -0,0 +1,83 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/questions/ + */ + +class Opalestate_featured_properties_Widget extends WP_Widget{ + + public function __construct() { + parent::__construct( + // Base ID of your widget + 'opalestate_featured_properties_widget', + // Widget name will appear in UI + esc_html__('Estate: Featured Properties', 'opalestate-pro'), + // Widget description + array( 'description' => esc_html__( 'Featured Properties widget.', 'opalestate-pro' ), ) + ); + } + + public function widget( $args, $instance ) { + + + extract( $args ); + extract( $instance ); + + + //Check + + $tpl = OPALESTATE_THEMER_WIDGET_TEMPLATES .'widgets/featured-properties.php'; + $tpl_default = OPALESTATE_PLUGIN_DIR .'templates/widgets/featured-properties.php'; + + if( is_file($tpl) ) { + $tpl_default = $tpl; + } + require $tpl_default; + } + + + // Form + + public function form( $instance ) { + //Set up some default widget settings. + $defaults = array( + 'title' => esc_html__('Featured Properties', 'opalestate-pro'), + 'num' => '5' + ); + $instance = wp_parse_args( (array) $instance, $defaults ); ?> +

              + + +

              + +

              + +
              + +

              + diff --git a/inc/widgets/mortgage-calculator.php b/inc/widgets/mortgage-calculator.php new file mode 100755 index 00000000..a958a14c --- /dev/null +++ b/inc/widgets/mortgage-calculator.php @@ -0,0 +1,62 @@ + esc_html__( 'Mortgage Calculator widget.', 'opalestate-pro' ), ] + ); + } + + public function widget( $instance, $args ) { + extract( $args ); + extract( $instance ); + + //Check + $tpl = OPALESTATE_THEMER_WIDGET_TEMPLATES . 'parts/mortgage-calculator.php'; + $tpl_default = OPALESTATE_PLUGIN_DIR . 'templates/parts/mortgage-calculator.php'; + + if ( is_file( $tpl ) ) { + $tpl_default = $tpl; + } + require $tpl_default; + } + + + public function form( $instance ) { + //Set up some default widget settings. + $defaults = [ + 'title' => esc_html__( 'Mortgage Calculator', 'opalestate-pro' ), + ]; + $instance = wp_parse_args( (array) $instance, $defaults ); ?> +

              + + +

              + + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/questions/ + */ + +class Opalestate_profile_info_Widget extends WP_Widget { + + public function __construct() { + parent::__construct( + // Base ID of your widget + 'opalestate_profile_info_widget', + // Widget name will appear in UI + esc_html__( 'Estate: User Menu Profile', 'opalestate-pro' ), + // Widget description + [ 'description' => esc_html__( 'Display Profile information in box and menu.', 'opalestate-pro' ), ] + ); + } + + /** + * + */ + public function widget( $args, $instance ) { + + global $before_widget, $after_widget, $before_title, $after_title, $post; + + if ( ! is_user_logged_in() ) { + return; + } + + extract( $args ); + + $title = apply_filters( 'widget_title', $instance['title'] ); + + + echo( $before_widget ); + + + if ( $title ) { + echo ( $before_title ) . $title . ( $after_title ); + } + ?> +
              + + +
              + +
              + +
              + esc_html__( 'My Profile', 'opalestate-pro' ), + ]; + $instance = wp_parse_args( (array) $instance, $defaults ); ?> +

              + + +

              + + diff --git a/inc/widgets/sameprice-properties.php b/inc/widgets/sameprice-properties.php new file mode 100755 index 00000000..62a83e10 --- /dev/null +++ b/inc/widgets/sameprice-properties.php @@ -0,0 +1,92 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/questions/ + */ + +class Opalestate_sammeprice_properties_Widget extends WP_Widget{ + + public function __construct() { + parent::__construct( + // Base ID of your widget + 'opalestate_samepriceproperties_widget', + // Widget name will appear in UI + esc_html__('Estate: Same Price', 'opalestate-pro'), + // Widget description + array( 'description' => esc_html__( 'Similar Properties By Same Price with configured range and Status', 'opalestate-pro' ), ) + ); + } + + public function widget( $instance , $args ) { + $default = array( + 'num' => 5, + 'range_price' => 100, + ); + $args = array_merge( $default , $args ); + extract( $args ); + extract( $instance ); + //Check + $tpl = OPALESTATE_THEMER_WIDGET_TEMPLATES .'widgets/sameprice-properties.php'; + $tpl_default = OPALESTATE_PLUGIN_DIR .'templates/widgets/sameprice-properties.php'; + + if( is_file($tpl) ) { + $tpl_default = $tpl; + } + require $tpl_default; + } + + + // Form + + public function form( $instance ) { + //Set up some default widget settings. + $defaults = array( + 'title' => esc_html__('Same Price', 'opalestate-pro'), + 'num' => '5', + 'range_price' => 1000 + ); + $instance = wp_parse_args( (array) $instance, $defaults ); ?> +

              + + +

              + +

              + +
              + +

              + +

              + +
              + +

              + + diff --git a/inc/widgets/search-properties.php b/inc/widgets/search-properties.php new file mode 100755 index 00000000..8c56dd8b --- /dev/null +++ b/inc/widgets/search-properties.php @@ -0,0 +1,153 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/questions/ + */ + +class Opalestate_search_properties_Widget extends WP_Widget { + /** + * Opalestate_search_properties_Widget constructor. + */ + public function __construct() { + parent::__construct( + // Base ID of your widget + 'opalestate_search_properties_widget', + // Widget name will appear in UI + __( 'Estate: Search Properties', 'opalestate-pro' ), + // Widget description + [ 'description' => esc_html__( 'Search Properties widget.', 'opalestate-pro' ), ] + ); + } + + public function widget( $args, $instance ) { + extract( $args ); + extract( $instance ); + //Our variables from the widget settings. + $title = apply_filters( 'widget_title', esc_attr( $instance['title'] ) ); + + // Output the widget. + echo $before_widget; // @WPCS: XSS OK. + + if ( $title ) { + echo $before_title . $title . $after_title; // @WPCS: XSS OK. + } + ?> + +
              + +
              + + esc_html__( 'Search Properties', 'opalestate-pro' ), + 'hidden_labels' => 'true', + 'nobutton' => '', + 'style' => 'search-form-v', + 'display_country' => true, + 'display_state' => '', + 'display_city' => '', + ]; + + $instance = wp_parse_args( (array) $instance, $defaults ); ?> +

              + + +

              + +

              + + +

              + +

              + + +

              + +

              + + +

              + +

              + + +

              + +

              + + +

              + +

              + + +

              + + esc_html__( 'No', 'opalestate-pro' ), + 'true' => esc_html__( 'Yes', 'opalestate-pro' ), + ]; + } +} + +register_widget( 'Opalestate_search_properties_Widget' ); diff --git a/inc/widgets/similar-properties.php b/inc/widgets/similar-properties.php new file mode 100755 index 00000000..4ed371f1 --- /dev/null +++ b/inc/widgets/similar-properties.php @@ -0,0 +1,82 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/questions/ + */ + +class Opalestate_similar_properties_Widget extends WP_Widget{ + + public function __construct() { + parent::__construct( + // Base ID of your widget + 'opalestate_similarproperties_widget', + // Widget name will appear in UI + esc_html__('Estate: Similar Properties', 'opalestate-pro'), + // Widget description + array( 'description' => esc_html__( 'Similar Properties By Same Types and Status Of the post', 'opalestate-pro' ), ) + ); + } + + public function widget( $args, $instance ) { + + + extract( $args ); + extract( $instance ); + + //Check + + $tpl = OPALESTATE_THEMER_WIDGET_TEMPLATES .'widgets/similar-properties.php'; + $tpl_default = OPALESTATE_PLUGIN_DIR .'templates/widgets/similar-properties.php'; + + if( is_file($tpl) ) { + $tpl_default = $tpl; + } + require $tpl_default; + } + + + // Form + + public function form( $instance ) { + //Set up some default widget settings. + $defaults = array( + 'title' => esc_html__('Similar Properties', 'opalestate-pro'), + 'num' => '5' + ); + $instance = wp_parse_args( (array) $instance, $defaults ); ?> +

              + + +

              + +

              + +
              + +

              + diff --git a/languages/opalestate-pro-backup-201909030250570.pot~ b/languages/opalestate-pro-backup-201909030250570.pot~ new file mode 100644 index 00000000..361de15f --- /dev/null +++ b/languages/opalestate-pro-backup-201909030250570.pot~ @@ -0,0 +1,6515 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Opal Estate Pro\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-08-13 06:25+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: \n" +"Language: \n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Loco https://localise.biz/\n" +"X-Loco-Version: 2.3.0; wp-5.2.2" + +#: templates/parts/membership-pricing-info.php:21 +#: templates/parts/membership-pricing-info.php:23 +msgid " Featured" +msgstr "" + +#: templates/parts/membership-pricing-info.php:12 +#: templates/parts/membership-pricing-info.php:14 +msgid " Listings" +msgstr "" + +#: templates/messages/enquiry-form.php:23 +#: templates/messages/enquiry-form.php:38 +#: templates/messages/contact-form.php:37 +#: templates/user/share-search-form.php:48 +#: templates/user-search/render-form.php:33 +msgid " Processing" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:233 +msgid " Unlimited listings ?" +msgstr "" + +#: templates/archive-opalestate_agency.php:74 +#: templates/archive-opalestate_agent.php:64 +#: templates/archive-opalestate_property.php:52 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:318 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:330 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:353 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:318 +msgid "« Previous" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:494 +#: inc/vendors/opalmembership/membership.php:498 +msgid "(Package) Featured Included:" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:493 +#: inc/vendors/opalmembership/membership.php:497 +msgid "(Package) Listings Included:" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:209 +#: templates/single-property/virtualtour.php:8 +msgid "360° Virtual Tour" +msgstr "" + +#: inc/admin/register-settings.php:123 +msgid "3rd Party" +msgstr "" + +#: inc/admin/settings/3rd_party.php:49 +msgid "3rd Party Settings" +msgstr "" + +#: install.php:99 +msgid "[opalestate_myaccount]" +msgstr "" + +#: install.php:135 +msgid "[opalestate_search_map_properties]" +msgstr "" + +#: install.php:117 +msgid "[opalestate_submission]" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:333 +msgid "A metabox with the specified 'metabox_id' doesn't exist." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:60 +msgid "A user could not be found with this email address." +msgstr "" + +#: templates/content-single-agent.php:54 +msgid "About the Agent" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:122 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:176 +msgid "Account" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:212 +msgid "Active Life" +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:51 +msgid "add" +msgstr "" + +#. %s is property title +#: templates/rating/opalestate-ratings.php:228 +msgid "Add a review" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:421 +#: inc/property/class-metabox-property-admin.php:611 +#: inc/property/class-metabox-property-admin.php:680 +#: inc/submission/class-metabox-property-submission.php:454 +#: inc/submission/class-metabox-property-submission.php:533 +#: inc/submission/class-metabox-property-submission.php:609 +msgid "Add more" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:42 +#: inc/agency/class-opalestate-agency-posttype.php:43 +msgid "Add New Agency" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:35 +#: inc/agent/class-opalestate-agent-posttype.php:36 +msgid "Add New Agent" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:42 +msgid "Add New Amenity" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:82 +msgid "Add New Category" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:43 +msgid "Add New City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:44 +msgid "Add New Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:45 +msgid "Add New Label" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:80 +msgid "Add New Level" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:74 +msgid "Add New Neighborhood" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:41 +#: inc/property/class-opalestate-posttype.php:42 +#: templates/shortcodes/submission-form.php:30 +#: templates/submission/submission-form.php:16 +msgid "Add New Property" +msgstr "" + +#: inc/taxonomies/class-taxonomy-categories.php:46 +msgid "Add New Property Category" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:56 +msgid "Add new rating feature" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:42 +msgid "Add New State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:45 +msgid "Add New Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:83 +msgid "Add New Type" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:55 +msgid "Add rating feature" +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:46 +msgid "" +"Add someone to your agency, please enter extractly username in below input:" +msgstr "" + +#: templates/user/favorite-button.php:12 +msgid "Add To Favorite" +msgstr "" + +#: inc/admin/settings/3rd_party.php:67 +msgid "" +"Add Walk Score API key. To get your Walk Score API key, go to your Walk " +"Score Account." +msgstr "" + +#: inc/admin/settings/3rd_party.php:93 +msgid "" +"Add Yelp API Secret. Register here" +msgstr "" + +#: inc/admin/settings/3rd_party.php:86 +msgid "" +"Add Yelp client ID. To get your Yelp Api Client ID, go to your Yelp Account. " +"Register here" +msgstr "" + +#: inc/admin/register-settings.php:115 +msgid "Add-ons" +msgstr "" + +#: inc/admin/register-settings.php:84 +msgid "Addons" +msgstr "" + +#: templates/content-single-agency.php:24 +#: templates/content-single-agency.php:66 +#: inc/classes/class-opalestate-metabox-user.php:103 +#: inc/property/class-metabox-property-admin.php:217 +#: inc/submission/class-metabox-property-submission.php:381 +#: inc/admin/property/class-property.php:101 +msgid "Address" +msgstr "" + +#: templates/content-single-agent.php:79 +msgid "Address:" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:54 +msgctxt "Admin menu name" +msgid "Rating Features" +msgstr "" + +#: inc/email/class-opalestate-abs-email-template.php:43 +msgid "Admin Notice of Expiring Job Listings" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:201 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:170 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:193 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:171 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:201 +msgid "Advanced" +msgstr "" + +#: inc/mixes-functions.php:128 +msgid "Advanced V1 Form" +msgstr "" + +#: inc/mixes-functions.php:129 +msgid "Advanced V2 Form" +msgstr "" + +#: inc/mixes-functions.php:130 +msgid "Advanced V3 Form" +msgstr "" + +#: inc/mixes-functions.php:131 +msgid "Advanced V4 Form" +msgstr "" + +#: inc/mixes-functions.php:132 +msgid "Advanced V5 Form" +msgstr "" + +#: inc/mixes-functions.php:133 +msgid "Advanced V6 Form" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:105 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:105 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:91 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:91 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:105 +msgid "Advanded" +msgstr "" + +#: inc/mixes-functions.php:475 +msgid "Afghan afghani" +msgstr "" + +#: inc/admin/settings/general.php:206 +msgid "After - 10$" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:270 +#: inc/submission/class-metabox-property-submission.php:140 +msgid "After Price Label (e.g. \"per month\")" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:268 +#: inc/submission/class-metabox-property-submission.php:138 +msgid "After Price Label (optional)" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:40 +#: inc/agency/class-opalestate-agency-posttype.php:52 +msgid "Agencies" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:94 +msgid "Agencies Search/Collection" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:482 +#: inc/user/class-opalestate-user.php:274 +msgid "Agency" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:74 +#: inc/agency/class-opalestate-agency-posttype.php:84 +msgid "Agency Categories" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:443 +#: inc/agency/class-opalestate-agency-metabox.php:391 +msgid "Agency Information" +msgstr "" + +#: inc/agency/class-opalestate-agency-front.php:96 +msgid "Agency Profile" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:80 +msgid "Agency Search Form" +msgstr "" + +#: inc/agency/class-opalestate-agency-front.php:102 +#: templates/user/agency/agency-team.php:36 +msgid "Agency Team" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-form-builder.php:80 +msgid "Agency/Agent Tab Form Search" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:476 +#: inc/user/class-opalestate-user.php:273 +msgid "Agent" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:442 +msgid "Agent Information" +msgstr "" + +#: templates/single-agent/author-box.php:31 +msgid "Agent details" +msgstr "" + +#: templates/user/agent/profile-agent.php:23 +msgid "Agent edit profile form is not avariable" +msgstr "" + +#: inc/admin/settings/general.php:111 inc/admin/settings/general.php:122 +msgid "Agent Image Size" +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:215 +msgid "Agent Information" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:72 +#: inc/agent/class-opalestate-agent-posttype.php:82 +msgid "Agent Levels" +msgstr "" + +#: inc/agent/class-opalestate-agent-front.php:91 +#: inc/agent/class-opalestate-agent-front.php:320 +msgid "Agent Profile" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:36 +msgid "Agent Team" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:33 +#: inc/agent/class-opalestate-agent-posttype.php:45 +msgid "Agents" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:94 +msgid "Agents Search Collection" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:80 +msgid "Agents Search Form" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:43 +#: inc/property/class-opalestate-shortcodes.php:44 +msgid "Ajax Search Map Properties" +msgstr "" + +#: inc/mixes-functions.php:476 +msgid "Albanian lek" +msgstr "" + +#: inc/mixes-functions.php:514 +msgid "Algerian dinar" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:345 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:357 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:380 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:220 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:345 +msgid "Alignment" +msgstr "" + +#: inc/class-opalestate-html.php:222 inc/template-functions.php:354 +#: templates/user/my-properties.php:3 templates/parts/search-form-h.php:25 +#: templates/search-box/fields/status-bar.php:9 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:154 +msgid "All" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:46 +msgid "All Agencies" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:39 +msgid "All Agents" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:37 +msgid "All Amenities" +msgstr "" + +#: templates/parts/mortgage-calculator.php:178 +msgid "" +"All calculation are based on tentative and estimated figure and shall not " +"replace any financial advice" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:77 +msgid "All Categories" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:38 +msgid "All Cities / Town" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:39 +msgid "All Countries" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:40 +msgid "All Label" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:75 +msgid "All Levels" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:69 +msgid "All Neighborhoods" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:45 +msgid "All Properties" +msgstr "" + +#: inc/importer/class-import-steps.php:570 +msgid "" +"All siders are downloading from live server then extract and install, please " +"waiting for a while!" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:37 +msgid "All States / Province" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:40 +msgid "All Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:78 +msgid "All Types" +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:30 +msgid "Allow set automatic a free package." +msgstr "" + +#: inc/vendors/cmb2-plugins/uploader/uploader.php:154 +#, php-format +msgid "Allow upload file have size < %s MB and maximum number of files: %s" +msgstr "" + +#: inc/admin/settings/general.php:67 +msgid "" +"Allow User send message Contact/Equire via email and saved into database to " +"exchange theirs message direct in User Message Management" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:34 +#: inc/taxonomies/class-taxomony-amenities.php:44 +#: inc/submission/class-metabox-property-submission.php:65 +#: inc/submission/class-metabox-property-submission.php:416 +#: templates/search-box/search-form-v3.php:51 +#: templates/search-box/search-form-v2.php:34 +msgid "Amenities" +msgstr "" + +#: inc/user/functions.php:223 +msgid "An account is already registered with your email address. Please login." +msgstr "" + +#: inc/submission/class-opalestate-submission.php:682 +msgid "An error occured when removing an item." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:251 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:220 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:243 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:251 +msgid "AND" +msgstr "" + +#: inc/mixes-functions.php:479 +msgid "Angolan kwanza" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:299 +msgid "Animation Speed" +msgstr "" + +#: templates/parts/mortgage-calculator.php:165 +#: templates/parts/mortgage-calculator.php:166 +#: templates/widgets/mortgage-calculator.php:152 +#: templates/widgets/mortgage-calculator.php:153 +msgid "Annual Interest" +msgstr "" + +#: templates/shortcodes/ajax-map-search.php:46 +#: templates/parts/search-form-v.php:63 +msgid "Any" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:679 +#: inc/submission/class-metabox-property-submission.php:532 +msgid "Apartment {#}" +msgstr "" + +#: templates/content-single-property-v5.php:30 +#: inc/property/class-metabox-property-admin.php:83 +#: inc/submission/class-metabox-property-submission.php:67 +#: inc/submission/class-metabox-property-submission.php:469 +#: templates/single-property/apartments.php:14 +msgid "Apartments" +msgstr "" + +#: inc/admin/register-settings.php:122 inc/admin/settings/api_keys.php:28 +#: inc/admin/settings/api_keys.php:34 +msgid "API" +msgstr "" + +#: inc/admin/class-api-keys-table.php:54 +msgid "API Key" +msgstr "" + +#: inc/admin/class-api-keys-table.php:55 +msgid "API Keys" +msgstr "" + +#: inc/admin/functions.php:372 +#, php-format +msgid "" +"API keys allow users to use the Opalestate REST API to " +"retrieve donation data in JSON or XML for external applications or devices, " +"such as Zapi_keyser." +msgstr "" + +#: templates/shortcodes/ajax-map-search.php:78 +msgid "Apply" +msgstr "" + +#: inc/class-opalestate-email.php:331 +msgid "Approve For Publish - {property_name}" +msgstr "" + +#: inc/class-opalestate-email.php:304 +msgid "Approve property for publish" +msgstr "" + +#: templates/user/share-search-form.php:23 +msgid "Are you searching with anyone? Share this search." +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:64 +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:76 +msgid "Are you sure to delete this" +msgstr "" + +#: templates/user-search/content-savedsearch.php:22 +msgid "Are you sure to delete this?" +msgstr "" + +#: inc/class-opalestate-enqueue.php:86 +msgid "Are you sure to remove?" +msgstr "" + +#: templates/user/content-property.php:91 +msgid "Are you sure you wish to delete?" +msgstr "" + +#: inc/function-search-fields.php:83 templates/search-box/search-form-v3.php:61 +#: templates/search-box/search-form-v2.php:44 +msgid "Area" +msgstr "" + +#: inc/template-functions.php:229 +msgid "Area Ascending" +msgstr "" + +#: inc/template-functions.php:230 +msgid "Area Desending" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:346 +#: inc/submission/class-metabox-property-submission.php:288 +msgid "Area Size" +msgstr "" + +#: inc/mixes-functions.php:480 +msgid "Argentine peso" +msgstr "" + +#: inc/mixes-functions.php:477 +msgid "Armenian dram" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:200 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:338 +msgid "Arrows" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:199 +msgid "Arrows and Dots" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:216 +msgid "Arts & Entertainment" +msgstr "" + +#: inc/mixes-functions.php:482 +msgid "Aruban florin" +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:44 +msgid "As an author, you can add other users to your agency." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:228 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:197 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:220 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:197 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:228 +msgid "ASC" +msgstr "" + +#: templates/content-single-property-v2.php:66 +msgid "Attachment" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:126 +#: inc/property/class-metabox-property-admin.php:130 +#: inc/submission/class-metabox-property-submission.php:216 +msgid "Attachments" +msgstr "" + +#: inc/mixes-functions.php:481 +msgid "Australian dollar" +msgstr "" + +#: inc/admin/property/class-property.php:103 +msgid "Author" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:469 +msgid "Author Information" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:220 +msgid "Automotive" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:244 +msgid "Autoplay" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:258 +msgid "Autoplay Speed" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:666 +#: inc/submission/class-metabox-property-submission.php:518 +msgid "Available" +msgstr "" + +#: templates/rating/opalestate-ratings.php:252 +#: templates/rating/opalestate-ratings.php:264 +msgid "Average" +msgstr "" + +#: inc/mixes-functions.php:483 +msgid "Azerbaijani manat" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:81 +#: inc/taxonomies/class-taxonomy-status.php:77 +msgid "Background" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:316 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:402 +msgid "Background Color" +msgstr "" + +#: inc/mixes-functions.php:494 +msgid "Bahamian dollar" +msgstr "" + +#: inc/mixes-functions.php:488 +msgid "Bahraini dinar" +msgstr "" + +#: inc/mixes-functions.php:486 +msgid "Bangladeshi taka" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:315 +#: inc/agent/class-opalestate-agent-metabox.php:148 +msgid "Banner" +msgstr "" + +#: inc/mixes-functions.php:485 +msgid "Barbadian dollar" +msgstr "" + +#: templates/rating/opalestate-ratings.php:132 +msgid "based on all ratings" +msgstr "" + +#: inc/property/class-opalestate-search.php:396 +msgid "Bath Rooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:330 +#: inc/submission/class-metabox-property-submission.php:270 +msgid "Bathrooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:586 +#: inc/submission/class-metabox-property-submission.php:582 +msgid "Baths" +msgstr "" + +#: templates/single-property/floor-plans.php:63 +msgid "Baths:" +msgstr "" + +#: templates/rating/opalestate-ratings.php:228 +#, php-format +msgid "Be the first to review “%s”" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:224 +msgid "Beauty & Spas" +msgstr "" + +#: inc/property/class-opalestate-search.php:394 +msgid "Bed Rooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:320 +#: inc/submission/class-metabox-property-submission.php:258 +msgid "Bedrooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:641 +#: inc/submission/class-metabox-property-submission.php:494 +#: templates/single-property/apartments.php:23 +msgid "Beds" +msgstr "" + +#: inc/admin/settings/general.php:205 +msgid "Before - $10" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:264 +#: inc/submission/class-metabox-property-submission.php:134 +msgid "Before Price Label (e.g. \"from\")" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:262 +#: inc/submission/class-metabox-property-submission.php:132 +msgid "Before Price Label (optional)" +msgstr "" + +#: inc/mixes-functions.php:498 +msgid "Belarusian ruble" +msgstr "" + +#: inc/mixes-functions.php:499 +msgid "Belize dollar" +msgstr "" + +#: inc/mixes-functions.php:490 +msgid "Bermudian dollar" +msgstr "" + +#: inc/mixes-functions.php:496 +msgid "Bhutanese ngultrum" +msgstr "" + +#: templates/single-property/walkscore.php:48 +msgid "Bikeable Scores" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:51 +#: inc/agency/class-opalestate-agency-metabox.php:129 +msgid "Biographical Info" +msgstr "" + +#: inc/mixes-functions.php:495 +msgid "Bitcoin" +msgstr "" + +#: inc/admin/class-user.php:168 +msgid "Block Submssion" +msgstr "" + +#: inc/admin/class-user.php:176 +msgid "Block Submssion Message" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:44 +msgid "Block: Account Button" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:54 +msgid "Block: Agencies Collection" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:40 +msgid "Block: Agency - Search Form" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:54 +msgid "Block: Agent Collection" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:40 +msgid "Block: Agents - Search Form" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-category-list.php:54 +msgid "Block: Category Listing" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:55 +msgid "Block: Property Collection" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-split-maps-search.php:40 +msgid "Block: Split Maps Property Search" +msgstr "" + +#: inc/mixes-functions.php:492 +msgid "Bolivian boliviano" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:357 +msgid "Border Radius" +msgstr "" + +#: inc/mixes-functions.php:484 +msgid "Bosnia and Herzegovina convertible mark" +msgstr "" + +#: inc/mixes-functions.php:497 +msgid "Botswana pula" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-form-builder.php:95 +msgid "Brand Items" +msgstr "" + +#: inc/mixes-functions.php:493 +msgid "Brazilian real" +msgstr "" + +#: inc/admin/views/addons/list.php:3 +msgid "Browse All Add-ons" +msgstr "" + +#: templates/archive-opalestate_agent.php:13 +msgid "" +"Browser home sales, rating and review to find the best agent to sell or " +"lease your home" +msgstr "" + +#: inc/mixes-functions.php:491 +msgid "Brunei dollar" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:657 +#: inc/submission/class-metabox-property-submission.php:510 +#: templates/single-property/apartments.php:26 +msgid "Building / Address" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:298 +#: inc/submission/class-metabox-property-submission.php:238 +msgid "Built year" +msgstr "" + +#: inc/mixes-functions.php:487 +msgid "Bulgarian lev" +msgstr "" + +#: inc/mixes-functions.php:565 +msgid "Burmese kyat" +msgstr "" + +#: inc/mixes-functions.php:489 +msgid "Burundian franc" +msgstr "" + +#: inc/classes/class-opalestate-cache.php:205 +#: inc/classes/class-opalestate-cache.php:246 +#: inc/classes/class-opalestate-cache.php:295 +msgid "Cache key format should be opalestate_cache_*" +msgstr "" + +#: templates/parts/property-loop-price.php:15 +msgid "Call to Price" +msgstr "" + +#: inc/mixes-functions.php:548 +msgid "Cambodian riel" +msgstr "" + +#: inc/mixes-functions.php:500 +msgid "Canadian dollar" +msgstr "" + +#: inc/class-opalestate-html.php:56 +msgid "Cancel" +msgstr "" + +#: inc/mixes-functions.php:509 +msgid "Cape Verdean escudo" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:222 +msgid "Carousel Additional Options" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:153 +msgid "Carousel Options" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:237 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:206 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:229 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:206 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:237 +msgid "Categories" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:75 +msgid "Category" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-category-list.php:94 +msgid "Category Collection" +msgstr "" + +#: inc/taxonomies/class-taxonomy-categories.php:77 +msgid "Category image" +msgstr "" + +#: inc/taxonomies/class-taxonomy-categories.php:69 +#: inc/taxonomies/class-taxonomy-labels.php:75 +#: inc/taxonomies/class-taxonomy-status.php:71 +msgid "Category Metabox" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:247 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:216 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:239 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:247 +msgid "Category Operator" +msgstr "" + +#: inc/mixes-functions.php:553 +msgid "Cayman Islands dollar" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:353 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:365 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:388 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:228 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:353 +msgid "Center" +msgstr "" + +#: inc/mixes-functions.php:627 +msgid "Central African CFA franc" +msgstr "" + +#: inc/mixes-functions.php:630 +msgid "CFP franc" +msgstr "" + +#: templates/user/profile.php:41 +msgid "Change Password" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:515 +msgid "" +"Change to new owner of this property, which be listed in That user dashboard" +msgstr "" + +#: opal-estate-pro.php:170 +msgid "Cheatin’ huh?" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:301 +msgid "Check your email address for you new password." +msgstr "" + +#: inc/mixes-functions.php:503 +msgid "Chilean peso" +msgstr "" + +#: inc/mixes-functions.php:504 +msgid "Chinese yuan" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:103 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:157 +msgid "Choose Icon" +msgstr "" + +#: inc/admin/settings/general.php:176 +msgid "Choose layout for single property." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:264 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:287 +msgid "Cities" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:35 +#: inc/taxonomies/class-taxonomy-city.php:45 +msgid "Cities / Towns" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:126 +msgid "City" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:95 +#: inc/submission/class-metabox-property-submission.php:368 +msgid "City / Town" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:77 +msgid "City image" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:69 +msgid "City Metabox" +msgstr "" + +#: templates/rating/opalestate-ratings.php:283 +msgid "Click here to login" +msgstr "" + +#: templates/submission/completed.php:11 templates/submission/completed.php:19 +#, php-format +msgid "Click to %s here %s to back to your listing or %s edit %s this." +msgstr "" + +#: templates/parts/membership-warning.php:4 +msgid "Click to this link to see plans" +msgstr "" + +#: inc/mixes-functions.php:139 +msgid "Collapse City Form" +msgstr "" + +#: inc/mixes-functions.php:140 +msgid "Collapse Keyword Form" +msgstr "" + +#: inc/mixes-functions.php:505 +msgid "Colombian peso" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:87 +#: inc/taxonomies/class-taxonomy-status.php:83 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:386 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:448 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:179 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:257 +msgid "Color" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-form-builder.php:108 +msgid "Column" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:134 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:106 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:113 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:114 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:125 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:125 +#: inc/vendors/elementor/widgets/opalestate-split-maps-search.php:109 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:134 +msgid "Columns" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:150 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:117 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:127 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:130 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:141 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:141 +#: inc/vendors/elementor/widgets/opalestate-split-maps-search.php:125 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:150 +msgid "Columns Gap" +msgstr "" + +#: inc/mixes-functions.php:549 +msgid "Comorian franc" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:132 +msgid "Company" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:145 +msgid "company" +msgstr "" + +#: inc/importer/class-import-steps.php:911 +msgid "Completed the installation" +msgstr "" + +#: inc/user/class-opalestate-user.php:472 +msgid "Confirm Password" +msgstr "" + +#: inc/importer/class-import-steps.php:66 +msgid "Confirmed to install the sample " +msgstr "" + +#: inc/mixes-functions.php:501 +msgid "Congolese franc" +msgstr "" + +#: templates/user/social-login/facebook-button.php:20 +msgid "Connect with Facebook" +msgstr "" + +#: templates/user/social-login/google-button.php:20 +msgid "Connect with Google" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:151 +msgid "Contact email" +msgstr "" + +#: templates/messages/contact-form.php:13 +msgid "Contact Me" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:143 +msgid "Contact Member" +msgstr "" + +#: templates/parts/property-loop-price.php:34 +msgid "Contact Property" +msgstr "" + +#: templates/content-single-agency.php:140 +msgid "Contact Us" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:415 +#: inc/property/class-metabox-property-admin.php:592 +#: inc/submission/class-metabox-property-submission.php:448 +#: inc/submission/class-metabox-property-submission.php:588 +msgid "Content" +msgstr "" + +#. %s: Name of current post +#: templates/content-single-agency.php:50 templates/content-single-agent.php:58 +#, php-format +msgid "Continue reading %s" +msgstr "" + +#. %s: Name of current post +#: templates/single-property/content.php:6 +#, php-format +msgid "Continue reading %s " +msgstr "" + +#: inc/mixes-functions.php:506 +msgid "Costa Rican colón" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:179 +msgid "Could not allow uploading image" +msgstr "" + +#: inc/importer/class-import-steps.php:249 +msgid "" +"Could not fetch data for the installation, Please try again or contact our " +"developer. Thanks!!!" +msgstr "" + +#: inc/ajax-functions.php:213 inc/ajax-functions.php:218 +msgid "Could not set this as featured" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-category-list.php:185 +msgid "Count" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:36 +#: inc/taxonomies/class-taxonomy-locations.php:46 +msgid "Countries" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:142 +#: inc/taxonomies/class-taxonomy-state.php:91 +#: inc/taxonomies/class-taxonomy-city.php:88 +#: inc/submission/class-metabox-property-submission.php:355 +msgid "Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:85 +msgid "Country image" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:77 +msgid "Country Metabox" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:504 +msgid "Create an Account" +msgstr "" + +#: inc/mixes-functions.php:532 +msgid "Croatian kuna" +msgstr "" + +#: inc/mixes-functions.php:507 +msgid "Cuban convertible peso" +msgstr "" + +#: inc/mixes-functions.php:508 +msgid "Cuban peso" +msgstr "" + +#: inc/admin/settings/general.php:192 +msgid "Currency" +msgstr "" + +#: inc/admin/settings/general.php:200 +msgid "Currency Position" +msgstr "" + +#: inc/admin/settings/general.php:184 +msgid "Currency Settings" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:104 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:104 +msgid "Current Page" +msgstr "" + +#: inc/agency/class-opalestate-agency-front.php:317 +#: inc/agent/class-opalestate-agent-front.php:219 +msgid "Currently, The data could not save!" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:533 +msgid "" +"Currently, your account was blocked, please keep contact admin to resolve " +"this!." +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:47 +msgid "Custom Icon Marker" +msgstr "" + +#: inc/mixes-functions.php:510 +msgid "Czech koruna" +msgstr "" + +#: inc/mixes-functions.php:512 +msgid "Danish krone" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:141 +msgid "Dark" +msgstr "" + +#: inc/user/functions.php:123 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:549 +msgid "Dashboard" +msgstr "" + +#: inc/rating/class-opalestate-rating-metabox.php:105 +msgid "Data" +msgstr "" + +#: inc/admin/property/class-property.php:104 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:213 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:182 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:205 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:213 +msgid "Date" +msgstr "" + +#: inc/admin/functions.php:327 +msgid "Deactivate License" +msgstr "" + +#: inc/admin/settings/general.php:218 +msgid "Decimal Separator" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:169 +msgid "Default" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:501 +msgid "Default User" +msgstr "" + +#: templates/user-search/content-savedsearch.php:12 +msgid "Delete" +msgstr "" + +#: templates/user/content-property.php:91 +msgid "Delete Property" +msgstr "" + +#: templates/parts/mortgage-calculator.php:158 +#: templates/parts/mortgage-calculator.php:159 +#: templates/widgets/mortgage-calculator.php:145 +#: templates/widgets/mortgage-calculator.php:146 +msgid "Deposit" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:229 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:198 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:221 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:198 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:229 +msgid "DESC" +msgstr "" + +#: templates/content-single-property-v2.php:63 +#: templates/content-single-property-v5.php:16 +#: templates/content-property-list.php:51 +#: templates/content-single-agency.php:23 +#: templates/content-single-agency.php:44 templates/content-single-agent.php:16 +#: inc/rating/class-opalestate-rating-metabox.php:110 +#: inc/submission/class-metabox-property-submission.php:109 +#: templates/single-property/content.php:2 +msgid "Description" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:309 +msgid "Direction" +msgstr "" + +#: inc/class-opalestate-email.php:317 +#: inc/submission/class-opalestate-submission.php:180 +#: inc/submission/class-opalestate-submission.php:190 +#: inc/submission/class-opalestate-submission.php:200 +#: inc/submission/class-opalestate-submission.php:210 +#: inc/submission/class-opalestate-submission.php:220 +#: inc/submission/class-opalestate-submission.php:230 +#: inc/submission/class-opalestate-submission.php:240 +#: inc/vendors/social-login/class-opalestate-social-login.php:70 +#: inc/vendors/social-login/class-opalestate-social-login.php:107 +#: inc/admin/settings/property.php:71 inc/admin/settings/property.php:82 +#: inc/admin/settings/property.php:127 inc/admin/settings/property.php:138 +#: inc/admin/settings/property.php:174 inc/admin/settings/property.php:236 +#: inc/admin/settings/property.php:247 inc/admin/settings/property.php:266 +#: inc/admin/settings/property.php:277 inc/admin/settings/property.php:301 +#: inc/admin/settings/property.php:312 inc/admin/settings/property.php:323 +#: inc/admin/settings/property.php:334 inc/admin/settings/property.php:345 +#: inc/admin/settings/property.php:356 inc/admin/settings/property.php:367 +#: inc/admin/settings/property.php:378 inc/admin/settings/property.php:389 +#: inc/admin/settings/property.php:400 inc/admin/settings/general.php:72 +#: inc/admin/rating/class-rating.php:70 inc/admin/rating/class-rating.php:80 +#: inc/admin/rating/class-rating.php:90 +msgid "Disable" +msgstr "" + +#: inc/widgets/search-properties.php:83 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:109 +msgid "Disable Labels" +msgstr "" + +#: inc/admin/settings/property.php:224 +msgid "Disable or enable fields appearing in search form" +msgstr "" + +#: inc/widgets/search-properties.php:92 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:118 +msgid "Disable Search button" +msgstr "" + +#: inc/admin/class-user.php:170 +msgid "Disable Submssion Functions to not allow submit property" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:136 +msgid "Display captcha box with color style." +msgstr "" + +#: inc/widgets/search-properties.php:119 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:149 +msgid "Display City select" +msgstr "" + +#: inc/widgets/search-properties.php:101 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:126 +msgid "Display Country select" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:160 +msgid "Display More Options" +msgstr "" + +#: inc/widgets/profile-info.php:24 +msgid "Display Profile information in box and menu." +msgstr "" + +#: inc/admin/settings/property.php:77 inc/admin/settings/property.php:99 +#: inc/admin/settings/property.php:122 inc/admin/settings/property.php:133 +msgid "Display Save Search Link Management" +msgstr "" + +#: inc/widgets/search-properties.php:110 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:138 +msgid "Display State select" +msgstr "" + +#: inc/mixes-functions.php:511 +msgid "Djiboutian franc" +msgstr "" + +#: inc/classes/class-opalestate-cache.php:170 +msgid "Do not pass empty action to generate cache key." +msgstr "" + +#: inc/classes/class-opalestate-cache.php:203 +msgid "Do not pass invalid empty cache key" +msgstr "" + +#: inc/mixes-functions.php:513 +msgid "Dominican peso" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:201 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:400 +msgid "Dots" +msgstr "" + +#: inc/importer/class-import-steps.php:375 +msgid "Downloading:" +msgstr "" + +#: templates/user/share-search-form.php:39 +msgid "E-mail" +msgstr "" + +#: inc/mixes-functions.php:628 +msgid "East Caribbean dollar" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:57 +#: templates/user/content-property.php:82 +#: inc/vendors/opalmembership/membership.php:508 +msgid "Edit" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:44 +msgid "Edit Agency" +msgstr "" + +#: templates/user/agency/profile-agency.php:23 +msgid "Edit Agency Profile" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:37 +msgid "Edit Agent" +msgstr "" + +#: templates/user/agent/profile-agent.php:7 +msgid "Edit Agent Profile" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:40 +msgid "Edit Amenity" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:80 +msgid "Edit Category" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:41 +msgid "Edit City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:42 +msgid "Edit Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:43 +msgid "Edit Label" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:78 +msgid "Edit Level" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:267 +msgid "Edit My Property" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:72 +msgid "Edit Neighborhood" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:43 +#: templates/shortcodes/submission-form.php:32 +#: templates/submission/submission-form.php:19 +msgid "Edit Property" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:58 +msgid "Edit rating feature" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:40 +msgid "Edit State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:43 +msgid "Edit Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:81 +msgid "Edit Type" +msgstr "" + +#: templates/user/profile.php:22 +msgid "Edit User Profile" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:228 +msgid "Education" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:282 +msgid "Effect" +msgstr "" + +#: inc/mixes-functions.php:515 +msgid "Egyptian pound" +msgstr "" + +#: inc/class-opalestate-email.php:152 +#: inc/classes/class-opalestate-metabox-user.php:178 +#: inc/agency/class-opalestate-agency-metabox.php:351 +#: inc/message/class-opalestate-message.php:525 +#: inc/message/class-opalestate-message.php:626 +#: inc/agent/class-opalestate-agent-metabox.php:177 +#: templates/rating/opalestate-ratings.php:237 +msgid "Email" +msgstr "" + +#: templates/user/register-form.php:50 +msgid "Email address" +msgstr "" + +#: inc/class-opalestate-email.php:297 inc/class-opalestate-email.php:336 +#: inc/class-opalestate-email.php:364 +msgid "Email Body" +msgstr "" + +#: inc/class-opalestate-email.php:344 +msgid "Email Contact Templates (Template Tags)" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:172 +msgid "Email is required." +msgstr "" + +#: inc/message/class-opalestate-message.php:229 +msgid "Email Sent successful" +msgstr "" + +#: inc/class-opalestate-email.php:240 inc/class-opalestate-email.php:244 +#: inc/submission/class-opalestate-submission.php:121 +msgid "Email Settings" +msgstr "" + +#: inc/class-opalestate-email.php:285 inc/class-opalestate-email.php:324 +#: inc/class-opalestate-email.php:352 +msgid "Email Subject" +msgstr "" + +#: inc/class-opalestate-email.php:267 +msgid "Email Submission Templates (Template Tags)" +msgstr "" + +#: templates/single-property/sharebox.php:72 +msgid "Email to a Friend" +msgstr "" + +#: inc/class-opalestate-email.php:259 +msgid "" +"Email to send donation receipts from. This will act as the \"from\" and " +"\"reply-to\" address." +msgstr "" + +#: inc/class-opalestate-email.php:316 +#: inc/submission/class-opalestate-submission.php:179 +#: inc/submission/class-opalestate-submission.php:189 +#: inc/submission/class-opalestate-submission.php:199 +#: inc/submission/class-opalestate-submission.php:209 +#: inc/submission/class-opalestate-submission.php:219 +#: inc/submission/class-opalestate-submission.php:229 +#: inc/submission/class-opalestate-submission.php:239 +#: inc/vendors/social-login/class-opalestate-social-login.php:69 +#: inc/vendors/social-login/class-opalestate-social-login.php:106 +#: inc/admin/settings/property.php:70 inc/admin/settings/property.php:81 +#: inc/admin/settings/property.php:126 inc/admin/settings/property.php:137 +#: inc/admin/settings/property.php:175 inc/admin/settings/property.php:237 +#: inc/admin/settings/property.php:248 inc/admin/settings/property.php:267 +#: inc/admin/settings/property.php:278 inc/admin/settings/property.php:300 +#: inc/admin/settings/property.php:311 inc/admin/settings/property.php:322 +#: inc/admin/settings/property.php:333 inc/admin/settings/property.php:344 +#: inc/admin/settings/property.php:355 inc/admin/settings/property.php:366 +#: inc/admin/settings/property.php:377 inc/admin/settings/property.php:388 +#: inc/admin/settings/property.php:399 inc/admin/settings/general.php:71 +#: inc/admin/rating/class-rating.php:69 inc/admin/rating/class-rating.php:79 +#: inc/admin/rating/class-rating.php:89 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:171 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:171 +msgid "Enable" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:154 +msgid "Enable Admin Approve" +msgstr "" + +#: inc/admin/rating/class-rating.php:74 inc/admin/rating/class-rating.php:75 +msgid "Enable agency reviews" +msgstr "" + +#: inc/admin/rating/class-rating.php:84 inc/admin/rating/class-rating.php:85 +msgid "Enable agent reviews" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:204 +#: inc/submission/class-opalestate-submission.php:205 +msgid "Enable Amenities tab" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:224 +#: inc/submission/class-opalestate-submission.php:225 +msgid "Enable Apartments tab" +msgstr "" + +#: inc/class-opalestate-email.php:311 +msgid "Enable approve property email" +msgstr "" + +#: inc/class-opalestate-email.php:312 +msgid "Enable approve property email." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:140 +msgid "Enable Avatar" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:138 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:161 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:152 +msgid "Enable Carousel" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:101 +#: inc/vendors/social-login/class-opalestate-social-login.php:102 +msgid "Enable Facebook login" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:214 +#: inc/submission/class-opalestate-submission.php:215 +msgid "Enable Facilities tab" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:234 +#: inc/submission/class-opalestate-submission.php:235 +msgid "Enable Floor plans tab" +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:29 +msgid "Enable Free Submission" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:102 +msgid "" +"Enable google captch in contact , register form. After Set yes, you change " +"setting in Google Captcha Tab. Register here: https://www.google." +"com/recaptcha/admin Version 2" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:64 +#: inc/vendors/social-login/class-opalestate-social-login.php:65 +msgid "Enable Google login" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:396 +msgid "Enable Google Map" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:194 +#: inc/submission/class-opalestate-submission.php:195 +msgid "Enable Information tab" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:112 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:166 +msgid "Enable Label" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:184 +#: inc/submission/class-opalestate-submission.php:185 +msgid "Enable Location tab" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:174 +#: inc/submission/class-opalestate-submission.php:175 +msgid "Enable Media tab" +msgstr "" + +#: inc/admin/settings/general.php:66 +msgid "Enable Message Database" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:149 +msgid "Enable Notification" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:161 +msgid "Enable or Disable require user enter price and price label." +msgstr "" + +#: inc/admin/rating/class-rating.php:64 inc/admin/rating/class-rating.php:65 +msgid "Enable property reviews" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:160 +msgid "Enable Require Price" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:114 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:114 +msgid "Enable Sortable Bar" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:99 +msgid "Enable Static Map" +msgstr "" + +#: inc/admin/settings/property.php:66 +msgid "Enable to allow user post/submit properties in front-end" +msgstr "" + +#: inc/admin/settings/property.php:65 +msgid "Enable User Submission" +msgstr "" + +#: templates/messages/enquiry-form.php:7 +msgid "Enquire about property" +msgstr "" + +#: templates/parts/search-agency-form.php:20 +msgid "Enter Agency Name" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:250 +#: inc/property/class-metabox-property-admin.php:258 +#: inc/submission/class-metabox-property-submission.php:120 +#: inc/submission/class-metabox-property-submission.php:128 +msgid "Enter amount without currency" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:251 +msgid "Enter an username or e-mail address." +msgstr "" + +#: inc/property/class-metabox-property-admin.php:301 +#: inc/submission/class-metabox-property-submission.php:241 +msgid "Enter built year" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:153 +msgid "" +"Enter contact name that allow user contact you via the contact form of " +"website." +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:61 +#: inc/agent/class-opalestate-agent-metabox.php:128 +msgid "Enter max price of property which is for sale/rent..." +msgstr "" + +#: inc/admin/settings/property.php:213 +msgid "Enter maximum of area for starting search" +msgstr "" + +#: inc/admin/settings/property.php:191 +msgid "Enter maximum of price for starting search" +msgstr "" + +#: inc/admin/settings/general.php:166 +msgid "Enter maximum of price for starting search agent by target" +msgstr "" + +#: inc/admin/settings/property.php:158 +msgid "Enter min of properties display in search page" +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:54 +#: inc/agent/class-opalestate-agent-metabox.php:121 +msgid "Enter min price of property which is for sale/rent..." +msgstr "" + +#: inc/admin/settings/general.php:156 +msgid "Enter minimum of price for starting search agent by target" +msgstr "" + +#: inc/admin/settings/property.php:203 +msgid "Enter minimum of area for starting search" +msgstr "" + +#: inc/admin/settings/property.php:181 +msgid "Enter minimum of price for starting search" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:388 +#: inc/submission/class-metabox-property-submission.php:341 +msgid "Enter Number of Amount Rooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:337 +#: inc/submission/class-metabox-property-submission.php:279 +msgid "Enter number of bathrooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:327 +#: inc/submission/class-metabox-property-submission.php:267 +msgid "Enter number of bedrooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:377 +#: inc/submission/class-metabox-property-submission.php:328 +msgid "Enter Number of Kitchens" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:366 +#: inc/submission/class-metabox-property-submission.php:315 +msgid "Enter Number of Living Rooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:316 +#: inc/submission/class-metabox-property-submission.php:255 +msgid "Enter number of Parking" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:355 +#: inc/submission/class-metabox-property-submission.php:303 +msgid "Enter Orientation of property" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:349 +#: inc/submission/class-metabox-property-submission.php:297 +msgid "Enter size of area in sqft" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:343 +#: inc/submission/class-metabox-property-submission.php:285 +msgid "Enter size of Plot as 20x30, 20x30x40, 20x30x40x50" +msgstr "" + +#: inc/class-opalestate-email.php:338 +msgid "" +"Enter the email a user should receive when they make an initial payment " +"request." +msgstr "" + +#: inc/class-opalestate-email.php:299 +msgid "" +"Enter the email an admin should receive when an initial payment request is " +"made." +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:47 +msgid "Enter User ID to show information without using user info" +msgstr "" + +#: inc/class-opalestate-html.php:41 +msgid "Enter username" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:182 +msgid "Enter your facebook profile or facebook newfeed" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:160 +msgid "Enter your home phone." +msgstr "" + +#: inc/mixes-functions.php:516 +msgid "Eritrean nakfa" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:46 +#: inc/user/class-opalestate-user-form-handler.php:51 +#: inc/user/class-opalestate-user-form-handler.php:60 +#: inc/user/class-opalestate-user-form-handler.php:70 +#: inc/user/class-opalestate-user-form-handler.php:160 +#: inc/user/class-opalestate-user-form-handler.php:165 +#: inc/user/class-opalestate-user-form-handler.php:172 +#: inc/user/class-opalestate-user-form-handler.php:179 +#: inc/user/class-opalestate-user-form-handler.php:182 +#: inc/user/class-opalestate-user-form-handler.php:191 +msgid "ERROR" +msgstr "" + +#: inc/api/class-opalestate-api.php:1097 inc/api/class-opalestate-api.php:1102 +#: inc/api/class-opalestate-api.php:1120 inc/api/class-opalestate-api.php:1130 +msgid "Error" +msgstr "" + +#. Widget name will appear in UI +#: inc/widgets/featured-properties.php:22 +msgid "Estate: Featured Properties" +msgstr "" + +#. Widget name will appear in UI +#: inc/widgets/mortgage-calculator.php:25 +msgid "Estate: Mortgage Calculator" +msgstr "" + +#. Widget name will appear in UI +#: inc/widgets/sameprice-properties.php:22 +msgid "Estate: Same Price" +msgstr "" + +#. Widget name will appear in UI +#: inc/widgets/search-properties.php:23 +msgid "Estate: Search Properties" +msgstr "" + +#. Widget name will appear in UI +#: inc/widgets/similar-properties.php:22 +msgid "Estate: Similar Properties" +msgstr "" + +#. Widget name will appear in UI +#: inc/widgets/profile-info.php:22 +msgid "Estate: User Menu Profile" +msgstr "" + +#: inc/mixes-functions.php:517 +msgid "Ethiopian birr" +msgstr "" + +#: inc/mixes-functions.php:518 +msgid "Euro" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:232 +msgid "Event Planning & Services" +msgstr "" + +#: templates/user/my-properties.php:6 +#: inc/vendors/opalmembership/membership.php:594 +#: inc/vendors/opalmembership/membership.php:603 +msgid "Expired" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:219 +#: inc/agency/class-opalestate-agency-metabox.php:180 +#: inc/vendors/social-login/class-opalestate-social-login.php:93 +#: templates/user/social-login/facebook-button.php:19 +msgid "Facebook" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:112 +msgid "Facebook Application ID" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:113 +msgid "Facebook Application ID is required for Facebook login." +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:118 +msgid "Facebook Secret" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:119 +msgid "Facebook Secret is required for Facebook login." +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:66 +msgid "Facilities" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:68 +msgid "Facility" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:420 +#: inc/submission/class-metabox-property-submission.php:453 +msgid "Facility {#}" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:287 +msgid "Fade" +msgstr "" + +#: inc/mixes-functions.php:520 +msgid "Falkland Islands pound" +msgstr "" + +#: inc/user/functions.php:137 +msgid "Favorite" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:201 +#: inc/agency/class-opalestate-agency-metabox.php:374 +#: inc/agent/class-opalestate-agent-metabox.php:200 +msgid "Fax" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:52 +msgctxt "Feature plural name" +msgid "Rating Features" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:53 +msgctxt "Feature singular name" +msgid "Rating Feature" +msgstr "" + +#: templates/content-agent-list.php:14 templates/content-agent-grid.php:15 +#: templates/content-agent-grid-v2.php:13 templates/content-agency-grid.php:15 +#: templates/content-agency-list.php:15 +#: inc/property/class-metabox-property-admin.php:177 +#: templates/single-agent/author-box.php:15 +#: templates/user/content-property.php:22 +#: templates/single-agency/author-box.php:22 +#: templates/parts/featured-label.php:5 +#: inc/admin/property/class-property.php:99 +msgid "Featured" +msgstr "" + +#: templates/content-agency-grid.php:14 templates/content-agency-list.php:14 +#: templates/single-agency/author-box.php:21 +#: templates/single-agency/author-box.php:21 +msgid "Featured Agency" +msgstr "" + +#: templates/content-agent-list.php:12 templates/content-agent-grid.php:13 +#: templates/content-agent-grid-v2.php:11 +#: templates/single-agent/author-box.php:13 +msgid "Featured Agent" +msgstr "" + +#: inc/template-functions.php:226 +msgid "Featured Desending" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:183 +msgid "Featured Image" +msgstr "" + +#: inc/admin/settings/general.php:145 +msgid "Featured Image Size" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:152 +msgid "Featured only" +msgstr "" + +#: inc/widgets/featured-properties.php:52 +#: templates/single-agent/featured-properties.php:20 +#: templates/user/dashboard.php:17 +msgid "Featured Properties" +msgstr "" + +#: inc/widgets/featured-properties.php:24 +msgid "Featured Properties widget." +msgstr "" + +#: inc/vendors/opalmembership/membership.php:501 +msgid "Featured Remaining:" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-form-builder.php:100 +msgid "Field" +msgstr "" + +#: inc/mixes-functions.php:519 +msgid "Fijian dollar" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:65 +msgid "Filter rating features" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:236 +msgid "Financial Services" +msgstr "" + +#: templates/archive-opalestate_agency.php:12 +msgid "Find A Local Real Estate Agencies" +msgstr "" + +#: templates/elementor-templates/opalestate-office-agent-search.php:19 +msgid "Find An Agency" +msgstr "" + +#: templates/elementor-templates/opalestate-office-agent-search.php:14 +msgid "Find An Agent" +msgstr "" + +#: templates/parts/search-agents-form-address.php:20 +#: templates/parts/search-agents-form.php:20 +#: templates/parts/search-agency-form-address.php:20 +msgid "Find an experienced agent with:" +msgstr "" + +#: templates/archive-opalestate_agent.php:12 +msgid "Find The Best Real Estate Agent For Your" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:33 +#: inc/agency/class-opalestate-agency-metabox.php:110 +msgid "First Name" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:651 +#: inc/submission/class-metabox-property-submission.php:504 +#: templates/single-property/apartments.php:25 +msgid "Floor" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:76 +msgid "Floor Plan" +msgstr "" + +#: templates/content-single-property-v2.php:65 +#: templates/content-single-property-v5.php:33 +#: inc/submission/class-metabox-property-submission.php:548 +#: templates/single-property/floor-plans.php:15 +msgid "Floor Plans" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:68 +msgid "Floor plans" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:610 +#: inc/submission/class-metabox-property-submission.php:608 +msgid "Floor {#}" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:240 +msgid "Food" +msgstr "" + +#. %s: property +#: inc/api/class-opalestate-api.php:678 inc/api/class-opalestate-api.php:769 +#: inc/api/class-opalestate-api.php:821 +#, php-format +msgid "Form %s not found!" +msgstr "" + +#: templates/archive-opalestate_agency.php:39 +#: templates/elementor-templates/opalestate-agency-collection.php:26 +#, php-format +msgid "Found %s Agency" +msgstr "" + +#: templates/archive-opalestate_agent.php:39 +#: templates/elementor-templates/opalestate-agent-collection.php:29 +#: templates/shortcodes/search-agents.php:15 +#, php-format +msgid "Found %s Agents" +msgstr "" + +#: templates/shortcodes/search-properties-result.php:22 +#: templates/shortcodes/ajax-map-search-result.php:14 +#: templates/parts/archive-simple-bars.php:6 +#, php-format +msgid "Found %s Properties" +msgstr "" + +#: inc/user/class-opalestate-user.php:362 +msgid "Found a problem while updating" +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:90 +msgid "Free membership" +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:22 +msgid "Free Submission" +msgstr "" + +#: templates/user/share-search-form.php:31 +msgid "Friend Email" +msgstr "" + +#: inc/class-opalestate-email.php:258 +msgid "From Email" +msgstr "" + +#: inc/class-opalestate-email.php:251 +msgid "From Name" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:91 +#: inc/agency/class-opalestate-agency-metabox.php:344 +#: templates/single-agency/gallery.php:6 inc/admin/agency/class-agency.php:72 +#: templates/single-property/preview/tabs.php:15 +msgid "Gallery" +msgstr "" + +#: inc/template-functions.php:470 +msgid "Gallery Metro" +msgstr "" + +#: inc/template-functions.php:464 +msgid "Gallery Slider" +msgstr "" + +#: inc/template-functions.php:463 +msgid "Gallery Thumb Nav" +msgstr "" + +#: inc/mixes-functions.php:526 +msgid "Gambian dalasi" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:47 +#: inc/admin/register-settings.php:110 inc/admin/class-user.php:105 +#: inc/submission/class-metabox-property-submission.php:60 +#: inc/admin/settings/property.php:26 inc/admin/agency/class-agency.php:129 +#: inc/admin/agent/class-agent.php:80 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:212 +msgid "General" +msgstr "" + +#: inc/admin/settings/email.php:28 inc/admin/settings/general.php:28 +#: inc/admin/settings/general.php:43 +msgid "General Settings" +msgstr "" + +#: inc/api/class-opalestate-api.php:1062 +msgid "Generate API Key" +msgstr "" + +#: inc/admin/class-api-keys-table.php:235 +msgid "Generate New API Keys" +msgstr "" + +#: inc/mixes-functions.php:522 +msgid "Georgian lari" +msgstr "" + +#: inc/mixes-functions.php:524 +msgid "Ghana cedi" +msgstr "" + +#: inc/mixes-functions.php:525 +msgid "Gibraltar pound" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:105 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:105 +msgid "Global Agent Search Page" +msgstr "" + +#: inc/admin/functions.php:198 +msgid "Global Default" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:201 +#, php-format +msgid "" +"Go to the Menus screen to manage your " +"menus." +msgstr "" + +#: templates/rating/opalestate-ratings.php:251 +#: templates/rating/opalestate-ratings.php:263 +msgid "Good" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:225 +#: inc/vendors/social-login/class-opalestate-social-login.php:57 +#: templates/user/social-login/google-button.php:19 +msgid "Google" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:87 +msgid "Google API key" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:88 +msgid "Google API key is required for Google Login." +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:154 +msgid "Google Captcha" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:114 +msgid "Google Captcha page Settings" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:75 +msgid "Google Client ID" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:76 +msgid "Google Client ID is required for Google Login." +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:81 +msgid "Google Client Secret" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:82 +msgid "Google Client Secret is required for Google Login." +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:400 +msgid "Google Map" +msgstr "" + +#: inc/admin/settings/general.php:248 +msgid "Google Map API" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:207 +#: inc/submission/class-metabox-property-submission.php:389 +msgid "Google Map View" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:207 +msgid "Google Plus Url" +msgstr "" + +#: inc/template-functions.php:264 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:126 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:117 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:117 +#: inc/vendors/elementor/widgets/opalestate-split-maps-search.php:101 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:126 +msgid "Grid" +msgstr "" + +#: inc/mixes-functions.php:528 +msgid "Guatemalan quetzal" +msgstr "" + +#: inc/mixes-functions.php:523 +msgid "Guernsey pound" +msgstr "" + +#: inc/mixes-functions.php:527 +msgid "Guinean franc" +msgstr "" + +#: inc/mixes-functions.php:529 +msgid "Guyanese dollar" +msgstr "" + +#: inc/mixes-functions.php:533 +msgid "Haitian gourde" +msgstr "" + +#: templates/content-single-agency.php:71 +msgid "Head Agency:" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:244 +msgid "Health & Medical" +msgstr "" + +#: templates/user/share-search-form.php:8 +#: templates/user-search/render-form.php:8 +#, php-format +msgid "" +"Hey there! I saved this search on %s, please check out these homes that are " +"listed. Remember to save this search to be first to catch any new listings." +msgstr "" + +#: templates/content-single-agency.php:141 +#, php-format +msgid "Hi %s. I saw your profile and wanted to see if you could help me." +msgstr "" + +#: templates/parts/has-warning.php:3 +msgid "" +"Hi! you could not edit/create a property at this time, you have not " +"permission to do." +msgstr "" + +#: templates/messages/enquiry-form.php:4 +#, php-format +msgid "Hi, I am interested in %s (Property ID: %s)" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:440 +msgid "Hide Author Information" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:248 +msgid "Home Services " +msgstr "" + +#: inc/mixes-functions.php:531 +msgid "Honduran lempira" +msgstr "" + +#: inc/mixes-functions.php:530 +msgid "Hong Kong dollar" +msgstr "" + +#: inc/admin/settings/property.php:223 +msgid "Horizontal Search Fields" +msgstr "" + +#: templates/single-property/map.php:47 templates/single-property/map-v2.php:49 +#: templates/single-property/preview/tabs.php:41 +#: templates/single-property/preview/map.php:17 +msgid "Hospital" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:252 +msgid "Hotels & Travel" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:383 +msgid "Hover" +msgstr "" + +#. Author URI of the plugin +msgid "http://www.wpopal.com" +msgstr "" + +#. URI of the plugin +msgid "http://www.wpopal.com/product/opal-estate-wordpress-plugin/" +msgstr "" + +#: inc/mixes-functions.php:534 +msgid "Hungarian forint" +msgstr "" + +#: templates/user/register-form.php:80 +msgid "I agree with" +msgstr "" + +#: inc/mixes-functions.php:541 +msgid "Icelandic króna" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:49 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:284 +msgid "Icon" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:300 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:390 +msgid "Icon Color" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:328 +msgid "Icon Font Size" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-category-list.php:183 +msgid "ID" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:84 +#: inc/taxonomies/class-taxonomy-categories.php:76 +#: inc/taxonomies/class-taxonomy-state.php:79 +#: inc/taxonomies/class-taxonomy-city.php:76 +#: inc/taxonomies/class-taxonomy-types.php:58 +msgid "Image" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:74 +msgid "Image Icon" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:94 +msgid "Image Logo" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:597 +#: inc/submission/class-metabox-property-submission.php:593 +msgid "Image Preview" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:95 +#: inc/submission/class-metabox-property-submission.php:194 +msgid "Images Gallery" +msgstr "" + +#: inc/importer/class-import-steps.php:857 +msgid "" +"Import all setting, options, other contents, please waiting for a while!" +msgstr "" + +#: inc/importer/class-import-steps.php:757 +msgid "Import all settings for theme, please waiting for a while!" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:252 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:221 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:244 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:252 +msgid "IN" +msgstr "" + +#: inc/classes/class-opalestate-cache.php:150 +#, php-format +msgid "" +"In order for database caching to work with Give you must " +"add %1$s to the \"Ignored query stems\" option in W3 Total " +"Cache settings." +msgstr "" + +#: templates/user/read-messages.php:7 +msgid "Inbox" +msgstr "" + +#: inc/mixes-functions.php:538 +msgid "Indian rupee" +msgstr "" + +#: inc/mixes-functions.php:535 +msgid "Indonesian rupiah" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:268 +msgid "Infinite Loop" +msgstr "" + +#: templates/content-single-property-v2.php:64 +#: inc/property/class-metabox-property-admin.php:61 +#: inc/agency/class-opalestate-agency-metabox.php:140 +#: inc/agency/class-opalestate-agency-metabox.php:266 +#: inc/agent/class-opalestate-agent-metabox.php:100 +#: inc/submission/class-metabox-property-submission.php:64 +msgid "Information" +msgstr "" + +#: inc/template-functions.php:462 +#: inc/property/class-metabox-property-admin.php:536 +#: inc/admin/settings/general.php:179 +msgid "Inherit" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:209 +msgid "Input for goolge plus profile or your newfeed." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:196 +msgid "Input for instagram profile." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:190 +msgid "Input for linked in profile." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:202 +msgid "Input for pinterest feed" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:167 +msgid "Input for skype account." +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:53 +#: inc/property/class-metabox-property-admin.php:230 +#: inc/agency/class-opalestate-agency-metabox.php:131 +#: inc/submission/class-metabox-property-submission.php:205 +msgid "" +"Input for videos, audios from Youtube, Vimeo and all supported sites by " +"WordPress. It has preview feature." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:223 +msgid "Input for your channel Vimeo" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:216 +msgid "Input for your channel youtube." +msgstr "" + +#: inc/property/class-metabox-property-admin.php:117 +#: inc/property/class-metabox-property-admin.php:606 +#: inc/submission/class-metabox-property-submission.php:211 +#: inc/submission/class-metabox-property-submission.php:604 +msgid "Input iframe to show 360° Virtual Tour." +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:354 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:417 +msgid "Inside" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:242 +msgid "Instagram" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:194 +msgid "Instagram URL" +msgstr "" + +#: inc/importer/class-import-steps.php:67 +#: inc/importer/class-import-steps.php:68 +#: inc/importer/class-import-steps.php:69 +#: inc/importer/class-import-steps.php:70 +#: inc/importer/class-import-steps.php:71 +#: inc/importer/class-import-steps.php:72 +#: inc/importer/class-import-steps.php:73 +#: inc/importer/class-import-steps.php:74 +#: inc/importer/class-import-steps.php:75 +msgid "Install required plugins " +msgstr "" + +#: inc/api/class-opalestate-api.php:457 +msgid "Invalid API key!" +msgstr "" + +#: inc/api/class-opalestate-api.php:473 +msgid "Invalid API version!" +msgstr "" + +#: inc/importer/class-content-importer.php:466 +msgid "Invalid file type" +msgstr "" + +#: inc/api/class-opalestate-api.php:601 +msgid "Invalid query!" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:266 +msgid "Invalid username or e-mail address." +msgstr "" + +#: inc/mixes-functions.php:540 +msgid "Iranian rial" +msgstr "" + +#: inc/mixes-functions.php:539 +msgid "Iraqi dinar" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:148 +#: inc/agency/class-opalestate-agency-metabox.php:57 +msgid "Is Featured" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:274 +msgid "Is Price On Call" +msgstr "" + +#: inc/mixes-functions.php:536 +msgid "Israeli new shekel" +msgstr "" + +#: inc/importer/class-import-steps.php:259 +msgid "It is getting data from live server for comming installation!" +msgstr "" + +#: templates/content-no-results.php:6 +msgid "" +"It seems we can’t find what you’re looking for. Perhaps " +"searching can help." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:122 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:113 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:113 +#: inc/vendors/elementor/widgets/opalestate-split-maps-search.php:97 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:122 +msgid "Item Layout" +msgstr "" + +#: inc/mixes-functions.php:543 +msgid "Jamaican dollar" +msgstr "" + +#: inc/mixes-functions.php:545 +msgid "Japanese yen" +msgstr "" + +#: inc/mixes-functions.php:542 +msgid "Jersey pound" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:126 +msgid "Job" +msgstr "" + +#: inc/mixes-functions.php:544 +msgid "Jordanian dinar" +msgstr "" + +#: inc/mixes-functions.php:554 +msgid "Kazakhstani tenge" +msgstr "" + +#: inc/mixes-functions.php:546 +msgid "Kenyan shilling" +msgstr "" + +#: templates/parts/search-form-v.php:39 +#: templates/search-box/fields/search-text.php:1 +msgid "Keyword" +msgstr "" + +#: inc/admin/settings/3rd_party.php:130 +msgid "kilometers" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:370 +#: inc/submission/class-metabox-property-submission.php:319 +msgid "Kitchens" +msgstr "" + +#: inc/template-functions.php:704 +msgid "km" +msgstr "" + +#: inc/mixes-functions.php:552 +msgid "Kuwaiti dinar" +msgstr "" + +#: inc/mixes-functions.php:547 +msgid "Kyrgyzstani som" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:410 +#: inc/taxonomies/class-taxonomy-labels.php:37 +#: inc/taxonomies/class-taxonomy-labels.php:47 +#: inc/submission/class-metabox-property-submission.php:443 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:171 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:249 +msgid "Label" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:120 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:174 +msgid "Label Text" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:244 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:267 +msgid "Lables" +msgstr "" + +#: inc/mixes-functions.php:555 +msgid "Lao kip" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:43 +#: inc/agency/class-opalestate-agency-metabox.php:120 +msgid "Last Name" +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/map/map.php:54 +msgid "Latitude" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:156 +#: inc/widgets/search-properties.php:74 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:99 +msgid "Layout" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:533 +msgid "Layout Display" +msgstr "" + +#. %s is property title +#: templates/rating/opalestate-ratings.php:230 +#, php-format +msgid "Leave a Reply to %s" +msgstr "" + +#: inc/mixes-functions.php:556 +msgid "Lebanese pound" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:313 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:349 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:361 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:384 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:224 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:349 +msgid "Left" +msgstr "" + +#: inc/mixes-functions.php:559 +msgid "Lesotho loti" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:73 +msgid "Level" +msgstr "" + +#: inc/mixes-functions.php:558 +msgid "Liberian dollar" +msgstr "" + +#: templates/single-property/map.php:53 templates/single-property/map-v2.php:55 +#: templates/single-property/preview/tabs.php:47 +#: templates/single-property/preview/map.php:23 +msgid "Library" +msgstr "" + +#: inc/mixes-functions.php:560 +msgid "Libyan dinar" +msgstr "" + +#: inc/admin/register-settings.php:119 +msgid "Licenses" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:140 +msgid "Light" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-category-list.php:216 +msgid "Limit" +msgstr "" + +#: inc/widgets/featured-properties.php:62 +#: inc/widgets/sameprice-properties.php:63 +#: inc/widgets/similar-properties.php:61 +msgid "Limit:" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:673 +#: inc/submission/class-metabox-property-submission.php:525 +msgid "Link" +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:45 +msgid "Link to User" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:30 +msgid "Link To User ID" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:174 +msgid "Link to your website" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:231 +msgid "LinkedIn" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:188 +msgid "Linkedin URL" +msgstr "" + +#: inc/template-functions.php:268 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:127 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:118 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:118 +#: inc/vendors/elementor/widgets/opalestate-split-maps-search.php:102 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:127 +msgid "List" +msgstr "" + +#: templates/content-single-agency.php:26 +msgid "Listing" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:500 +msgid "Listings Remaining:" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:359 +#: inc/submission/class-metabox-property-submission.php:306 +msgid "Living Rooms" +msgstr "" + +#: templates/single-agency/properties.php:27 +msgid "Load More" +msgstr "" + +#: templates/elementor-templates/opalestate-split-maps-search.php:12 +msgid "Loading map..." +msgstr "" + +#: templates/parts/mortgage-calculator.php:23 +#: templates/parts/mortgage-calculator.php:132 +#: templates/widgets/mortgage-calculator.php:23 +#: templates/widgets/mortgage-calculator.php:126 +msgid "Loan Amount" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:256 +msgid "Local Flavor" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:260 +msgid "Local Services" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:79 +#: inc/property/class-metabox-property-admin.php:194 +#: inc/submission/class-metabox-property-submission.php:63 +#: templates/parts/search-form-v.php:50 +#: templates/search-box/search-form-v3.php:28 +#: templates/search-box/fields/search-city-text.php:23 +#: templates/search-box/fields/location.php:1 +#: templates/search-box/fields/location.php:2 +msgid "Location" +msgstr "" + +#: templates/content-single-agency.php:76 templates/content-single-agent.php:84 +msgid "Location:" +msgstr "" + +#: inc/user/functions.php:196 +msgid "Log out" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:133 +msgid "Logged in" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:96 +msgid "Logged successfully, welcome back!" +msgstr "" + +#: templates/user/my-account-popup.php:4 templates/user/my-account.php:4 +#: templates/user/login-form.php:16 templates/user/login-form.php:51 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:531 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:532 +msgid "Login" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:46 +msgid "Login Form" +msgstr "" + +#: templates/submission/submission-completed.php:8 +#: templates/submission/require-login.php:8 +msgid "" +"Login in allowing you to edit your property or submit a property, save " +"favorite real estate." +msgstr "" + +#: templates/submission/submission-completed.php:9 +#: templates/submission/require-login.php:9 +msgid "Login Now" +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/map/map.php:64 +msgid "Longitude" +msgstr "" + +#: inc/admin/settings/general.php:134 +msgid "Loop Image Size" +msgstr "" + +#: templates/user/login-form.php:52 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:542 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:542 +msgid "Lost your password?" +msgstr "" + +#: inc/admin/settings/general.php:243 +msgid "m2" +msgstr "" + +#: inc/mixes-functions.php:567 +msgid "Macanese pataca" +msgstr "" + +#: inc/mixes-functions.php:564 +msgid "Macedonian denar" +msgstr "" + +#: inc/mixes-functions.php:563 +msgid "Malagasy ariary" +msgstr "" + +#: inc/mixes-functions.php:571 +msgid "Malawian kwacha" +msgstr "" + +#: inc/mixes-functions.php:573 +msgid "Malaysian ringgit" +msgstr "" + +#: inc/mixes-functions.php:570 +msgid "Maldivian rufiyaa" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:109 +msgid "Manual Images 360 " +msgstr "" + +#: inc/mixes-functions.php:537 +msgid "Manx pound" +msgstr "" + +#: templates/content-single-property-v5.php:21 +#: templates/single-property/map.php:25 templates/single-property/map-v2.php:21 +#: templates/single-property/preview/tabs.php:17 +msgid "Map" +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/map/map.php:46 +msgid "Map Address" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:144 +msgid "Map Height" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:112 +msgid "Map Location" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:108 +msgid "Map On Right?" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:80 +msgid "Map Preview Form" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:121 +msgid "Map Width %" +msgstr "" + +#: inc/template-functions.php:465 +msgid "Maps" +msgstr "" + +#: inc/template-functions.php:471 +msgid "Mark Picture" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:264 +msgid "Mass Media" +msgstr "" + +#: inc/mixes-functions.php:568 +msgid "Mauritanian ouguiya" +msgstr "" + +#: inc/mixes-functions.php:569 +msgid "Mauritian rupee" +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:50 +msgid "Maximum number of Free Featured that users can set." +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:40 +msgid "Maximum number of Free Listing that users can submit." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-category-list.php:217 +msgid "Maximum number of terms to return." +msgstr "" + +#: inc/admin/settings/property.php:212 +msgid "Maximum of Search Aea" +msgstr "" + +#: inc/admin/settings/property.php:190 +msgid "Maximum of Search Price" +msgstr "" + +#: inc/admin/settings/general.php:165 +msgid "Maximum of Target Price For Agent" +msgstr "" + +#: inc/admin/settings/general.php:86 +msgid "Maximun Upload Image Files" +msgstr "" + +#: inc/admin/settings/general.php:78 +msgid "Maximun Upload Image Size" +msgstr "" + +#: inc/admin/settings/general.php:102 +msgid "Maximun Upload Other Files" +msgstr "" + +#: inc/admin/settings/general.php:94 +msgid "Maximun Upload Other Size" +msgstr "" + +#: inc/admin/settings/general.php:235 inc/admin/settings/general.php:236 +msgid "Measurement Unit" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:62 +msgid "Media" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:563 +msgid "Membership Information" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:546 +msgid "Membership Package" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:195 +msgid "Menu" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:215 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:184 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:207 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:215 +msgid "Menu Order" +msgstr "" + +#: inc/message/class-opalestate-message.php:542 +#: inc/message/class-opalestate-message.php:566 +#: inc/message/class-opalestate-message.php:643 +#: inc/message/class-opalestate-message.php:719 +#: templates/user/share-search-form.php:43 +msgid "Message" +msgstr "" + +#: inc/class-opalestate-email.php:117 inc/class-opalestate-email.php:120 +msgid "Message has been successfully sent." +msgstr "" + +#: inc/user/functions.php:159 +msgid "Messages" +msgstr "" + +#: templates/user/messages.php:9 +msgid "Messages for you" +msgstr "" + +#: inc/admin/class-user.php:87 inc/admin/agency/class-agency.php:110 +#: inc/admin/agent/class-agent.php:62 +msgid "Metabox" +msgstr "" + +#: inc/mixes-functions.php:572 +msgid "Mexican peso" +msgstr "" + +#: inc/template-functions.php:700 inc/admin/settings/3rd_party.php:129 +msgid "miles" +msgstr "" + +#: inc/admin/settings/property.php:202 +msgid "Minimum of Search Aea" +msgstr "" + +#: inc/admin/settings/property.php:180 +msgid "Minimum of Search Price" +msgstr "" + +#: inc/admin/settings/general.php:155 +msgid "Minimum of Target Price For Agent" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:195 +#: inc/agency/class-opalestate-agency-metabox.php:368 +#: inc/agent/class-opalestate-agent-metabox.php:194 +msgid "Mobile" +msgstr "" + +#: inc/mixes-functions.php:562 +msgid "Moldovan leu" +msgstr "" + +#: inc/mixes-functions.php:566 +msgid "Mongolian tögrög" +msgstr "" + +#: templates/parts/mortgage-calculator.php:129 +#: templates/widgets/mortgage-calculator.php:123 +msgid "month" +msgstr "" + +#: templates/shortcodes/ajax-map-search.php:37 +msgid "More" +msgstr "" + +#: templates/single-property/walkscore.php:51 +msgid "More details here" +msgstr "" + +#: templates/single-property/walkscore.php:25 +#: templates/single-property/walkscore.php:38 +msgid "more details here" +msgstr "" + +#: templates/search-box/fields/more-options.php:19 +msgid "More Search Options" +msgstr "" + +#: inc/mixes-functions.php:561 +msgid "Moroccan dirham" +msgstr "" + +#: inc/widgets/mortgage-calculator.php:49 +msgid "Mortgage Calculator" +msgstr "" + +#: inc/widgets/mortgage-calculator.php:27 +msgid "Mortgage Calculator widget." +msgstr "" + +#: templates/parts/mortgage-calculator.php:102 +msgid "Mortgage Payment Calculator" +msgstr "" + +#: inc/mixes-functions.php:574 +msgid "Mozambican metical" +msgstr "" + +#: inc/admin/settings/general.php:242 +msgid "mq" +msgstr "" + +#: install.php:98 inc/user/class-opalestate-user.php:51 +msgid "My Account" +msgstr "" + +#: inc/admin/settings/general.php:59 +msgid "My Account Page" +msgstr "" + +#: templates/content-single-agent.php:75 +msgid "My Address" +msgstr "" + +#: templates/single-agency/properties.php:34 +msgid "My Agency has not any property yet." +msgstr "" + +#: inc/vendors/opalmembership/membership.php:259 +msgid "My Invoices" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:252 +msgid "My Membership" +msgstr "" + +#: inc/widgets/profile-info.php:74 +msgid "My Profile" +msgstr "" + +#: inc/user/functions.php:174 inc/submission/class-opalestate-submission.php:97 +#: templates/single-agent/properties.php:11 templates/user/dashboard.php:10 +#: templates/single-agency/properties.php:16 +msgid "My Properties" +msgstr "" + +#: templates/user-search/content-savedsearch.php:9 +msgid "My Saved Searches" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:564 +#: inc/message/class-opalestate-message.php:516 +#: inc/message/class-opalestate-message.php:618 +#: inc/submission/class-metabox-property-submission.php:560 +#: templates/rating/opalestate-ratings.php:235 +#: templates/user/share-search-form.php:35 +#: templates/user-search/content-savedsearch.php:12 +#: templates/user-search/render-form.php:29 +#: templates/user/agency/agency-team.php:21 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:184 +msgid "Name" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:82 +#: inc/user/class-opalestate-user.php:432 +#: inc/user/class-opalestate-user.php:445 +#: inc/submission/class-metabox-property-submission.php:44 +msgid "Name and Description" +msgstr "" + +#: templates/user-search/render-form.php:21 +msgid "Name this search." +msgstr "" + +#: inc/mixes-functions.php:575 +msgid "Namibian dollar" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:195 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:329 +msgid "Navigation" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:66 +#: inc/taxonomies/class-taxonomy-neighborhood.php:76 +msgid "Neighborhoods" +msgstr "" + +#: inc/mixes-functions.php:579 +msgid "Nepalese rupee" +msgstr "" + +#: inc/mixes-functions.php:478 +msgid "Netherlands Antillean guilder" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:45 +msgid "New Agency" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:38 +msgid "New Agent" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:43 +msgid "New Amenity" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:83 +msgid "New Category Name" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:44 +msgid "New City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:45 +msgid "New Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:46 +msgid "New Label" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:81 +msgid "New Level Name" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:75 +msgid "New Neighborhood" +msgstr "" + +#: inc/user/class-opalestate-user.php:463 +msgid "New Password" +msgstr "" + +#: inc/user/class-opalestate-user.php:378 +msgid "New password is not same confirm password" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:44 +msgid "New Property" +msgstr "" + +#: inc/taxonomies/class-taxonomy-categories.php:47 +msgid "New Property Category" +msgstr "" + +#: inc/email/class-opalesate-approve.php:31 +#: inc/email/class-opalestate-new-submitted.php:31 +#, php-format +msgid "New Property Listing Submitted: %s" +msgstr "" + +#: inc/class-opalestate-email.php:292 +msgid "New property submitted - {property_name}" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:59 +msgid "New rating feature" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:43 +msgid "New State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:46 +msgid "New Status" +msgstr "" + +#: inc/mixes-functions.php:616 +msgid "New Taiwan dollar" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:84 +msgid "New Type" +msgstr "" + +#: inc/mixes-functions.php:580 +msgid "New Zealand dollar" +msgstr "" + +#: inc/template-functions.php:325 +msgid "Next" +msgstr "" + +#: templates/archive-opalestate_agency.php:75 +#: templates/archive-opalestate_agent.php:65 +#: templates/archive-opalestate_property.php:53 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:332 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:344 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:367 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:332 +msgid "Next »" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:331 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:343 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:366 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:331 +msgid "Next Label" +msgstr "" + +#: templates/single-opalestate_agency.php:19 +msgid "Next page" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:162 +#: inc/submission/class-metabox-property-submission.php:226 +#: inc/submission/class-metabox-property-submission.php:343 +#: inc/submission/class-metabox-property-submission.php:405 +#: inc/submission/class-metabox-property-submission.php:421 +#: inc/submission/class-metabox-property-submission.php:439 +#: inc/submission/class-metabox-property-submission.php:482 +#: inc/submission/class-metabox-property-submission.php:674 +msgid "Next Step" +msgstr "" + +#: inc/mixes-functions.php:577 +msgid "Nicaraguan córdoba" +msgstr "" + +#: inc/mixes-functions.php:576 +msgid "Nigerian naira" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:268 +msgid "Nightlife" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:107 +#: inc/classes/class-opalestate-metabox-user.php:152 +#: inc/classes/class-opalestate-metabox-user.php:163 +#: inc/property/class-metabox-property-admin.php:181 +#: inc/property/class-metabox-property-admin.php:212 +#: inc/property/class-metabox-property-admin.php:278 +#: inc/property/class-metabox-property-admin.php:448 +#: inc/property/class-metabox-property-admin.php:458 +#: inc/agency/class-opalestate-agency-metabox.php:61 +#: inc/widgets/search-properties.php:147 +#: inc/submission/class-metabox-property-submission.php:393 +#: inc/submission/class-metabox-property-submission.php:473 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:235 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:249 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:273 +#: inc/vendors/opalmembership/free-package.php:35 +msgid "No" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:49 +msgid "No Agencies found" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:50 +msgid "No Agencies found in Trash" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:42 +msgid "No Agents found" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:43 +msgid "No Agents found in Trash" +msgstr "" + +#: templates/user-search/content-savedsearch.php:37 +msgid "No Item In Saved Searches" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:48 +msgid "No Properties found" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:49 +msgid "No Properties found in Trash" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:62 +msgid "No rating features found" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:63 +msgid "No rating features found in trash" +msgstr "" + +#: inc/admin/functions.php:563 +msgid "No users found" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:237 +msgid "" +"No, it is not unlimited, If not set it will be unlimited. Number of " +"properties can make featured with this package." +msgstr "" + +#: inc/api/class-opalestate-api.php:1097 +msgid "Nonce verification failed." +msgstr "" + +#: inc/class-opalestate-html.php:223 +#: inc/property/class-metabox-property-admin.php:665 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:202 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:280 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:292 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:315 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:280 +msgid "None" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:293 +msgid "Normal" +msgstr "" + +#: inc/mixes-functions.php:550 +msgid "North Korean won" +msgstr "" + +#: inc/mixes-functions.php:578 +msgid "Norwegian krone" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:253 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:222 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:245 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:253 +msgid "NOT IN" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:96 +msgid "Not logged in" +msgstr "" + +#: templates/rating/opalestate-ratings.php:253 +#: templates/rating/opalestate-ratings.php:265 +msgid "Not that bad" +msgstr "" + +#: templates/content-no-results.php:3 +msgid "Nothing Found" +msgstr "" + +#: inc/class-opalestate-email.php:276 +msgid "Notification For New Property Submission" +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:49 +msgid "Number Free Featured" +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:39 +msgid "Number Free Listing" +msgstr "" + +#: inc/admin/settings/general.php:225 +msgid "Number of Decimals" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:220 +#: inc/vendors/opalmembership/membership.php:581 +msgid "Number Of Featured Properties" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:207 +#: inc/vendors/opalmembership/membership.php:568 +msgid "Number Of Properties" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:229 +#: inc/vendors/opalmembership/membership.php:590 +msgid "Number of properties can make featured with this package." +msgstr "" + +#: inc/vendors/opalmembership/membership.php:216 +#: inc/vendors/opalmembership/membership.php:577 +msgid "" +"Number of properties with this package. If not set it will be unlimited." +msgstr "" + +#: inc/admin/settings/3rd_party.php:114 +msgid "Number of results to show on listing page for each category." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:281 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:283 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:293 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:295 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:316 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:318 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:281 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:283 +msgid "Numbers" +msgstr "" + +#: templates/search-box/fields/search-city-text.php:38 +msgid "Of My Location" +msgstr "" + +#: inc/user/class-opalestate-user.php:454 +msgid "Old Password" +msgstr "" + +#: inc/user/class-opalestate-user.php:389 +msgid "Old password is not correct" +msgstr "" + +#: inc/mixes-functions.php:581 +msgid "Omani rial" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:305 +msgid "Oops! Something went wrong while updating your account." +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-extended.php:78 +msgid "Opal Estate" +msgstr "" + +#: inc/admin/views/addons/list.php:2 +msgid "Opal Estate Add-ons" +msgstr "" + +#: inc/class-opalestate-roles.php:92 +msgid "Opal Estate Agency" +msgstr "" + +#: inc/class-opalestate-roles.php:80 +msgid "Opal Estate Agent" +msgstr "" + +#: inc/class-opalestate-roles.php:49 +msgid "Opal Estate Manager" +msgstr "" + +#. Name of the plugin +msgid "Opal Estate Pro" +msgstr "" + +#. Description of the plugin +msgid "" +"Opal Real Estate Plugin is an ideal solution and brilliant choice for you to " +"set up a professional estate website." +msgstr "" + +#: inc/api/class-opalestate-api.php:1053 +msgid "Opalestate API Keys" +msgstr "" + +#: inc/template-hook-functions.php:268 +msgid "Opalestate Fullwidth" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:115 +msgid "Or 360° Virtual Tour" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:95 +msgid "Or Using Image Logo without using text" +msgstr "" + +#: inc/rating/class-opalestate-rating-metabox.php:116 +#: inc/taxonomies/class-taxonomy-status.php:89 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:224 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:193 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:216 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:193 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:224 +msgid "Order" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:209 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:178 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:201 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:179 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:209 +msgid "Order By" +msgstr "" + +#: inc/mixes-functions.php:245 +msgid "Orginal Size" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:352 +#: inc/submission/class-metabox-property-submission.php:300 +msgid "Orientation" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:355 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:416 +msgid "Outside" +msgstr "" + +#: templates/rating/opalestate-ratings.php:106 +msgid "Overall rating" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:553 +msgid "Package" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:369 +msgid "Padding" +msgstr "" + +#: templates/fullwidth-page.php:33 templates/single-opalestate_agency.php:20 +#: templates/archive-opalestate_agency.php:76 +#: templates/archive-opalestate_agent.php:66 +#: templates/archive-opalestate_property.php:54 +msgid "Page" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:291 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:303 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:326 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:291 +msgid "Page Limit" +msgstr "" + +#: templates/single-property/views-statistics.php:16 +#: templates/single-property/views-statistics.php:28 +msgid "Page Views Statistics" +msgstr "" + +#: templates/fullwidth-page.php:29 templates/content-single-agent.php:63 +#: templates/single-property/content.php:11 +msgid "Pages:" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:266 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:276 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:281 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:288 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:304 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:311 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:266 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:276 +msgid "Pagination" +msgstr "" + +#: inc/mixes-functions.php:586 +msgid "Pakistani rupee" +msgstr "" + +#: inc/mixes-functions.php:582 +msgid "Panamanian balboa" +msgstr "" + +#: inc/mixes-functions.php:584 +msgid "Papua New Guinean kina" +msgstr "" + +#: inc/mixes-functions.php:589 +msgid "Paraguayan guaraní" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:38 +msgid "Parent Amenity" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:39 +msgid "Parent Amenity:" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:78 +msgid "Parent Category" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:79 +msgid "Parent Category:" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:39 +msgid "Parent City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:40 +msgid "Parent City:" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:40 +msgid "Parent Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:41 +msgid "Parent Country:" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:41 +msgid "Parent Label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:42 +msgid "Parent Label:" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:76 +msgid "Parent Level" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:77 +msgid "Parent Level:" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:70 +msgid "Parent Neighborhood" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:71 +msgid "Parent Neighborhood:" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:64 +msgid "Parent rating features" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:38 +msgid "Parent State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:39 +msgid "Parent State:" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:41 +msgid "Parent Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:42 +msgid "Parent Status:" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:79 +msgid "Parent Type" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:80 +msgid "Parent Type:" +msgstr "" + +#: inc/property/class-opalestate-search.php:395 +#: inc/property/class-metabox-property-admin.php:309 +#: inc/submission/class-metabox-property-submission.php:246 +msgid "Parking" +msgstr "" + +#: templates/user/register-form.php:57 templates/user/login-form.php:34 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:516 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:517 +msgid "Password" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:70 +#: inc/user/class-opalestate-user-form-handler.php:179 +msgid "Password is required." +msgstr "" + +#: inc/user/functions.php:237 +msgid "Password is requried." +msgstr "" + +#: inc/user/class-opalestate-user.php:387 +msgid "Password Updated" +msgstr "" + +#: inc/user/class-opalestate-user.php:373 +msgid "passwords fields are not empty" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:230 +msgid "Pause on Hover" +msgstr "" + +#: templates/user/my-properties.php:5 +msgid "Pending" +msgstr "" + +#: templates/user/dashboard.php:24 +msgid "Pending Properties" +msgstr "" + +#: templates/rating/opalestate-ratings.php:250 +#: templates/rating/opalestate-ratings.php:262 +msgid "Perfect" +msgstr "" + +#: inc/user/functions.php:130 +msgid "Personal Information" +msgstr "" + +#: inc/mixes-functions.php:583 +msgid "Peruvian nuevo sol" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:272 +msgid "Pets" +msgstr "" + +#: templates/single-property/map.php:59 templates/single-property/map-v2.php:61 +#: templates/single-property/preview/tabs.php:53 +#: templates/single-property/preview/map.php:29 +msgid "Pharmacy" +msgstr "" + +#: inc/mixes-functions.php:585 +msgid "Philippine peso" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:189 +#: inc/agency/class-opalestate-agency-metabox.php:158 +#: inc/agency/class-opalestate-agency-metabox.php:362 +#: inc/message/class-opalestate-message.php:534 +#: inc/message/class-opalestate-message.php:635 +#: inc/message/class-opalestate-message.php:711 +#: inc/agent/class-opalestate-agent-metabox.php:188 +msgid "Phone" +msgstr "" + +#: inc/template-hook-functions.php:235 +msgid "" +"Physical Arrange viewings is always been attractive to property clients. " +"Fill out the form to arrange visualizations around our properties." +msgstr "" + +#: templates/single-property/map-v2.php:20 +msgid "Picture" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:237 +msgid "Pinterest" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:200 +msgid "Pinterest Url" +msgstr "" + +#: templates/single-property/floor-plans.php:22 +#: templates/single-property/floor-plans.php:34 +#, php-format +msgid "Plan %s" +msgstr "" + +#: inc/user/functions.php:228 +msgid "Please enter a valid account username." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:147 +msgid "Please enter company name." +msgstr "" + +#: inc/submission/class-opalestate-submission.php:460 +msgid "Please enter data for all require fields before submitting" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:139 +msgid "Please enter position or job in your company." +msgstr "" + +#: inc/user/class-opalestate-user.php:477 +msgid "Please enter your confirm password." +msgstr "" + +#: inc/user/class-opalestate-user.php:468 +msgid "Please enter your new password." +msgstr "" + +#: inc/user/class-opalestate-user.php:459 +msgid "Please enter your old password" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:190 +msgid "Please Enter Your Property SKU" +msgstr "" + +#: inc/rating/class-opalestate-rating-init.php:96 +msgid "Please rate all features." +msgstr "" + +#: inc/rating/class-opalestate-rating-init.php:102 +msgid "Please rate." +msgstr "" + +#: inc/user/class-opalestate-user-search.php:147 +msgid "Please sign in to save this search." +msgstr "" + +#: inc/importer/class-import-steps.php:594 +msgid "Please waiting for downloading sliders from live server" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:634 +#: inc/submission/class-metabox-property-submission.php:486 +#: templates/single-property/apartments.php:22 +msgid "Plot" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:340 +#: inc/submission/class-metabox-property-submission.php:282 +msgid "Plot Size" +msgstr "" + +#: inc/mixes-functions.php:587 +msgid "Polish złoty" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:350 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:412 +msgid "Position" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:201 +#: inc/submission/class-metabox-property-submission.php:374 +msgid "Postal Code / Zip" +msgstr "" + +#. %s: property date +#: templates/content-single-property-v2.php:38 +#: templates/content-single-property-v3.php:60 +#: templates/content-single-property-v4.php:33 +#: templates/content-single-property-v5.php:73 +#: templates/content-single-property.php:31 +#, php-format +msgid "Posted: %s" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:190 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:159 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:182 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:190 +msgid "Posts Per Page" +msgstr "" + +#: inc/mixes-functions.php:521 +msgid "Pound sterling" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:541 +msgid "Preview Display" +msgstr "" + +#: inc/template-functions.php:314 +msgid "Previous" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:317 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:329 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:352 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:317 +msgid "Previous Label" +msgstr "" + +#: templates/single-opalestate_agency.php:18 +msgid "Previous page" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:342 +#: inc/submission/class-metabox-property-submission.php:404 +#: inc/submission/class-metabox-property-submission.php:420 +#: inc/submission/class-metabox-property-submission.php:438 +#: inc/submission/class-metabox-property-submission.php:481 +#: inc/submission/class-metabox-property-submission.php:556 +#: inc/submission/class-metabox-property-submission.php:673 +msgid "Previous Step" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:225 +msgid "Previous Step " +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:282 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:283 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:294 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:295 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:317 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:318 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:282 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:283 +msgid "Previous/Next" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:252 +#: inc/property/class-metabox-property-admin.php:570 +#: inc/submission/class-metabox-property-submission.php:566 +#: templates/search-box/search-form-v3.php:56 +#: templates/search-box/search-form-v2.php:39 +#: templates/search-box/fields/price.php:20 +msgid "Price" +msgstr "" + +#: inc/template-functions.php:227 +msgid "Price Ascending" +msgstr "" + +#: inc/template-functions.php:228 +msgid "Price Desending" +msgstr "" + +#: templates/single-property/apartments.php:24 +msgid "Price From" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:646 +#: inc/submission/class-metabox-property-submission.php:499 +msgid "Price from" +msgstr "" + +#: templates/shortcodes/ajax-map-search.php:65 +#: templates/single-property/meta.php:13 templates/single-property/price.php:9 +#: templates/single-property/floor-plans.php:42 +#: templates/parts/search-form-h.php:83 +#: templates/parts/search-agents-form.php:46 +#: templates/parts/search-form-v.php:87 +msgid "Price:" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:54 +msgid "Prices" +msgstr "" + +#: inc/template-functions.php:1035 inc/template-functions.php:1037 +msgid "Print" +msgstr "" + +#: templates/user/agency/agency-team.php:45 +msgid "Processing" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:276 +msgid "Professional Services" +msgstr "" + +#: templates/content-single-agency.php:112 +#: templates/content-single-agent.php:18 +#: inc/property/class-opalestate-posttype.php:39 +#: inc/property/class-opalestate-posttype.php:51 +#: templates/single-agency/tabs.php:6 +msgid "Properties" +msgstr "" + +#: templates/single-property/sameagent.php:8 +#, php-format +msgid "Properties by %s" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:35 +msgid "Properties By Amenity" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:36 +msgid "Properties By City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:37 +msgid "Properties By Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:38 +msgid "Properties By Label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:67 +msgid "Properties By Neighborhood" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:35 +msgid "Properties By State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:38 +msgid "Properties By Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:76 +msgid "Properties By Type" +msgstr "" + +#: inc/admin/settings/property.php:157 +msgid "Properties Per Page" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:40 +#: inc/agency/class-opalestate-agency-posttype.php:41 +#: inc/admin/register-settings.php:112 +#: inc/agent/class-opalestate-agent-posttype.php:34 +msgid "Property" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:62 +msgid "property" +msgstr "" + +#: templates/content-single-property-v2.php:132 +msgid "Property Attachments" +msgstr "" + +#: inc/taxonomies/class-taxonomy-categories.php:45 +msgid "Property Categories" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:95 +msgid "Property Collection" +msgstr "" + +#: templates/content-single-property-print.php:44 +#: templates/content-single-property-v2.php:83 +#: templates/content-single-property-v3.php:71 +#: templates/content-single-property-v4.php:51 +#: templates/content-single-property-v5.php:84 +#: templates/content-single-property.php:56 +msgid "Property Description" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:680 +msgid "Property has been successfully removed." +msgstr "" + +#: inc/submission/class-opalestate-submission.php:501 +msgid "Property has been successfully updated." +msgstr "" + +#: inc/message/class-opalestate-message.php:500 +#: inc/message/class-opalestate-message.php:604 +#: inc/message/class-opalestate-message.php:681 +msgid "Property ID" +msgstr "" + +#: templates/content-single-property-print.php:49 +#: templates/content-single-property-v2.php:89 +#: templates/content-single-property-v3.php:76 +#: templates/content-single-property-v4.php:57 +#: templates/content-single-property-v5.php:90 +#: templates/content-single-property.php:62 +msgid "Property ID: " +msgstr "" + +#: templates/content-single-property-v2.php:122 +#: inc/property/class-metabox-property-admin.php:303 +#: templates/single-property/features.php:11 +msgid "Property Information" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:28 +msgid "Property Metabox" +msgstr "" + +#: templates/single-property/map.php:16 +msgid "Property on Map" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:83 +msgid "Property Search Form" +msgstr "" + +#: inc/admin/settings/property.php:55 +msgid "Property Settings" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:187 +msgid "Property SKU" +msgstr "" + +#: install.php:116 inc/submission/class-opalestate-submission.php:131 +msgid "Property Submission Page" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:52 +msgid "property-city" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:54 +msgid "property-label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:53 +msgid "property-location" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:83 +msgid "property-neighborhood" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:51 +msgid "property-state" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:53 +msgid "property-status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:92 +msgid "property-type" +msgstr "" + +#: inc/admin/class-api-keys-table.php:181 +msgid "Public Key" +msgstr "" + +#: inc/api/class-opalestate-api.php:1064 +msgid "Public key:" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:280 +msgid "Public Services & Government" +msgstr "" + +#: templates/user/my-properties.php:4 +msgid "Published" +msgstr "" + +#: inc/mixes-functions.php:590 +msgid "Qatari riyal" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:182 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:151 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:174 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:163 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:182 +msgid "Query" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:61 +msgid "Query rating features" +msgstr "" + +#: templates/single-property/information.php:9 +msgid "Quick Information" +msgstr "" + +#: templates/search-box/fields/search-city-text.php:37 +msgid "Radius" +msgstr "" + +#: templates/search-box/fields/radius.php:14 +msgid "Radius:" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:216 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:185 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:208 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:216 +msgid "Random" +msgstr "" + +#: inc/widgets/sameprice-properties.php:69 +msgid "Range Price:" +msgstr "" + +#: templates/rating/opalestate-ratings.php:249 +#: templates/rating/opalestate-ratings.php:261 +msgid "Rate…" +msgstr "" + +#. 1: rating 2: rating count +#: inc/template-functions.php:875 +#, php-format +msgid "Rated %1$s out of 5 based on %2$s customer rating" +msgid_plural "Rated %1$s out of 5 based on %2$s customer ratings" +msgstr[0] "" +msgstr[1] "" + +#. %s: rating +#: inc/template-functions.php:856 inc/template-functions.php:880 +#, php-format +msgid "Rated %s out of 5" +msgstr "" + +#: inc/rating/class-opalestate-rating-metabox.php:57 +msgid "Rating" +msgstr "" + +#: inc/rating/class-opalestate-rating-metabox.php:57 +msgid "Rating features" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:67 +msgid "Rating Features List" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:66 +msgid "Rating Features navigation" +msgstr "" + +#. %s number of ratings +#: templates/rating/opalestate-ratings.php:118 +#, php-format +msgctxt "rating numbers" +msgid "%s rating" +msgid_plural "%s ratings" +msgstr[0] "" +msgstr[1] "" + +#: templates/rating/opalestate-ratings.php:64 +msgid "Ratings & Reviews" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:182 +msgid "Re-Password is not match." +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:284 +msgid "Real Estate" +msgstr "" + +#: templates/archive-opalestate_agency.php:13 +msgid "" +"Reality Agencies are local expert who can get you better results for lower " +"fees" +msgstr "" + +#: templates/user/my-account-popup.php:5 templates/user/register-form.php:31 +#: templates/user/register-form.php:93 templates/user/my-account.php:5 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:504 +msgid "Register" +msgstr "" + +#: templates/user/login-form.php:56 +msgid "Register now!" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:45 +msgid "Register User Form" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:248 +#: inc/submission/class-metabox-property-submission.php:118 +msgid "Regular Price" +msgstr "" + +#: inc/admin/class-api-keys-table.php:154 +msgid "Reissue" +msgstr "" + +#: templates/parts/modules/carousel.php:11 +msgid "Related Properties" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:288 +msgid "Religious Organizations" +msgstr "" + +#: templates/user/login-form.php:42 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:523 +msgid "Remember me" +msgstr "" + +#: inc/importer/class-content-importer.php:607 +#, php-format +msgid "Remote file is too large, limit is %s" +msgstr "" + +#: inc/importer/class-import-steps.php:114 +msgid "Remote Request Fails" +msgstr "" + +#: inc/importer/class-content-importer.php:588 +#, php-format +msgid "Remote server returned %1$d %2$s for %3$s" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:422 +#: inc/property/class-metabox-property-admin.php:612 +#: inc/property/class-metabox-property-admin.php:681 +#: inc/submission/class-metabox-property-submission.php:455 +#: inc/submission/class-metabox-property-submission.php:534 +#: inc/submission/class-metabox-property-submission.php:610 +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:64 +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:76 +msgid "Remove" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:266 +msgid "Renew membership" +msgstr "" + +#: templates/user/register-form.php:62 +msgid "Repeat-Password" +msgstr "" + +#: templates/user/read-messages.php:45 +msgid "Reply" +msgstr "" + +#: inc/template-hook-functions.php:195 inc/template-hook-functions.php:238 +msgid "Request Viewing" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:292 +msgid "Restaurants" +msgstr "" + +#: inc/importer/class-import-steps.php:121 +msgid "Retrieve Body Fails" +msgstr "" + +#: templates/content-single-agent.php:17 templates/single-agency/tabs.php:17 +#: inc/admin/rating/class-rating.php:46 +msgid "Review" +msgstr "" + +#. %s number of reviews +#: inc/template-functions.php:986 templates/rating/opalestate-ratings.php:173 +#, php-format +msgctxt "review numbers" +msgid "%s review" +msgid_plural "%s reviews" +msgstr[0] "" +msgstr[1] "" + +#: inc/admin/rating/class-rating.php:54 inc/admin/rating/class-rating.php:58 +msgid "Review Settings" +msgstr "" + +#: templates/content-single-property-v5.php:35 inc/user/functions.php:144 +#: inc/user/functions.php:151 +msgid "Reviews" +msgstr "" + +#: inc/admin/class-api-keys-table.php:163 +msgid "Revoke" +msgstr "" + +#: inc/api/class-opalestate-api.php:1074 +msgid "Revoke API Keys" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:314 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:357 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:369 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:392 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:232 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:357 +msgid "Right" +msgstr "" + +#: inc/mixes-functions.php:591 +msgid "Romanian leu" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:381 +#: inc/property/class-metabox-property-admin.php:581 +#: inc/submission/class-metabox-property-submission.php:332 +#: inc/submission/class-metabox-property-submission.php:577 +msgid "Rooms" +msgstr "" + +#: templates/single-property/floor-plans.php:56 +msgid "Rooms:" +msgstr "" + +#: inc/mixes-functions.php:593 +msgid "Russian ruble" +msgstr "" + +#: inc/mixes-functions.php:594 +msgid "Rwandan franc" +msgstr "" + +#: inc/mixes-functions.php:606 +msgid "São Tomé and Príncipe dobra" +msgstr "" + +#: inc/mixes-functions.php:601 +msgid "Saint Helena pound" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:256 +#: inc/submission/class-metabox-property-submission.php:126 +#: templates/parts/mortgage-calculator.php:152 +#: templates/parts/mortgage-calculator.php:153 +#: templates/widgets/mortgage-calculator.php:139 +#: templates/widgets/mortgage-calculator.php:140 +msgid "Sale Price" +msgstr "" + +#: templates/single-property/price.php:12 +msgid "Sale Price:" +msgstr "" + +#: inc/widgets/sameprice-properties.php:52 +msgid "Same Price" +msgstr "" + +#: inc/mixes-functions.php:626 +msgid "Samoan tālā" +msgstr "" + +#: inc/mixes-functions.php:595 +msgid "Saudi riyal" +msgstr "" + +#: templates/user-search/render-form.php:33 +msgid "Save" +msgstr "" + +#: templates/user/profile.php:30 templates/user/profile.php:50 +#: templates/user/agency/profile-agency.php:32 +#: templates/user/agent/profile-agent.php:16 +msgid "Save Change" +msgstr "" + +#: templates/shortcodes/submission-form.php:52 +#: templates/submission/submission-form.php:39 +#: templates/submission/submission-form.php:40 +msgid "Save property" +msgstr "" + +#: templates/user-search/render-form.php:12 +msgid "Save search" +msgstr "" + +#: inc/admin/functions.php:288 +msgid "Save Settings" +msgstr "" + +#: inc/user/class-opalestate-user-search.php:191 +msgid "Saved Search" +msgstr "" + +#: inc/user/class-opalestate-user-search.php:142 +msgid "Saved this search successful." +msgstr "" + +#: inc/message/class-opalestate-message.php:695 +msgid "Schedule" +msgstr "" + +#: templates/single-property/map.php:66 templates/single-property/map-v2.php:68 +#: templates/single-property/preview/tabs.php:60 +#: templates/single-property/preview/map.php:36 +msgid "School" +msgstr "" + +#: templates/content-single-property-v5.php:24 +msgid "Scores" +msgstr "" + +#: templates/shortcodes/ajax-map-quick-search.php:34 +#: templates/parts/search-agents-form-address.php:40 +#: templates/parts/search-form-h.php:95 +#: templates/parts/search-agents-form.php:55 +#: templates/parts/search-agency-form-address.php:40 +#: templates/parts/search-form-v.php:101 +#: templates/parts/search-agency-form.php:27 +#: templates/search-box/fields/submit-button.php:2 +msgid "Search" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:48 +msgid "Search Agency" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:41 +msgid "Search Agent" +msgstr "" + +#: inc/agent/class-opalestate-agent-front.php:321 +msgid "Search Agents" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:36 +msgid "Search Amenities" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:106 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:106 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:92 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:92 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:106 +msgid "Search By Address" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:76 +msgid "Search Category" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:37 +msgid "Search Cities / Towns" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:38 +msgid "Search Countries" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:101 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:101 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:87 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:87 +#: inc/vendors/elementor/widgets/opalestate-split-maps-search.php:80 +#: inc/vendors/elementor/widgets/opalestate-split-maps-search.php:87 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:101 +msgid "Search Form" +msgstr "" + +#: inc/admin/functions.php:365 +msgid "Search Key" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:39 +msgid "Search Label" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:74 +msgid "Search Level" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:42 +msgid "Search Map Properties" +msgstr "" + +#: install.php:134 +msgid "Search Map Properties Page" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:68 +msgid "Search Neighborhoods" +msgstr "" + +#: inc/admin/settings/property.php:27 +msgid "Search Page" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:39 +#: inc/widgets/search-properties.php:57 templates/parts/search-form-v.php:30 +msgid "Search Properties" +msgstr "" + +#: inc/admin/settings/property.php:144 +msgid "Search Properties Page" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:38 +msgid "Search Properties Result" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:40 +msgid "Search Properties Vertical" +msgstr "" + +#: inc/widgets/search-properties.php:25 +msgid "Search Properties widget." +msgstr "" + +#: inc/property/class-opalestate-posttype.php:47 +msgid "Search Property" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:36 +msgid "Search States" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:39 +msgid "Search Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:77 +msgid "Search Types" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-form-builder.php:40 +msgid "Search: Form Builder" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:40 +msgid "Search: Maps Preview" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:43 +msgid "Search: Property Form " +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:40 +msgid "Search: Property Results" +msgstr "" + +#: inc/admin/class-api-keys-table.php:183 +msgid "Secret Key" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:128 +msgid "Secret key" +msgstr "" + +#: inc/api/class-opalestate-api.php:1067 +msgid "Secret key:" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:537 +#: inc/property/class-metabox-property-admin.php:545 +msgid "Select a layout to display full information of this property" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:75 +msgid "Select an image icon (SVG, PNG or JPEG)." +msgstr "" + +#: inc/taxonomies/class-taxonomy-categories.php:100 +msgid "Select category" +msgstr "" + +#: inc/ajax-functions.php:139 inc/taxonomies/class-taxonomy-city.php:112 +msgid "Select City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:108 +#: inc/taxonomies/class-taxonomy-locations.php:128 +msgid "Select Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:114 +msgid "Select Label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:98 +msgid "Select Neighborhoods" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:135 +#: inc/submission/class-metabox-property-submission.php:224 +msgid "Select one or more files to allow download" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:97 +#: inc/property/class-metabox-property-admin.php:111 +#: inc/agency/class-opalestate-agency-metabox.php:320 +#: inc/agent/class-opalestate-agent-metabox.php:153 +#: inc/submission/class-metabox-property-submission.php:187 +#: inc/submission/class-metabox-property-submission.php:196 +msgid "Select one or more images to show as gallery" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:96 +msgid "Select one, to add new you create in city of estate panel" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:98 +msgid "Select one, to add new you create in City/Town of estate panel" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:92 +#: inc/taxonomies/class-taxonomy-city.php:89 +msgid "Select one, to add new you create in countries of estate panel" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:80 +#: inc/agency/class-opalestate-agency-metabox.php:37 +#: inc/agency/class-opalestate-agency-metabox.php:277 +#: inc/agency/class-opalestate-agency-metabox.php:345 +#: inc/agent/class-opalestate-agent-metabox.php:65 +#: inc/agent/class-opalestate-agent-metabox.php:111 +#: inc/admin/agency/class-agency.php:73 +msgid "Select one, to add new you create in location of estate panel" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:89 +msgid "Select one, to add new you create in state of estate panel" +msgstr "" + +#: inc/ajax-functions.php:97 inc/taxonomies/class-taxonomy-state.php:108 +#: inc/taxonomies/class-taxonomy-state.php:125 +msgid "Select State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:128 +msgid "Select Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:111 +msgid "Select Type" +msgstr "" + +#: templates/messages/enquiry-form.php:23 +#: templates/messages/enquiry-form.php:38 +#: templates/messages/contact-form.php:37 +#: templates/user/share-search-form.php:48 +#: templates/user/agency/agency-team.php:45 +msgid "Send message" +msgstr "" + +#: inc/email/class-opalestate-abs-email-template.php:53 +msgid "Send notices to the site administrator before a job listing expires." +msgstr "" + +#: templates/messages/request-reviewing-form.php:10 +#: templates/messages/request-reviewing-form.php:11 +msgid "Send now" +msgstr "" + +#: inc/message/class-opalestate-message.php:508 +#: inc/message/class-opalestate-message.php:611 +#: inc/message/class-opalestate-message.php:688 +#: templates/user/agency/agency-team.php:14 +msgid "Sender ID" +msgstr "" + +#: inc/message/class-opalestate-message.php:230 +#: inc/message/class-opalestate-message.php:234 +msgid "Sending Message" +msgstr "" + +#: inc/mixes-functions.php:592 +msgid "Serbian dinar" +msgstr "" + +#: inc/rating/class-opalestate-rating-metabox.php:117 +#: inc/taxonomies/class-taxonomy-status.php:90 +msgid "Set a priority to display" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:82 +#: inc/taxonomies/class-taxonomy-status.php:78 +msgid "Set background of label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:84 +msgid "Set background of text" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:88 +msgid "Set color of text" +msgstr "" + +#: templates/user/content-property.php:79 +msgid "Set Featured" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:180 +msgid "Set how many slides are scrolled per swipe." +msgstr "" + +#: inc/admin/settings/general.php:79 inc/admin/settings/general.php:87 +msgid "Set maximun volumn size having < x MB" +msgstr "" + +#: inc/admin/settings/general.php:95 inc/admin/settings/general.php:103 +msgid "Set maximun volumn size having < x MB for upload docx, pdf..." +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:150 +msgid "Set member as featured" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:562 +msgid "Set package ID with -1 as free package." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:32 +msgid "" +"Set relationship to existed user, allow user can edit Agency profile in " +"front-end and show account info in each property." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:59 +msgid "Set this agent as featured" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:161 +msgid "Set this member as Trusted Member" +msgstr "" + +#: inc/admin/register-settings.php:79 +msgid "Settings" +msgstr "" + +#: inc/admin/register-settings.php:280 +msgid "Settings updated." +msgstr "" + +#: inc/mixes-functions.php:597 +msgid "Seychellois rupee" +msgstr "" + +#: templates/single-property/sharebox.php:28 +msgid "Share on facebook" +msgstr "" + +#: templates/single-property/sharebox.php:57 +msgid "Share on Google plus" +msgstr "" + +#: templates/single-property/sharebox.php:42 +msgid "Share on LinkedIn" +msgstr "" + +#: templates/single-property/sharebox.php:65 +msgid "Share on Pinterest" +msgstr "" + +#: templates/single-property/sharebox.php:49 +msgid "Share on Tumblr" +msgstr "" + +#: templates/single-property/sharebox.php:35 +msgid "Share on Twitter" +msgstr "" + +#: templates/user/share-search-form.php:14 +msgid "Share this Search" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:296 +#: templates/single-property/map.php:73 templates/single-property/map-v2.php:75 +#: templates/single-property/preview/tabs.php:67 +#: templates/single-property/preview/map.php:43 +msgid "Shopping" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:302 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:314 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:337 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:302 +msgid "Shorten" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:148 +msgid "Show" +msgstr "" + +#: inc/admin/settings/property.php:295 +msgid "Show Amenities tab" +msgstr "" + +#: inc/admin/settings/property.php:296 +msgid "Show Amenities tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:372 +msgid "Show Apartments tab" +msgstr "" + +#: inc/admin/settings/property.php:373 +msgid "Show Apartments tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:317 +msgid "Show Attachments tab" +msgstr "" + +#: inc/admin/settings/property.php:318 +msgid "Show Attachments tab in the single property page." +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:101 +msgid "Show Captcha In Form" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:80 +msgid "Show Collection as Default Results" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:142 +msgid "Show Content Use Not Login" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:599 +#: inc/vendors/opalmembership/membership.php:607 +msgid "Show expired time in double format." +msgstr "" + +#: inc/admin/settings/property.php:306 +msgid "Show Facilities tab" +msgstr "" + +#: inc/admin/settings/property.php:307 +msgid "Show Facilities tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:169 +msgid "Show Featured First" +msgstr "" + +#: inc/admin/settings/property.php:171 +msgid "Show featured first in page result, as default Newest is showed" +msgstr "" + +#: inc/admin/settings/property.php:383 +msgid "Show Floor Plans tab" +msgstr "" + +#: inc/admin/settings/property.php:384 +msgid "Show Floor Plans tab in the single property page." +msgstr "" + +#: inc/submission/class-opalestate-submission.php:148 +msgid "Show Login Form" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:149 +msgid "Show Login Form and Submission Form" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:143 +msgid "Show Login/Register form and submission form if user not logined" +msgstr "" + +#: inc/admin/settings/property.php:339 +msgid "Show Map tab" +msgstr "" + +#: inc/admin/settings/property.php:340 +msgid "Show Map tab in the single property page." +msgstr "" + +#: inc/admin/class-user.php:178 +msgid "Show message for disabled user" +msgstr "" + +#: inc/admin/settings/property.php:98 +msgid "Show Meta Information In Grid and Single Page" +msgstr "" + +#: inc/admin/settings/property.php:350 +msgid "Show Nearby tab" +msgstr "" + +#: inc/admin/settings/property.php:351 +msgid "Show Nearby tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:232 inc/admin/settings/property.php:262 +msgid "Show Price" +msgstr "" + +#: inc/admin/settings/property.php:328 +msgid "Show Video tab" +msgstr "" + +#: inc/admin/settings/property.php:329 +msgid "Show Video tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:394 +msgid "Show Views Statistics tab" +msgstr "" + +#: inc/admin/settings/property.php:395 +msgid "Show Views Statistics tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:361 +msgid "Show Walk Scores tab" +msgstr "" + +#: inc/admin/settings/property.php:362 +msgid "Show Walk Scores tab in the single property page." +msgstr "" + +#: templates/search-box/fields/search-city-text.php:35 +msgid "Show with in." +msgstr "" + +#: inc/mixes-functions.php:602 +msgid "Sierra Leonean leone" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:501 +msgid "Sign in" +msgstr "" + +#: inc/widgets/similar-properties.php:51 +msgid "Similar Properties" +msgstr "" + +#: inc/widgets/sameprice-properties.php:24 +msgid "Similar Properties By Same Price with configured range and Status" +msgstr "" + +#: inc/widgets/similar-properties.php:24 +msgid "Similar Properties By Same Types and Status Of the post" +msgstr "" + +#: inc/mixes-functions.php:137 +msgid "Simple City Form" +msgstr "" + +#: inc/mixes-functions.php:138 +msgid "Simple Keyword Form" +msgstr "" + +#: inc/mixes-functions.php:600 +msgid "Singapore dollar" +msgstr "" + +#: inc/admin/settings/general.php:175 +msgid "Single Layout Page" +msgstr "" + +#: inc/admin/settings/property.php:28 +msgid "Single Page" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:121 +msgid "Site Key" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:576 +#: inc/submission/class-metabox-property-submission.php:572 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:366 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:428 +msgid "Size" +msgstr "" + +#: templates/single-property/floor-plans.php:49 +msgid "Size:" +msgstr "" + +#: inc/admin/property/class-property.php:100 +msgid "Sku" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:165 +msgid "Skype" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:286 +msgid "Slide" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:178 +msgid "Slides to Scroll" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:166 +msgid "Slides to Show" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:261 +#: inc/admin/agency/class-agency.php:79 +msgid "slogan" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:51 +msgctxt "slug" +msgid "opal-property-amenity" +msgstr "" + +#: inc/taxonomies/class-taxonomy-categories.php:53 +msgctxt "slug" +msgid "property-category" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:183 +msgid "Social" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:49 +msgid "Social Login" +msgstr "" + +#: inc/admin/class-user.php:112 inc/admin/agency/class-agency.php:136 +#: inc/admin/agent/class-agent.php:87 +msgid "Socials" +msgstr "" + +#: inc/mixes-functions.php:596 +msgid "Solomon Islands dollar" +msgstr "" + +#: inc/mixes-functions.php:603 +msgid "Somali shilling" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:540 +msgid "Sorry! Your submitted datcould not save a at this time" +msgstr "" + +#: inc/template-functions.php:234 +msgid "Sort By" +msgstr "" + +#: inc/mixes-functions.php:632 +msgid "South African rand" +msgstr "" + +#: inc/mixes-functions.php:551 +msgid "South Korean won" +msgstr "" + +#: inc/mixes-functions.php:605 +msgid "South Sudanese pound" +msgstr "" + +#: inc/admin/settings/general.php:240 +msgid "sq ft" +msgstr "" + +#: inc/admin/settings/general.php:241 +msgid "sq m" +msgstr "" + +#: inc/mixes-functions.php:557 +msgid "Sri Lankan rupee" +msgstr "" + +#: templates/rating/opalestate-ratings.php:79 +msgid "star" +msgstr "" + +#: inc/importer/class-import-steps.php:286 +msgid "Starting to download attachments then import" +msgstr "" + +#: inc/importer/class-import-steps.php:399 +#: inc/importer/class-import-steps.php:451 +#: inc/importer/class-import-steps.php:473 +msgid "Starting to import Content" +msgstr "" + +#: inc/importer/class-import-steps.php:622 +msgid "Starting to import customizer" +msgstr "" + +#: inc/importer/class-import-steps.php:860 +msgid "Starting to import other content and settings" +msgstr "" + +#: inc/importer/class-import-steps.php:450 +msgid "Starting to import other sample content" +msgstr "" + +#: inc/importer/class-import-steps.php:262 +msgid "Starting to import required plugins" +msgstr "" + +#: inc/importer/class-import-steps.php:576 +msgid "Starting to import required slider" +msgstr "" + +#: inc/importer/class-import-steps.php:497 +msgid "Starting to import required widgets" +msgstr "" + +#: inc/importer/class-import-steps.php:552 +msgid "Starting to import website menu" +msgstr "" + +#: inc/importer/class-import-steps.php:761 +msgid "Starting to theme Options" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:139 +msgid "State" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:88 +#: inc/taxonomies/class-taxonomy-city.php:97 +msgid "State / Province" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:80 +msgid "State image" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:72 +msgid "State Metabox" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:362 +msgid "States / Province" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:34 +#: inc/taxonomies/class-taxonomy-state.php:44 +msgid "States / Provinces" +msgstr "" + +#: templates/content-single-property-v5.php:27 +msgid "Statistics" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:662 +#: inc/taxonomies/class-taxonomy-status.php:37 +#: inc/taxonomies/class-taxonomy-status.php:47 +#: inc/taxonomies/class-taxonomy-status.php:140 +#: inc/submission/class-metabox-property-submission.php:515 +#: templates/single-property/features.php:38 +#: templates/single-property/apartments.php:27 +#: templates/parts/search-form-v.php:44 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:254 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:277 +msgid "Status" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:143 +msgid "Statuses" +msgstr "" + +#: templates/single-property/map.php:28 templates/single-property/map-v2.php:25 +#: templates/single-property/preview/tabs.php:19 +msgid "Street View" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:96 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:103 +msgid "Style Item Layout" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:93 +msgid "Submission Form" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:462 +#: inc/submission/class-opalestate-submission.php:527 +#: inc/submission/class-opalestate-submission.php:534 +#: inc/submission/class-opalestate-submission.php:541 +#: inc/vendors/opalmembership/membership.php:426 +msgid "Submission Information" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:110 +msgid "Submission Page" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:125 +msgid "Submission Page Settings" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:167 +msgid "Submission Tab Settings" +msgstr "" + +#: templates/rating/opalestate-ratings.php:240 +msgid "Submit" +msgstr "" + +#: inc/user/functions.php:167 +msgid "Submit Property" +msgstr "" + +#: inc/user/class-opalestate-user.php:272 +msgid "Subscriber" +msgstr "" + +#: inc/mixes-functions.php:598 +msgid "Sudanese pound" +msgstr "" + +#: inc/mixes-functions.php:604 +msgid "Surinamese dollar" +msgstr "" + +#: inc/mixes-functions.php:608 +msgid "Swazi lilangeni" +msgstr "" + +#: inc/mixes-functions.php:599 +msgid "Swedish krona" +msgstr "" + +#: inc/mixes-functions.php:502 +msgid "Swiss franc" +msgstr "" + +#: inc/mixes-functions.php:607 +msgid "Syrian pound" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:303 +msgid "System is unable to send you mail containg your new password." +msgstr "" + +#: inc/template-functions.php:466 +msgid "Tabs - Gallery Active" +msgstr "" + +#: inc/template-functions.php:467 +msgid "Tabs - Map Active" +msgstr "" + +#: inc/template-functions.php:468 +msgid "Tabs - Street Map Active" +msgstr "" + +#: inc/mixes-functions.php:610 +msgid "Tajikistani somoni" +msgstr "" + +#: inc/mixes-functions.php:617 +msgid "Tanzanian shilling" +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:59 +#: inc/agent/class-opalestate-agent-metabox.php:126 +msgid "Target Max Price" +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:52 +#: inc/agent/class-opalestate-agent-metabox.php:119 +msgid "Target Min Price" +msgstr "" + +#: inc/admin/agent/class-agent.php:94 +msgid "Target Search" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:100 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:100 +msgid "Target Submit Page" +msgstr "" + +#: templates/content-single-agency.php:27 +#: templates/content-single-agency.php:101 templates/single-agency/tabs.php:11 +#: inc/admin/agency/class-agency.php:144 +msgid "Team" +msgstr "" + +#: templates/user/register-form.php:81 +msgid "terms & conditions" +msgstr "" + +#: inc/mixes-functions.php:609 +msgid "Thai baht" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:88 +msgid "The captcha is not verified, please try again!" +msgstr "" + +#: inc/agency/class-opalestate-agency-front.php:308 +#: inc/agent/class-opalestate-agent-front.php:210 +msgid "The data updated successful, please wait for redirecting" +msgstr "" + +#: inc/class-opalestate-email.php:326 inc/class-opalestate-email.php:354 +msgid "" +"The email subject a user should receive when they make an initial property " +"request." +msgstr "" + +#: inc/class-opalestate-email.php:287 +msgid "The email subject for admin notifications." +msgstr "" + +#: inc/admin/settings/general.php:146 +msgid "" +"The Featured Image is an image that is chosen as the representative image in " +"single page. ." +msgstr "" + +#: inc/admin/views/addons/list.php:7 +msgid "The following Add-ons extend the functionality of Opal Estate." +msgstr "" + +#: inc/importer/class-import-steps.php:248 +msgid "The installation was not complete" +msgstr "" + +#: inc/importer/class-import-steps.php:548 +msgid "The Installer is excuting to import menu, please waiting for a while!" +msgstr "" + +#: inc/admin/settings/general.php:112 inc/admin/settings/general.php:123 +msgid "" +"The Loop Image is an Agent that is chosen as the representative Agent in " +"grid and list." +msgstr "" + +#: inc/admin/settings/general.php:135 +msgid "" +"The Loop Image is an image that is chosen as the representative image in " +"grid and list." +msgstr "" + +#: inc/class-opalestate-email.php:252 +msgid "" +"The name donation receipts are said to come from. This should probably be " +"your site or shop name." +msgstr "" + +#: inc/admin/settings/property.php:406 +msgid "The number of days will be saved to the database." +msgstr "" + +#: inc/submission/class-opalestate-submission.php:507 +msgid "The property has updated completed with new information" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:155 +msgid "" +"the Property will be auto approve when user submit, if you do not enable it." +msgstr "" + +#: inc/admin/settings/general.php:212 +msgid "The symbol (typically , or .) to separate thousands" +msgstr "" + +#: inc/admin/settings/general.php:219 +msgid "The symbol (usually , or .) to separate decimal points" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:135 +msgid "Theme" +msgstr "" + +#: templates/rating/opalestate-ratings.php:207 +msgid "There are no reviews yet." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:257 +msgid "There is no user registered with that email address." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:263 +msgid "There is no user registered with that username." +msgstr "" + +#: inc/admin/views/addons/list.php:21 +msgid "" +"There was an error retrieving the Give Add-ons list from the server. Please " +"try again later." +msgstr "" + +#: inc/class-opalestate-enqueue.php:87 +msgid "This file is has large volume size, please try to upload other." +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:50 +#: inc/taxonomies/class-taxonomy-types.php:48 +msgid "This image will display in google map" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:90 +msgid "" +"This is often used for building seach page, it combines with block => Search:" +" Map Preview, Search: Property Results." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:89 +msgid "" +"This is often used for building seach page, it combines with block => Search:" +" Property Form, Search: Property Results." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:87 +msgid "" +"This is often used for building seach page, it combines with block => Search:" +" Property Form, Search:Map Preview." +msgstr "" + +#: inc/admin/settings/property.php:145 +msgid "" +"This is page to display result of properties after user searching via form." +msgstr "" + +#: inc/admin/settings/general.php:60 +msgid "This is page use User login and register an account, or reset password." +msgstr "" + +#: inc/admin/settings/general.php:53 +msgid "" +"This is page use User Management Page using for show content of management " +"page such as profile, my properties" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:132 +msgid "" +"This is the submission page. The [opalestate_submission] " +"shortcode should be on this page." +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:69 +msgid "This is where store rating features are stored." +msgstr "" + +#: inc/admin/settings/general.php:226 +msgid "This sets the number of decimal points shown in displayed prices." +msgstr "" + +#: inc/admin/class-user.php:49 +#, php-format +msgid "" +"This user has role Opal Estate Agency and click here to update Agency profile" +msgstr "" + +#: inc/user/class-opalestate-user.php:167 +#, php-format +msgid "" +"This user has role Opal Estate Agency and click here to update Agency profile" +msgstr "" + +#: inc/admin/class-user.php:59 +#, php-format +msgid "" +"This user has role Opal Estate Agent and click here to update Agent profile" +msgstr "" + +#: inc/user/class-opalestate-user.php:177 +#, php-format +msgid "" +"This user has role Opal Estate Agent and click here to update Agent profile" +msgstr "" + +#: inc/admin/settings/general.php:211 +msgid "Thousands Separator" +msgstr "" + +#: inc/message/class-opalestate-message.php:703 +msgid "Time" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:99 +#: inc/vendors/elementor/widgets/opalestate-form-builder.php:87 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:214 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:183 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:206 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:214 +msgid "Title" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:137 +msgid "Title/Job" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:252 +#: inc/agent/class-opalestate-agent-metabox.php:91 +msgid "Title/Name" +msgstr "" + +#: inc/widgets/featured-properties.php:57 +#: inc/widgets/sameprice-properties.php:58 +#: inc/widgets/similar-properties.php:56 inc/widgets/profile-info.php:78 +#: inc/widgets/search-properties.php:68 inc/widgets/mortgage-calculator.php:53 +msgid "Title:" +msgstr "" + +#: inc/admin/settings/general.php:151 +msgid "" +"To generate images with new image sizes, you can use this Force Regenerate Thumbnails" +msgstr "" + +#: inc/admin/class-api-keys-table.php:182 +msgid "Token" +msgstr "" + +#: inc/api/class-opalestate-api.php:1070 +msgid "Token:" +msgstr "" + +#: inc/mixes-functions.php:613 +msgid "Tongan paʻanga" +msgstr "" + +#: inc/template-functions.php:469 +msgid "Tour 360" +msgstr "" + +#: templates/single-property/map.php:79 templates/single-property/map-v2.php:81 +#: templates/single-property/preview/tabs.php:73 +#: templates/single-property/preview/map.php:49 +msgid "Trainstation" +msgstr "" + +#: templates/single-property/walkscore.php:35 +msgid "Transit Scores" +msgstr "" + +#: inc/mixes-functions.php:588 +msgid "Transnistrian ruble" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:300 +msgid "Transportation" +msgstr "" + +#: inc/mixes-functions.php:615 +msgid "Trinidad and Tobago dollar" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:159 +msgid "Trusted" +msgstr "" + +#: templates/content-agent-list.php:26 templates/content-agent-list.php:27 +#: templates/content-agent-grid.php:20 templates/content-agent-grid.php:20 +#: templates/content-agent-grid-v2.php:19 +#: templates/content-agent-grid-v2.php:19 templates/content-agency-grid.php:21 +#: templates/content-agency-grid.php:21 templates/content-agency-list.php:28 +#: templates/content-agency-list.php:29 +#: templates/single-agent/author-box.php:21 +#: templates/single-agent/author-box.php:21 +#: templates/single-agency/author-box.php:28 +#: templates/single-agency/author-box.php:28 +#: templates/single-property/user/author-member-box.php:28 +#: templates/single-property/user/author-member-box.php:28 +#: templates/single-property/user/author-user-box.php:64 +#: templates/single-property/user/author-user-box.php:64 +#: templates/single-property/user/author-user-box-list.php:50 +#: templates/single-property/user/author-user-box-list.php:50 +msgid "Trusted Member" +msgstr "" + +#: inc/mixes-functions.php:612 +msgid "Tunisian dinar" +msgstr "" + +#: inc/mixes-functions.php:614 +msgid "Turkish lira" +msgstr "" + +#: inc/mixes-functions.php:611 +msgid "Turkmenistan manat" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:212 +msgid "Twitter" +msgstr "" + +#: inc/message/class-opalestate-message.php:493 +#: inc/message/class-opalestate-message.php:559 +#: inc/message/class-opalestate-message.php:597 +#: inc/message/class-opalestate-message.php:674 +#: inc/taxonomies/class-taxonomy-types.php:123 +#: templates/user/register-form.php:69 +#: templates/single-property/features.php:26 +#: templates/parts/search-form-v.php:55 +msgid "Type" +msgstr "" + +#: templates/search-box/fields/search-city-text.php:24 +msgid "Type City or Area" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:59 +msgid "Type image" +msgstr "" + +#: templates/search-box/fields/search-text.php:2 +msgid "Type keyword" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:68 +#: inc/taxonomies/class-taxonomy-neighborhood.php:42 +#: inc/taxonomies/class-taxonomy-types.php:40 +msgid "Type Metabox" +msgstr "" + +#: templates/single-property/information.php:15 +msgid "Type:" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:276 +#: inc/agent/class-opalestate-agent-metabox.php:64 +#: inc/agent/class-opalestate-agent-metabox.php:110 +#: inc/taxonomies/class-taxonomy-types.php:75 +#: inc/taxonomies/class-taxonomy-types.php:85 +#: inc/submission/class-metabox-property-submission.php:154 +#: templates/search-box/search-form-v3.php:46 +#: templates/search-box/search-form-v2.php:29 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:234 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:257 +msgid "Types" +msgstr "" + +#: inc/mixes-functions.php:619 +msgid "Ugandan shilling" +msgstr "" + +#: inc/mixes-functions.php:618 +msgid "Ukrainian hryvnia" +msgstr "" + +#: inc/message/class-opalestate-request-reviewing.php:94 +#: inc/message/class-opalestate-message.php:234 +#: inc/message/class-opalestate-message.php:282 +msgid "Unable to send a message." +msgstr "" + +#: inc/property/class-metabox-property-admin.php:667 +#: inc/submission/class-metabox-property-submission.php:519 +msgid "Unavailable" +msgstr "" + +#: inc/mixes-functions.php:474 +msgid "United Arab Emirates dirham" +msgstr "" + +#: inc/mixes-functions.php:620 +msgid "United States dollar" +msgstr "" + +#: templates/parts/membership-pricing-info.php:14 +#: templates/parts/membership-pricing-info.php:23 +#: inc/vendors/opalmembership/membership.php:493 +#: inc/vendors/opalmembership/membership.php:494 +msgid "Unlimited" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:41 +msgid "Update Amenity" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:81 +msgid "Update Category" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:42 +msgid "Update City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:43 +msgid "Update Country" +msgstr "" + +#: inc/agency/class-opalestate-agency-front.php:310 +#: inc/agency/class-opalestate-agency-front.php:318 +#: inc/agent/class-opalestate-agent-front.php:212 +#: inc/agent/class-opalestate-agent-front.php:220 +msgid "Update Information" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:44 +msgid "Update Label" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:79 +msgid "Update Level" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:73 +msgid "Update Neighborhood" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:41 +msgid "Update State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:44 +msgid "Update Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:82 +msgid "Update Type" +msgstr "" + +#: templates/emails/publish_property.php:14 +msgid "URL" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:63 +msgctxt "URL Slug" +msgid "agency" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:56 +msgctxt "URL Slug" +msgid "agent" +msgstr "" + +#: inc/mixes-functions.php:621 +msgid "Uruguayan peso" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:187 +msgid "Use Custom Dashboard Menu" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:129 +msgid "Used for communication between your site and Google. Grab it." +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:122 +#, php-format +msgid "Used for displaying the CAPTCHA. Grab it %s" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:512 +msgid "User" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:441 +msgid "User Author Information" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:150 +msgid "User Assignment" +msgstr "" + +#: install.php:80 +msgid "User Dashboard Page" +msgstr "" + +#: inc/agency/class-opalestate-agency-front.php:472 +#: inc/agent/class-opalestate-agent-front.php:497 +msgid "User ID" +msgstr "" + +#: inc/api/class-opalestate-api.php:1102 +msgid "User ID Required." +msgstr "" + +#: inc/template-hook-functions.php:267 +msgid "User Management" +msgstr "" + +#: inc/admin/settings/general.php:52 +msgid "User Management Page" +msgstr "" + +#: inc/user/class-opalestate-user.php:50 +msgid "User Profile" +msgstr "" + +#: inc/admin/settings/property.php:76 inc/admin/settings/property.php:132 +msgid "User Saved Search" +msgstr "" + +#: inc/admin/settings/property.php:121 +msgid "User Share Search" +msgstr "" + +#: inc/admin/class-api-keys-table.php:180 templates/user/register-form.php:43 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:512 +msgid "Username" +msgstr "" + +#: inc/user/functions.php:232 +msgid "Username is already exists." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:51 +#: inc/user/class-opalestate-user-form-handler.php:165 +msgid "Username is required." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:511 +msgid "Username or email" +msgstr "" + +#: templates/user/login-form.php:27 +msgid "Username or email address" +msgstr "" + +#: inc/mixes-functions.php:622 +msgid "Uzbekistani som" +msgstr "" + +#: inc/mixes-functions.php:625 +msgid "Vanuatu vatu" +msgstr "" + +#: inc/mixes-functions.php:623 +msgid "Venezuelan bolívar" +msgstr "" + +#: inc/mixes-functions.php:134 +msgid "Vertical Advanced Form" +msgstr "" + +#: inc/mixes-functions.php:135 +msgid "Vertical Advanced V2 Form" +msgstr "" + +#: inc/mixes-functions.php:136 +msgid "Vertical Advanced V3 Form" +msgstr "" + +#: inc/admin/settings/property.php:254 +msgid "Vertical Search Fields" +msgstr "" + +#: templates/rating/opalestate-ratings.php:254 +#: templates/rating/opalestate-ratings.php:266 +msgid "Very poor" +msgstr "" + +#: inc/template-functions.php:437 +msgid "Vesion 2" +msgstr "" + +#: inc/template-functions.php:438 +msgid "Vesion 3" +msgstr "" + +#: inc/template-functions.php:439 +msgid "Vesion 4" +msgstr "" + +#: inc/template-functions.php:440 +msgid "Vesion 5" +msgstr "" + +#: templates/content-single-property-v5.php:18 +#: inc/property/class-metabox-property-admin.php:228 +#: inc/submission/class-metabox-property-submission.php:202 +#: templates/single-property/video.php:12 +msgid "Video" +msgstr "" + +#: inc/mixes-functions.php:624 +msgid "Vietnamese đồng" +msgstr "" + +#: templates/user-search/content-savedsearch.php:12 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:211 +msgid "View" +msgstr "" + +#: templates/single-property/apartments.php:43 +msgid "view" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:47 +msgid "View Agency" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:40 +msgid "View Agent" +msgstr "" + +#: inc/admin/views/addons/list.php:3 +msgid "View All Add-ons" +msgstr "" + +#: inc/admin/class-api-keys-table.php:143 +msgid "View API Log" +msgstr "" + +#: templates/single-agent/author-box.php:122 +msgid "View Profile" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:46 +#: templates/user/dashboard.php:128 templates/user/property-ratings.php:91 +msgid "View Property" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:60 +msgid "View rating feature" +msgstr "" + +#: inc/admin/settings/property.php:405 +msgid "Views Statistics time limit (days)" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:221 +msgid "Vimeo Url" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:104 +msgid "Virtual Tour 360" +msgstr "" + +#: inc/importer/class-import-steps.php:400 +msgid "Waiting for a while to download all attachment files!" +msgstr "" + +#: inc/importer/class-import-steps.php:489 +msgid "Waiting for a while to import content!" +msgstr "" + +#: inc/admin/settings/3rd_party.php:58 +msgid "Walk Score" +msgstr "" + +#: inc/admin/settings/3rd_party.php:66 +msgid "Walk Score APi Key" +msgstr "" + +#: templates/single-property/walkscore.php:12 +#: templates/single-property/walkscore.php:22 +msgid "Walk Scores" +msgstr "" + +#: inc/admin/functions.php:586 +msgid "We could find this user" +msgstr "" + +#: inc/admin/functions.php:590 +msgid "We could not find this user" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:184 +#: inc/agency/class-opalestate-agency-metabox.php:357 +#: inc/agent/class-opalestate-agent-metabox.php:183 +msgid "Website" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:172 +msgid "Website URL" +msgstr "" + +#: inc/mixes-functions.php:629 +msgid "West African CFA franc" +msgstr "" + +#: templates/single-property/nearby.php:27 +msgid "What's nearby" +msgstr "" + +#: templates/parts/search-agents-form-address.php:23 +#: templates/parts/search-agents-form.php:23 +#: templates/parts/search-agency-form-address.php:23 +msgid "Who sale between:" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:153 +msgid "Without Featured" +msgstr "" + +#. Author of the plugin +msgid "WPOPAL" +msgstr "" + +#: templates/parts/mortgage-calculator.php:172 +#: templates/parts/mortgage-calculator.php:173 +#: templates/widgets/mortgage-calculator.php:159 +#: templates/widgets/mortgage-calculator.php:160 +msgid "Years" +msgstr "" + +#: inc/admin/settings/3rd_party.php:77 +msgid "Yelp" +msgstr "" + +#: inc/admin/settings/3rd_party.php:113 +msgid "Yelp - Number of results" +msgstr "" + +#: inc/admin/settings/3rd_party.php:85 +msgid "Yelp API Client ID" +msgstr "" + +#: inc/admin/settings/3rd_party.php:92 +msgid "Yelp API Secret" +msgstr "" + +#: inc/admin/settings/3rd_party.php:99 +msgid "Yelp App key" +msgstr "" + +#: inc/admin/settings/3rd_party.php:106 +msgid "Yelp Categories" +msgstr "" + +#: inc/admin/settings/3rd_party.php:107 +msgid "Yelp Categories to show on front page" +msgstr "" + +#: inc/admin/settings/3rd_party.php:124 inc/admin/settings/3rd_party.php:125 +msgid "Yelp Distance Measurement Unit" +msgstr "" + +#: inc/mixes-functions.php:631 +msgid "Yemeni rial" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:108 +#: inc/classes/class-opalestate-metabox-user.php:153 +#: inc/classes/class-opalestate-metabox-user.php:164 +#: inc/property/class-metabox-property-admin.php:182 +#: inc/property/class-metabox-property-admin.php:211 +#: inc/property/class-metabox-property-admin.php:279 +#: inc/agency/class-opalestate-agency-metabox.php:62 +#: inc/widgets/search-properties.php:148 +#: inc/submission/class-metabox-property-submission.php:394 +#: inc/submission/class-metabox-property-submission.php:474 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:234 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:248 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:272 +#: inc/vendors/opalmembership/free-package.php:34 +msgid "Yes" +msgstr "" + +#: templates/user/register-form.php:22 templates/user/login-form.php:7 +msgid "You are currently logged in." +msgstr "" + +#: templates/parts/not-allowed.php:8 +msgid "You are not allowed to access this page." +msgstr "" + +#: inc/admin/settings/3rd_party.php:100 +msgid "" +"You can find it in your Yelp Application Dashboard. Register here" +msgstr "" + +#. %s: process +#: inc/api/class-opalestate-api.php:1117 inc/api/class-opalestate-api.php:1127 +#, php-format +msgid "You do not have permission to %s API keys for this user." +msgstr "" + +#: inc/class-opalestate-email.php:359 +#: inc/message/class-opalestate-message.php:102 +msgid "You got a message" +msgstr "" + +#: inc/message/class-opalestate-message.php:161 +#: inc/email/class-opalestate-email-notifycation.php:38 +msgid "You got a message contact" +msgstr "" + +#: inc/email/class-opalestate-email-notifycation.php:34 +msgid "You got a message enquiry" +msgstr "" + +#: inc/email/class-opalestate-request-viewing.php:31 +#, php-format +msgid "You have a message request reviewing: %s at" +msgstr "" + +#: templates/user/favorite-properties.php:24 +msgid "You have not added any property as favorite." +msgstr "" + +#: templates/user-search/content-savedsearch.php:38 +msgid "You have not added any search data." +msgstr "" + +#: templates/user/my-properties.php:47 +msgid "You have not submited any property." +msgstr "" + +#: templates/user/dashboard.php:55 templates/user/property-ratings.php:11 +msgid "You have not written any reviews yet." +msgstr "" + +#: inc/submission/class-opalestate-submission.php:511 +msgid "You have submitted the property successful" +msgstr "" + +#: templates/rating/opalestate-ratings.php:282 +msgid "You must be logged in to review." +msgstr "" + +#: inc/api/class-opalestate-api.php:423 +msgid "You must specify both a token and API key!" +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/map/map.php:73 +msgid "" +"You need to register Google API " +"Key, then put the key in plugin setting." +msgstr "" + +#: inc/admin/settings/general.php:249 +msgid "" +"You need to register Google API " +"Key, then put the key in this setting." +msgstr "" + +#: inc/user/class-opalestate-user-search.php:144 +msgid "You saved this search" +msgstr "" + +#: inc/user/class-opalestate-user.php:263 +msgid "Your account is blocked, you could not complete this action" +msgstr "" + +#: inc/user/class-opalestate-user.php:251 +msgid "" +"Your account was blocked to use the submission form, so you could not submit " +"any property." +msgstr "" + +#: templates/parts/mortgage-calculator.php:140 +#: templates/widgets/mortgage-calculator.php:110 +msgid "Your deposit" +msgstr "" + +#: templates/parts/mortgage-calculator.php:141 +#: templates/widgets/mortgage-calculator.php:111 +msgid "Your interest" +msgstr "" + +#: inc/mixes-functions.php:324 inc/mixes-functions.php:328 +msgid "Your Location" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:424 +msgid "" +"Your membership package is expired or Your package has 0 left listing, " +"please upgrade now." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:289 +msgid "Your new password" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:292 +msgid "Your new password is: " +msgstr "" + +#: templates/parts/membership-warning.php:3 +msgid "" +"Your package has 0 left listing, you could not add any more. Please upgrade " +"now" +msgstr "" + +#: templates/parts/mortgage-calculator.php:24 +#: templates/parts/mortgage-calculator.php:125 +#: templates/widgets/mortgage-calculator.php:24 +#: templates/widgets/mortgage-calculator.php:119 +msgid "Your payment" +msgstr "" + +#: templates/parts/mortgage-calculator.php:139 +#: templates/widgets/mortgage-calculator.php:109 +msgid "Your price" +msgstr "" + +#: templates/rating/opalestate-ratings.php:260 +msgid "Your rating" +msgstr "" + +#: inc/api/class-opalestate-api.php:440 +msgid "Your request could not be authenticated!" +msgstr "" + +#: templates/rating/opalestate-ratings.php:270 +msgid "Your review" +msgstr "" + +#: templates/rating/opalestate-ratings.php:278 +msgid "Your review already exists!" +msgstr "" + +#: templates/rating/review-meta.php:14 +msgid "Your review is awaiting approval" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:214 +msgid "Youtube Url" +msgstr "" + +#: inc/mixes-functions.php:633 +msgid "Zambian kwacha" +msgstr "" + +#: inc/importer/class-content-importer.php:601 +msgid "Zero size file downloaded" +msgstr "" diff --git a/languages/opalestate-pro.pot b/languages/opalestate-pro.pot new file mode 100755 index 00000000..6da263ce --- /dev/null +++ b/languages/opalestate-pro.pot @@ -0,0 +1,6511 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Opal Estate Pro\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-09-03 02:50+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: \n" +"Language: \n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Loco https://localise.biz/\n" +"X-Loco-Version: 2.3.0; wp-5.2.2" + +#: opal-estate-pro.php:170 +msgid "Cheatin’ huh?" +msgstr "" + +#: inc/function-search-fields.php:80 templates/search-box/search-form-v3.php:61 +#: templates/search-box/search-form-v2.php:44 +msgid "Area" +msgstr "" + +#: inc/class-opalestate-enqueue.php:86 +msgid "Are you sure to remove?" +msgstr "" + +#: inc/class-opalestate-enqueue.php:87 +msgid "This file is has large volume size, please try to upload other." +msgstr "" + +#: inc/class-opalestate-email.php:135 inc/class-opalestate-email.php:138 +msgid "Message has been successfully sent." +msgstr "" + +#: inc/class-opalestate-email.php:170 +#: inc/classes/class-opalestate-metabox-user.php:154 +#: inc/classes/class-opalestate-metabox-user.php:219 +#: inc/agency/class-opalestate-agency-metabox.php:338 +#: inc/message/class-opalestate-message.php:530 +#: inc/message/class-opalestate-message.php:632 +#: inc/agent/class-opalestate-agent-metabox.php:177 +#: templates/rating/opalestate-ratings.php:239 +msgid "Email" +msgstr "" + +#: inc/class-opalestate-email.php:258 inc/class-opalestate-email.php:262 +#: inc/submission/class-opalestate-submission.php:121 +msgid "Email Settings" +msgstr "" + +#: inc/class-opalestate-email.php:269 +msgid "From Name" +msgstr "" + +#: inc/class-opalestate-email.php:270 +msgid "" +"The name donation receipts are said to come from. This should probably be " +"your site or shop name." +msgstr "" + +#: inc/class-opalestate-email.php:276 +msgid "From Email" +msgstr "" + +#: inc/class-opalestate-email.php:277 +msgid "" +"Email to send donation receipts from. This will act as the \"from\" and " +"\"reply-to\" address." +msgstr "" + +#: inc/class-opalestate-email.php:285 +msgid "Email Submission Templates (Template Tags)" +msgstr "" + +#: inc/class-opalestate-email.php:294 +msgid "Notification For New Property Submission" +msgstr "" + +#: inc/class-opalestate-email.php:303 inc/class-opalestate-email.php:342 +#: inc/class-opalestate-email.php:370 +msgid "Email Subject" +msgstr "" + +#: inc/class-opalestate-email.php:305 +msgid "The email subject for admin notifications." +msgstr "" + +#: inc/class-opalestate-email.php:310 inc/class-opalestate-email.php:349 +#: inc/email/class-opalesate-approve.php:31 +#: inc/email/class-opalestate-new-submitted.php:31 +msgid "New Property Listing Submitted: {property_name}" +msgstr "" + +#: inc/class-opalestate-email.php:315 inc/class-opalestate-email.php:354 +#: inc/class-opalestate-email.php:382 +msgid "Email Body" +msgstr "" + +#: inc/class-opalestate-email.php:317 +msgid "" +"Enter the email an admin should receive when an initial payment request is " +"made." +msgstr "" + +#: inc/class-opalestate-email.php:322 +msgid "Approve property for publish" +msgstr "" + +#: inc/class-opalestate-email.php:329 +msgid "Enable approve property email" +msgstr "" + +#: inc/class-opalestate-email.php:330 +msgid "Enable approve property email." +msgstr "" + +#: inc/class-opalestate-email.php:334 +#: inc/submission/class-opalestate-submission.php:179 +#: inc/submission/class-opalestate-submission.php:189 +#: inc/submission/class-opalestate-submission.php:199 +#: inc/submission/class-opalestate-submission.php:209 +#: inc/submission/class-opalestate-submission.php:219 +#: inc/submission/class-opalestate-submission.php:229 +#: inc/submission/class-opalestate-submission.php:239 +#: inc/vendors/social-login/class-opalestate-social-login.php:69 +#: inc/vendors/social-login/class-opalestate-social-login.php:106 +#: inc/admin/settings/property.php:65 inc/admin/settings/property.php:123 +#: inc/admin/settings/property.php:134 inc/admin/settings/property.php:172 +#: inc/admin/settings/property.php:248 inc/admin/settings/property.php:259 +#: inc/admin/settings/property.php:278 inc/admin/settings/property.php:289 +#: inc/admin/settings/property.php:311 inc/admin/settings/property.php:322 +#: inc/admin/settings/property.php:333 inc/admin/settings/property.php:344 +#: inc/admin/settings/property.php:355 inc/admin/settings/property.php:366 +#: inc/admin/settings/property.php:377 inc/admin/settings/property.php:388 +#: inc/admin/settings/property.php:399 inc/admin/settings/property.php:410 +#: inc/admin/settings/general.php:70 inc/admin/rating/class-rating.php:69 +#: inc/admin/rating/class-rating.php:79 inc/admin/rating/class-rating.php:89 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:171 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:171 +msgid "Enable" +msgstr "" + +#: inc/class-opalestate-email.php:335 +#: inc/submission/class-opalestate-submission.php:180 +#: inc/submission/class-opalestate-submission.php:190 +#: inc/submission/class-opalestate-submission.php:200 +#: inc/submission/class-opalestate-submission.php:210 +#: inc/submission/class-opalestate-submission.php:220 +#: inc/submission/class-opalestate-submission.php:230 +#: inc/submission/class-opalestate-submission.php:240 +#: inc/vendors/social-login/class-opalestate-social-login.php:70 +#: inc/vendors/social-login/class-opalestate-social-login.php:107 +#: inc/admin/settings/property.php:66 inc/admin/settings/property.php:124 +#: inc/admin/settings/property.php:135 inc/admin/settings/property.php:171 +#: inc/admin/settings/property.php:247 inc/admin/settings/property.php:258 +#: inc/admin/settings/property.php:277 inc/admin/settings/property.php:288 +#: inc/admin/settings/property.php:312 inc/admin/settings/property.php:323 +#: inc/admin/settings/property.php:334 inc/admin/settings/property.php:345 +#: inc/admin/settings/property.php:356 inc/admin/settings/property.php:367 +#: inc/admin/settings/property.php:378 inc/admin/settings/property.php:389 +#: inc/admin/settings/property.php:400 inc/admin/settings/property.php:411 +#: inc/admin/settings/general.php:71 inc/admin/rating/class-rating.php:70 +#: inc/admin/rating/class-rating.php:80 inc/admin/rating/class-rating.php:90 +msgid "Disable" +msgstr "" + +#: inc/class-opalestate-email.php:344 inc/class-opalestate-email.php:372 +msgid "" +"The email subject a user should receive when they make an initial property " +"request." +msgstr "" + +#: inc/class-opalestate-email.php:356 +msgid "" +"Enter the email a user should receive when they make an initial payment " +"request." +msgstr "" + +#: inc/class-opalestate-email.php:362 +msgid "Email Contact Templates (Template Tags)" +msgstr "" + +#: inc/class-opalestate-email.php:377 +#: inc/message/class-opalestate-message.php:103 +msgid "You got a message" +msgstr "" + +#: inc/class-opalestate-roles.php:49 +msgid "Opal Estate Manager" +msgstr "" + +#: inc/class-opalestate-roles.php:80 +msgid "Opal Estate Agent" +msgstr "" + +#: inc/class-opalestate-roles.php:92 +msgid "Opal Estate Agency" +msgstr "" + +#: inc/class-opalestate-install.php:142 +msgid "User Dashboard Page" +msgstr "" + +#: inc/class-opalestate-install.php:160 inc/user/class-opalestate-user.php:58 +msgid "My Account" +msgstr "" + +#: inc/class-opalestate-install.php:161 +msgid "[opalestate_myaccount]" +msgstr "" + +#: inc/class-opalestate-install.php:178 +#: inc/submission/class-opalestate-submission.php:131 +msgid "Property Submission Page" +msgstr "" + +#: inc/class-opalestate-install.php:179 +msgid "[opalestate_submission]" +msgstr "" + +#: inc/class-opalestate-install.php:196 +msgid "Search Map Properties Page" +msgstr "" + +#: inc/class-opalestate-install.php:197 +msgid "[opalestate_search_map_properties]" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:88 +msgid "The captcha is not verified, please try again!" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:101 +msgid "Show Captcha In Form" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:102 +msgid "" +"Enable google captch in contact , register form. After Set yes, you change " +"setting in Google Captcha Tab. Register here: https://www.google." +"com/recaptcha/admin Version 2" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:107 +#: inc/classes/class-opalestate-metabox-user.php:193 +#: inc/classes/class-opalestate-metabox-user.php:204 +#: inc/property/class-metabox-property-admin.php:181 +#: inc/property/class-metabox-property-admin.php:212 +#: inc/property/class-metabox-property-admin.php:278 +#: inc/property/class-metabox-property-admin.php:448 +#: inc/property/class-metabox-property-admin.php:458 +#: inc/agency/class-opalestate-agency-metabox.php:62 +#: inc/widgets/search-properties.php:147 +#: inc/submission/class-metabox-property-submission.php:394 +#: inc/submission/class-metabox-property-submission.php:474 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:235 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:249 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:273 +#: inc/vendors/opalmembership/free-package.php:35 +msgid "No" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:108 +#: inc/classes/class-opalestate-metabox-user.php:194 +#: inc/classes/class-opalestate-metabox-user.php:205 +#: inc/property/class-metabox-property-admin.php:182 +#: inc/property/class-metabox-property-admin.php:211 +#: inc/property/class-metabox-property-admin.php:279 +#: inc/agency/class-opalestate-agency-metabox.php:63 +#: inc/widgets/search-properties.php:148 +#: inc/submission/class-metabox-property-submission.php:395 +#: inc/submission/class-metabox-property-submission.php:475 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:234 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:248 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:272 +#: inc/vendors/opalmembership/free-package.php:34 +msgid "Yes" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:114 +msgid "Google Captcha page Settings" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:121 +msgid "Site Key" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:122 +#, php-format +msgid "Used for displaying the CAPTCHA. Grab it %s" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:128 +msgid "Secret key" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:129 +msgid "Used for communication between your site and Google. Grab it." +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:135 +msgid "Theme" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:136 +msgid "Display captcha box with color style." +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:140 +msgid "Light" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:141 +msgid "Dark" +msgstr "" + +#: inc/class-no-captcha-recaptcha.php:154 +msgid "Google Captcha" +msgstr "" + +#: inc/template-hook-functions.php:202 inc/template-hook-functions.php:245 +msgid "Request Viewing" +msgstr "" + +#: inc/template-hook-functions.php:242 +msgid "" +"Physical Arrange viewings is always been attractive to property clients. " +"Fill out the form to arrange visualizations around our properties." +msgstr "" + +#: inc/template-hook-functions.php:274 +msgid "User Management" +msgstr "" + +#: inc/template-hook-functions.php:275 +msgid "Opalestate Fullwidth" +msgstr "" + +#: inc/ajax-functions.php:97 inc/taxonomies/class-taxonomy-state.php:108 +#: inc/taxonomies/class-taxonomy-state.php:125 +msgid "Select State" +msgstr "" + +#: inc/ajax-functions.php:139 inc/taxonomies/class-taxonomy-city.php:132 +msgid "Select City" +msgstr "" + +#: inc/ajax-functions.php:213 inc/ajax-functions.php:218 +msgid "Could not set this as featured" +msgstr "" + +#: inc/class-opalestate-html.php:41 +msgid "Enter username" +msgstr "" + +#: inc/class-opalestate-html.php:56 +msgid "Cancel" +msgstr "" + +#: inc/class-opalestate-html.php:222 inc/template-functions.php:301 +#: templates/user/my-properties.php:3 +#: templates/search-box/fields/status-bar.php:9 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:152 +msgid "All" +msgstr "" + +#: inc/class-opalestate-html.php:223 +#: inc/property/class-metabox-property-admin.php:665 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:202 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:280 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:288 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:309 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:280 +msgid "None" +msgstr "" + +#: inc/mixes-functions.php:142 +msgid "Advanced V1 Form" +msgstr "" + +#: inc/mixes-functions.php:143 +msgid "Advanced V2 Form" +msgstr "" + +#: inc/mixes-functions.php:144 +msgid "Advanced V3 Form" +msgstr "" + +#: inc/mixes-functions.php:145 +msgid "Advanced V4 Form" +msgstr "" + +#: inc/mixes-functions.php:146 +msgid "Advanced V5 Form" +msgstr "" + +#: inc/mixes-functions.php:147 +msgid "Advanced V6 Form" +msgstr "" + +#: inc/mixes-functions.php:148 +msgid "Vertical Advanced Form" +msgstr "" + +#: inc/mixes-functions.php:149 +msgid "Vertical Advanced V2 Form" +msgstr "" + +#: inc/mixes-functions.php:150 +msgid "Vertical Advanced V3 Form" +msgstr "" + +#: inc/mixes-functions.php:151 +msgid "Simple City Form" +msgstr "" + +#: inc/mixes-functions.php:152 +msgid "Simple Keyword Form" +msgstr "" + +#: inc/mixes-functions.php:153 +msgid "Collapse City Form" +msgstr "" + +#: inc/mixes-functions.php:154 +msgid "Collapse Keyword Form" +msgstr "" + +#: inc/mixes-functions.php:165 inc/mixes-functions.php:181 +#: inc/template-functions.php:211 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:126 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:117 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:117 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:126 +msgid "Grid" +msgstr "" + +#: inc/mixes-functions.php:166 inc/mixes-functions.php:182 +msgid "Grid v2" +msgstr "" + +#: inc/mixes-functions.php:167 inc/mixes-functions.php:183 +msgid "Grid v3" +msgstr "" + +#: inc/mixes-functions.php:168 inc/mixes-functions.php:195 +#: inc/template-functions.php:215 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:127 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:118 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:118 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:127 +msgid "List" +msgstr "" + +#: inc/mixes-functions.php:169 inc/mixes-functions.php:196 +msgid "List v2" +msgstr "" + +#: inc/mixes-functions.php:170 inc/mixes-functions.php:184 +msgid "Mark hover" +msgstr "" + +#: inc/mixes-functions.php:295 +msgid "Orginal Size" +msgstr "" + +#: inc/mixes-functions.php:386 inc/mixes-functions.php:390 +msgid "Your Location" +msgstr "" + +#: inc/mixes-functions.php:512 +#, php-format +msgid "Placeholder %s" +msgstr "" + +#: inc/mixes-functions.php:545 +msgid "United Arab Emirates dirham" +msgstr "" + +#: inc/mixes-functions.php:546 +msgid "Afghan afghani" +msgstr "" + +#: inc/mixes-functions.php:547 +msgid "Albanian lek" +msgstr "" + +#: inc/mixes-functions.php:548 +msgid "Armenian dram" +msgstr "" + +#: inc/mixes-functions.php:549 +msgid "Netherlands Antillean guilder" +msgstr "" + +#: inc/mixes-functions.php:550 +msgid "Angolan kwanza" +msgstr "" + +#: inc/mixes-functions.php:551 +msgid "Argentine peso" +msgstr "" + +#: inc/mixes-functions.php:552 +msgid "Australian dollar" +msgstr "" + +#: inc/mixes-functions.php:553 +msgid "Aruban florin" +msgstr "" + +#: inc/mixes-functions.php:554 +msgid "Azerbaijani manat" +msgstr "" + +#: inc/mixes-functions.php:555 +msgid "Bosnia and Herzegovina convertible mark" +msgstr "" + +#: inc/mixes-functions.php:556 +msgid "Barbadian dollar" +msgstr "" + +#: inc/mixes-functions.php:557 +msgid "Bangladeshi taka" +msgstr "" + +#: inc/mixes-functions.php:558 +msgid "Bulgarian lev" +msgstr "" + +#: inc/mixes-functions.php:559 +msgid "Bahraini dinar" +msgstr "" + +#: inc/mixes-functions.php:560 +msgid "Burundian franc" +msgstr "" + +#: inc/mixes-functions.php:561 +msgid "Bermudian dollar" +msgstr "" + +#: inc/mixes-functions.php:562 +msgid "Brunei dollar" +msgstr "" + +#: inc/mixes-functions.php:563 +msgid "Bolivian boliviano" +msgstr "" + +#: inc/mixes-functions.php:564 +msgid "Brazilian real" +msgstr "" + +#: inc/mixes-functions.php:565 +msgid "Bahamian dollar" +msgstr "" + +#: inc/mixes-functions.php:566 +msgid "Bitcoin" +msgstr "" + +#: inc/mixes-functions.php:567 +msgid "Bhutanese ngultrum" +msgstr "" + +#: inc/mixes-functions.php:568 +msgid "Botswana pula" +msgstr "" + +#: inc/mixes-functions.php:569 +msgid "Belarusian ruble" +msgstr "" + +#: inc/mixes-functions.php:570 +msgid "Belize dollar" +msgstr "" + +#: inc/mixes-functions.php:571 +msgid "Canadian dollar" +msgstr "" + +#: inc/mixes-functions.php:572 +msgid "Congolese franc" +msgstr "" + +#: inc/mixes-functions.php:573 +msgid "Swiss franc" +msgstr "" + +#: inc/mixes-functions.php:574 +msgid "Chilean peso" +msgstr "" + +#: inc/mixes-functions.php:575 +msgid "Chinese yuan" +msgstr "" + +#: inc/mixes-functions.php:576 +msgid "Colombian peso" +msgstr "" + +#: inc/mixes-functions.php:577 +msgid "Costa Rican colón" +msgstr "" + +#: inc/mixes-functions.php:578 +msgid "Cuban convertible peso" +msgstr "" + +#: inc/mixes-functions.php:579 +msgid "Cuban peso" +msgstr "" + +#: inc/mixes-functions.php:580 +msgid "Cape Verdean escudo" +msgstr "" + +#: inc/mixes-functions.php:581 +msgid "Czech koruna" +msgstr "" + +#: inc/mixes-functions.php:582 +msgid "Djiboutian franc" +msgstr "" + +#: inc/mixes-functions.php:583 +msgid "Danish krone" +msgstr "" + +#: inc/mixes-functions.php:584 +msgid "Dominican peso" +msgstr "" + +#: inc/mixes-functions.php:585 +msgid "Algerian dinar" +msgstr "" + +#: inc/mixes-functions.php:586 +msgid "Egyptian pound" +msgstr "" + +#: inc/mixes-functions.php:587 +msgid "Eritrean nakfa" +msgstr "" + +#: inc/mixes-functions.php:588 +msgid "Ethiopian birr" +msgstr "" + +#: inc/mixes-functions.php:589 +msgid "Euro" +msgstr "" + +#: inc/mixes-functions.php:590 +msgid "Fijian dollar" +msgstr "" + +#: inc/mixes-functions.php:591 +msgid "Falkland Islands pound" +msgstr "" + +#: inc/mixes-functions.php:592 +msgid "Pound sterling" +msgstr "" + +#: inc/mixes-functions.php:593 +msgid "Georgian lari" +msgstr "" + +#: inc/mixes-functions.php:594 +msgid "Guernsey pound" +msgstr "" + +#: inc/mixes-functions.php:595 +msgid "Ghana cedi" +msgstr "" + +#: inc/mixes-functions.php:596 +msgid "Gibraltar pound" +msgstr "" + +#: inc/mixes-functions.php:597 +msgid "Gambian dalasi" +msgstr "" + +#: inc/mixes-functions.php:598 +msgid "Guinean franc" +msgstr "" + +#: inc/mixes-functions.php:599 +msgid "Guatemalan quetzal" +msgstr "" + +#: inc/mixes-functions.php:600 +msgid "Guyanese dollar" +msgstr "" + +#: inc/mixes-functions.php:601 +msgid "Hong Kong dollar" +msgstr "" + +#: inc/mixes-functions.php:602 +msgid "Honduran lempira" +msgstr "" + +#: inc/mixes-functions.php:603 +msgid "Croatian kuna" +msgstr "" + +#: inc/mixes-functions.php:604 +msgid "Haitian gourde" +msgstr "" + +#: inc/mixes-functions.php:605 +msgid "Hungarian forint" +msgstr "" + +#: inc/mixes-functions.php:606 +msgid "Indonesian rupiah" +msgstr "" + +#: inc/mixes-functions.php:607 +msgid "Israeli new shekel" +msgstr "" + +#: inc/mixes-functions.php:608 +msgid "Manx pound" +msgstr "" + +#: inc/mixes-functions.php:609 +msgid "Indian rupee" +msgstr "" + +#: inc/mixes-functions.php:610 +msgid "Iraqi dinar" +msgstr "" + +#: inc/mixes-functions.php:611 +msgid "Iranian rial" +msgstr "" + +#: inc/mixes-functions.php:612 +msgid "Icelandic króna" +msgstr "" + +#: inc/mixes-functions.php:613 +msgid "Jersey pound" +msgstr "" + +#: inc/mixes-functions.php:614 +msgid "Jamaican dollar" +msgstr "" + +#: inc/mixes-functions.php:615 +msgid "Jordanian dinar" +msgstr "" + +#: inc/mixes-functions.php:616 +msgid "Japanese yen" +msgstr "" + +#: inc/mixes-functions.php:617 +msgid "Kenyan shilling" +msgstr "" + +#: inc/mixes-functions.php:618 +msgid "Kyrgyzstani som" +msgstr "" + +#: inc/mixes-functions.php:619 +msgid "Cambodian riel" +msgstr "" + +#: inc/mixes-functions.php:620 +msgid "Comorian franc" +msgstr "" + +#: inc/mixes-functions.php:621 +msgid "North Korean won" +msgstr "" + +#: inc/mixes-functions.php:622 +msgid "South Korean won" +msgstr "" + +#: inc/mixes-functions.php:623 +msgid "Kuwaiti dinar" +msgstr "" + +#: inc/mixes-functions.php:624 +msgid "Cayman Islands dollar" +msgstr "" + +#: inc/mixes-functions.php:625 +msgid "Kazakhstani tenge" +msgstr "" + +#: inc/mixes-functions.php:626 +msgid "Lao kip" +msgstr "" + +#: inc/mixes-functions.php:627 +msgid "Lebanese pound" +msgstr "" + +#: inc/mixes-functions.php:628 +msgid "Sri Lankan rupee" +msgstr "" + +#: inc/mixes-functions.php:629 +msgid "Liberian dollar" +msgstr "" + +#: inc/mixes-functions.php:630 +msgid "Lesotho loti" +msgstr "" + +#: inc/mixes-functions.php:631 +msgid "Libyan dinar" +msgstr "" + +#: inc/mixes-functions.php:632 +msgid "Moroccan dirham" +msgstr "" + +#: inc/mixes-functions.php:633 +msgid "Moldovan leu" +msgstr "" + +#: inc/mixes-functions.php:634 +msgid "Malagasy ariary" +msgstr "" + +#: inc/mixes-functions.php:635 +msgid "Macedonian denar" +msgstr "" + +#: inc/mixes-functions.php:636 +msgid "Burmese kyat" +msgstr "" + +#: inc/mixes-functions.php:637 +msgid "Mongolian tögrög" +msgstr "" + +#: inc/mixes-functions.php:638 +msgid "Macanese pataca" +msgstr "" + +#: inc/mixes-functions.php:639 +msgid "Mauritanian ouguiya" +msgstr "" + +#: inc/mixes-functions.php:640 +msgid "Mauritian rupee" +msgstr "" + +#: inc/mixes-functions.php:641 +msgid "Maldivian rufiyaa" +msgstr "" + +#: inc/mixes-functions.php:642 +msgid "Malawian kwacha" +msgstr "" + +#: inc/mixes-functions.php:643 +msgid "Mexican peso" +msgstr "" + +#: inc/mixes-functions.php:644 +msgid "Malaysian ringgit" +msgstr "" + +#: inc/mixes-functions.php:645 +msgid "Mozambican metical" +msgstr "" + +#: inc/mixes-functions.php:646 +msgid "Namibian dollar" +msgstr "" + +#: inc/mixes-functions.php:647 +msgid "Nigerian naira" +msgstr "" + +#: inc/mixes-functions.php:648 +msgid "Nicaraguan córdoba" +msgstr "" + +#: inc/mixes-functions.php:649 +msgid "Norwegian krone" +msgstr "" + +#: inc/mixes-functions.php:650 +msgid "Nepalese rupee" +msgstr "" + +#: inc/mixes-functions.php:651 +msgid "New Zealand dollar" +msgstr "" + +#: inc/mixes-functions.php:652 +msgid "Omani rial" +msgstr "" + +#: inc/mixes-functions.php:653 +msgid "Panamanian balboa" +msgstr "" + +#: inc/mixes-functions.php:654 +msgid "Peruvian nuevo sol" +msgstr "" + +#: inc/mixes-functions.php:655 +msgid "Papua New Guinean kina" +msgstr "" + +#: inc/mixes-functions.php:656 +msgid "Philippine peso" +msgstr "" + +#: inc/mixes-functions.php:657 +msgid "Pakistani rupee" +msgstr "" + +#: inc/mixes-functions.php:658 +msgid "Polish złoty" +msgstr "" + +#: inc/mixes-functions.php:659 +msgid "Transnistrian ruble" +msgstr "" + +#: inc/mixes-functions.php:660 +msgid "Paraguayan guaraní" +msgstr "" + +#: inc/mixes-functions.php:661 +msgid "Qatari riyal" +msgstr "" + +#: inc/mixes-functions.php:662 +msgid "Romanian leu" +msgstr "" + +#: inc/mixes-functions.php:663 +msgid "Serbian dinar" +msgstr "" + +#: inc/mixes-functions.php:664 +msgid "Russian ruble" +msgstr "" + +#: inc/mixes-functions.php:665 +msgid "Rwandan franc" +msgstr "" + +#: inc/mixes-functions.php:666 +msgid "Saudi riyal" +msgstr "" + +#: inc/mixes-functions.php:667 +msgid "Solomon Islands dollar" +msgstr "" + +#: inc/mixes-functions.php:668 +msgid "Seychellois rupee" +msgstr "" + +#: inc/mixes-functions.php:669 +msgid "Sudanese pound" +msgstr "" + +#: inc/mixes-functions.php:670 +msgid "Swedish krona" +msgstr "" + +#: inc/mixes-functions.php:671 +msgid "Singapore dollar" +msgstr "" + +#: inc/mixes-functions.php:672 +msgid "Saint Helena pound" +msgstr "" + +#: inc/mixes-functions.php:673 +msgid "Sierra Leonean leone" +msgstr "" + +#: inc/mixes-functions.php:674 +msgid "Somali shilling" +msgstr "" + +#: inc/mixes-functions.php:675 +msgid "Surinamese dollar" +msgstr "" + +#: inc/mixes-functions.php:676 +msgid "South Sudanese pound" +msgstr "" + +#: inc/mixes-functions.php:677 +msgid "São Tomé and Príncipe dobra" +msgstr "" + +#: inc/mixes-functions.php:678 +msgid "Syrian pound" +msgstr "" + +#: inc/mixes-functions.php:679 +msgid "Swazi lilangeni" +msgstr "" + +#: inc/mixes-functions.php:680 +msgid "Thai baht" +msgstr "" + +#: inc/mixes-functions.php:681 +msgid "Tajikistani somoni" +msgstr "" + +#: inc/mixes-functions.php:682 +msgid "Turkmenistan manat" +msgstr "" + +#: inc/mixes-functions.php:683 +msgid "Tunisian dinar" +msgstr "" + +#: inc/mixes-functions.php:684 +msgid "Tongan paʻanga" +msgstr "" + +#: inc/mixes-functions.php:685 +msgid "Turkish lira" +msgstr "" + +#: inc/mixes-functions.php:686 +msgid "Trinidad and Tobago dollar" +msgstr "" + +#: inc/mixes-functions.php:687 +msgid "New Taiwan dollar" +msgstr "" + +#: inc/mixes-functions.php:688 +msgid "Tanzanian shilling" +msgstr "" + +#: inc/mixes-functions.php:689 +msgid "Ukrainian hryvnia" +msgstr "" + +#: inc/mixes-functions.php:690 +msgid "Ugandan shilling" +msgstr "" + +#: inc/mixes-functions.php:691 +msgid "United States dollar" +msgstr "" + +#: inc/mixes-functions.php:692 +msgid "Uruguayan peso" +msgstr "" + +#: inc/mixes-functions.php:693 +msgid "Uzbekistani som" +msgstr "" + +#: inc/mixes-functions.php:694 +msgid "Venezuelan bolívar" +msgstr "" + +#: inc/mixes-functions.php:695 +msgid "Vietnamese đồng" +msgstr "" + +#: inc/mixes-functions.php:696 +msgid "Vanuatu vatu" +msgstr "" + +#: inc/mixes-functions.php:697 +msgid "Samoan tālā" +msgstr "" + +#: inc/mixes-functions.php:698 +msgid "Central African CFA franc" +msgstr "" + +#: inc/mixes-functions.php:699 +msgid "East Caribbean dollar" +msgstr "" + +#: inc/mixes-functions.php:700 +msgid "West African CFA franc" +msgstr "" + +#: inc/mixes-functions.php:701 +msgid "CFP franc" +msgstr "" + +#: inc/mixes-functions.php:702 +msgid "Yemeni rial" +msgstr "" + +#: inc/mixes-functions.php:703 +msgid "South African rand" +msgstr "" + +#: inc/mixes-functions.php:704 +msgid "Zambian kwacha" +msgstr "" + +#: inc/template-functions.php:177 +msgid "Featured Desending" +msgstr "" + +#: inc/template-functions.php:178 +msgid "Price Ascending" +msgstr "" + +#: inc/template-functions.php:179 +msgid "Price Desending" +msgstr "" + +#: inc/template-functions.php:180 +msgid "Area Ascending" +msgstr "" + +#: inc/template-functions.php:181 +msgid "Area Desending" +msgstr "" + +#: inc/template-functions.php:185 +msgid "Sort By" +msgstr "" + +#: inc/template-functions.php:261 +msgid "Previous" +msgstr "" + +#: inc/template-functions.php:272 +msgid "Next" +msgstr "" + +#: inc/template-functions.php:381 +msgid "Vesion 2" +msgstr "" + +#: inc/template-functions.php:382 +msgid "Vesion 3" +msgstr "" + +#: inc/template-functions.php:383 +msgid "Vesion 4" +msgstr "" + +#: inc/template-functions.php:384 +msgid "Vesion 5" +msgstr "" + +#: inc/template-functions.php:406 +#: inc/property/class-metabox-property-admin.php:536 +#: inc/admin/settings/general.php:178 +msgid "Inherit" +msgstr "" + +#: inc/template-functions.php:407 +msgid "Gallery Thumb Nav" +msgstr "" + +#: inc/template-functions.php:408 +msgid "Gallery Slider" +msgstr "" + +#: inc/template-functions.php:409 +msgid "Maps" +msgstr "" + +#: inc/template-functions.php:410 +msgid "Tabs - Gallery Active" +msgstr "" + +#: inc/template-functions.php:411 +msgid "Tabs - Map Active" +msgstr "" + +#: inc/template-functions.php:412 +msgid "Tabs - Street Map Active" +msgstr "" + +#: inc/template-functions.php:413 +msgid "Tour 360" +msgstr "" + +#: inc/template-functions.php:414 +msgid "Gallery Metro" +msgstr "" + +#: inc/template-functions.php:415 +msgid "Mark Picture" +msgstr "" + +#: inc/template-functions.php:649 inc/admin/settings/3rd_party.php:129 +msgid "miles" +msgstr "" + +#: inc/template-functions.php:653 +msgid "km" +msgstr "" + +#: inc/template-functions.php:764 +msgid "Similar Properties You May Like" +msgstr "" + +#: inc/template-functions.php:807 +msgid "New Listings Nearby" +msgstr "" + +#. %s: rating +#: inc/template-functions.php:843 inc/template-functions.php:869 +#, php-format +msgid "Rated %s out of 5" +msgstr "" + +#. 1: rating 2: rating count +#: inc/template-functions.php:863 +#, php-format +msgid "Rated %1$s out of 5 based on %2$s customer rating" +msgid_plural "Rated %1$s out of 5 based on %2$s customer ratings" +msgstr[0] "" +msgstr[1] "" + +#. %s number of reviews +#: inc/template-functions.php:975 templates/rating/opalestate-ratings.php:173 +#, php-format +msgctxt "review numbers" +msgid "%s review" +msgid_plural "%s reviews" +msgstr[0] "" +msgstr[1] "" + +#: inc/template-functions.php:1025 inc/template-functions.php:1027 +msgid "Print" +msgstr "" + +#: templates/content-single-property-print.php:50 +#: templates/content-single-property-v2.php:87 +#: templates/content-single-property-v3.php:77 +#: templates/content-single-property-v4.php:57 +#: templates/content-single-property-v5.php:90 +#: templates/content-single-property.php:62 +msgid "Property Description" +msgstr "" + +#: templates/content-single-property-print.php:55 +#: templates/content-single-property-v2.php:93 +#: templates/content-single-property-v3.php:82 +#: templates/content-single-property-v4.php:63 +#: templates/content-single-property-v5.php:96 +#: templates/content-single-property.php:68 +msgid "Property ID: " +msgstr "" + +#. %s: property date +#: templates/content-single-property-v2.php:42 +#: templates/content-single-property-v3.php:66 +#: templates/content-single-property-v4.php:39 +#: templates/content-single-property-v5.php:79 +#: templates/content-single-property.php:37 +#, php-format +msgid "Posted: %s" +msgstr "" + +#: templates/content-single-property-v2.php:67 +#: templates/content-single-property-v5.php:16 +#: templates/content-property-list.php:59 +#: templates/content-single-agency.php:23 +#: templates/content-single-agency.php:44 templates/content-single-agent.php:16 +#: inc/rating/class-opalestate-rating-metabox.php:110 +#: inc/submission/class-metabox-property-submission.php:110 +#: templates/single-property/content.php:2 +msgid "Description" +msgstr "" + +#: templates/content-single-property-v2.php:68 +#: inc/property/class-metabox-property-admin.php:61 +#: inc/agency/class-opalestate-agency-metabox.php:141 +#: inc/agency/class-opalestate-agency-metabox.php:269 +#: inc/agent/class-opalestate-agent-metabox.php:100 +#: inc/submission/class-metabox-property-submission.php:65 +#: templates/search-box/search-form-v3.php:51 +#: templates/search-box/search-form-v2.php:34 +msgid "Information" +msgstr "" + +#: templates/content-single-property-v2.php:69 +#: templates/content-single-property-v5.php:33 +#: inc/submission/class-metabox-property-submission.php:549 +#: templates/single-property/floor-plans.php:15 +msgid "Floor Plans" +msgstr "" + +#: templates/content-single-property-v2.php:70 +msgid "Attachment" +msgstr "" + +#: templates/content-single-property-v2.php:126 +#: inc/property/class-metabox-property-admin.php:303 +#: templates/single-property/features.php:11 +msgid "Property Information" +msgstr "" + +#: templates/content-single-property-v2.php:137 +msgid "Property Attachments" +msgstr "" + +#: templates/fullwidth-page.php:29 templates/content-single-agent.php:63 +#: templates/single-property/content.php:11 +msgid "Pages:" +msgstr "" + +#: templates/fullwidth-page.php:33 +msgid "Page" +msgstr "" + +#: templates/content-agent-list.php:12 templates/content-agent-grid.php:10 +#: templates/content-agent-grid-v2.php:9 templates/content-user-grid.php:42 +#: templates/single-agent/author-box.php:16 +msgid "Featured Agent" +msgstr "" + +#: templates/content-agent-list.php:14 templates/content-agent-grid.php:12 +#: templates/content-agent-grid-v2.php:11 templates/content-user-grid.php:44 +#: templates/content-agency-grid.php:14 templates/content-agency-list.php:15 +#: inc/property/class-metabox-property-admin.php:177 +#: templates/single-agent/author-box.php:18 +#: templates/user/content-property.php:19 +#: templates/single-agency/author-box.php:24 +#: templates/parts/featured-label.php:9 +#: inc/admin/property/class-property.php:99 +msgid "Featured" +msgstr "" + +#: templates/content-agent-list.php:26 templates/content-agent-list.php:27 +#: templates/content-agent-grid.php:17 templates/content-agent-grid.php:17 +#: templates/content-agent-grid-v2.php:17 +#: templates/content-agent-grid-v2.php:17 templates/content-user-grid.php:49 +#: templates/content-user-grid.php:49 templates/content-agency-grid.php:20 +#: templates/content-agency-grid.php:20 templates/content-agency-list.php:28 +#: templates/content-agency-list.php:29 +#: templates/single-agent/author-box.php:24 +#: templates/single-agent/author-box.php:25 +#: templates/single-agency/author-box.php:30 +#: templates/single-agency/author-box.php:30 +#: templates/single-property/user/author-member-box.php:28 +#: templates/single-property/user/author-member-box.php:28 +#: templates/single-property/user/author-user-box.php:66 +#: templates/single-property/user/author-user-box.php:67 +#: templates/single-property/user/author-user-box-list.php:51 +#: templates/single-property/user/author-user-box-list.php:52 +msgid "Trusted Member" +msgstr "" + +#: templates/content-single-property-v5.php:18 +#: inc/property/class-metabox-property-admin.php:228 +#: inc/submission/class-metabox-property-submission.php:203 +#: templates/single-property/video.php:12 +msgid "Video" +msgstr "" + +#: templates/content-single-property-v5.php:21 +#: templates/single-property/map.php:25 templates/single-property/map-v2.php:21 +#: templates/single-property/preview/tabs.php:17 +msgid "Map" +msgstr "" + +#: templates/content-single-property-v5.php:24 +msgid "Scores" +msgstr "" + +#: templates/content-single-property-v5.php:27 +msgid "Statistics" +msgstr "" + +#: templates/content-single-property-v5.php:30 +#: inc/property/class-metabox-property-admin.php:83 +#: inc/submission/class-metabox-property-submission.php:68 +#: inc/submission/class-metabox-property-submission.php:470 +#: templates/single-property/apartments.php:14 +msgid "Apartments" +msgstr "" + +#: templates/content-single-property-v5.php:35 inc/user/functions.php:144 +#: inc/user/functions.php:151 +msgid "Reviews" +msgstr "" + +#: templates/archive-opalestate_agency.php:12 +msgid "Find A Local Real Estate Agencies" +msgstr "" + +#: templates/archive-opalestate_agency.php:13 +msgid "" +"Reality Agencies are local expert who can get you better results for lower " +"fees" +msgstr "" + +#: templates/archive-opalestate_agency.php:38 +#: templates/elementor-templates/opalestate-agency-collection.php:26 +#, php-format +msgid "Found %s Agency" +msgstr "" + +#: templates/content-no-results.php:3 +msgid "Nothing Found" +msgstr "" + +#: templates/content-no-results.php:6 +msgid "" +"It seems we can’t find what you’re looking for. Perhaps " +"searching can help." +msgstr "" + +#: templates/archive-opalestate_agent.php:11 +msgid "Find The Best Real Estate Agent For Your" +msgstr "" + +#: templates/archive-opalestate_agent.php:12 +msgid "" +"Browser home sales, rating and review to find the best agent to sell or " +"lease your home" +msgstr "" + +#: templates/archive-opalestate_agent.php:37 +#: templates/elementor-templates/opalestate-agent-collection.php:29 +#: templates/shortcodes/search-agents.php:15 +#, php-format +msgid "Found %s Agents" +msgstr "" + +#: templates/user-management.php:50 templates/user/read-messages.php:16 +#: templates/user/read-messages.php:28 templates/user/messages.php:16 +msgid "User Avatar" +msgstr "" + +#: templates/user-management.php:117 +msgid "Login to your account" +msgstr "" + +#: templates/user-management.php:118 +msgid "" +"Logining in allows you to edit your property or submit a property, save " +"favorite real estate." +msgstr "" + +#: templates/content-agency-grid.php:13 templates/content-agency-list.php:14 +#: templates/single-agency/author-box.php:22 +#: templates/single-agency/author-box.php:23 +msgid "Featured Agency" +msgstr "" + +#: templates/content-single-agency.php:24 +#: templates/content-single-agency.php:66 +#: inc/classes/class-opalestate-metabox-user.php:110 +#: inc/property/class-metabox-property-admin.php:217 +#: inc/submission/class-metabox-property-submission.php:382 +#: inc/admin/property/class-property.php:101 +msgid "Address" +msgstr "" + +#: templates/content-single-agency.php:26 +msgid "Listing" +msgstr "" + +#: templates/content-single-agency.php:27 +#: templates/content-single-agency.php:101 templates/single-agency/tabs.php:11 +#: inc/admin/agency/class-agency.php:144 +msgid "Team" +msgstr "" + +#. %s: Name of current post +#: templates/content-single-agency.php:50 templates/content-single-agent.php:58 +#, php-format +msgid "Continue reading %s" +msgstr "" + +#: templates/content-single-agency.php:71 +msgid "Head Agency:" +msgstr "" + +#: templates/content-single-agency.php:76 templates/content-single-agent.php:84 +msgid "Location:" +msgstr "" + +#: templates/content-single-agency.php:110 +#: templates/content-single-agent.php:18 +#: inc/property/class-opalestate-posttype.php:41 +#: inc/property/class-opalestate-posttype.php:53 +#: templates/single-agency/tabs.php:6 +msgid "Properties" +msgstr "" + +#: templates/content-single-agency.php:138 +msgid "Contact Us" +msgstr "" + +#: templates/content-single-agency.php:139 +#, php-format +msgid "Hi %s. I saw your profile and wanted to see if you could help me." +msgstr "" + +#: templates/content-single-agent.php:17 templates/single-agency/tabs.php:17 +#: inc/admin/rating/class-rating.php:46 +msgid "Review" +msgstr "" + +#: templates/content-single-agent.php:54 +msgid "About the Agent" +msgstr "" + +#: templates/content-single-agent.php:75 +msgid "My Address" +msgstr "" + +#: templates/content-single-agent.php:79 +msgid "Address:" +msgstr "" + +#: inc/rating/class-opalestate-rating-init.php:96 +msgid "Please rate all features." +msgstr "" + +#: inc/rating/class-opalestate-rating-init.php:102 +msgid "Please rate." +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:52 +msgctxt "Feature plural name" +msgid "Rating Features" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:53 +msgctxt "Feature singular name" +msgid "Rating Feature" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:54 +msgctxt "Admin menu name" +msgid "Rating Features" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:55 +msgid "Add rating feature" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:56 +msgid "Add new rating feature" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:57 +#: templates/user/content-property.php:77 +#: inc/vendors/opalmembership/membership.php:508 +msgid "Edit" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:58 +msgid "Edit rating feature" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:59 +msgid "New rating feature" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:60 +msgid "View rating feature" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:61 +msgid "Query rating features" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:62 +msgid "No rating features found" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:63 +msgid "No rating features found in trash" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:64 +msgid "Parent rating features" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:65 +msgid "Filter rating features" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:66 +msgid "Rating Features navigation" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:67 +msgid "Rating Features List" +msgstr "" + +#: inc/rating/class-opalestate-rating-features-posttype.php:69 +msgid "This is where store rating features are stored." +msgstr "" + +#: inc/rating/class-opalestate-rating-metabox.php:57 +msgid "Rating features" +msgstr "" + +#: inc/rating/class-opalestate-rating-metabox.php:57 +msgid "Rating" +msgstr "" + +#: inc/rating/class-opalestate-rating-metabox.php:105 +msgid "Data" +msgstr "" + +#: inc/rating/class-opalestate-rating-metabox.php:116 +#: inc/taxonomies/class-taxonomy-status.php:87 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:224 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:192 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:213 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:193 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:193 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:224 +msgid "Order" +msgstr "" + +#: inc/rating/class-opalestate-rating-metabox.php:117 +#: inc/taxonomies/class-taxonomy-status.php:88 +msgid "Set a priority to display" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:166 +msgid "Active Life" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:170 +msgid "Arts & Entertainment" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:174 +msgid "Automotive" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:178 +msgid "Beauty & Spas" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:182 +msgid "Education" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:186 +msgid "Event Planning & Services" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:190 +msgid "Financial Services" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:194 +msgid "Food" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:198 +msgid "Health & Medical" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:202 +msgid "Home Services " +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:206 +msgid "Hotels & Travel" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:210 +msgid "Local Flavor" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:214 +msgid "Local Services" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:218 +msgid "Mass Media" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:222 +msgid "Nightlife" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:226 +msgid "Pets" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:230 +msgid "Professional Services" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:234 +msgid "Public Services & Government" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:238 +msgid "Real Estate" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:242 +msgid "Religious Organizations" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:246 +msgid "Restaurants" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:250 +#: templates/single-property/map.php:73 templates/single-property/map-v2.php:75 +#: templates/single-property/preview/tabs.php:69 +#: templates/single-property/preview/map.php:43 +msgid "Shopping" +msgstr "" + +#: inc/classes/class-opalestate-yelp.php:254 +msgid "Transportation" +msgstr "" + +#: inc/classes/class-opalestate-cache.php:150 +#, php-format +msgid "" +"In order for database caching to work with Give you must " +"add %1$s to the \"Ignored query stems\" option in W3 Total " +"Cache settings." +msgstr "" + +#: inc/classes/class-opalestate-cache.php:170 +msgid "Do not pass empty action to generate cache key." +msgstr "" + +#: inc/classes/class-opalestate-cache.php:203 +msgid "Do not pass invalid empty cache key" +msgstr "" + +#: inc/classes/class-opalestate-cache.php:205 +#: inc/classes/class-opalestate-cache.php:246 +#: inc/classes/class-opalestate-cache.php:295 +msgid "Cache key format should be opalestate_cache_*" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:23 +#: inc/classes/class-opalestate-metabox-user.php:32 +#: inc/agency/class-opalestate-agency-metabox.php:100 +#: inc/agency/class-opalestate-agency-metabox.php:311 +#: inc/agency/class-opalestate-agency-metabox.php:321 +#: inc/agent/class-opalestate-agent-metabox.php:157 +#: inc/agent/class-opalestate-agent-metabox.php:167 +msgid "Avatar Picture" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:24 +#: inc/classes/class-opalestate-metabox-user.php:33 +#: inc/classes/class-opalestate-metabox-user.php:74 +#: inc/classes/class-opalestate-metabox-user.php:211 +#: inc/agency/class-opalestate-agency-metabox.php:101 +#: inc/agency/class-opalestate-agency-metabox.php:312 +#: inc/agency/class-opalestate-agency-metabox.php:322 +#: inc/agent/class-opalestate-agent-metabox.php:158 +#: inc/agent/class-opalestate-agent-metabox.php:168 +msgid "This image will display in user detail and profile box information" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:43 +#: inc/agency/class-opalestate-agency-metabox.php:111 +msgid "First Name" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:51 +#: inc/agency/class-opalestate-agency-metabox.php:121 +msgid "Last Name" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:59 +#: inc/agency/class-opalestate-agency-metabox.php:130 +msgid "Biographical Info" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:61 +#: inc/agency/class-opalestate-agency-metabox.php:132 +msgid "" +"Share a little biographical information to fill out your profile. This may " +"be shown publicly." +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:73 +#: inc/classes/class-opalestate-metabox-user.php:210 +msgid "Avatar Pictures" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:86 +#: inc/property/class-metabox-property-admin.php:194 +#: inc/submission/class-metabox-property-submission.php:64 +#: templates/search-box/search-form-v3.php:28 +#: templates/search-box/fields/search-city-text.php:23 +#: templates/search-box/fields/location.php:1 +#: templates/search-box/fields/location.php:2 +msgid "Location" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:87 +#: inc/agency/class-opalestate-agency-metabox.php:37 +#: inc/agency/class-opalestate-agency-metabox.php:280 +#: inc/agency/class-opalestate-agency-metabox.php:332 +#: inc/agent/class-opalestate-agent-metabox.php:65 +#: inc/agent/class-opalestate-agent-metabox.php:111 +#: inc/admin/agency/class-agency.php:73 +msgid "Select one, to add new you create in location of estate panel" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:95 +#: inc/taxonomies/class-taxonomy-city.php:96 +msgid "State / Province" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:96 +msgid "Select one, to add new you create in state of estate panel" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:102 +#: inc/submission/class-metabox-property-submission.php:369 +msgid "City / Town" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:103 +msgid "Select one, to add new you create in city of estate panel" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:119 +msgid "Map Location" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:133 +msgid "Job" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:139 +msgid "Company" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:160 +#: inc/classes/class-opalestate-metabox-user.php:225 +#: inc/agency/class-opalestate-agency-metabox.php:344 +#: inc/agent/class-opalestate-agent-metabox.php:183 +msgid "Website" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:165 +#: inc/classes/class-opalestate-metabox-user.php:230 +#: inc/agency/class-opalestate-agency-metabox.php:159 +#: inc/agency/class-opalestate-agency-metabox.php:349 +#: inc/message/class-opalestate-message.php:539 +#: inc/message/class-opalestate-message.php:641 +#: inc/message/class-opalestate-message.php:716 +#: inc/agent/class-opalestate-agent-metabox.php:188 +msgid "Phone" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:171 +#: inc/classes/class-opalestate-metabox-user.php:236 +#: inc/agency/class-opalestate-agency-metabox.php:355 +#: inc/agent/class-opalestate-agent-metabox.php:194 +msgid "Mobile" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:177 +#: inc/classes/class-opalestate-metabox-user.php:242 +#: inc/agency/class-opalestate-agency-metabox.php:361 +#: inc/agent/class-opalestate-agent-metabox.php:200 +msgid "Fax" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:189 +#: inc/agency/class-opalestate-agency-metabox.php:58 +msgid "Is Featured" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:191 +msgid "Set member as featured" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:200 +msgid "Trusted" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:202 +msgid "Set this member as Trusted Member" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:253 +msgid "Twitter" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:260 +#: inc/agency/class-opalestate-agency-metabox.php:181 +#: inc/vendors/social-login/class-opalestate-social-login.php:93 +#: templates/user/social-login/facebook-button.php:19 +msgid "Facebook" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:266 +#: inc/vendors/social-login/class-opalestate-social-login.php:57 +#: templates/user/social-login/google-button.php:19 +msgid "Google" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:272 +msgid "LinkedIn" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:278 +msgid "Pinterest" +msgstr "" + +#: inc/classes/class-opalestate-metabox-user.php:283 +msgid "Instagram" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:38 +msgid "Search Properties Result" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:39 +#: inc/widgets/search-properties.php:57 +msgid "Search Properties" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:40 +msgid "Search Properties Vertical" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:42 +msgid "Search Map Properties" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:43 +#: inc/property/class-opalestate-shortcodes.php:44 +msgid "Ajax Search Map Properties" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:45 +msgid "Register User Form" +msgstr "" + +#: inc/property/class-opalestate-shortcodes.php:46 +msgid "Login Form" +msgstr "" + +#: inc/property/class-opalestate-search.php:392 +msgid "Bed Rooms" +msgstr "" + +#: inc/property/class-opalestate-search.php:393 +#: inc/property/class-metabox-property-admin.php:309 +#: inc/submission/class-metabox-property-submission.php:247 +msgid "Parking" +msgstr "" + +#: inc/property/class-opalestate-search.php:394 +msgid "Bath Rooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:28 +msgid "Property Metabox" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:47 +#: inc/admin/register-settings.php:110 inc/admin/class-user.php:105 +#: inc/submission/class-metabox-property-submission.php:61 +#: inc/admin/settings/property.php:21 inc/admin/agency/class-agency.php:129 +#: inc/admin/agent/class-agent.php:80 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:212 +msgid "General" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:54 +msgid "Prices" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:68 +msgid "Facility" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:76 +msgid "Floor Plan" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:91 +#: inc/agency/class-opalestate-agency-metabox.php:331 +#: templates/single-agency/gallery.php:10 inc/admin/agency/class-agency.php:72 +#: templates/single-property/preview/tabs.php:15 +msgid "Gallery" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:95 +#: inc/submission/class-metabox-property-submission.php:195 +msgid "Images Gallery" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:97 +#: inc/property/class-metabox-property-admin.php:111 +#: inc/agency/class-opalestate-agency-metabox.php:307 +#: inc/agent/class-opalestate-agent-metabox.php:153 +#: inc/submission/class-metabox-property-submission.php:188 +#: inc/submission/class-metabox-property-submission.php:197 +msgid "Select one or more images to show as gallery" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:104 +msgid "Virtual Tour 360" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:109 +msgid "Manual Images 360 " +msgstr "" + +#: inc/property/class-metabox-property-admin.php:115 +msgid "Or 360° Virtual Tour" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:117 +#: inc/property/class-metabox-property-admin.php:606 +#: inc/submission/class-metabox-property-submission.php:212 +#: inc/submission/class-metabox-property-submission.php:605 +msgid "Input iframe to show 360° Virtual Tour." +msgstr "" + +#: inc/property/class-metabox-property-admin.php:126 +#: inc/property/class-metabox-property-admin.php:130 +#: inc/submission/class-metabox-property-submission.php:217 +#: templates/single-property/attachments.php:12 +msgid "Attachments" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:135 +#: inc/submission/class-metabox-property-submission.php:225 +msgid "Select one or more files to allow download" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:143 +msgid "Contact Member" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:150 +msgid "User Assignment" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:156 +#: inc/widgets/search-properties.php:74 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:97 +msgid "Layout" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:187 +msgid "Property SKU" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:190 +msgid "Please Enter Your Property SKU" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:201 +#: inc/submission/class-metabox-property-submission.php:375 +msgid "Postal Code / Zip" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:207 +#: inc/submission/class-metabox-property-submission.php:390 +msgid "Google Map View" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:230 +#: inc/submission/class-metabox-property-submission.php:206 +msgid "" +"Input for videos, audios from Youtube, Vimeo and all supported sites by " +"WordPress. It has preview feature." +msgstr "" + +#: inc/property/class-metabox-property-admin.php:248 +#: inc/submission/class-metabox-property-submission.php:119 +msgid "Regular Price" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:250 +#: inc/property/class-metabox-property-admin.php:258 +#: inc/submission/class-metabox-property-submission.php:121 +#: inc/submission/class-metabox-property-submission.php:129 +msgid "Enter amount without currency" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:252 +#: inc/property/class-metabox-property-admin.php:570 +#: inc/submission/class-metabox-property-submission.php:567 +#: templates/search-box/search-form-v3.php:56 +#: templates/search-box/search-form-v2.php:39 +#: templates/search-box/fields/price.php:20 +msgid "Price" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:256 +#: inc/submission/class-metabox-property-submission.php:127 +#: templates/parts/mortgage-calculator.php:152 +msgid "Sale Price" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:262 +#: inc/submission/class-metabox-property-submission.php:133 +msgid "Before Price Label (optional)" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:264 +#: inc/submission/class-metabox-property-submission.php:135 +msgid "Before Price Label (e.g. \"from\")" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:268 +#: inc/submission/class-metabox-property-submission.php:139 +msgid "After Price Label (optional)" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:270 +#: inc/submission/class-metabox-property-submission.php:141 +msgid "After Price Label (e.g. \"per month\")" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:274 +msgid "Is Price On Call" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:298 +#: inc/submission/class-metabox-property-submission.php:239 +msgid "Built year" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:301 +#: inc/submission/class-metabox-property-submission.php:242 +msgid "Enter built year" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:316 +#: inc/submission/class-metabox-property-submission.php:256 +msgid "Enter number of Parking" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:320 +#: inc/submission/class-metabox-property-submission.php:259 +msgid "Bedrooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:327 +#: inc/submission/class-metabox-property-submission.php:268 +msgid "Enter number of bedrooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:330 +#: inc/submission/class-metabox-property-submission.php:271 +msgid "Bathrooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:337 +#: inc/submission/class-metabox-property-submission.php:280 +msgid "Enter number of bathrooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:340 +#: inc/submission/class-metabox-property-submission.php:283 +msgid "Plot Size" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:343 +#: inc/submission/class-metabox-property-submission.php:286 +msgid "Enter size of Plot as 20x30, 20x30x40, 20x30x40x50" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:346 +#: inc/submission/class-metabox-property-submission.php:289 +msgid "Area Size" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:349 +#: inc/submission/class-metabox-property-submission.php:298 +msgid "Enter size of area in sqft" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:352 +#: inc/submission/class-metabox-property-submission.php:301 +msgid "Orientation" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:355 +#: inc/submission/class-metabox-property-submission.php:304 +msgid "Enter Orientation of property" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:359 +#: inc/submission/class-metabox-property-submission.php:307 +msgid "Living Rooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:366 +#: inc/submission/class-metabox-property-submission.php:316 +msgid "Enter Number of Living Rooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:370 +#: inc/submission/class-metabox-property-submission.php:320 +msgid "Kitchens" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:377 +#: inc/submission/class-metabox-property-submission.php:329 +msgid "Enter Number of Kitchens" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:381 +#: inc/property/class-metabox-property-admin.php:581 +#: inc/submission/class-metabox-property-submission.php:333 +#: inc/submission/class-metabox-property-submission.php:578 +msgid "Rooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:388 +#: inc/submission/class-metabox-property-submission.php:342 +msgid "Enter Number of Amount Rooms" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:410 +#: inc/taxonomies/class-taxonomy-labels.php:38 +#: inc/taxonomies/class-taxonomy-labels.php:48 +#: inc/submission/class-metabox-property-submission.php:444 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:169 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:249 +msgid "Label" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:415 +#: inc/property/class-metabox-property-admin.php:592 +#: inc/submission/class-metabox-property-submission.php:449 +#: inc/submission/class-metabox-property-submission.php:589 +msgid "Content" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:420 +#: inc/submission/class-metabox-property-submission.php:454 +msgid "Facility {#}" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:421 +#: inc/property/class-metabox-property-admin.php:611 +#: inc/property/class-metabox-property-admin.php:680 +#: inc/submission/class-metabox-property-submission.php:455 +#: inc/submission/class-metabox-property-submission.php:534 +#: inc/submission/class-metabox-property-submission.php:610 +msgid "Add more" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:422 +#: inc/property/class-metabox-property-admin.php:612 +#: inc/property/class-metabox-property-admin.php:681 +#: inc/submission/class-metabox-property-submission.php:456 +#: inc/submission/class-metabox-property-submission.php:535 +#: inc/submission/class-metabox-property-submission.php:611 +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:64 +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:76 +msgid "Remove" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:440 +msgid "Hide Author Information" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:441 +msgid "User Author Information" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:442 +msgid "Agent Information" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:443 +#: inc/agency/class-opalestate-agency-metabox.php:378 +msgid "Agency Information" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:469 +msgid "Author Information" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:476 +#: inc/user/class-opalestate-user.php:284 +msgid "Agent" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:482 +#: inc/user/class-opalestate-user.php:285 +#: templates/parts/search-agency-form.php:20 +msgid "Agency" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:501 +msgid "Default User" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:512 +msgid "User" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:515 +msgid "" +"Change to new owner of this property, which be listed in That user dashboard" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:533 +msgid "Layout Display" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:537 +#: inc/property/class-metabox-property-admin.php:545 +msgid "Select a layout to display full information of this property" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:541 +msgid "Preview Display" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:564 +#: inc/message/class-opalestate-message.php:521 +#: inc/message/class-opalestate-message.php:624 +#: inc/submission/class-metabox-property-submission.php:561 +#: templates/rating/opalestate-ratings.php:237 +#: templates/user/share-search-form.php:35 +#: templates/user-search/content-savedsearch.php:12 +#: templates/user-search/render-form.php:29 +#: templates/user/agency/agency-team.php:21 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:184 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:184 +msgid "Name" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:576 +#: inc/submission/class-metabox-property-submission.php:573 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:370 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:432 +msgid "Size" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:586 +#: inc/submission/class-metabox-property-submission.php:583 +msgid "Baths" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:597 +#: inc/submission/class-metabox-property-submission.php:594 +msgid "Image Preview" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:610 +#: inc/submission/class-metabox-property-submission.php:609 +msgid "Floor {#}" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:634 +#: inc/submission/class-metabox-property-submission.php:487 +#: templates/single-property/apartments.php:22 +msgid "Plot" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:641 +#: inc/submission/class-metabox-property-submission.php:495 +#: templates/single-property/apartments.php:23 +msgid "Beds" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:646 +#: inc/submission/class-metabox-property-submission.php:500 +msgid "Price from" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:651 +#: inc/submission/class-metabox-property-submission.php:505 +#: templates/single-property/apartments.php:25 +msgid "Floor" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:657 +#: inc/submission/class-metabox-property-submission.php:511 +#: templates/single-property/apartments.php:26 +msgid "Building / Address" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:662 +#: inc/taxonomies/class-taxonomy-status.php:35 +#: inc/taxonomies/class-taxonomy-status.php:45 +#: inc/taxonomies/class-taxonomy-status.php:153 +#: inc/submission/class-metabox-property-submission.php:516 +#: templates/single-property/features.php:40 +#: templates/single-property/apartments.php:27 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:253 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:274 +msgid "Status" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:666 +#: inc/submission/class-metabox-property-submission.php:519 +msgid "Available" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:667 +#: inc/submission/class-metabox-property-submission.php:520 +msgid "Unavailable" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:673 +#: inc/submission/class-metabox-property-submission.php:526 +msgid "Link" +msgstr "" + +#: inc/property/class-metabox-property-admin.php:679 +#: inc/submission/class-metabox-property-submission.php:533 +msgid "Apartment {#}" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:42 +#: inc/agency/class-opalestate-agency-posttype.php:44 +#: inc/admin/register-settings.php:112 +#: inc/agent/class-opalestate-agent-posttype.php:37 +msgid "Property" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:43 +#: inc/property/class-opalestate-posttype.php:44 +#: templates/shortcodes/submission-form.php:30 +#: templates/submission/submission-form.php:16 +msgid "Add New Property" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:45 +#: templates/shortcodes/submission-form.php:32 +#: templates/submission/submission-form.php:19 +msgid "Edit Property" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:46 +msgid "New Property" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:47 +msgid "All Properties" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:48 +#: templates/user/dashboard.php:130 templates/user/property-ratings.php:91 +msgid "View Property" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:49 +msgid "Search Property" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:50 +msgid "No Properties found" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:51 +msgid "No Properties found in Trash" +msgstr "" + +#: inc/property/class-opalestate-posttype.php:73 +msgctxt "property slug" +msgid "property" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:43 +#: inc/agency/class-opalestate-agency-posttype.php:55 +msgid "Agencies" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:45 +#: inc/agency/class-opalestate-agency-posttype.php:46 +msgid "Add New Agency" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:47 +msgid "Edit Agency" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:48 +msgid "New Agency" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:49 +msgid "All Agencies" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:50 +msgid "View Agency" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:51 +msgid "Search Agency" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:52 +msgid "No Agencies found" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:53 +msgid "No Agencies found in Trash" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:69 +msgctxt "agency slug" +msgid "agency" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:75 +#: inc/agency/class-opalestate-agency-posttype.php:85 +msgid "Agency Categories" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:76 +msgid "Category" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:77 +msgid "Search Category" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:78 +msgid "All Categories" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:79 +msgid "Parent Category" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:80 +msgid "Parent Category:" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:81 +msgid "Edit Category" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:82 +msgid "Update Category" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:83 +#: inc/taxonomies/class-taxonomy-categories.php:46 +msgid "Add New Category" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:84 +msgid "New Category Name" +msgstr "" + +#: inc/agency/class-opalestate-agency-posttype.php:97 +msgctxt "agency category slug" +msgid "agency-category" +msgstr "" + +#: inc/agency/class-opalestate-agency-front.php:84 +msgid "Agency Profile" +msgstr "" + +#: inc/agency/class-opalestate-agency-front.php:90 +#: templates/user/agency/agency-team.php:36 +msgid "Agency Team" +msgstr "" + +#: inc/agency/class-opalestate-agency-front.php:293 +#: inc/user/class-opalestate-user.php:338 +#: inc/agent/class-opalestate-agent-front.php:199 +msgid "The data updated successful, please wait for redirecting" +msgstr "" + +#: inc/agency/class-opalestate-agency-front.php:295 +#: inc/agency/class-opalestate-agency-front.php:302 +#: inc/user/class-opalestate-user.php:340 +#: inc/agent/class-opalestate-agent-front.php:201 +#: inc/agent/class-opalestate-agent-front.php:209 +msgid "Update Information" +msgstr "" + +#: inc/agency/class-opalestate-agency-front.php:301 +#: inc/agent/class-opalestate-agent-front.php:208 +msgid "Currently, The data could not save!" +msgstr "" + +#: inc/agency/class-opalestate-agency-front.php:458 +#: inc/agent/class-opalestate-agent-front.php:484 +msgid "User ID" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:30 +msgid "Link To User ID" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:32 +msgid "" +"Set relationship to existed user, allow user can edit Agency profile in " +"front-end and show account info in each property." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:36 +msgid "Agent Team" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:60 +msgid "Set this agent as featured" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:83 +#: inc/user/class-opalestate-user.php:562 +#: inc/user/class-opalestate-user.php:575 +#: inc/submission/class-metabox-property-submission.php:45 +msgid "Name and Description" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:138 +msgid "Title/Job" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:140 +msgid "Please enter position or job in your company." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:146 +msgid "company" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:148 +msgid "Please enter company name." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:152 +msgid "Contact email" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:154 +msgid "" +"Enter contact name that allow user contact you via the contact form of " +"website." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:161 +msgid "Enter your home phone." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:166 +msgid "Skype" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:168 +msgid "Input for skype account." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:173 +msgid "Website URL" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:175 +msgid "Link to your website" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:183 +msgid "Enter your facebook profile or facebook newfeed" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:184 +msgid "Social" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:189 +msgid "Linkedin URL" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:191 +msgid "Input for linked in profile." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:195 +msgid "Instagram URL" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:197 +msgid "Input for instagram profile." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:201 +msgid "Pinterest Url" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:203 +msgid "Input for pinterest feed" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:208 +msgid "Google Plus Url" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:210 +msgid "Input for goolge plus profile or your newfeed." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:215 +msgid "Youtube Url" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:217 +msgid "Input for your channel youtube." +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:222 +msgid "Vimeo Url" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:224 +msgid "Input for your channel Vimeo" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:255 +msgid "Title / Name" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:264 +#: inc/admin/agency/class-agency.php:79 +msgid "slogan" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:279 +#: inc/agent/class-opalestate-agent-metabox.php:64 +#: inc/agent/class-opalestate-agent-metabox.php:110 +#: inc/taxonomies/class-taxonomy-types.php:75 +#: inc/taxonomies/class-taxonomy-types.php:85 +#: inc/submission/class-metabox-property-submission.php:155 +#: templates/search-box/search-form-v3.php:46 +#: templates/search-box/search-form-v2.php:29 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:233 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:254 +msgid "Types" +msgstr "" + +#: inc/agency/class-opalestate-agency-metabox.php:302 +#: inc/agent/class-opalestate-agent-metabox.php:148 +msgid "Banner" +msgstr "" + +#: inc/admin/functions.php:198 +msgid "Global Default" +msgstr "" + +#: inc/admin/functions.php:288 +msgid "Save Settings" +msgstr "" + +#: inc/admin/functions.php:327 +msgid "Deactivate License" +msgstr "" + +#: inc/admin/functions.php:365 +msgid "Search Key" +msgstr "" + +#: inc/admin/functions.php:372 +#, php-format +msgid "" +"API keys allow users to use the Opalestate REST API to " +"retrieve donation data in JSON or XML for external applications or devices, " +"such as Zapi_keyser." +msgstr "" + +#: inc/admin/functions.php:563 +msgid "No users found" +msgstr "" + +#: inc/admin/functions.php:586 +msgid "We could find this user" +msgstr "" + +#: inc/admin/functions.php:590 +msgid "We could not find this user" +msgstr "" + +#: inc/admin/register-settings.php:79 +msgid "Settings" +msgstr "" + +#: inc/admin/register-settings.php:84 +msgid "Addons" +msgstr "" + +#: inc/admin/register-settings.php:115 +msgid "Add-ons" +msgstr "" + +#: inc/admin/register-settings.php:119 +msgid "Licenses" +msgstr "" + +#: inc/admin/register-settings.php:122 inc/admin/settings/api_keys.php:28 +#: inc/admin/settings/api_keys.php:34 +msgid "API" +msgstr "" + +#: inc/admin/register-settings.php:123 +msgid "3rd Party" +msgstr "" + +#: inc/admin/register-settings.php:280 +msgid "Settings updated." +msgstr "" + +#: inc/admin/class-user.php:49 +#, php-format +msgid "" +"This user has role Opal Estate Agency and click here to update Agency profile" +msgstr "" + +#: inc/admin/class-user.php:59 +#, php-format +msgid "" +"This user has role Opal Estate Agent and click here to update Agent profile" +msgstr "" + +#: inc/admin/class-user.php:87 inc/admin/agency/class-agency.php:110 +#: inc/admin/agent/class-agent.php:62 +msgid "Metabox" +msgstr "" + +#: inc/admin/class-user.php:112 inc/admin/agency/class-agency.php:136 +#: inc/admin/agent/class-agent.php:87 +msgid "Socials" +msgstr "" + +#: inc/admin/class-user.php:168 +msgid "Block Submssion" +msgstr "" + +#: inc/admin/class-user.php:170 +msgid "Disable Submssion Functions to not allow submit property" +msgstr "" + +#: inc/admin/class-user.php:176 +msgid "Block Submssion Message" +msgstr "" + +#: inc/admin/class-user.php:178 +msgid "Show message for disabled user" +msgstr "" + +#: inc/admin/class-api-keys-table.php:54 +msgid "API Key" +msgstr "" + +#: inc/admin/class-api-keys-table.php:55 +msgid "API Keys" +msgstr "" + +#: inc/admin/class-api-keys-table.php:143 +msgid "View API Log" +msgstr "" + +#: inc/admin/class-api-keys-table.php:154 +msgid "Reissue" +msgstr "" + +#: inc/admin/class-api-keys-table.php:163 +msgid "Revoke" +msgstr "" + +#: inc/admin/class-api-keys-table.php:180 templates/user/register-form.php:43 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:512 +msgid "Username" +msgstr "" + +#: inc/admin/class-api-keys-table.php:181 +msgid "Public Key" +msgstr "" + +#: inc/admin/class-api-keys-table.php:182 +msgid "Token" +msgstr "" + +#: inc/admin/class-api-keys-table.php:183 +msgid "Secret Key" +msgstr "" + +#: inc/admin/class-api-keys-table.php:235 +msgid "Generate New API Keys" +msgstr "" + +#: inc/message/class-opalestate-request-reviewing.php:94 +#: inc/message/class-opalestate-message.php:234 +#: inc/message/class-opalestate-message.php:284 +msgid "Unable to send a message." +msgstr "" + +#: inc/message/class-opalestate-message.php:162 +#: inc/email/class-opalestate-email-notifycation.php:38 +msgid "You got a message contact" +msgstr "" + +#: inc/message/class-opalestate-message.php:229 +msgid "Email Sent successful" +msgstr "" + +#: inc/message/class-opalestate-message.php:230 +#: inc/message/class-opalestate-message.php:234 +msgid "Sending Message" +msgstr "" + +#: inc/message/class-opalestate-message.php:498 +#: inc/message/class-opalestate-message.php:564 +#: inc/message/class-opalestate-message.php:603 +#: inc/message/class-opalestate-message.php:680 +#: inc/taxonomies/class-taxonomy-types.php:123 +#: templates/user/register-form.php:69 +#: templates/single-property/features.php:28 +msgid "Type" +msgstr "" + +#: inc/message/class-opalestate-message.php:505 +#: inc/message/class-opalestate-message.php:610 +#: inc/message/class-opalestate-message.php:687 +msgid "Property ID" +msgstr "" + +#: inc/message/class-opalestate-message.php:513 +#: inc/message/class-opalestate-message.php:617 +#: inc/message/class-opalestate-message.php:694 +#: templates/user/agency/agency-team.php:14 +msgid "Sender ID" +msgstr "" + +#: inc/message/class-opalestate-message.php:547 +#: inc/message/class-opalestate-message.php:571 +#: inc/message/class-opalestate-message.php:649 +#: inc/message/class-opalestate-message.php:724 +#: templates/user/share-search-form.php:45 +msgid "Message" +msgstr "" + +#: inc/message/class-opalestate-message.php:701 +msgid "Schedule" +msgstr "" + +#: inc/message/class-opalestate-message.php:709 +msgid "Time" +msgstr "" + +#: inc/user/functions.php:123 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:549 +msgid "Dashboard" +msgstr "" + +#: inc/user/functions.php:130 +msgid "Personal Information" +msgstr "" + +#: inc/user/functions.php:137 +msgid "Favorite" +msgstr "" + +#: inc/user/functions.php:159 +msgid "Messages" +msgstr "" + +#: inc/user/functions.php:167 +msgid "Submit Property" +msgstr "" + +#: inc/user/functions.php:174 inc/submission/class-opalestate-submission.php:97 +#: templates/single-agent/properties.php:11 templates/user/dashboard.php:12 +#: templates/single-agency/properties.php:16 +msgid "My Properties" +msgstr "" + +#: inc/user/functions.php:196 +msgid "Log out" +msgstr "" + +#: inc/user/functions.php:223 +msgid "An account is already registered with your email address. Please login." +msgstr "" + +#: inc/user/functions.php:228 +msgid "Please enter a valid account username." +msgstr "" + +#: inc/user/functions.php:232 +msgid "Username is already exists." +msgstr "" + +#: inc/user/functions.php:237 +msgid "Password is requried." +msgstr "" + +#: inc/user/class-opalestate-user.php:57 +msgid "User Profile" +msgstr "" + +#: inc/user/class-opalestate-user.php:168 +#, php-format +msgid "" +"This user has role Opal Estate Agency and click here to update Agency profile" +msgstr "" + +#: inc/user/class-opalestate-user.php:179 +#, php-format +msgid "" +"This user has role Opal Estate Agent and click here to update Agent profile" +msgstr "" + +#: inc/user/class-opalestate-user.php:258 +msgid "" +"Your account was blocked to use the submission form, so you could not submit " +"any property." +msgstr "" + +#: inc/user/class-opalestate-user.php:270 +msgid "Your account is blocked, you could not complete this action" +msgstr "" + +#: inc/user/class-opalestate-user.php:283 +msgid "Subscriber" +msgstr "" + +#: inc/user/class-opalestate-user.php:490 +msgid "Found a problem while updating" +msgstr "" + +#: inc/user/class-opalestate-user.php:501 +msgid "Passwords fields are not empty" +msgstr "" + +#: inc/user/class-opalestate-user.php:507 +msgid "New password is not same confirm password" +msgstr "" + +#: inc/user/class-opalestate-user.php:517 +msgid "Password Updated" +msgstr "" + +#: inc/user/class-opalestate-user.php:519 +msgid "Old password is not correct" +msgstr "" + +#: inc/user/class-opalestate-user.php:584 +msgid "Old Password" +msgstr "" + +#: inc/user/class-opalestate-user.php:589 +msgid "Please enter your old password" +msgstr "" + +#: inc/user/class-opalestate-user.php:593 +msgid "New Password" +msgstr "" + +#: inc/user/class-opalestate-user.php:598 +msgid "Please enter your new password." +msgstr "" + +#: inc/user/class-opalestate-user.php:602 +msgid "Confirm Password" +msgstr "" + +#: inc/user/class-opalestate-user.php:607 +msgid "Please enter your confirm password." +msgstr "" + +#: inc/user/class-opalestate-user-search.php:142 +msgid "Saved this search successful." +msgstr "" + +#: inc/user/class-opalestate-user-search.php:144 +msgid "You saved this search" +msgstr "" + +#: inc/user/class-opalestate-user-search.php:147 +msgid "Please sign in to save this search." +msgstr "" + +#: inc/user/class-opalestate-user-search.php:191 +msgid "Saved Search" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:46 +#: inc/user/class-opalestate-user-form-handler.php:51 +#: inc/user/class-opalestate-user-form-handler.php:60 +#: inc/user/class-opalestate-user-form-handler.php:70 +#: inc/user/class-opalestate-user-form-handler.php:160 +#: inc/user/class-opalestate-user-form-handler.php:165 +#: inc/user/class-opalestate-user-form-handler.php:172 +#: inc/user/class-opalestate-user-form-handler.php:179 +#: inc/user/class-opalestate-user-form-handler.php:182 +#: inc/user/class-opalestate-user-form-handler.php:191 +msgid "ERROR" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:51 +#: inc/user/class-opalestate-user-form-handler.php:165 +msgid "Username is required." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:60 +msgid "A user could not be found with this email address." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:70 +#: inc/user/class-opalestate-user-form-handler.php:179 +msgid "Password is required." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:96 +msgid "Logged successfully, welcome back!" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:172 +msgid "Email is required." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:182 +msgid "Re-Password is not match." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:251 +msgid "Enter an username or e-mail address." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:257 +msgid "There is no user registered with that email address." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:263 +msgid "There is no user registered with that username." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:266 +msgid "Invalid username or e-mail address." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:289 +msgid "Your new password" +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:292 +msgid "Your new password is: " +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:301 +msgid "Check your email address for you new password." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:303 +msgid "System is unable to send you mail containg your new password." +msgstr "" + +#: inc/user/class-opalestate-user-form-handler.php:305 +msgid "Oops! Something went wrong while updating your account." +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:45 +msgid "Link to User" +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:47 +msgid "Enter User ID to show information without using user info" +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:52 +#: inc/agent/class-opalestate-agent-metabox.php:119 +msgid "Target Min Price" +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:54 +#: inc/agent/class-opalestate-agent-metabox.php:121 +msgid "Enter min price of property which is for sale/rent..." +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:59 +#: inc/agent/class-opalestate-agent-metabox.php:126 +msgid "Target Max Price" +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:61 +#: inc/agent/class-opalestate-agent-metabox.php:128 +msgid "Enter max price of property which is for sale/rent..." +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:91 +msgid "Title/Name" +msgstr "" + +#: inc/agent/class-opalestate-agent-metabox.php:215 +msgid "Agent Information" +msgstr "" + +#: inc/agent/class-opalestate-agent-front.php:81 +#: inc/agent/class-opalestate-agent-front.php:308 +msgid "Agent Profile" +msgstr "" + +#: inc/agent/class-opalestate-agent-front.php:309 +msgid "Search Agents" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:36 +#: inc/agent/class-opalestate-agent-posttype.php:48 +msgid "Agents" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:38 +#: inc/agent/class-opalestate-agent-posttype.php:39 +msgid "Add New Agent" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:40 +msgid "Edit Agent" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:41 +msgid "New Agent" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:42 +msgid "All Agents" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:43 +msgid "View Agent" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:44 +msgid "Search Agent" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:45 +msgid "No Agents found" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:46 +msgid "No Agents found in Trash" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:62 +msgctxt "agent slug" +msgid "agent" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:75 +#: inc/agent/class-opalestate-agent-posttype.php:85 +msgid "Agent Levels" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:76 +msgid "Level" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:77 +msgid "Search Level" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:78 +msgid "All Levels" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:79 +msgid "Parent Level" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:80 +msgid "Parent Level:" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:81 +msgid "Edit Level" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:82 +msgid "Update Level" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:83 +msgid "Add New Level" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:84 +msgid "New Level Name" +msgstr "" + +#: inc/agent/class-opalestate-agent-posttype.php:97 +msgctxt "agent level slug" +msgid "agent-level" +msgstr "" + +#: inc/api/class-opalestate-api.php:423 +msgid "You must specify both a token and API key!" +msgstr "" + +#: inc/api/class-opalestate-api.php:440 +msgid "Your request could not be authenticated!" +msgstr "" + +#: inc/api/class-opalestate-api.php:457 +msgid "Invalid API key!" +msgstr "" + +#: inc/api/class-opalestate-api.php:473 +msgid "Invalid API version!" +msgstr "" + +#: inc/api/class-opalestate-api.php:601 +msgid "Invalid query!" +msgstr "" + +#. %s: property +#: inc/api/class-opalestate-api.php:678 inc/api/class-opalestate-api.php:769 +#: inc/api/class-opalestate-api.php:821 +#, php-format +msgid "Form %s not found!" +msgstr "" + +#: inc/api/class-opalestate-api.php:1053 +msgid "Opalestate API Keys" +msgstr "" + +#: inc/api/class-opalestate-api.php:1062 +msgid "Generate API Key" +msgstr "" + +#: inc/api/class-opalestate-api.php:1064 +msgid "Public key:" +msgstr "" + +#: inc/api/class-opalestate-api.php:1067 +msgid "Secret key:" +msgstr "" + +#: inc/api/class-opalestate-api.php:1070 +msgid "Token:" +msgstr "" + +#: inc/api/class-opalestate-api.php:1074 +msgid "Revoke API Keys" +msgstr "" + +#: inc/api/class-opalestate-api.php:1097 +msgid "Nonce verification failed." +msgstr "" + +#: inc/api/class-opalestate-api.php:1097 inc/api/class-opalestate-api.php:1102 +#: inc/api/class-opalestate-api.php:1120 inc/api/class-opalestate-api.php:1130 +msgid "Error" +msgstr "" + +#: inc/api/class-opalestate-api.php:1102 +msgid "User ID Required." +msgstr "" + +#. %s: process +#: inc/api/class-opalestate-api.php:1117 inc/api/class-opalestate-api.php:1127 +#, php-format +msgid "You do not have permission to %s API keys for this user." +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:36 +#: inc/taxonomies/class-taxonomy-locations.php:46 +msgid "Countries" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:37 +msgid "Properties By Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:38 +msgid "Search Countries" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:39 +msgid "All Countries" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:40 +msgid "Parent Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:41 +msgid "Parent Country:" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:42 +msgid "Edit Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:43 +msgid "Update Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:44 +msgid "Add New Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:45 +msgid "New Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:53 +msgid "location" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:77 +msgid "Country Metabox" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:84 +#: inc/taxonomies/class-taxonomy-categories.php:76 +#: inc/taxonomies/class-taxonomy-state.php:79 +#: inc/taxonomies/class-taxonomy-city.php:75 +#: inc/taxonomies/class-taxonomy-types.php:58 +msgid "Image" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:85 +msgid "Country image" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:108 +#: inc/taxonomies/class-taxonomy-locations.php:128 +msgid "Select Country" +msgstr "" + +#: inc/taxonomies/class-taxonomy-locations.php:142 +#: inc/taxonomies/class-taxonomy-state.php:91 +#: inc/taxonomies/class-taxonomy-city.php:87 +#: inc/submission/class-metabox-property-submission.php:356 +msgid "Country" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:34 +#: inc/taxonomies/class-taxomony-amenities.php:44 +#: inc/submission/class-metabox-property-submission.php:66 +#: inc/submission/class-metabox-property-submission.php:417 +msgid "Amenities" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:35 +msgid "Properties By Amenity" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:36 +msgid "Search Amenities" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:37 +msgid "All Amenities" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:38 +msgid "Parent Amenity" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:39 +msgid "Parent Amenity:" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:40 +msgid "Edit Amenity" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:41 +msgid "Update Amenity" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:42 +msgid "Add New Amenity" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:43 +msgid "New Amenity" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:51 +msgctxt "slug" +msgid "amenity" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:68 +#: inc/taxonomies/class-taxonomy-neighborhood.php:42 +#: inc/taxonomies/class-taxonomy-types.php:40 +msgid "Type Metabox" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:74 +msgid "Image Icon" +msgstr "" + +#: inc/taxonomies/class-taxomony-amenities.php:75 +msgid "Select an image icon (SVG, PNG or JPEG)." +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:49 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:284 +msgid "Icon" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:50 +#: inc/taxonomies/class-taxonomy-types.php:48 +msgid "This image will display in google map" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:66 +#: inc/taxonomies/class-taxonomy-neighborhood.php:76 +msgid "Neighborhoods" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:67 +msgid "Properties By Neighborhood" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:68 +msgid "Search Neighborhoods" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:69 +msgid "All Neighborhoods" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:70 +msgid "Parent Neighborhood" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:71 +msgid "Parent Neighborhood:" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:72 +msgid "Edit Neighborhood" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:73 +msgid "Update Neighborhood" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:74 +msgid "Add New Neighborhood" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:75 +msgid "New Neighborhood" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:83 +msgid "property-neighborhood" +msgstr "" + +#: inc/taxonomies/class-taxonomy-neighborhood.php:98 +msgid "Select Neighborhoods" +msgstr "" + +#: inc/taxonomies/class-taxonomy-categories.php:45 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:237 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:205 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:226 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:206 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:206 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:237 +msgid "Categories" +msgstr "" + +#: inc/taxonomies/class-taxonomy-categories.php:47 +msgid "New Category" +msgstr "" + +#: inc/taxonomies/class-taxonomy-categories.php:53 +msgctxt "slug" +msgid "property-category" +msgstr "" + +#: inc/taxonomies/class-taxonomy-categories.php:69 +#: inc/taxonomies/class-taxonomy-labels.php:76 +#: inc/taxonomies/class-taxonomy-status.php:69 +msgid "Category Metabox" +msgstr "" + +#: inc/taxonomies/class-taxonomy-categories.php:77 +msgid "Category image" +msgstr "" + +#: inc/taxonomies/class-taxonomy-categories.php:100 +msgid "Select category" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:34 +#: inc/taxonomies/class-taxonomy-state.php:44 +msgid "States / Provinces" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:35 +msgid "Properties By State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:36 +msgid "Search States" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:37 +msgid "All States / Province" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:38 +msgid "Parent State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:39 +msgid "Parent State:" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:40 +msgid "Edit State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:41 +msgid "Update State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:42 +msgid "Add New State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:43 +msgid "New State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:51 +msgid "state" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:72 +msgid "State Metabox" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:80 +msgid "State image" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:92 +#: inc/taxonomies/class-taxonomy-city.php:88 +msgid "Select one, to add new you create in countries of estate panel" +msgstr "" + +#: inc/taxonomies/class-taxonomy-state.php:139 +msgid "State" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:39 +msgid "Properties By Label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:40 +msgid "Search Label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:41 +msgid "All Label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:42 +msgid "Parent Label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:43 +msgid "Parent Label:" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:44 +msgid "Edit Label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:45 +msgid "Update Label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:46 +msgid "Add New Label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:47 +msgid "New Label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:55 +msgid "property-label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:82 +#: inc/taxonomies/class-taxonomy-status.php:75 +msgid "Background" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:83 +#: inc/taxonomies/class-taxonomy-status.php:76 +msgid "Set background of label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:88 +#: inc/taxonomies/class-taxonomy-status.php:81 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:390 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:452 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:186 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:215 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:241 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:306 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:347 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:257 +msgid "Color" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:89 +msgid "Set color of text" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:95 +msgid "Image Logo" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:96 +msgid "Or Using Image Logo without using text" +msgstr "" + +#: inc/taxonomies/class-taxonomy-labels.php:135 +msgid "Select Label" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:35 +#: inc/taxonomies/class-taxonomy-city.php:45 +msgid "Cities / Towns" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:36 +msgid "Properties By City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:37 +msgid "Search Cities / Towns" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:38 +msgid "All Cities / Town" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:39 +msgid "Parent City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:40 +msgid "Parent City:" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:41 +msgid "Edit City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:42 +msgid "Update City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:43 +msgid "Add New City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:44 +msgid "New City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:52 +msgid "city" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:69 +msgid "City Metabox" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:76 +msgid "City image" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:97 +msgid "Select one, to add new you create in City/Town of estate panel" +msgstr "" + +#: inc/taxonomies/class-taxonomy-city.php:146 +msgid "City" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:47 +msgid "Custom Icon Marker" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:59 +msgid "Type image" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:76 +msgid "Properties By Type" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:77 +msgid "Search Types" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:78 +msgid "All Types" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:79 +msgid "Parent Type" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:80 +msgid "Parent Type:" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:81 +msgid "Edit Type" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:82 +msgid "Update Type" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:83 +msgid "Add New Type" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:84 +msgid "New Type" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:92 +msgid "type" +msgstr "" + +#: inc/taxonomies/class-taxonomy-types.php:111 +msgid "Select Type" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:36 +msgid "Properties By Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:37 +msgid "Search Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:38 +msgid "All Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:39 +msgid "Parent Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:40 +msgid "Parent Status:" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:41 +msgid "Edit Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:42 +msgid "Update Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:43 +msgid "Add New Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:44 +msgid "New Status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:51 +msgid "status" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:82 +msgid "Set background of text" +msgstr "" + +#: inc/taxonomies/class-taxonomy-status.php:141 +msgid "Select Status" +msgstr "" + +#: inc/email/class-opalestate-email-notifycation.php:34 +msgid "You got a message enquiry" +msgstr "" + +#: inc/email/class-opalestate-request-viewing.php:31 +#, php-format +msgid "You have a message request reviewing: %s at" +msgstr "" + +#: inc/email/class-opalestate-abs-email-template.php:43 +msgid "Admin Notice of Expiring Job Listings" +msgstr "" + +#: inc/email/class-opalestate-abs-email-template.php:53 +msgid "Send notices to the site administrator before a job listing expires." +msgstr "" + +#. Widget name will appear in UI +#: inc/widgets/featured-properties.php:22 +msgid "Estate: Featured Properties" +msgstr "" + +#: inc/widgets/featured-properties.php:24 +msgid "Featured Properties widget." +msgstr "" + +#: inc/widgets/featured-properties.php:52 +#: templates/single-agent/featured-properties.php:19 +#: templates/user/dashboard.php:19 +msgid "Featured Properties" +msgstr "" + +#: inc/widgets/featured-properties.php:57 +#: inc/widgets/sameprice-properties.php:58 +#: inc/widgets/similar-properties.php:56 inc/widgets/profile-info.php:80 +#: inc/widgets/search-properties.php:68 inc/widgets/mortgage-calculator.php:53 +msgid "Title:" +msgstr "" + +#: inc/widgets/featured-properties.php:62 +#: inc/widgets/sameprice-properties.php:63 +#: inc/widgets/similar-properties.php:61 +msgid "Limit:" +msgstr "" + +#. Widget name will appear in UI +#: inc/widgets/sameprice-properties.php:22 +msgid "Estate: Same Price" +msgstr "" + +#: inc/widgets/sameprice-properties.php:24 +msgid "Similar Properties By Same Price with configured range and Status" +msgstr "" + +#: inc/widgets/sameprice-properties.php:52 +msgid "Same Price" +msgstr "" + +#: inc/widgets/sameprice-properties.php:69 +msgid "Range Price:" +msgstr "" + +#. Widget name will appear in UI +#: inc/widgets/similar-properties.php:22 +msgid "Estate: Similar Properties" +msgstr "" + +#: inc/widgets/similar-properties.php:24 +msgid "Similar Properties By Same Types and Status Of the post" +msgstr "" + +#: inc/widgets/similar-properties.php:51 +msgid "Similar Properties" +msgstr "" + +#. Widget name will appear in UI +#: inc/widgets/profile-info.php:22 +msgid "Estate: User Menu Profile" +msgstr "" + +#: inc/widgets/profile-info.php:24 +msgid "Display Profile information in box and menu." +msgstr "" + +#: inc/widgets/profile-info.php:76 +msgid "My Profile" +msgstr "" + +#. Widget name will appear in UI +#: inc/widgets/search-properties.php:23 +msgid "Estate: Search Properties" +msgstr "" + +#: inc/widgets/search-properties.php:25 +msgid "Search Properties widget." +msgstr "" + +#: inc/widgets/search-properties.php:83 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:107 +msgid "Disable Labels" +msgstr "" + +#: inc/widgets/search-properties.php:92 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:116 +msgid "Disable Search button" +msgstr "" + +#: inc/widgets/search-properties.php:101 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:124 +msgid "Display Country select" +msgstr "" + +#: inc/widgets/search-properties.php:110 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:136 +msgid "Display State select" +msgstr "" + +#: inc/widgets/search-properties.php:119 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:147 +msgid "Display City select" +msgstr "" + +#. Widget name will appear in UI +#: inc/widgets/mortgage-calculator.php:25 +msgid "Estate: Mortgage Calculator" +msgstr "" + +#: inc/widgets/mortgage-calculator.php:27 +msgid "Mortgage Calculator widget." +msgstr "" + +#: inc/widgets/mortgage-calculator.php:49 +msgid "Mortgage Calculator" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:93 +msgid "Submission Form" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:110 +msgid "Submission Page" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:125 +msgid "Submission Page Settings" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:132 +msgid "" +"This is the submission page. The [opalestate_submission] " +"shortcode should be on this page." +msgstr "" + +#: inc/submission/class-opalestate-submission.php:142 +msgid "Show Content Use Not Login" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:143 +msgid "Show Login/Register form and submission form if user not logined" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:148 +msgid "Show Login Form" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:149 +msgid "Show Login Form and Submission Form" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:154 +msgid "Enable Admin Approve" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:155 +msgid "" +"the Property will be auto approve when user submit, if you do not enable it." +msgstr "" + +#: inc/submission/class-opalestate-submission.php:160 +msgid "Enable Require Price" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:161 +msgid "Enable or Disable require user enter price and price label." +msgstr "" + +#: inc/submission/class-opalestate-submission.php:167 +msgid "Submission Tab Settings" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:174 +#: inc/submission/class-opalestate-submission.php:175 +msgid "Enable Media tab" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:184 +#: inc/submission/class-opalestate-submission.php:185 +msgid "Enable Location tab" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:194 +#: inc/submission/class-opalestate-submission.php:195 +msgid "Enable Information tab" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:204 +#: inc/submission/class-opalestate-submission.php:205 +msgid "Enable Amenities tab" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:214 +#: inc/submission/class-opalestate-submission.php:215 +msgid "Enable Facilities tab" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:224 +#: inc/submission/class-opalestate-submission.php:225 +msgid "Enable Apartments tab" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:234 +#: inc/submission/class-opalestate-submission.php:235 +msgid "Enable Floor plans tab" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:267 +msgid "Edit My Property" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:333 +msgid "A metabox with the specified 'metabox_id' doesn't exist." +msgstr "" + +#: inc/submission/class-opalestate-submission.php:460 +msgid "Please enter data for all require fields before submitting" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:462 +#: inc/submission/class-opalestate-submission.php:527 +#: inc/submission/class-opalestate-submission.php:534 +#: inc/submission/class-opalestate-submission.php:541 +#: inc/vendors/opalmembership/membership.php:426 +msgid "Submission Information" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:501 +msgid "Property has been successfully updated." +msgstr "" + +#: inc/submission/class-opalestate-submission.php:507 +msgid "The property has updated completed with new information" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:511 +msgid "You have submitted the property successful" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:533 +msgid "" +"Currently, your account was blocked, please keep contact admin to resolve " +"this!." +msgstr "" + +#: inc/submission/class-opalestate-submission.php:540 +msgid "Sorry! Your submitted datcould not save a at this time" +msgstr "" + +#: inc/submission/class-opalestate-submission.php:680 +msgid "Property has been successfully removed." +msgstr "" + +#: inc/submission/class-opalestate-submission.php:682 +msgid "An error occured when removing an item." +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:63 +msgid "Media" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:67 +msgid "Facilities" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:69 +msgid "Floor plans" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:100 +#: inc/vendors/elementor/widgets/opalestate-form-builder.php:87 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:214 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:182 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:203 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:214 +msgid "Title" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:144 +msgid "Statuses" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:163 +#: inc/submission/class-metabox-property-submission.php:227 +#: inc/submission/class-metabox-property-submission.php:344 +#: inc/submission/class-metabox-property-submission.php:406 +#: inc/submission/class-metabox-property-submission.php:422 +#: inc/submission/class-metabox-property-submission.php:440 +#: inc/submission/class-metabox-property-submission.php:483 +#: inc/submission/class-metabox-property-submission.php:675 +msgid "Next Step" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:184 +msgid "Featured Image" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:210 +#: templates/single-property/virtualtour.php:8 +msgid "360° Virtual Tour" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:226 +msgid "Previous Step " +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:343 +#: inc/submission/class-metabox-property-submission.php:405 +#: inc/submission/class-metabox-property-submission.php:421 +#: inc/submission/class-metabox-property-submission.php:439 +#: inc/submission/class-metabox-property-submission.php:482 +#: inc/submission/class-metabox-property-submission.php:557 +#: inc/submission/class-metabox-property-submission.php:674 +msgid "Previous Step" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:363 +msgid "States / Province" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:397 +msgid "Enable Google Map" +msgstr "" + +#: inc/submission/class-metabox-property-submission.php:401 +msgid "Google Map" +msgstr "" + +#: templates/messages/request-reviewing-form.php:10 +#: templates/messages/request-reviewing-form.php:11 +msgid "Send now" +msgstr "" + +#: templates/messages/enquiry-form.php:4 +#, php-format +msgid "Hi, I am interested in %s (Property ID: %s)" +msgstr "" + +#: templates/messages/enquiry-form.php:7 +msgid "Enquire about property" +msgstr "" + +#: templates/messages/enquiry-form.php:23 +#: templates/messages/enquiry-form.php:38 +#: templates/messages/contact-form.php:37 +#: templates/user/share-search-form.php:50 +#: templates/user-search/render-form.php:33 +msgid " Processing" +msgstr "" + +#: templates/messages/enquiry-form.php:23 +#: templates/messages/enquiry-form.php:38 +#: templates/messages/contact-form.php:37 +#: templates/user/share-search-form.php:50 +#: templates/user/agency/agency-team.php:45 +msgid "Send message" +msgstr "" + +#: templates/messages/contact-form.php:13 +msgid "Contact Me" +msgstr "" + +#: templates/rating/opalestate-ratings.php:64 +msgid "Ratings & Reviews" +msgstr "" + +#: templates/rating/opalestate-ratings.php:79 +msgid "star" +msgstr "" + +#: templates/rating/opalestate-ratings.php:106 +msgid "Overall rating" +msgstr "" + +#. %s number of ratings +#: templates/rating/opalestate-ratings.php:118 +#, php-format +msgctxt "rating numbers" +msgid "%s rating" +msgid_plural "%s ratings" +msgstr[0] "" +msgstr[1] "" + +#: templates/rating/opalestate-ratings.php:132 +msgid "based on all ratings" +msgstr "" + +#: templates/rating/opalestate-ratings.php:207 +msgid "There are no reviews yet." +msgstr "" + +#. %s is property title +#: templates/rating/opalestate-ratings.php:230 +msgid "Add a review" +msgstr "" + +#: templates/rating/opalestate-ratings.php:230 +#, php-format +msgid "Be the first to review “%s”" +msgstr "" + +#. %s is property title +#: templates/rating/opalestate-ratings.php:232 +#, php-format +msgid "Leave a Reply to %s" +msgstr "" + +#: templates/rating/opalestate-ratings.php:242 +msgid "Submit" +msgstr "" + +#: templates/rating/opalestate-ratings.php:251 +#: templates/rating/opalestate-ratings.php:263 +msgid "Rate…" +msgstr "" + +#: templates/rating/opalestate-ratings.php:252 +#: templates/rating/opalestate-ratings.php:264 +msgid "Perfect" +msgstr "" + +#: templates/rating/opalestate-ratings.php:253 +#: templates/rating/opalestate-ratings.php:265 +msgid "Good" +msgstr "" + +#: templates/rating/opalestate-ratings.php:254 +#: templates/rating/opalestate-ratings.php:266 +msgid "Average" +msgstr "" + +#: templates/rating/opalestate-ratings.php:255 +#: templates/rating/opalestate-ratings.php:267 +msgid "Not that bad" +msgstr "" + +#: templates/rating/opalestate-ratings.php:256 +#: templates/rating/opalestate-ratings.php:268 +msgid "Very poor" +msgstr "" + +#: templates/rating/opalestate-ratings.php:262 +msgid "Your rating" +msgstr "" + +#: templates/rating/opalestate-ratings.php:272 +msgid "Your review" +msgstr "" + +#: templates/rating/opalestate-ratings.php:280 +msgid "Your review already exists!" +msgstr "" + +#: templates/rating/opalestate-ratings.php:283 +msgid "You cannot write review on your own post." +msgstr "" + +#: templates/rating/opalestate-ratings.php:287 +msgid "You must be logged in to review." +msgstr "" + +#: templates/rating/opalestate-ratings.php:288 +msgid "Click here to login" +msgstr "" + +#: templates/rating/review-meta.php:14 +msgid "Your review is awaiting approval" +msgstr "" + +#: templates/single-agent/author-box.php:34 +msgid "Agent details" +msgstr "" + +#: templates/single-agent/author-box.php:125 +msgid "View Profile" +msgstr "" + +#: templates/emails/publish_property.php:14 +msgid "URL" +msgstr "" + +#: templates/elementor-templates/opalestate-split-maps-search.php:12 +msgid "Loading map..." +msgstr "" + +#: templates/elementor-templates/opalestate-office-agent-search.php:14 +msgid "Find An Agent" +msgstr "" + +#: templates/elementor-templates/opalestate-office-agent-search.php:19 +msgid "Find An Agency" +msgstr "" + +#: templates/user/share-search-form.php:8 +#: templates/user-search/render-form.php:8 +#, php-format +msgid "" +"Hey there! I saved this search on %s, please check out these homes that are " +"listed. Remember to save this search to be first to catch any new listings." +msgstr "" + +#: templates/user/share-search-form.php:14 +msgid "Share this Search" +msgstr "" + +#: templates/user/share-search-form.php:23 +msgid "Are you searching with anyone? Share this search." +msgstr "" + +#: templates/user/share-search-form.php:31 +msgid "Friend Email" +msgstr "" + +#: templates/user/share-search-form.php:40 +msgid "E-mail" +msgstr "" + +#: templates/user/dashboard.php:26 +msgid "Pending Properties" +msgstr "" + +#: templates/user/dashboard.php:57 templates/user/property-ratings.php:11 +msgid "You have not written any reviews yet." +msgstr "" + +#: templates/user/content-property.php:71 +msgid "Set Featured" +msgstr "" + +#: templates/user/content-property.php:87 +msgid "Are you sure you wish to delete?" +msgstr "" + +#: templates/user/content-property.php:88 +msgid "Delete Property" +msgstr "" + +#: templates/user/my-account-popup.php:4 templates/user/my-account.php:4 +#: templates/user/login-form.php:16 templates/user/login-form.php:51 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:531 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:532 +msgid "Login" +msgstr "" + +#: templates/user/my-account-popup.php:5 templates/user/register-form.php:31 +#: templates/user/register-form.php:93 templates/user/my-account.php:5 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:504 +msgid "Register" +msgstr "" + +#: templates/user/favorite-properties.php:24 +msgid "You have not added any property as favorite." +msgstr "" + +#: templates/user/favorite-button.php:12 +msgid "Add To Favorite" +msgstr "" + +#: templates/user/read-messages.php:7 +msgid "Inbox" +msgstr "" + +#: templates/user/read-messages.php:45 +msgid "Reply" +msgstr "" + +#: templates/user/register-form.php:22 templates/user/login-form.php:7 +msgid "You are currently logged in." +msgstr "" + +#: templates/user/register-form.php:50 +msgid "Email address" +msgstr "" + +#: templates/user/register-form.php:57 templates/user/login-form.php:34 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:516 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:517 +msgid "Password" +msgstr "" + +#: templates/user/register-form.php:62 +msgid "Repeat-Password" +msgstr "" + +#: templates/user/register-form.php:80 +msgid "I agree with" +msgstr "" + +#: templates/user/register-form.php:81 +msgid "terms & conditions" +msgstr "" + +#: templates/user/profile.php:22 +msgid "Edit User Profile" +msgstr "" + +#: templates/user/profile.php:30 templates/user/profile.php:50 +#: templates/user/agency/profile-agency.php:32 +#: templates/user/agent/profile-agent.php:16 +msgid "Save Change" +msgstr "" + +#: templates/user/profile.php:41 +msgid "Change Password" +msgstr "" + +#: templates/user/my-properties.php:4 +msgid "Published" +msgstr "" + +#: templates/user/my-properties.php:5 +msgid "Pending" +msgstr "" + +#: templates/user/my-properties.php:6 +#: inc/vendors/opalmembership/membership.php:594 +#: inc/vendors/opalmembership/membership.php:603 +msgid "Expired" +msgstr "" + +#: templates/user/my-properties.php:47 +msgid "You have not submited any property." +msgstr "" + +#: templates/user/messages.php:9 +msgid "Messages for you" +msgstr "" + +#: templates/user/login-form.php:27 +msgid "Username or email address" +msgstr "" + +#: templates/user/login-form.php:42 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:523 +msgid "Remember me" +msgstr "" + +#: templates/user/login-form.php:52 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:542 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:542 +msgid "Lost your password?" +msgstr "" + +#: templates/user/login-form.php:56 +msgid "Register now!" +msgstr "" + +#: templates/shortcodes/ajax-map-quick-search.php:23 +#: templates/parts/search-agents-form-address.php:36 +#: templates/parts/search-agents-form.php:55 +#: templates/parts/search-agency-form-address.php:37 +#: templates/parts/search-agency-form.php:28 +#: templates/search-box/fields/submit-button.php:2 +msgid "Search" +msgstr "" + +#: templates/shortcodes/search-properties-result.php:28 +#: templates/shortcodes/ajax-map-search-result.php:19 +#: templates/parts/archive-simple-bars.php:6 +#, php-format +msgid "Found %s Properties" +msgstr "" + +#: templates/shortcodes/ajax-map-search.php:35 +msgid "More" +msgstr "" + +#: templates/shortcodes/ajax-map-search.php:44 +msgid "Any" +msgstr "" + +#: templates/shortcodes/ajax-map-search.php:63 +#: templates/single-property/meta.php:13 templates/single-property/price.php:9 +#: templates/single-property/floor-plans.php:42 +#: templates/parts/search-agents-form.php:46 +msgid "Price:" +msgstr "" + +#: templates/shortcodes/ajax-map-search.php:76 +msgid "Apply" +msgstr "" + +#: templates/shortcodes/submission-form.php:52 +#: templates/submission/submission-form.php:39 +#: templates/submission/submission-form.php:40 +msgid "Save property" +msgstr "" + +#: templates/single-property/sharebox.php:28 +msgid "Share on facebook" +msgstr "" + +#: templates/single-property/sharebox.php:35 +msgid "Share on Twitter" +msgstr "" + +#: templates/single-property/sharebox.php:42 +msgid "Share on LinkedIn" +msgstr "" + +#: templates/single-property/sharebox.php:49 +msgid "Share on Tumblr" +msgstr "" + +#: templates/single-property/sharebox.php:57 +msgid "Share on Google plus" +msgstr "" + +#: templates/single-property/sharebox.php:65 +msgid "Share on Pinterest" +msgstr "" + +#: templates/single-property/sharebox.php:72 +msgid "Email to a Friend" +msgstr "" + +#: templates/single-property/map.php:16 +msgid "Property on Map" +msgstr "" + +#: templates/single-property/map.php:28 templates/single-property/map-v2.php:25 +#: templates/single-property/preview/tabs.php:20 +msgid "Street View" +msgstr "" + +#: templates/single-property/map.php:47 templates/single-property/map-v2.php:49 +#: templates/single-property/preview/tabs.php:43 +#: templates/single-property/preview/map.php:17 +msgid "Hospital" +msgstr "" + +#: templates/single-property/map.php:53 templates/single-property/map-v2.php:55 +#: templates/single-property/preview/tabs.php:49 +#: templates/single-property/preview/map.php:23 +msgid "Library" +msgstr "" + +#: templates/single-property/map.php:59 templates/single-property/map-v2.php:61 +#: templates/single-property/preview/tabs.php:55 +#: templates/single-property/preview/map.php:29 +msgid "Pharmacy" +msgstr "" + +#: templates/single-property/map.php:66 templates/single-property/map-v2.php:68 +#: templates/single-property/preview/tabs.php:62 +#: templates/single-property/preview/map.php:36 +msgid "School" +msgstr "" + +#: templates/single-property/map.php:79 templates/single-property/map-v2.php:81 +#: templates/single-property/preview/tabs.php:75 +#: templates/single-property/preview/map.php:49 +msgid "Trainstation" +msgstr "" + +#: templates/single-property/attachments.php:21 +msgid "Download" +msgstr "" + +#. %s: Name of current post +#: templates/single-property/content.php:6 +#, php-format +msgid "Continue reading %s " +msgstr "" + +#: templates/single-property/sameagent.php:8 +#, php-format +msgid "Properties by %s" +msgstr "" + +#: templates/single-property/information.php:9 +msgid "Quick Information" +msgstr "" + +#: templates/single-property/information.php:15 +msgid "Type:" +msgstr "" + +#: templates/single-property/price.php:12 +msgid "Sale Price:" +msgstr "" + +#: templates/single-property/map-v2.php:20 +msgid "Picture" +msgstr "" + +#: templates/single-property/walkscore.php:12 +#: templates/single-property/walkscore.php:22 +msgid "Walk Scores" +msgstr "" + +#: templates/single-property/walkscore.php:25 +#: templates/single-property/walkscore.php:38 +msgid "more details here" +msgstr "" + +#: templates/single-property/walkscore.php:35 +msgid "Transit Scores" +msgstr "" + +#: templates/single-property/walkscore.php:48 +msgid "Bikeable Scores" +msgstr "" + +#: templates/single-property/walkscore.php:51 +msgid "More details here" +msgstr "" + +#: templates/single-property/floor-plans.php:22 +#: templates/single-property/floor-plans.php:34 +#, php-format +msgid "Plan %s" +msgstr "" + +#: templates/single-property/floor-plans.php:49 +msgid "Size:" +msgstr "" + +#: templates/single-property/floor-plans.php:56 +msgid "Rooms:" +msgstr "" + +#: templates/single-property/floor-plans.php:63 +msgid "Baths:" +msgstr "" + +#: templates/single-property/views-statistics.php:16 +#: templates/single-property/views-statistics.php:28 +msgid "Page Views Statistics" +msgstr "" + +#: templates/single-property/nearby.php:27 +msgid "What's nearby" +msgstr "" + +#: templates/single-property/apartments.php:24 +msgid "Price From" +msgstr "" + +#: templates/single-property/apartments.php:43 +msgid "view" +msgstr "" + +#: templates/user-search/content-savedsearch.php:9 +msgid "My Saved Searches" +msgstr "" + +#: templates/user-search/content-savedsearch.php:12 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:211 +msgid "View" +msgstr "" + +#: templates/user-search/content-savedsearch.php:12 +msgid "Delete" +msgstr "" + +#: templates/user-search/content-savedsearch.php:22 +msgid "Are you sure to delete this?" +msgstr "" + +#: templates/user-search/content-savedsearch.php:37 +msgid "No Item In Saved Searches" +msgstr "" + +#: templates/user-search/content-savedsearch.php:38 +msgid "You have not added any search data." +msgstr "" + +#: templates/user-search/render-form.php:12 +msgid "Save search" +msgstr "" + +#: templates/user-search/render-form.php:21 +msgid "Name this search." +msgstr "" + +#: templates/user-search/render-form.php:33 +msgid "Save" +msgstr "" + +#: templates/single-agency/properties.php:28 +msgid "Load More" +msgstr "" + +#: templates/single-agency/properties.php:35 +msgid "My Agency has not any property yet." +msgstr "" + +#: templates/single-agency/author-box.php:41 +msgid "Agency avatar" +msgstr "" + +#: templates/parts/membership-pricing-info.php:12 +#: templates/parts/membership-pricing-info.php:14 +msgid " Listings" +msgstr "" + +#: templates/parts/membership-pricing-info.php:14 +#: templates/parts/membership-pricing-info.php:23 +#: inc/vendors/opalmembership/membership.php:493 +#: inc/vendors/opalmembership/membership.php:494 +msgid "Unlimited" +msgstr "" + +#: templates/parts/membership-pricing-info.php:21 +#: templates/parts/membership-pricing-info.php:23 +msgid " Featured" +msgstr "" + +#: templates/parts/not-allowed.php:8 +msgid "You are not allowed to access this page." +msgstr "" + +#: templates/parts/search-agents-form-address.php:16 +#: templates/parts/search-agents-form.php:20 +#: templates/parts/search-agency-form-address.php:16 +msgid "Find an experienced agent with:" +msgstr "" + +#: templates/parts/search-agents-form-address.php:19 +#: templates/parts/search-agents-form.php:23 +#: templates/parts/search-agency-form-address.php:19 +msgid "Who sale between:" +msgstr "" + +#: templates/parts/membership-warning.php:3 +msgid "" +"Your package has 0 left listing, you could not add any more. Please upgrade " +"now" +msgstr "" + +#: templates/parts/membership-warning.php:4 +msgid "Click to this link to see plans" +msgstr "" + +#: templates/parts/property-loop-price.php:15 +msgid "Call to Price" +msgstr "" + +#: templates/parts/property-loop-price.php:34 +msgid "Contact Property" +msgstr "" + +#: templates/parts/property-types.php:4 +msgid "Types:" +msgstr "" + +#: templates/parts/has-warning.php:3 +msgid "" +"Hi! you could not edit/create a property at this time, you have not " +"permission to do." +msgstr "" + +#: templates/parts/mortgage-calculator.php:23 +#: templates/parts/mortgage-calculator.php:132 +msgid "Loan Amount" +msgstr "" + +#: templates/parts/mortgage-calculator.php:24 +#: templates/parts/mortgage-calculator.php:125 +msgid "Your payment" +msgstr "" + +#: templates/parts/mortgage-calculator.php:104 +msgid "Mortgage Payment Calculator" +msgstr "" + +#: templates/parts/mortgage-calculator.php:129 +msgid "month" +msgstr "" + +#: templates/parts/mortgage-calculator.php:139 +msgid "Your price" +msgstr "" + +#: templates/parts/mortgage-calculator.php:140 +msgid "Your deposit" +msgstr "" + +#: templates/parts/mortgage-calculator.php:141 +msgid "Your interest" +msgstr "" + +#: templates/parts/mortgage-calculator.php:157 +msgid "Deposit" +msgstr "" + +#: templates/parts/mortgage-calculator.php:163 +msgid "Annual Interest" +msgstr "" + +#: templates/parts/mortgage-calculator.php:169 +msgid "Years" +msgstr "" + +#: templates/parts/mortgage-calculator.php:174 +msgid "" +"All calculation are based on tentative and estimated figure and shall not " +"replace any financial advice" +msgstr "" + +#: templates/parts/property-categories.php:4 +msgid "Categories:" +msgstr "" + +#: templates/parts/search-agency-form.php:21 +msgid "Enter Agency Name" +msgstr "" + +#: templates/submission/submission-completed.php:8 +#: templates/submission/require-login.php:8 +msgid "" +"Login in allowing you to edit your property or submit a property, save " +"favorite real estate." +msgstr "" + +#: templates/submission/submission-completed.php:9 +#: templates/submission/require-login.php:9 +msgid "Login Now" +msgstr "" + +#: templates/submission/completed.php:11 templates/submission/completed.php:19 +#, php-format +msgid "Click to %s here %s to back to your listing or %s edit %s this." +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:49 +msgid "Social Login" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:64 +#: inc/vendors/social-login/class-opalestate-social-login.php:65 +msgid "Enable Google login" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:75 +msgid "Google Client ID" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:76 +msgid "Google Client ID is required for Google Login." +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:81 +msgid "Google Client Secret" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:82 +msgid "Google Client Secret is required for Google Login." +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:87 +msgid "Google API key" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:88 +msgid "Google API key is required for Google Login." +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:101 +#: inc/vendors/social-login/class-opalestate-social-login.php:102 +msgid "Enable Facebook login" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:112 +msgid "Facebook Application ID" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:113 +msgid "Facebook Application ID is required for Facebook login." +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:118 +msgid "Facebook Secret" +msgstr "" + +#: inc/vendors/social-login/class-opalestate-social-login.php:119 +msgid "Facebook Secret is required for Facebook login." +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:154 +msgid "Carousel Options" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:167 +msgid "Slides to Show" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:170 +msgid "Default" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:179 +msgid "Slides to Scroll" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:181 +msgid "Set how many slides are scrolled per swipe." +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:195 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:333 +msgid "Navigation" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:199 +msgid "Arrows and Dots" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:200 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:342 +msgid "Arrows" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:201 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:404 +msgid "Dots" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:222 +msgid "Carousel Additional Options" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:230 +msgid "Pause on Hover" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:244 +msgid "Autoplay" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:258 +msgid "Autoplay Speed" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:268 +msgid "Infinite Loop" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:282 +msgid "Effect" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:286 +msgid "Slide" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:287 +msgid "Fade" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:299 +msgid "Animation Speed" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:309 +msgid "Direction" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:313 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:349 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:357 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:378 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:224 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:349 +msgid "Left" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:314 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:357 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:365 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:386 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:232 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:357 +msgid "Right" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:354 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:416 +msgid "Position" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:358 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:421 +msgid "Inside" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:359 +#: inc/vendors/elementor/class-opalestate-elementor-widget-base.php:420 +msgid "Outside" +msgstr "" + +#: inc/vendors/elementor/class-opalestate-elementor-extended.php:78 +msgid "Opal Estate" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:179 +msgid "Could not allow uploading image" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:207 +#: inc/vendors/opalmembership/membership.php:568 +msgid "Number Of Properties" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:216 +#: inc/vendors/opalmembership/membership.php:577 +msgid "" +"Number of properties with this package. If not set it will be unlimited." +msgstr "" + +#: inc/vendors/opalmembership/membership.php:220 +#: inc/vendors/opalmembership/membership.php:581 +msgid "Number Of Featured Properties" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:229 +#: inc/vendors/opalmembership/membership.php:590 +msgid "Number of properties can make featured with this package." +msgstr "" + +#: inc/vendors/opalmembership/membership.php:233 +msgid " Unlimited listings ?" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:237 +msgid "" +"No, it is not unlimited, If not set it will be unlimited. Number of " +"properties can make featured with this package." +msgstr "" + +#: inc/vendors/opalmembership/membership.php:252 +msgid "My Membership" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:259 +msgid "My Invoices" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:266 +msgid "Renew membership" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:424 +msgid "" +"Your membership package is expired or Your package has 0 left listing, " +"please upgrade now." +msgstr "" + +#: inc/vendors/opalmembership/membership.php:493 +#: inc/vendors/opalmembership/membership.php:497 +msgid "(Package) Listings Included:" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:494 +#: inc/vendors/opalmembership/membership.php:498 +msgid "(Package) Featured Included:" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:500 +msgid "Listings Remaining:" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:501 +msgid "Featured Remaining:" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:546 +msgid "Membership Package" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:553 +msgid "Package" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:562 +msgid "Set package ID with -1 as free package." +msgstr "" + +#: inc/vendors/opalmembership/membership.php:563 +msgid "Membership Information" +msgstr "" + +#: inc/vendors/opalmembership/membership.php:599 +#: inc/vendors/opalmembership/membership.php:607 +msgid "Show expired time in double format." +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:22 +msgid "Free Submission" +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:29 +msgid "Enable Free Submission" +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:30 +msgid "Allow set automatic a free package." +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:39 +msgid "Number Free Listing" +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:40 +msgid "Maximum number of Free Listing that users can submit." +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:49 +msgid "Number Free Featured" +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:50 +msgid "Maximum number of Free Featured that users can set." +msgstr "" + +#: inc/vendors/opalmembership/free-package.php:90 +msgid "Free membership" +msgstr "" + +#: inc/admin/settings/email.php:28 inc/admin/settings/general.php:28 +#: inc/admin/settings/general.php:42 +msgid "General Settings" +msgstr "" + +#: inc/admin/settings/property.php:22 +msgid "Search Page" +msgstr "" + +#: inc/admin/settings/property.php:23 +msgid "Single Page" +msgstr "" + +#: inc/admin/settings/property.php:50 +msgid "Property Settings" +msgstr "" + +#: inc/admin/settings/property.php:60 +msgid "Enable User Submission" +msgstr "" + +#: inc/admin/settings/property.php:61 +msgid "Enable to allow user post/submit properties in front-end" +msgstr "" + +#: inc/admin/settings/property.php:82 +msgid "Show Meta Information in Grid and Single Page" +msgstr "" + +#: inc/admin/settings/property.php:89 +msgid "Archive Grid layout" +msgstr "" + +#: inc/admin/settings/property.php:96 +msgid "Archive List layout" +msgstr "" + +#: inc/admin/settings/property.php:118 +msgid "User Share Search" +msgstr "" + +#: inc/admin/settings/property.php:119 +msgid "Display Share Search Link Management" +msgstr "" + +#: inc/admin/settings/property.php:129 +msgid "User Saved Search" +msgstr "" + +#: inc/admin/settings/property.php:130 +msgid "Display Save Search Link Management" +msgstr "" + +#: inc/admin/settings/property.php:141 +msgid "Search Properties Page" +msgstr "" + +#: inc/admin/settings/property.php:142 +msgid "" +"This is page to display result of properties after user searching via form." +msgstr "" + +#: inc/admin/settings/property.php:154 +msgid "Properties Per Page" +msgstr "" + +#: inc/admin/settings/property.php:155 +msgid "Enter min of properties display in search page" +msgstr "" + +#: inc/admin/settings/property.php:166 +msgid "Show Featured First" +msgstr "" + +#: inc/admin/settings/property.php:168 +msgid "Show featured first in page result, as default Newest is showed" +msgstr "" + +#: inc/admin/settings/property.php:177 +msgid "Minimum of Search Price" +msgstr "" + +#: inc/admin/settings/property.php:178 +msgid "Enter minimum of price for starting search" +msgstr "" + +#: inc/admin/settings/property.php:187 +msgid "Maximum of Search Price" +msgstr "" + +#: inc/admin/settings/property.php:188 +msgid "Enter maximum of price for starting search" +msgstr "" + +#: inc/admin/settings/property.php:199 +msgid "Minimum of Search Aea" +msgstr "" + +#: inc/admin/settings/property.php:200 +msgid "Enter minimum of area for starting search" +msgstr "" + +#: inc/admin/settings/property.php:209 +msgid "Maximum of Search Aea" +msgstr "" + +#: inc/admin/settings/property.php:210 +msgid "Enter maximum of area for starting search" +msgstr "" + +#: inc/admin/settings/property.php:220 +msgid "Search Grid layout" +msgstr "" + +#: inc/admin/settings/property.php:227 +msgid "Search List layout" +msgstr "" + +#: inc/admin/settings/property.php:234 +msgid "Horizontal Search Fields" +msgstr "" + +#: inc/admin/settings/property.php:235 +msgid "Disable or enable fields appearing in search form" +msgstr "" + +#: inc/admin/settings/property.php:243 inc/admin/settings/property.php:273 +msgid "Show Price" +msgstr "" + +#: inc/admin/settings/property.php:265 +msgid "Vertical Search Fields" +msgstr "" + +#: inc/admin/settings/property.php:306 +msgid "Show Amenities tab" +msgstr "" + +#: inc/admin/settings/property.php:307 +msgid "Show Amenities tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:317 +msgid "Show Facilities tab" +msgstr "" + +#: inc/admin/settings/property.php:318 +msgid "Show Facilities tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:328 +msgid "Show Attachments tab" +msgstr "" + +#: inc/admin/settings/property.php:329 +msgid "Show Attachments tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:339 +msgid "Show Video tab" +msgstr "" + +#: inc/admin/settings/property.php:340 +msgid "Show Video tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:350 +msgid "Show Map tab" +msgstr "" + +#: inc/admin/settings/property.php:351 +msgid "Show Map tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:361 +msgid "Show Nearby tab" +msgstr "" + +#: inc/admin/settings/property.php:362 +msgid "Show Nearby tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:372 +msgid "Show Walk Scores tab" +msgstr "" + +#: inc/admin/settings/property.php:373 +msgid "Show Walk Scores tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:383 +msgid "Show Apartments tab" +msgstr "" + +#: inc/admin/settings/property.php:384 +msgid "Show Apartments tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:394 +msgid "Show Floor Plans tab" +msgstr "" + +#: inc/admin/settings/property.php:395 +msgid "Show Floor Plans tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:405 +msgid "Show Views Statistics tab" +msgstr "" + +#: inc/admin/settings/property.php:406 +msgid "Show Views Statistics tab in the single property page." +msgstr "" + +#: inc/admin/settings/property.php:416 +msgid "Views Statistics time limit (days)" +msgstr "" + +#: inc/admin/settings/property.php:417 +msgid "The number of days will be saved to the database." +msgstr "" + +#: inc/admin/settings/property.php:429 +msgid "Related properties layout" +msgstr "" + +#: inc/admin/settings/property.php:430 +msgid "Select a layout for related properties." +msgstr "" + +#: inc/admin/settings/property.php:437 +msgid "Nearby properties layout" +msgstr "" + +#: inc/admin/settings/property.php:438 +msgid "Select a layout for nearby properties." +msgstr "" + +#: inc/admin/settings/general.php:51 +msgid "User Management Page" +msgstr "" + +#: inc/admin/settings/general.php:52 +msgid "" +"This is page use User Management Page using for show content of management " +"page such as profile, my properties" +msgstr "" + +#: inc/admin/settings/general.php:58 +msgid "My Account Page" +msgstr "" + +#: inc/admin/settings/general.php:59 +msgid "This is page use User login and register an account, or reset password." +msgstr "" + +#: inc/admin/settings/general.php:65 +msgid "Enable Message Database" +msgstr "" + +#: inc/admin/settings/general.php:66 +msgid "" +"Allow User send message Contact/Equire via email and saved into database to " +"exchange theirs message direct in User Message Management" +msgstr "" + +#: inc/admin/settings/general.php:77 +msgid "Maximun Upload Image Size" +msgstr "" + +#: inc/admin/settings/general.php:78 inc/admin/settings/general.php:86 +msgid "Set maximun volumn size having < x MB" +msgstr "" + +#: inc/admin/settings/general.php:85 +msgid "Maximun Upload Image Files" +msgstr "" + +#: inc/admin/settings/general.php:93 +msgid "Maximun Upload Other Size" +msgstr "" + +#: inc/admin/settings/general.php:94 inc/admin/settings/general.php:102 +msgid "Set maximun volumn size having < x MB for upload docx, pdf..." +msgstr "" + +#: inc/admin/settings/general.php:101 +msgid "Maximun Upload Other Files" +msgstr "" + +#: inc/admin/settings/general.php:110 inc/admin/settings/general.php:121 +msgid "Agent Image Size" +msgstr "" + +#: inc/admin/settings/general.php:111 inc/admin/settings/general.php:122 +msgid "" +"The Loop Image is an Agent that is chosen as the representative Agent in " +"grid and list." +msgstr "" + +#: inc/admin/settings/general.php:133 +msgid "Loop Image Size" +msgstr "" + +#: inc/admin/settings/general.php:134 +msgid "" +"The Loop Image is an image that is chosen as the representative image in " +"grid and list." +msgstr "" + +#: inc/admin/settings/general.php:144 +msgid "Featured Image Size" +msgstr "" + +#: inc/admin/settings/general.php:145 +msgid "" +"The Featured Image is an image that is chosen as the representative image in " +"single page. ." +msgstr "" + +#: inc/admin/settings/general.php:150 +msgid "" +"To generate images with new image sizes, you can use this Force Regenerate Thumbnails" +msgstr "" + +#: inc/admin/settings/general.php:154 +msgid "Minimum of Target Price For Agent" +msgstr "" + +#: inc/admin/settings/general.php:155 +msgid "Enter minimum of price for starting search agent by target" +msgstr "" + +#: inc/admin/settings/general.php:164 +msgid "Maximum of Target Price For Agent" +msgstr "" + +#: inc/admin/settings/general.php:165 +msgid "Enter maximum of price for starting search agent by target" +msgstr "" + +#: inc/admin/settings/general.php:174 +msgid "Single Layout Page" +msgstr "" + +#: inc/admin/settings/general.php:175 +msgid "Choose layout for single property." +msgstr "" + +#: inc/admin/settings/general.php:183 +msgid "Currency Settings" +msgstr "" + +#: inc/admin/settings/general.php:191 +msgid "Currency" +msgstr "" + +#: inc/admin/settings/general.php:199 +msgid "Currency Position" +msgstr "" + +#: inc/admin/settings/general.php:204 +msgid "Before - $10" +msgstr "" + +#: inc/admin/settings/general.php:205 +msgid "After - 10$" +msgstr "" + +#: inc/admin/settings/general.php:210 +msgid "Thousands Separator" +msgstr "" + +#: inc/admin/settings/general.php:211 +msgid "The symbol (typically , or .) to separate thousands" +msgstr "" + +#: inc/admin/settings/general.php:217 +msgid "Decimal Separator" +msgstr "" + +#: inc/admin/settings/general.php:218 +msgid "The symbol (usually , or .) to separate decimal points" +msgstr "" + +#: inc/admin/settings/general.php:224 +msgid "Number of Decimals" +msgstr "" + +#: inc/admin/settings/general.php:225 +msgid "This sets the number of decimal points shown in displayed prices." +msgstr "" + +#: inc/admin/settings/general.php:234 inc/admin/settings/general.php:235 +msgid "Measurement Unit" +msgstr "" + +#: inc/admin/settings/general.php:239 +msgid "sq ft" +msgstr "" + +#: inc/admin/settings/general.php:240 +msgid "sq m" +msgstr "" + +#: inc/admin/settings/general.php:241 +msgid "mq" +msgstr "" + +#: inc/admin/settings/general.php:242 +msgid "m2" +msgstr "" + +#: inc/admin/settings/general.php:247 +msgid "Google Map API" +msgstr "" + +#: inc/admin/settings/general.php:248 +msgid "" +"You need to register Google API " +"Key, then put the key in this setting." +msgstr "" + +#: inc/admin/settings/3rd_party.php:49 +msgid "3rd Party Settings" +msgstr "" + +#: inc/admin/settings/3rd_party.php:58 +msgid "Walk Score" +msgstr "" + +#: inc/admin/settings/3rd_party.php:66 +msgid "Walk Score APi Key" +msgstr "" + +#: inc/admin/settings/3rd_party.php:67 +msgid "" +"Add Walk Score API key. To get your Walk Score API key, go to your Walk " +"Score Account." +msgstr "" + +#: inc/admin/settings/3rd_party.php:77 +msgid "Yelp" +msgstr "" + +#: inc/admin/settings/3rd_party.php:85 +msgid "Yelp API Client ID" +msgstr "" + +#: inc/admin/settings/3rd_party.php:86 +msgid "" +"Add Yelp client ID. To get your Yelp Api Client ID, go to your Yelp Account. " +"Register here" +msgstr "" + +#: inc/admin/settings/3rd_party.php:92 +msgid "Yelp API Secret" +msgstr "" + +#: inc/admin/settings/3rd_party.php:93 +msgid "" +"Add Yelp API Secret. Register here" +msgstr "" + +#: inc/admin/settings/3rd_party.php:99 +msgid "Yelp App key" +msgstr "" + +#: inc/admin/settings/3rd_party.php:100 +msgid "" +"You can find it in your Yelp Application Dashboard. Register here" +msgstr "" + +#: inc/admin/settings/3rd_party.php:106 +msgid "Yelp Categories" +msgstr "" + +#: inc/admin/settings/3rd_party.php:107 +msgid "Yelp Categories to show on front page" +msgstr "" + +#: inc/admin/settings/3rd_party.php:113 +msgid "Yelp - Number of results" +msgstr "" + +#: inc/admin/settings/3rd_party.php:114 +msgid "Number of results to show on listing page for each category." +msgstr "" + +#: inc/admin/settings/3rd_party.php:124 inc/admin/settings/3rd_party.php:125 +msgid "Yelp Distance Measurement Unit" +msgstr "" + +#: inc/admin/settings/3rd_party.php:130 +msgid "kilometers" +msgstr "" + +#: inc/admin/rating/class-rating.php:54 inc/admin/rating/class-rating.php:58 +msgid "Review Settings" +msgstr "" + +#: inc/admin/rating/class-rating.php:64 inc/admin/rating/class-rating.php:65 +msgid "Enable property reviews" +msgstr "" + +#: inc/admin/rating/class-rating.php:74 inc/admin/rating/class-rating.php:75 +msgid "Enable agency reviews" +msgstr "" + +#: inc/admin/rating/class-rating.php:84 inc/admin/rating/class-rating.php:85 +msgid "Enable agent reviews" +msgstr "" + +#: inc/admin/property/class-property.php:100 +msgid "Sku" +msgstr "" + +#: inc/admin/property/class-property.php:103 +msgid "Author" +msgstr "" + +#: inc/admin/property/class-property.php:104 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:213 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:181 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:202 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:213 +msgid "Date" +msgstr "" + +#: inc/admin/agent/class-agent.php:94 +msgid "Target Search" +msgstr "" + +#: templates/user/social-login/google-button.php:20 +msgid "Connect with Google" +msgstr "" + +#: templates/user/social-login/facebook-button.php:20 +msgid "Connect with Facebook" +msgstr "" + +#: templates/user/agency/agency-team.php:45 +msgid "Processing" +msgstr "" + +#: templates/user/agency/profile-agency.php:23 +msgid "Edit Agency Profile" +msgstr "" + +#: templates/user/agent/profile-agent.php:7 +msgid "Edit Agent Profile" +msgstr "" + +#: templates/user/agent/profile-agent.php:23 +msgid "Agent edit profile form is not avariable" +msgstr "" + +#: templates/search-box/fields/search-text.php:1 +msgid "Keyword" +msgstr "" + +#: templates/search-box/fields/search-text.php:2 +msgid "Type keyword" +msgstr "" + +#: templates/search-box/fields/more-options.php:19 +msgid "More Search Options" +msgstr "" + +#: templates/search-box/fields/radius.php:14 +msgid "Radius:" +msgstr "" + +#: templates/search-box/fields/search-city-text.php:24 +msgid "Type City or Area" +msgstr "" + +#: templates/search-box/fields/search-city-text.php:35 +msgid "Show with in." +msgstr "" + +#: templates/search-box/fields/search-city-text.php:37 +msgid "Radius" +msgstr "" + +#: templates/search-box/fields/search-city-text.php:38 +msgid "Of My Location" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-form-builder.php:40 +msgid "Search: Form Builder" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-form-builder.php:80 +msgid "Agency/Agent Tab Form Search" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-form-builder.php:95 +msgid "Brand Items" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-form-builder.php:100 +msgid "Field" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-form-builder.php:108 +msgid "Column" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:54 +msgid "Block: Agent Collection" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:94 +msgid "Agents Search Collection" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:101 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:101 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:87 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:101 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:87 +#: inc/vendors/elementor/widgets/opalestate-split-maps-search.php:80 +#: inc/vendors/elementor/widgets/opalestate-split-maps-search.php:87 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:101 +msgid "Search Form" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:105 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:105 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:91 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:105 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:91 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:105 +msgid "Advanded" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:106 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:106 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:92 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:106 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:92 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:106 +msgid "Search By Address" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:114 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:114 +msgid "Enable Sortable Bar" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:122 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:113 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:113 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:122 +msgid "Item Layout" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:134 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:106 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:111 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:114 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:125 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:114 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:125 +#: inc/vendors/elementor/widgets/opalestate-split-maps-search.php:97 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:134 +msgid "Columns" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:150 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:117 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:125 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:130 +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:141 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:130 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:141 +#: inc/vendors/elementor/widgets/opalestate-split-maps-search.php:112 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:150 +msgid "Columns Gap" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:182 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:151 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:172 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:163 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:163 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:182 +msgid "Query" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:190 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:159 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:180 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:190 +msgid "Posts Per Page" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:201 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:169 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:190 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:171 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:171 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:201 +msgid "Advanced" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:209 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:177 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:198 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:179 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:179 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:209 +msgid "Order By" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:215 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:183 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:204 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:215 +msgid "Menu Order" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:216 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:184 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:205 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:216 +msgid "Random" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:228 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:196 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:217 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:197 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:197 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:228 +msgid "ASC" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:229 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:197 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:218 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:198 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:198 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:229 +msgid "DESC" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:247 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:215 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:236 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:247 +msgid "Category Operator" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:251 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:219 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:240 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:251 +msgid "AND" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:252 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:220 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:241 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:252 +msgid "IN" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:253 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:221 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:242 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:253 +msgid "NOT IN" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:266 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:276 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:277 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:284 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:298 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:305 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:266 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:276 +msgid "Pagination" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:281 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:283 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:289 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:291 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:310 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:312 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:281 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:283 +msgid "Numbers" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:282 +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:283 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:290 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:291 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:311 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:312 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:282 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:283 +msgid "Previous/Next" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:291 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:299 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:320 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:291 +msgid "Page Limit" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:302 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:310 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:331 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:302 +msgid "Shorten" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:317 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:325 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:346 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:317 +msgid "Previous Label" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:318 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:326 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:347 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:318 +msgid "« Previous" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:331 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:339 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:360 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:331 +msgid "Next Label" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:332 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:340 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:361 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:332 +msgid "Next »" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:345 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:353 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:374 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:220 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:345 +msgid "Alignment" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agent-collection.php:353 +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:361 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:382 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:228 +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:353 +msgid "Center" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:40 +msgid "Search: Property Results" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:80 +msgid "Show Collection as Default Results" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:87 +msgid "" +"This is often used for building seach page, it combines with block => Search:" +" Property Form, Search:Map Preview." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:96 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:101 +msgid "Style Item Layout" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:138 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:159 +#: inc/vendors/elementor/widgets/opalestate-category-list.php:152 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:152 +msgid "Enable Carousel" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:243 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:264 +msgid "Lables" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-property-results.php:263 +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:284 +msgid "Cities" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:53 +msgid "Block: Property Collection" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:93 +msgid "Property Collection" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:146 +msgid "Show" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:150 +msgid "Featured only" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-property-collection.php:151 +msgid "Without Featured" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:41 +msgid "Search: Property Form " +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:81 +msgid "Property Search Form" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:88 +msgid "" +"This is often used for building seach page, it combines with block => Search:" +" Map Preview, Search: Property Results." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:158 +msgid "Display More Options" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:179 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:299 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:293 +msgid "Normal" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:208 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:340 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:383 +msgid "Hover" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:233 +msgid "Input" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:253 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:318 +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:359 +msgid "Background color" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:265 +msgid "Border color" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-searchbox.php:289 +msgid "Button" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-category-list.php:54 +msgid "Block: Category Listing" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-category-list.php:94 +msgid "Category Collection" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-category-list.php:183 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:183 +msgid "ID" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-category-list.php:185 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:185 +msgid "Count" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-category-list.php:216 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:216 +msgid "Limit" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-category-list.php:217 +#: inc/vendors/elementor/widgets/opalestate-city-list.php:217 +msgid "Maximum number of terms to return." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:40 +msgid "Block: Agency - Search Form" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:80 +msgid "Agency Search Form" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:100 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:100 +msgid "Target Submit Page" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:104 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:104 +msgid "Current Page" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agency.php:105 +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:105 +msgid "Global Agent Search Page" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:40 +msgid "Search: Maps Preview" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:80 +msgid "Map Preview Form" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:89 +msgid "" +"This is often used for building seach page, it combines with block => Search:" +" Property Form, Search: Property Results." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:99 +msgid "Enable Static Map" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:108 +msgid "Map On Right?" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:121 +msgid "Map Width %" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-map-top-search.php:144 +msgid "Map Height" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-city-list.php:54 +msgid "Block: City Listing" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-city-list.php:94 +msgid "City Collection" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:40 +msgid "Block: Agents - Search Form" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-search-agents.php:80 +msgid "Agents Search Form" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-split-maps-search.php:40 +msgid "Block: Split Maps Property Search" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:44 +msgid "Block: Account Button" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:96 +msgid "Not logged in" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:103 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:157 +msgid "Choose Icon" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:112 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:166 +msgid "Enable Label" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:120 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:174 +msgid "Label Text" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:122 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:176 +msgid "Account" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:133 +msgid "Logged in" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:140 +msgid "Enable Avatar" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:149 +msgid "Enable Notification" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:187 +msgid "Use Custom Dashboard Menu" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:195 +msgid "Menu" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:201 +#, php-format +msgid "" +"Go to the Menus screen to manage your " +"menus." +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:300 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:390 +msgid "Icon Color" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:316 +#: inc/vendors/elementor/widgets/opalestate-account-button.php:402 +msgid "Background Color" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:328 +msgid "Icon Font Size" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:357 +msgid "Border Radius" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:369 +msgid "Padding" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:501 +msgid "Sign in" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:504 +msgid "Create an Account" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-account-button.php:511 +msgid "Username or email" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:54 +msgid "Block: Agencies Collection" +msgstr "" + +#: inc/vendors/elementor/widgets/opalestate-agency-collection.php:94 +msgid "Agencies Search/Collection" +msgstr "" + +#: inc/vendors/cmb2-plugins/uploader/uploader.php:154 +#, php-format +msgid "Allow upload file have size < %s MB and maximum number of files: %s" +msgstr "" + +#: inc/admin/views/addons/list.php:2 +msgid "Opal Estate Add-ons" +msgstr "" + +#: inc/admin/views/addons/list.php:4 +msgid "The following Add-ons extend the functionality of Opal Estate." +msgstr "" + +#: inc/admin/views/addons/list.php:345 +msgid "" +"There was an error retrieving the Opalestate Add-ons list from the server. " +"Please try again later." +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:44 +msgid "As an author, you can add other users to your agency." +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:46 +msgid "" +"Add someone to your agency, please enter extractly username in below input:" +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:51 +msgid "add" +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:64 +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/user/user.php:76 +msgid "Are you sure to delete this" +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/map/map.php:46 +msgid "Map Address" +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/map/map.php:54 +msgid "Latitude" +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/map/map.php:64 +msgid "Longitude" +msgstr "" + +#: inc/vendors/cmb2-plugins/cmb2/custom-fields/map/map.php:73 +msgid "" +"You need to register Google API " +"Key, then put the key in plugin setting." +msgstr "" + +#. Name of the plugin +msgid "Opal Estate Pro" +msgstr "" + +#. Description of the plugin +msgid "" +"Opal Real Estate Plugin is an ideal solution and brilliant choice for you to " +"set up a professional estate website." +msgstr "" + +#. URI of the plugin +msgid "http://www.wpopal.com/product/opal-estate-wordpress-plugin/" +msgstr "" + +#. Author of the plugin +msgid "WPOPAL" +msgstr "" + +#. Author URI of the plugin +msgid "http://www.wpopal.com" +msgstr "" diff --git a/license.txt b/license.txt new file mode 100755 index 00000000..85e5a0c4 --- /dev/null +++ b/license.txt @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/opal-estate-pro.php b/opal-estate-pro.php new file mode 100755 index 00000000..5cf35eb6 --- /dev/null +++ b/opal-estate-pro.php @@ -0,0 +1,491 @@ +setup_constants(); + + register_activation_hook( OPALESTATE_PLUGIN_FILE, [ 'Opalestate_Install', 'install' ] ); + add_action( 'plugins_loaded', [ self::$instance, 'load_textdomain' ] ); + self::$instance->setup(); + self::$instance->roles = new Opalestate_Roles(); + self::$instance->html = new Opalestate_HTML_Elements(); + self::$instance->api = new Opalestate_API(); + self::$instance->session = new Opalestate_Session(); + + /** + * + */ + add_filter( 'opalestate_google_map_api', [ __CLASS__, 'load_google_map_api' ] ); + add_action( 'cli_init', [ self::$instance, 'init_cli' ] ); + } + + return self::$instance; + } + + public static function load_google_map_api( $key ) { + if ( opalestate_options( 'google_map_api_keys' ) ) { + $key = '//maps.googleapis.com/maps/api/js?sensor=false&libraries=places&key=' . opalestate_options( 'google_map_api_keys' ); + } + + return $key; + } + + public function init_cli() { + $this->includes( + [ + 'cli/export.php', + ] + ); + } + + /** + * Throw error on object clone + * + * The whole idea of the singleton design pattern is that there is a single + * object, therefore we don't want the object to be cloned. + * + * @return void + * @access protected + */ + public function __clone() { + // Cloning instances of the class is forbidden + _doing_it_wrong( __FUNCTION__, esc_html__( 'Cheatin’ huh?', 'opalestate-pro' ), '1.0.1' ); + } + + /** + * + */ + public function setup_constants() { + // Plugin version + if ( ! defined( 'OPALESTATE_VERSION' ) ) { + define( 'OPALESTATE_VERSION', '1.0.1' ); + } + + // Plugin Folder Path + if ( ! defined( 'OPALESTATE_PLUGIN_DIR' ) ) { + define( 'OPALESTATE_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); + } + + // Plugin Folder URL + if ( ! defined( 'OPALESTATE_PLUGIN_URL' ) ) { + define( 'OPALESTATE_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); + } + + // Plugin Root File + if ( ! defined( 'OPALESTATE_PLUGIN_FILE' ) ) { + define( 'OPALESTATE_PLUGIN_FILE', __FILE__ ); + } + + // Plugin Root File + if ( ! defined( 'OPALESTATE_THEMER_WIDGET_TEMPLATES' ) ) { + define( 'OPALESTATE_THEMER_WIDGET_TEMPLATES', get_stylesheet_directory() . '/' ); + } + + if ( ! defined( 'OPALMEMBERSHIP_PACKAGES_PREFIX' ) ) { + define( 'OPALMEMBERSHIP_PACKAGES_PREFIX', 'opalestate_package_' ); + } + + if ( ! defined( "OPALESTATE_CLUSTER_ICON_URL" ) ) { + define( 'OPALESTATE_CLUSTER_ICON_URL', apply_filters( 'opalestate_cluster_icon_url', OPALESTATE_PLUGIN_URL . 'assets/cluster-icon.png' ) ); + } + + /// define; + define( 'OPALESTATE_AGENT_PREFIX', 'opalestate_agt_' ); + define( 'OPALESTATE_PROPERTY_PREFIX', 'opalestate_ppt_' ); + define( 'OPALESTATE_AGENCY_PREFIX', 'opalestate_ofe_' ); + } + + + public function setup() { + global $opalestate_options; + + /** + * Get the CMB2 bootstrap! + * + * @description: Checks to see if CMB2 plugin is installed first the uses included CMB2; we can still use it even it it's not active. This prevents fatal error conflicts with other themes and users of the CMB2 WP.org plugin + * + */ + require_once OPALESTATE_PLUGIN_DIR . 'inc/vendors/cmb2-plugins/init.php'; + require_once OPALESTATE_PLUGIN_DIR . 'inc/admin/register-settings.php'; + require_once OPALESTATE_PLUGIN_DIR . 'inc/admin/functions.php'; + + if ( is_admin() ) { + require_once OPALESTATE_PLUGIN_DIR . 'inc/admin/class-admin.php'; + } + + $opalestate_options = opalestate_get_settings(); + + $this->includes( + [ + 'class-template-loader.php', + 'query-functions.php', + 'mixes-functions.php', + 'class-opalestate-roles.php', + 'classes/class-opalestate-session.php', + 'classes/class-opalestate-abs-query.php', + 'classes/class-opalestate-metabox-user.php', + 'classes/class-opalestate-geolocation.php', + 'classes/class-opalestate-yelp.php', + 'classes/class-opalestate-walkscore.php', + 'classes/class-opalestate-multilingual.php', + //'classes/metabox/class-metabox-agency.php', + ] + ); + + // rating + $this->includes( + [ + 'rating/class-opalestate-rating.php', + ] + ); + + // message + $this->includes( + [ + 'message/class-opalestate-message.php', + 'message/class-opalestate-request-reviewing.php', + 'message/functions.php', + ] + ); + + // agent + $this->includes( + [ + 'agent/class-opalestate-agent-posttype.php', + 'agent/class-opalestate-agent.php', + 'agent/class-opalestate-agent-query.php', + 'agent/class-opalestate-agent-front.php', + 'agent/class-opalestate-agent-metabox.php', + ] + ); + + // agent + $this->includes( + [ + 'agency/class-opalestate-agency-posttype.php', + 'agency/class-opalestate-agency.php', + 'agency/class-opalestate-agency-query.php', + 'agency/class-opalestate-agency-front.php', + 'agency/class-opalestate-agency-metabox.php', + ] + ); + + /// property /// + $this->includes( + [ + 'property/class-metabox-property-admin.php', + 'property/class-opalestate-posttype.php', + 'property/class-opalestate-property-query.php', + 'property/class-opalestate-query.php', + 'property/class-opalestate-favorite.php', + 'property/class-opalestate-property.php', + 'property/class-opalestate-shortcodes.php', + 'property/class-opalestate-search.php', + 'property/class-opalestate-view-stats.php', + 'property/functions.php', + ] + ); + + + /// user /// + $this->includes( + [ + 'user/functions.php', + 'user/class-opalestate-user.php', + 'user/class-opalestate-user-form-handler.php', + 'user/class-opalestate-user-search.php', + 'user/class-user-statistics.php', + ] + ); + + $this->includes( + [ + 'taxonomies/class-taxonomy-categories.php', + 'taxonomies/class-taxomony-amenities.php', + 'taxonomies/class-taxonomy-labels.php', + 'taxonomies/class-taxonomy-status.php', + 'taxonomies/class-taxonomy-types.php', + 'taxonomies/class-taxonomy-neighborhood.php', + 'taxonomies/class-taxonomy-locations.php', + 'taxonomies/class-taxonomy-city.php', + 'taxonomies/class-taxonomy-state.php', + ] + ); + + require_once OPALESTATE_PLUGIN_DIR . 'inc/api/class-opalestate-api.php'; + + $this->includes( + [ + 'template-functions.php', + ] + ); + + /// + $this->includes( + [ + 'class-opalestate-enqueue.php', + ] + ); + + //// enable or disable submission //// + if ( opalestate_options( 'enable_submission', 'on' ) == 'on' ) { + $this->includes( + [ + 'submission/class-metabox-property-submission.php', + 'submission/class-opalestate-submission.php', + ] + ); + + } + + $this->includes( + [ + 'class-no-captcha-recaptcha.php', + 'class-opalestate-email.php', + ] + ); + + require_once OPALESTATE_PLUGIN_DIR . 'inc/class-opalestate-install.php'; + + require_once OPALESTATE_PLUGIN_DIR . 'inc/class-opalestate-html.php'; + require_once OPALESTATE_PLUGIN_DIR . 'inc/function-search-fields.php'; + + add_action( 'widgets_init', [ $this, 'widgets_init' ] ); + + add_action( 'init', [ $this, 'set_location_actived' ] ); + + require_once OPALESTATE_PLUGIN_DIR . 'inc/ajax-functions.php'; + require_once OPALESTATE_PLUGIN_DIR . 'inc/template-hook-functions.php'; + + add_action( 'plugins_loaded', [ $this, 'load_exts' ] ); + $this->load_vendors(); + } + + /** + * Include list of collection files + * + * @var array $files + */ + public function load_vendors() { + if ( defined( "ELEMENTOR_VERSION" ) ) { + require_once OPALESTATE_PLUGIN_DIR . 'inc/vendors/elementor/class-opalestate-elementor-extended.php'; + } + + require_once OPALESTATE_PLUGIN_DIR . 'inc/vendors/social-login/class-opalestate-social-login.php'; + } + + /** + * Include list of collection files + * + * @var array $files + */ + public function includes( $files ) { + foreach ( $files as $file ) { + $this->_include( $file ); + } + } + + /** + * include single file if found + * + * @var string $file + */ + private function _include( $file = '' ) { + $file = OPALESTATE_PLUGIN_DIR . 'inc/' . $file; + //if ( file_exists( $file ) ) { + include_once $file; + //} + } + + /** + * Load extensions. + */ + public function load_exts() { + if ( class_exists( 'OpalMembership' ) ) { + require_once OPALESTATE_PLUGIN_DIR . 'inc/vendors/opalmembership/membership.php'; + } + } + + /** + * Set location actived. + */ + public static function set_location_actived() { + if ( isset( $_GET['set_location'] ) && ! empty( $_GET['set_location'] ) ) { + $_SESSION['set_location'] = trim( $_GET['set_location'] ); + wp_redirect( home_url( '/' ) ); + exit; + } + if ( isset( $_GET['clear_location'] ) && ! empty( $_GET['clear_location'] ) ) { + $_SESSION['set_location'] = null; + wp_redirect( home_url( '/' ) ); + exit; + } + if ( isset( $_SESSION['set_location'] ) && ! empty( $_SESSION['set_location'] ) ) { + Opalestate_Query::$LOCATION = $_SESSION['set_location']; + } + + if ( get_current_user_id() > 0 ) { + do_action( "opalestate_user_init" ); + } + } + + /** + * Load plugin textdomain. + */ + public function load_textdomain() { + // Set filter for Opalestate's languages directory + $lang_dir = dirname( plugin_basename( OPALESTATE_PLUGIN_FILE ) ) . '/languages/'; + $lang_dir = apply_filters( 'opalestate_languages_directory', $lang_dir ); + + // Traditional WordPress plugin locale filter + $locale = apply_filters( 'plugin_locale', get_locale(), 'opalestate-pro' ); + $mofile = sprintf( '%1$s-%2$s.mo', 'opalestate-pro', $locale ); + + // Setup paths to current locale file + $mofile_local = $lang_dir . $mofile; + $mofile_global = WP_LANG_DIR . '/opalestate/' . $mofile; + + if ( file_exists( $mofile_global ) ) { + // Look in global /wp-content/languages/opalestate folder + load_textdomain( 'opalestate-pro', $mofile_global ); + } elseif ( file_exists( $mofile_local ) ) { + // Look in local /wp-content/plugins/opalestate/languages/ folder + load_textdomain( 'opalestate-pro', $mofile_local ); + } else { + // Load the default language files + load_plugin_textdomain( 'opalestate-pro', false, $lang_dir ); + } + } + + public function widgets_init() { + opalestate_includes( OPALESTATE_PLUGIN_DIR . 'inc/widgets/*.php' ); + } + } +} + +if ( ! function_exists( 'OpalEstate' ) ) { + function OpalEstate() { + return OpalEstate::get_instance(); + } + + // Constructor. + OpalEstate(); +} diff --git a/project.json b/project.json new file mode 100755 index 00000000..5bd75c7d --- /dev/null +++ b/project.json @@ -0,0 +1,54 @@ +{ + "name" : "latehome", + "version": "1.0", + "plugin" : "opal-estate-pro", + "theme" : "wpopalbootstrap", + "domain" : "latehome", + "server" : "http://dev.wpopal.com/latehome", + "server_source": "http://source.wpopal.com/opal-estate-pro-source", + "folder_source":"sample", + "description":"Single Property WordPress Theme comes with the modern & luxury design is a perfect theme for any businesses, agencies & websites about properties, houses, business spaces, apartment & building complexes and more others. The theme is built with the powerful page builder Elementor, One Click Import and other great features needed for any successful property websites.", + "author" : "ThemeLexus", + "author_uri" :"http://www.themelexus.com/", + "themeuri" : "http://demo2.themelexus.com/latehome/", + "themeinfo":{ + "document" : "http://wpopal.com/guides/latehome", + "support" : "https://themelexus.ticksy.com/", + "envato" : "https://themeforest.net/user/themelexus/portfolio", + "facebook" : "https://www.facebook.com/themelexus/", + "twitter" : "https://twitter.com/opalwordpress", + "youtube" : "https://www.youtube.com/channel/UCEVKfaT81jFq4HE1Yky99GA", + "email" : "themelexus@gmail.com", + "sample_link" : "http://source.wpopal.com/latehome-source/samples.json" + }, + + "oldurl": "http://localhost/wordpress/latehome", + "newurl": "http://localhost/wordpress/latehome", + "subpath": "/wordpress/latehome", + "prefix": "n-", + "blogs": "244,2573,2575,2578", + "single":{ + "name": "Demo latehome", + "active": { + "header": "header-1", + "footer": "footer-1", + "page": "home-1" + }, + "plugins": { + "contact-form-7": "1600" + }, + "sliders": [ + "Slider-1.zip", + "slider-3.zip" + ], + "options": {}, + "plugins":{ + "contact-form-7": "contact-form-7", + "opal-widgets-for-elementor": "opal-widgets-for-elementor", + "wpopal-medical": "wpopal-medical", + "opal-service": "opal-service" + } + }, + "niches": [ + ] +} diff --git a/readme.txt b/readme.txt new file mode 100755 index 00000000..05d8cc3b --- /dev/null +++ b/readme.txt @@ -0,0 +1,96 @@ +=== Plugin Name === +Contributors: wpopal +Donate link: http://www.wpopal.com/product/opal-estate-wordpress-plugin/ +Tags: estate, property, opalestate, house for rent, agency for lease, estate submission, agents estate property +Requires at least: 4.6 +Tested up to: 5.2.2 +Stable tag: 1.0.1 +License: GPLv3 +License URI: http://www.gnu.org/licenses/gpl-3.0.html + +Opal Real Estate Plugin is an ideal solution and brilliant choice for you to set up a professional estate website + +== Description == + +Whether you want to create a website for your real estate business and you are meeting difficulties to pick a suitable real estate plugin to install in your property site. Opal real estate plugin Pro will be your best choice to help you control your site in a perfect way. + +The plugin will not make you disappointed with ease of use, friendly & flexible with users, high advanced functions and a range of powerful feature updated insight. They are created for selling, buying or renting an apartment, villa, house, flat, etc. Scroll down to see how awesome it is! + +[youtube https://www.youtube.com/watch?v=B7UrfNzPkFg] + += Features Include: = + +* - Potential Real Estate Listing to the website - + +* 100% Responsive and Mobile Ready +* Easily integrated to any WordPress website. +* Quick to set up, publish and update +* Easy to use and customize +* Display property listings in a responsive list or grid format +* Compatible with all kinds of Themes and Frameworks +* Start up with the Free version with menu plugin +* Easy to sort, search and manage properties listings +* Available for kinds of property listing such as property, rental, land, rural, business, commercial, commercial land. +* SEO friendly URL’s, mobile friendly design layout +* Facebook and Google + login in: Clients can log into the website with via social accounts! + +* - Easy for Developer to design and customize - + +* Excellent, clean & clear, extensible code +* Powerful plugin to match with your design +* Customize Css, HTML..easily and exactly +* Add new templates in seconds and use with shortcodes. +* Easy and Quick to understand API’s with detailed documentation +* Developer friendly with dozens of actions and filters. +* Custom labels for everything and full translation support. +* Hundreds of filters to modify the default behaviour of the plugin. +* Powerful Shortcodes and Widgets +* API Support allow display properties, agents on any applications + += More Features = + +* Search properties: Properties List, List Sidebar, Grid, Grid Sidebar, Search result, Category, Location, Type, Submit Properties.. +* Support Membership Packages: There are many different packages with specific features suitable for users to choose the best one for their business goal. +* Search Agents: This plugin supports filter function for selecting location, type and price of experienced agents conveniently +* Quick Search: Users can quickly search properties or agents based on filter location, type, packing,bathroom, bedroom.. +* Search Google Map +* Revolution Sliders +* Multilingual Support + + += WHAT IS NEW IN PRO VERSION = + +* Agency Agency and allow edit profile with user having Opal Estate Agency Role. Display Properties and members of agency +* Implement Google Capcha for all Email Form +* Implement Saved Search Form allowing user save theirs result as loved collection. They are managed with Saved Search Menu of user dashboard +* Supported Widgets working with Elementor page builder +* Implement Share Search Link for friend +* Implement property labels and allow customize color, background of label +* Improve Custom upload Marker icon for property types +* Improve free package for new registered user +* Create Shortcode ajax search + += Third party = +* Our plugin gets property scores via [WalkScore](https://www.walkscore.com/ "WalkScore"), you can visit [Walk Score Terms of Use](https://www.walkscore.com/terms-of-use.shtml "WalkScore term +page") for more information. +* Our plugin gets nearby properties via [Yelp](https://www.yelp.com/ "Yelp"), you can visit [Yelp Terms of Use](https://www.yelp.com/static?p=tos "Yelp term +page") for more information. +* Our plugin use [Facebook Social login](https://developers.facebook.com/docs/facebook-login/ "Facebook login") and [Google Social login](https://auth0.com/docs/connections/social/google "Google") + +== Installation == + +This section describes how to install the plugin and get it working. + + +1. Upload the plugin files to the `/wp-content/plugins/opal-estate-pro directory, or install the plugin through the WordPress plugins screen directly. +2. Activate the plugin through the 'Plugins' screen in WordPress +3. Use the Properties->Settings screen to configure the plugin + + +== Frequently Asked Questions == + +* Detailed guide to install and customize: [documentation](http://www.wpopal.com/guides/plugin/opalestate-pro/ "Visit the Plugin docs") +* Video guide and tutorials how to set up +* Images and refer links +* Easy for user to follow up +* System tickets support 24/7 available : [free support](https://wpopal.ticksy.com/ "Visit the Plugin support Page") diff --git a/templates/.DS_Store b/templates/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..af43a31967b43b3d95c070b4ecda0fa3316eefb3 GIT binary patch literal 6148 zcmeHKI|>3Z5S>vG!N$@uSMUZw^aNf&K@dS!5VhXQb9pr1d>UQtw2?P3dC6p6LSC`6 zBO*G#Y-b`95gEY^i0p zwti-h{ zq5pp-aYY5Fz+Wk#gT-nw$CI+Qb{=Q7w!qhL%elkNFn0c7o_bQ`6`Nzf VCbof2N8IT^{tTEdG%E0G1s=@c6`=qC literal 0 HcmV?d00001 diff --git a/templates/archive-opalestate_agency.php b/templates/archive-opalestate_agency.php new file mode 100755 index 00000000..96c90ef1 --- /dev/null +++ b/templates/archive-opalestate_agency.php @@ -0,0 +1,82 @@ + + +
              +
              + +
              +

              +

              +
              + +
              + true ] ); ?> +
              +
              +
              + +
              +
              +
            ' ); + the_archive_description( '
            ', '
            ' ); + ?> + + + + +
            +
            +
            +
            + found_posts ): ?> + found_posts ); ?> + +
            +
            + +
            +
            + +
            + +
            +
            +
            + +
            + +
            + +
            + +
            + + + + + + + + + + + diff --git a/templates/archive-opalestate_agent.php b/templates/archive-opalestate_agent.php new file mode 100755 index 00000000..5ef6aca0 --- /dev/null +++ b/templates/archive-opalestate_agent.php @@ -0,0 +1,70 @@ + +
            +
            +
            +

            +

            +
            + +
            + true ] ); ?> +
            +
            +
            + +
            +
            +
            ' ); + the_archive_description( '
            ', '
            ' ); + ?> + + + + +
            +
            +
            +
            + found_posts ): ?> + found_posts ); ?> + +
            +
            + +
            +
            + +
            + +
            +
            +
            + +
            + +
            + +
            + +
            + + + + + + + + + + diff --git a/templates/archive-opalestate_property.php b/templates/archive-opalestate_property.php new file mode 100755 index 00000000..0bbf432b --- /dev/null +++ b/templates/archive-opalestate_property.php @@ -0,0 +1,65 @@ + + +
            +
            + +
            ' ); + the_archive_description( '
            ', '
            ' ); + ?> + + +
            + + + +
            +
            + + +
            + +
            + + + +
            + +
            + + +
            +
            +
            + + + + + + + + + + + + diff --git a/templates/content-agency-grid.php b/templates/content-agency-grid.php new file mode 100755 index 00000000..c6633116 --- /dev/null +++ b/templates/content-agency-grid.php @@ -0,0 +1,69 @@ + +
            > +
            +
            + + is_featured() ): ?> +
            + + + +
            + + + get_trusted() ): ?> + + + + + +
            + +
            +
            + +
            +
            + +
            +

            +

            + +

            +
            +
            + +
            + + + +
            + + + + +
            + + + +
            + + + + +
            + +
            +
            +
            +
            diff --git a/templates/content-agency-list.php b/templates/content-agency-list.php new file mode 100755 index 00000000..db47eeaf --- /dev/null +++ b/templates/content-agency-list.php @@ -0,0 +1,65 @@ + +
            > +
            +
            + + + is_featured() ): ?> +
            + + + +
            + +
            + +
            +
            +
            +

            + +

            + get_trusted() ): ?> + + + + +

            +

            +
            + +
            +
            + + +
            + + + + +
            + + + +
            + + + + +
            + +
            +
            +
            +
            diff --git a/templates/content-agent-grid-v2.php b/templates/content-agent-grid-v2.php new file mode 100755 index 00000000..cd7375b1 --- /dev/null +++ b/templates/content-agent-grid-v2.php @@ -0,0 +1,33 @@ + +
            > +
            +
            + + is_featured() ): ?> + + + + + + + + get_trusted() ): ?> + + + + +
            +
            + +
            +
            + +
            + +

            +
            +
            +
            +
            diff --git a/templates/content-agent-grid.php b/templates/content-agent-grid.php new file mode 100755 index 00000000..94f688eb --- /dev/null +++ b/templates/content-agent-grid.php @@ -0,0 +1,115 @@ + +
            > +
            +
            + + render_level(); ?> + is_featured() ): ?> + + + + + + + get_trusted() ): ?> + + + + +
            +
            + +
            +
            + +
            +

            + get_meta( 'job' ); ?> + +

            + +
            + +
            + get_meta( 'email' ); ?> + +
            + + + + +
            + + + get_meta( 'phone' ); ?> + +
            + + + + +
            + + + get_meta( 'mobile' ); ?> + +
            + + + + +
            + + + get_meta( 'fax' ); ?> + +
            + +
            + + + get_meta( 'web' ); ?> + +
            + + + + +
            + + + get_socials(); ?> + + +
            + + + + + + + + + + + + + + + + + + + + + + + +
            + +
            +
            +
            +
            diff --git a/templates/content-agent-list.php b/templates/content-agent-list.php new file mode 100755 index 00000000..d7b05b59 --- /dev/null +++ b/templates/content-agent-list.php @@ -0,0 +1,78 @@ + +
            > +
            +
            +
            +
            + + render_level(); ?> + is_featured() ): ?> + + + + + + +
            +
            +
            +
            +
            +

            + + get_trusted() ): ?> + + + + +

            + +

            + get_meta( 'job' ); ?> + +

            + +
            +
            + + get_socials(); ?> + + +
            + + + + + + + + + + + + + + + + + + + + + + + +
            + +
            +
            +

            + +

            +
            +
            +
            +
            diff --git a/templates/content-no-results.php b/templates/content-no-results.php new file mode 100755 index 00000000..b9d06029 --- /dev/null +++ b/templates/content-no-results.php @@ -0,0 +1,8 @@ +
            + +
            +

            +
            +
            diff --git a/templates/content-property-featured-v1.php b/templates/content-property-featured-v1.php new file mode 100755 index 00000000..88a3c40d --- /dev/null +++ b/templates/content-property-featured-v1.php @@ -0,0 +1,67 @@ + +
            > +
            ' ); ?> + +
            +
            + latitude && $property->longitude ) : ?> + + + + + + get_address() ) : ?> + get_address() ); ?> + +
            +

            + +

            +
            + + + +
            + +
            + + + + + + + diff --git a/templates/content-property-grid-v2.php b/templates/content-property-grid-v2.php new file mode 100755 index 00000000..de650d45 --- /dev/null +++ b/templates/content-property-grid-v2.php @@ -0,0 +1,52 @@ + +
            > +
            +
            + ', '' ); ?> + +
            +
            + latitude && $property->longitude ) : ?> + + + + + + get_address() ) : ?> + get_address() ); ?> + +
            +
            +
            +
            +
            + +
            + +
            + +
            + +
            + + + +
            +
            + +
            + render_author_link() ); ?> + +
            + + +
            + +
            diff --git a/templates/content-property-grid-v3.php b/templates/content-property-grid-v3.php new file mode 100755 index 00000000..483fe795 --- /dev/null +++ b/templates/content-property-grid-v3.php @@ -0,0 +1,52 @@ + +
            > +
            +
            +
            + +
            + +
            + +
            + + +
            + +
            +
            +
            + + ', '' ); ?> + +
            +
            + latitude && $property->longitude ) : ?> + + + + + + get_address() ) : ?> + get_address() ); ?> + +
            +
            + +
            + +
            + render_author_link() ); ?> + +
            + + +
            + +
            diff --git a/templates/content-property-grid.php b/templates/content-property-grid.php new file mode 100755 index 00000000..9c4d99e7 --- /dev/null +++ b/templates/content-property-grid.php @@ -0,0 +1,61 @@ + +
            > + +
            +
            + + ', '' ); ?> + +
            + +
            + latitude && $property->longitude ) : ?> + + + + + + get_address() ) : ?> + get_address() ); ?> + +
            +
            +
            + +
            +
            + +
            + +
            + +
            + + render_author_link() ); ?> + +
            + get_gallery_count() ) && $count > 1 ) : ?> + + +
            +
            + + + +
            +
            + +
            + + +
            +
            + + +
            diff --git a/templates/content-property-list-v2.php b/templates/content-property-list-v2.php new file mode 100755 index 00000000..69f15ced --- /dev/null +++ b/templates/content-property-list-v2.php @@ -0,0 +1,37 @@ + +
            > +
            +
            +
            + +
            + +
            + +
            + +
            + +
            +
            + + ', '' ); ?> + +
            + get_address() ); ?> +
            + + +
            + +
            +
            + + +
            diff --git a/templates/content-property-list.php b/templates/content-property-list.php new file mode 100755 index 00000000..ec1943dc --- /dev/null +++ b/templates/content-property-list.php @@ -0,0 +1,68 @@ + +
            > +
            +
            +
            + +
            + +
            + +
            + +
            + +
            render_author_link() ); ?>
            +
            + +
            +
            + + + +
            + +
            +
            + + ', '' ); ?> + +
            + latitude && $property->longitude ) : ?> + + + + + + get_address() ) : ?> + get_address() ); ?> + +
            + + + +
            + + +
            + +
            +
            + +
            +
            + + + + + +
            diff --git a/templates/content-property-mark-hover.php b/templates/content-property-mark-hover.php new file mode 100755 index 00000000..8c0303fa --- /dev/null +++ b/templates/content-property-mark-hover.php @@ -0,0 +1,26 @@ + +
            > +
            +
            > +
            + ', '' ); ?> +
            +
            +
            get_metabox_value( 'areasize' ) ); ?>
            +
            + +
            +
            + + +
            + +
            \ No newline at end of file diff --git a/templates/content-property.php b/templates/content-property.php new file mode 100755 index 00000000..544f2dbc --- /dev/null +++ b/templates/content-property.php @@ -0,0 +1,18 @@ +
            > + + + +
            + ', '' ); ?> +
            + +
            + + +
            + + + + + +
            diff --git a/templates/content-single-agency.php b/templates/content-single-agency.php new file mode 100755 index 00000000..b8c3fab2 --- /dev/null +++ b/templates/content-single-agency.php @@ -0,0 +1,148 @@ +get_meta( 'map' ); +$address = $agency->get_meta( 'address' ); +$rowcls = apply_filters( 'opalestate_row_container_class', 'opal-row' ); +$id = time(); +?> + +
            > +
            +
            +
            + + +
            + + [ 'enable' => 1, 'name' => esc_html__( 'Description', 'opalestate-pro' ) ], + 'address' => [ 'enable' => 1, 'name' => esc_html__( 'Address', 'opalestate-pro' ) ], + + 'properties' => [ 'enable' => ! empty( $properties ), 'name' => esc_html__( 'Listing', 'opalestate-pro' ) ], + 'team' => [ 'enable' => ! empty( $team ), 'name' => esc_html__( 'Team', 'opalestate-pro' ) ], + ]; + ?> +
            +
            + +
            +
            +
            +

            +
            +
            + ', '', false ) + ) ); + + $end = 4; + ?> +
            + + + +
            +
            +
            +
            + +
            +

            +
            +
            + +

            + . + ' . esc_html__( 'Location:', 'opalestate-pro' ) . ''; + + $output = ''; + foreach ( $terms as $term ) { + $output .= $term->name; + } + $output .= ''; + echo wp_kses_post( $output ); + } + ?> +

            + +
            +
            +
            +
            + +
            + + +
            +
            +

            + +
            +
            + + + +
            +
            +

            +
            + +
            +
            +
            + +
            +
            +
            + + + +
            + +
            + + +
            + +
            +
            + get_meta( 'email' ); + $args = [ + 'post_id' => get_the_ID(), + 'id' => get_the_ID(), + 'email' => $email, + 'heading' => esc_html__( 'Contact Us', 'opalestate-pro' ), + 'message' => sprintf( esc_html__( 'Hi %s. I saw your profile and wanted to see if you could help me.', 'opalestate-pro' ), get_the_title() ), + 'type' => 'agency', + ]; + echo apply_filters( 'opalestate_render_contact_form', opalestate_load_template_path( 'messages/contact-form', $args ), $args ); + ?> +
            +
            +
            +
            + diff --git a/templates/content-single-agent.php b/templates/content-single-agent.php new file mode 100755 index 00000000..de91594d --- /dev/null +++ b/templates/content-single-agent.php @@ -0,0 +1,112 @@ +get_meta( 'map' ); +$address = $agent->get_meta( 'address' ); +$id = time(); +?> +
            +
            +
            +
            +
            +
            +
              +
            • +
            • +
            • +
            +
            +
            +
            +
            +
            +
            +
            > +
            +
            +
            + +
            + get_meta( 'email' ); + $args = [ + 'post_id' => get_the_ID(), + 'id' => get_the_ID(), + 'email' => $email, + 'message' => '', + 'type' => 'agent', + ]; + echo apply_filters( 'opalestate_render_contact_form', opalestate_load_template_path( 'messages/contact-form', $args ), $args ); + ?> +
            +
            + + +
            +
            +
            + ', '' ); ?> +
            +
            +
            +
            + ', '', false ) + ) ); + + wp_link_pages( [ + 'before' => '', + 'link_before' => '', + 'link_after' => '', + ] ); + ?> +
            +
            + +
            + +
            +
            +
            + +

            + . + ' . esc_html__( 'Location:', 'opalestate-pro' ) . ''; + + $output = ''; + foreach ( $terms as $term ) { + $output .= $term->name; + } + $output .= ''; + echo $output; + } + ?> +

            + +
            +
            +
            + +
            + + + + + + +
            +
            +
            +
            diff --git a/templates/content-single-property-print.php b/templates/content-single-property-print.php new file mode 100755 index 00000000..80b55af5 --- /dev/null +++ b/templates/content-single-property-print.php @@ -0,0 +1,83 @@ + + +
            +
            +
            +
            +
            +

            + + + +
            +
            + + +
            + +
            +
            + latitude && $property->longitude ) : ?> + + + + + + get_address() ) : ?> + get_address() ); ?> + +
            +
            +
            +
            + +
            +
            +
            + + + +
            +
            + +
            +
            > +
            +

            +
            +
            +
            + get_sku() ) : ?> + + get_sku() ); ?> + +
            +
            + + +
            + +
            +
            +
            +
            + diff --git a/templates/content-single-property-v2.php b/templates/content-single-property-v2.php new file mode 100755 index 00000000..7aeff6da --- /dev/null +++ b/templates/content-single-property-v2.php @@ -0,0 +1,166 @@ +get_floor_plans(); +$floors_enabled = $property->get_block_setting( 'floor_plans' ); +$attachments = $property->get_attachments(); +$attachments_enabled = $property->get_block_setting( 'attachments' ); +$header = apply_filters( 'opalestate_single_show_heading', true ); +?> + +
            +
            > + +
            +
            +
            + ', '' ); ?> + + + +
            +
            + + +
            + +
            + latitude && $property->longitude ) : ?> + + + + + + get_address() ) : ?> + get_address() ); ?> + +
            +
            + get_posted() ) + ); + ?> +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            + + [ 'enable' => 1, 'name' => esc_html__( 'Description', 'opalestate-pro' ) ], + 'information' => [ 'enable' => 1, 'name' => esc_html__( 'Information', 'opalestate-pro' ) ], + 'floors' => [ 'enable' => $floors_enabled && $floors, 'name' => esc_html__( 'Floor Plans', 'opalestate-pro' ) ], + 'attachment' => [ 'enable' => $attachments_enabled && $attachments, 'name' => esc_html__( 'Attachment', 'opalestate-pro' ) ], + ]; ?> + +
            + + +
            +
            +
            +

            +
            +
            +
              + get_sku() ) : ?> +
            • + + get_sku() ); ?> +
            • + +
            • + +
            • +
            • + get_id() ); ?> +
            • +
            • + +
            • +
            +
            + +
            + +
            + +
            +
            +
            +
            +
            + +
            +
            +

            +
            + + + +
            +
            +
            + +
            +
            +

            +
            + +
            +
            +
            + + +
            + +
            + +
            +
            +
            + + +
            +
            +
            + +
            +
            +
            +
            diff --git a/templates/content-single-property-v3.php b/templates/content-single-property-v3.php new file mode 100755 index 00000000..362c57fd --- /dev/null +++ b/templates/content-single-property-v3.php @@ -0,0 +1,113 @@ + +
            + + +
            +
            +
              +
            • + +
            • + +
            • + get_id() ); ?> +
            • + +
            • + +
            • +
            +
            +
            +
            + +
            +
            > +
            +
            + +
            +
            +
            +
            + ', '' ); ?> + + + +
            +
            + + +
            + +
            + latitude && $property->longitude ) : ?> + + + + + + get_address() ) : ?> + get_address() ); ?> + +
            +
            + get_posted() ) + ); + ?> +
            +
            +
            +
            +
            + +
            +

            +
            +
            +
            + get_sku() ) : ?> + + get_sku() ); ?> + +
            +
            + +
            + +
            +
            +
            + + + +
            +
            + +
            +
            +
            +
            +
            diff --git a/templates/content-single-property-v4.php b/templates/content-single-property-v4.php new file mode 100755 index 00000000..1e42955f --- /dev/null +++ b/templates/content-single-property-v4.php @@ -0,0 +1,108 @@ + +
            +
            > +
            +
            + +
            +
            +
            + ', '' ); ?> + + + +
            +
            + + +
            + +
            + latitude && $property->longitude ) : ?> + + + + + + get_address() ) : ?> + get_address() ); ?> + +
            +
            + get_posted() ) + ); + ?> +
            +
            +
            +
            +
            +
            + + +
            +

            +
            +
            +
              + get_sku() ) : ?> +
            • + + get_sku() ); ?> +
            • + +
            • + +
            • +
            • + get_id() ); ?> +
            • +
            • + +
            • +
            +
            + + +
            + +
            +
            +
            + + + +
            +
            + +
            +
            + +
            +
            +
            +
            +
            diff --git a/templates/content-single-property-v5.php b/templates/content-single-property-v5.php new file mode 100755 index 00000000..da758115 --- /dev/null +++ b/templates/content-single-property-v5.php @@ -0,0 +1,136 @@ + +
            + +
            +
            +
              +
            • + get_block_setting( 'video' ) ) : ?> +
            • + + get_block_setting( 'map' ) && apply_filters( 'opalestate_single_show_map', true ) ) : ?> +
            • + + get_block_setting( 'walkscores' ) ) : ?> +
            • + + get_block_setting( 'views_statistics' ) ) : ?> +
            • + + get_block_setting( 'apartments' ) && $property->get_apartments() ) : ?> +
            • + + get_block_setting( 'floor_plans' ) && $property->get_floor_plans() ) : ?> +
            • + +
            • +
            • + +
            • +
            +
            +
            +
            + +
            +
            > + +
            +
            + +
            +
            +
            +
            + ', '' ); ?> + + + +
            +
            + + +
            + +
            + latitude && $property->longitude ) : ?> + + + + + + get_address() ) : ?> + get_address() ); ?> + +
            +
            + get_posted() ) + ); + ?> +
            +
            +
            +
            +
            + +
            +

            +
            +
            +
              + get_sku() ) : ?> +
            • + + get_sku() ); ?> +
            • + +
            • + get_id() ); ?> +
            • +
            • + +
            • +
            +
            + + +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            +
            diff --git a/templates/content-single-property.php b/templates/content-single-property.php new file mode 100755 index 00000000..3916c401 --- /dev/null +++ b/templates/content-single-property.php @@ -0,0 +1,112 @@ + + +
            +
            +
            +
            +
            + ', '' ); ?> + + + +
            +
            + + +
            + +
            + latitude && $property->longitude ) : ?> + + + + + + get_address() ) : ?> + get_address() ); ?> + +
            +
            + get_posted() ) + ); + ?> +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            > +
            +
            +
            +

            +
            +
            +
              + get_sku() ) : ?> +
            • + + get_sku() ); ?> +
            • + +
            • + +
            • +
            • + get_id() ); ?> +
            • +
            • + +
            • +
            +
            + + +
            + +
            +
            +
            + + + +
            +
            +
            +
            + +
            +
            +
            +
            +
            diff --git a/templates/content-user-grid.php b/templates/content-user-grid.php new file mode 100755 index 00000000..fa8bc26f --- /dev/null +++ b/templates/content-user-grid.php @@ -0,0 +1,148 @@ +data; +$picture = OpalEstate_User::get_author_picture( $user_id ); + +if ( $agent_id ) { + $agent = opalesetate_agent( $agent_id ); + $post = get_post( $agent_id ); + $facebook = get_post_meta( $agent_id, OPALESTATE_AGENT_PREFIX . 'facebook', true ); + $twitter = get_post_meta( $agent_id, OPALESTATE_AGENT_PREFIX . 'twitter', true ); + $pinterest = get_post_meta( $agent_id, OPALESTATE_AGENT_PREFIX . 'pinterest', true ); + $google = get_post_meta( $agent_id, OPALESTATE_AGENT_PREFIX . 'google', true ); + $instagram = get_post_meta( $agent_id, OPALESTATE_AGENT_PREFIX . 'instagram', true ); + $linkedIn = get_post_meta( $agent_id, OPALESTATE_AGENT_PREFIX . 'linkedIn', true ); + $job = get_post_meta( $agent_id, OPALESTATE_AGENT_PREFIX . 'job', true ); + $title = $post->post_title; + $author_link = get_permalink( $agent_id ); + wp_reset_query(); +} else { + $title = $user->display_name; + $facebook = get_post_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'facebook', true ); + $twitter = get_post_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'twitter', true ); + $pinterest = get_post_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'pinterest', true ); + $google = get_post_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'google', true ); + $instagram = get_post_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'instagram', true ); + $linkedIn = get_post_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'linkedIn', true ); + $job = get_post_meta( $user_id, OPALESTATE_USER_PROFILE_PREFIX . 'job', true ); + $author_link = get_author_posts_url( $user_id ); +} +?> +
            > +
            +
            +
            + user image +
            + + + render_level(); ?> + is_featured() ): ?> + + + + + + + get_trusted() ): ?> + + + + + +
            +
            +
            +
            + +
            + + +

            + + + +

            + +
            +
            + + + get_meta( 'email' ); ?> + +
            + + + + +
            + + + get_meta( 'phone' ); ?> + +
            + + + + +
            + + + get_meta( 'mobile' ); ?> + +
            + + + + +
            + + + get_meta( 'fax' ); ?> + +
            + +
            + + + get_meta( 'web' ); ?> + +
            + + + + +
            + + + +
            + + + + + + + + + + + + + + + + + + + + + + + +
            +
            +
            +
            +
            diff --git a/templates/elementor-templates/opalestate-agency-collection.php b/templates/elementor-templates/opalestate-agency-collection.php new file mode 100755 index 00000000..fb8fd4a9 --- /dev/null +++ b/templates/elementor-templates/opalestate-agency-collection.php @@ -0,0 +1,59 @@ + get_settings_for_display(); + $layout = $settings['item_layout']; + $attrs = $this->get_render_attribute_string( 'wrapper-style' ); + if( isset($_GET['display']) && $_GET['display'] == 'grid' ){ + $layout = 'grid'; + + }else if( isset($_GET['display']) && $_GET['display'] == 'list' ){ + $layout = 'list'; + $attrs = 'class="column-list"'; + } + $onlyfeatured = 0; + if( isset($_GET['s_agents']) ) { + $query = Opalestate_Query::get_agencies( array("posts_per_page"=>$limit, 'paged' => $paged), $onlyfeatured ); + } else { + $query = OpalEstate_Search::get_search_agencies_query(); + } + + $rowcls = apply_filters('opalestate_row_container_class', 'opal-row'); +?> + + +
            +
            +
            + '.$query->found_posts.'' ) ?> +
            +
            +
            +
            + +
            + +
            +
            + +
            + have_posts() ): ?> +
            +
            > + have_posts() ): $query->the_post(); ?> +
            + +
            + +
            +
            + max_num_pages ): ?> +
            + max_num_pages ); ?> +
            + + +
            + +
            + +
            + diff --git a/templates/elementor-templates/opalestate-agent-collection.php b/templates/elementor-templates/opalestate-agent-collection.php new file mode 100755 index 00000000..4453299e --- /dev/null +++ b/templates/elementor-templates/opalestate-agent-collection.php @@ -0,0 +1,62 @@ + get_settings_for_display(); + $layout = $settings['item_layout']; + $attrs = $this->get_render_attribute_string( 'wrapper-style' ); + if( isset($_GET['display']) && $_GET['display'] == 'grid' ){ + $layout = 'grid'; + + }else if( isset($_GET['display']) && $_GET['display'] == 'list' ){ + $layout = 'list'; + $attrs = 'class="column-list"'; + } + + $onlyfeatured = 0 ; + + if( isset($_GET['s_agents']) ) { + $query = Opalestate_Query::get_agents( array("posts_per_page"=>$limit, 'paged' => $paged), $onlyfeatured ); + } else { + $query = OpalEstate_Search::get_search_agents_query(); + } + + $form = $settings['search_form'] ? "search-agents-form-".$settings['search_form']: "search-agents-form"; + $rowcls = apply_filters('opalestate_row_container_class', 'opal-row'); +?> + + +
            +
            +
            + '.$query->found_posts.'' ) ?> +
            +
            +
            +
            + +
            + +
            +
            + +
            + have_posts() ): ?> +
            +
            > + have_posts() ): $query->the_post(); ?> +
            + +
            + +
            +
            + max_num_pages ): ?> +
            + max_num_pages ); ?> +
            + + +
            + +
            + +
            + diff --git a/templates/elementor-templates/opalestate-category-list.php b/templates/elementor-templates/opalestate-category-list.php new file mode 100755 index 00000000..d1830f92 --- /dev/null +++ b/templates/elementor-templates/opalestate-category-list.php @@ -0,0 +1,66 @@ + $settings['limit'], + 'orderby' => $settings['orderby'], + 'order' => $settings['order'], +]; + +if ( $settings['categories'] ) { + $args['slug'] = $settings['categories']; +} + +$terms = Opalestate_Taxonomy_Categories::get_list( $args ); + +$attrs = $this->get_render_attribute_string( 'wrapper-style' ); + +?> +
            +
            > + + term_id ); + $image = wp_get_attachment_image_url( get_term_meta( $category->term_id, 'opalestate_category_image_id', true ), 'full' ); + ?> +
            + + + +
            > +
            +
            +
            + name ) : ?> +

            + name ); ?> +

            + + + count ) : ?> +
            + count, + 'opalestate-pro' + ), + number_format_i18n( $category->count ) + ); + ?> +
            + +
            +
            +
            + +
            +
            diff --git a/templates/elementor-templates/opalestate-city-list.php b/templates/elementor-templates/opalestate-city-list.php new file mode 100755 index 00000000..07d38e6f --- /dev/null +++ b/templates/elementor-templates/opalestate-city-list.php @@ -0,0 +1,66 @@ + $settings['limit'], + 'orderby' => $settings['orderby'], + 'order' => $settings['order'], +]; + +if ( $settings['categories'] ) { + $args['slug'] = $settings['categories']; +} + +$terms = Opalestate_Taxonomy_City::get_list( $args ); + +$attrs = $this->get_render_attribute_string( 'wrapper-style' ); + +?> +
            +
            > + + term_id ); + $image = wp_get_attachment_image_url( get_term_meta( $city->term_id, 'opalestate_city_image_id', true ), 'full' ); + ?> +
            + + + +
            > +
            +
            +
            + name ) : ?> +

            + name ); ?> +

            + + + count ) : ?> +
            + count, + 'opalestate-pro' + ), + number_format_i18n( $city->count ) + ); + ?> +
            + +
            +
            +
            + +
            +
            diff --git a/templates/elementor-templates/opalestate-form-builder.php b/templates/elementor-templates/opalestate-form-builder.php new file mode 100755 index 00000000..fd5615d6 --- /dev/null +++ b/templates/elementor-templates/opalestate-form-builder.php @@ -0,0 +1,30 @@ + +
            + +
            + + +
            + +
            + + +
            + + + +
            + +
            + +
            + diff --git a/templates/elementor-templates/opalestate-map-top-search.php b/templates/elementor-templates/opalestate-map-top-search.php new file mode 100755 index 00000000..3e44e42c --- /dev/null +++ b/templates/elementor-templates/opalestate-map-top-search.php @@ -0,0 +1,18 @@ + +
            + +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            \ No newline at end of file diff --git a/templates/elementor-templates/opalestate-office-agent-search.php b/templates/elementor-templates/opalestate-office-agent-search.php new file mode 100755 index 00000000..9c548e34 --- /dev/null +++ b/templates/elementor-templates/opalestate-office-agent-search.php @@ -0,0 +1,34 @@ + + +
            + + + +
            + +
            +
            + +
            +
            + +
            +
            +
            + + + diff --git a/templates/elementor-templates/opalestate-property-collection.php b/templates/elementor-templates/opalestate-property-collection.php new file mode 100755 index 00000000..1f3a63c0 --- /dev/null +++ b/templates/elementor-templates/opalestate-property-collection.php @@ -0,0 +1,54 @@ + 5, + 'column' => 3, + 'paged' => 1, + 'showsortby' => false, + 'style' => 'grid', +], $settings ); +extract( $settings ); + +if ( is_front_page() ) { + $paged = ( get_query_var( 'page' ) ) ? get_query_var( 'page' ) : 1; +} else { + $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; +} + +$args = [ + 'posts_per_page' => $posts_per_page, + 'paged' => $paged, + 'cities' => $cities, + 'categories' => $categories, + 'operator' => $cat_operator, + 'types' => $types, + 'statuses' => $statuses, + 'showmode' => $showmode, + 'labels' => $labels, +]; + +$query = Opalestate_Query::get_property_query( $args ); + +$class = 'column-item'; +?> + + 'list' ] ); ?> + +
            + + have_posts() ): ?> +
            get_render_attribute_string( 'wrapper-style' ); ?>> + have_posts() ) : $query->the_post(); ?> +
            + +
            + +
            + + +
            + + + + +
            + diff --git a/templates/elementor-templates/opalestate-search-agency.php b/templates/elementor-templates/opalestate-search-agency.php new file mode 100755 index 00000000..6617f7fd --- /dev/null +++ b/templates/elementor-templates/opalestate-search-agency.php @@ -0,0 +1,11 @@ + get_settings_for_display(); + $layout = $settings['item_layout']; + $form = $settings['search_form'] ? "search-agency-form-".$settings['search_form']: "search-agency-form"; + + +?> +
            + $settings['current_uri'] ) ); ?> +
            + \ No newline at end of file diff --git a/templates/elementor-templates/opalestate-search-agents.php b/templates/elementor-templates/opalestate-search-agents.php new file mode 100755 index 00000000..dee32701 --- /dev/null +++ b/templates/elementor-templates/opalestate-search-agents.php @@ -0,0 +1,10 @@ + get_settings_for_display(); + $layout = $settings['item_layout']; + $form = $settings['search_form'] ? "search-agents-form-".$settings['search_form']: "search-agents-form"; + +?> +
            + $settings['current_uri'] ) ); ?> +
            + \ No newline at end of file diff --git a/templates/elementor-templates/opalestate-search-property-results.php b/templates/elementor-templates/opalestate-search-property-results.php new file mode 100755 index 00000000..a274e664 --- /dev/null +++ b/templates/elementor-templates/opalestate-search-property-results.php @@ -0,0 +1,14 @@ + $settings['style'], + 'column' => $settings['column'] + ); +// echo time().'
             ha congtein' . print_r( $display ,1 ).'
            '; + + +?> +
            + + + +
            \ No newline at end of file diff --git a/templates/elementor-templates/opalestate-searchbox.php b/templates/elementor-templates/opalestate-searchbox.php new file mode 100755 index 00000000..304aa38f --- /dev/null +++ b/templates/elementor-templates/opalestate-searchbox.php @@ -0,0 +1,9 @@ + +
            + +
            diff --git a/templates/elementor-templates/opalestate-split-maps-search.php b/templates/elementor-templates/opalestate-split-maps-search.php new file mode 100755 index 00000000..3e34fee7 --- /dev/null +++ b/templates/elementor-templates/opalestate-split-maps-search.php @@ -0,0 +1,37 @@ + +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            +
            + true ] ); ?> +
            + +
            + 2 ] ); ?> +
            +
            +
            +
            +
            +
            diff --git a/templates/emails/contact.php b/templates/emails/contact.php new file mode 100755 index 00000000..4667d52a --- /dev/null +++ b/templates/emails/contact.php @@ -0,0 +1,11 @@ +Hi {receiver_name},
            +You have got message from {name} with email {email} and phone number {phone} +
            +
            Here is detail: +
            +
            +{message} +

            +
            +This message was sent by {site_link} on {current_time}. \ No newline at end of file diff --git a/templates/emails/enquiry.php b/templates/emails/enquiry.php new file mode 100755 index 00000000..2e5db06f --- /dev/null +++ b/templates/emails/enquiry.php @@ -0,0 +1,12 @@ +Hi {receiver_name},
            +You have got message from {name} with email {email} and phone number {phone} +
            +At Property {property_link} +
            Here is detail: +
            +
            +{message} +

            +
            +This message was sent by {site_link} on {current_time}. \ No newline at end of file diff --git a/templates/emails/publish_property.php b/templates/emails/publish_property.php new file mode 100755 index 00000000..12808acd --- /dev/null +++ b/templates/emails/publish_property.php @@ -0,0 +1,15 @@ + +Hi first_name . ' ' . $user->last_name; ?>, + +Your property have published. + +
            + +ID ); ?> + + :
            + \ No newline at end of file diff --git a/templates/emails/request-reviewing.php b/templates/emails/request-reviewing.php new file mode 100755 index 00000000..6ca3afae --- /dev/null +++ b/templates/emails/request-reviewing.php @@ -0,0 +1,15 @@ +Hi {receiver_name},
            +You have got message request reviewing from {name} with email {email} and phone number {phone} +
            +At Property {property_name} ( {property_link} ) +
            Here is detail: +
            +
            +Schedule Date At: {schedule_time} - {schedule_date} +
            + +{message} +

            +
            +This message was sent by {site_link} on {current_time}. \ No newline at end of file diff --git a/templates/fullwidth-page.php b/templates/fullwidth-page.php new file mode 100755 index 00000000..16d8d4fb --- /dev/null +++ b/templates/fullwidth-page.php @@ -0,0 +1,47 @@ + +
            + +
            +
            +
            +
            + +
            > +
            + '', + 'link_before' => '', + 'link_after' => '', + 'pagelink' => '' . esc_html__( 'Page', 'opalestate-pro' ) . ' %', + 'separator' => ', ', + ) + ); + ?> +
            +
            + +
            +
            +
            +
            +
            + + diff --git a/templates/messages/contact-form.php b/templates/messages/contact-form.php new file mode 100755 index 00000000..6a633850 --- /dev/null +++ b/templates/messages/contact-form.php @@ -0,0 +1,44 @@ +get_contact_form_fields(); +$form = OpalEstate()->html->render_form( $fields ); + +$id = 'send-contact-form' +?> + +
            + +
            + +
            +
            +
            + + + + + + + +
            +
            +
            + + +
            + diff --git a/templates/messages/enquiry-form.php b/templates/messages/enquiry-form.php new file mode 100755 index 00000000..76164fd4 --- /dev/null +++ b/templates/messages/enquiry-form.php @@ -0,0 +1,45 @@ +get_equiry_form_fields( $message ); +$form = OpalEstate()->html->render_form( $fields ); + +$id = 'send-enquiry-form'; +?> + + +
            + + + + + + + +
            + +
            +
            +
            +
            +
            +
            + + + + + + + +
            +
            +
            + +
            +
            + diff --git a/templates/messages/request-reviewing-form.php b/templates/messages/request-reviewing-form.php new file mode 100755 index 00000000..6f966ab6 --- /dev/null +++ b/templates/messages/request-reviewing-form.php @@ -0,0 +1,14 @@ +
            +

            +

            + '; ?> + + + + + + + '; ?> +
            diff --git a/templates/notices/error.php b/templates/notices/error.php new file mode 100755 index 00000000..b3f07e6a --- /dev/null +++ b/templates/notices/error.php @@ -0,0 +1,27 @@ + + * @copyright Copyright (C) 2016 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} +if ( ! $messages ) return; + +?> +
              + +
            • + +
            • + +
            \ No newline at end of file diff --git a/templates/notices/success.php b/templates/notices/success.php new file mode 100755 index 00000000..4ae1459f --- /dev/null +++ b/templates/notices/success.php @@ -0,0 +1,24 @@ + + * @copyright Copyright (C) 2016 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} +if ( ! $messages ) return; + +foreach ( $messages as $message ) : ?> +
            + +
            + \ No newline at end of file diff --git a/templates/notices/warning.php b/templates/notices/warning.php new file mode 100755 index 00000000..64014ba7 --- /dev/null +++ b/templates/notices/warning.php @@ -0,0 +1,24 @@ + + * @copyright Copyright (C) 2016 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} +if ( ! $messages ) return; +?> + +
            + +
            + diff --git a/templates/parts/archive-search-block.php b/templates/parts/archive-search-block.php new file mode 100755 index 00000000..d1867d43 --- /dev/null +++ b/templates/parts/archive-search-block.php @@ -0,0 +1,12 @@ + +
            +
            +
            + +
            + +
            +
            \ No newline at end of file diff --git a/templates/parts/archive-simple-bars.php b/templates/parts/archive-simple-bars.php new file mode 100755 index 00000000..b55a1204 --- /dev/null +++ b/templates/parts/archive-simple-bars.php @@ -0,0 +1,17 @@ + +
            +
            +
            + found_posts ): ?> + found_posts ); ?> + +
            +
            + +
            +
            + +
            + +
            +
            \ No newline at end of file diff --git a/templates/parts/collection-navigator.php b/templates/parts/collection-navigator.php new file mode 100755 index 00000000..cd97465d --- /dev/null +++ b/templates/parts/collection-navigator.php @@ -0,0 +1,29 @@ + +
            +
            +
            + + + +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            diff --git a/templates/parts/featured-label.php b/templates/parts/featured-label.php new file mode 100755 index 00000000..811b64ff --- /dev/null +++ b/templates/parts/featured-label.php @@ -0,0 +1,9 @@ +is_featured() ) { + return; +} +?> + + diff --git a/templates/parts/has-warning.php b/templates/parts/has-warning.php new file mode 100755 index 00000000..889a034e --- /dev/null +++ b/templates/parts/has-warning.php @@ -0,0 +1,5 @@ +
            +

            + +

            +

            diff --git a/templates/parts/membership-pricing-info.php b/templates/parts/membership-pricing-info.php new file mode 100755 index 00000000..be8261f6 --- /dev/null +++ b/templates/parts/membership-pricing-info.php @@ -0,0 +1,27 @@ + +
            +
            + + + + + + + +
            +
            + + + + + + + +
            +
            \ No newline at end of file diff --git a/templates/parts/membership-warning.php b/templates/parts/membership-warning.php new file mode 100755 index 00000000..1f38b640 --- /dev/null +++ b/templates/parts/membership-warning.php @@ -0,0 +1,6 @@ + +
            +

            +

            +
            + diff --git a/templates/parts/modules/carousel.php b/templates/parts/modules/carousel.php new file mode 100755 index 00000000..ca0b991c --- /dev/null +++ b/templates/parts/modules/carousel.php @@ -0,0 +1,39 @@ + $item, + 'spaceBetween' => 30, + 'slidesPerGroup' => $item, + 'loop' => false, +]; + +$template_style = isset( $args['style'] ) && $args['style'] ? sanitize_text_field( $args['style'] ) : 'content-property-grid'; +?> + diff --git a/templates/parts/mortgage-calculator.php b/templates/parts/mortgage-calculator.php new file mode 100755 index 00000000..26fc2e46 --- /dev/null +++ b/templates/parts/mortgage-calculator.php @@ -0,0 +1,180 @@ + admin_url( 'admin-ajax.php' ), + 'currency' => esc_attr__( $currency ), + 'loan_amount_text' => esc_html__( 'Loan Amount', 'opalestate-pro' ), + 'your_payment_text' => esc_html__( 'Your payment', 'opalestate-pro' ), + ] +); + +$max_price = intval( $property && $property->get_price() ) ? $property->get_price() : opalestate_options( 'search_max_price', 10000000 ); +$max_price = str_replace( ",", "", $max_price ); +$max_price = str_replace( ".", "", $max_price ); + +$start_price = $max_price; + +$max_price = $max_price + ( $max_price * 20 / 100 ); + + +$rate_start = 10; +$interest_rate_start = $rate_start / 100; +$years_start = 2; +$deposit_start = $max_price / 2; +$loan_amount = $max_price - $deposit_start; +$interest_rate_month = $interest_rate_start / 12; +$number_of_payments_month = $years_start * 12; +$monthly = round( ( $loan_amount * $interest_rate_month ) / ( 1 - pow( 1 + $interest_rate_month, -$number_of_payments_month ) ), 2 ); + +$total = $deposit_start + ( $monthly * $number_of_payments_month ); +$price_percent = $loan_amount / $total * 100; +$deposit_percent = $deposit_start / $total * 100; + +$deposit_color = apply_filters( 'opalestate_deposit_color', '#2f73e9' ); + +$data_sale_price = [ + 'id' => 'sale_price', + 'decimals' => opalestate_get_price_decimals(), + 'unit' => $currency, + 'ranger_min' => 0, + 'ranger_max' => $max_price, + 'input_min' => 0, + 'input_max' => $max_price, + 'mode' => 1, + 'start' => $start_price, +]; + +$data_deposit = [ + 'id' => 'deposit', + 'decimals' => opalestate_get_price_decimals(), + 'unit' => $currency, + 'ranger_min' => 0, + 'ranger_max' => $max_price, + 'input_min' => 0, + 'input_max' => $max_price, + 'mode' => 1, + 'start' => $deposit_start, +]; + +$data_interest_rate = [ + 'id' => 'interest_rate', + 'unit' => '%', + 'ranger_min' => 0, + 'ranger_max' => 100, + 'input_min' => 0, + 'input_max' => 100, + 'mode' => 1, + 'start' => $rate_start, +]; + +$data_years = [ + 'id' => 'years', + 'ranger_min' => 0, + 'ranger_max' => 30, + 'input_min' => 0, + 'input_max' => 30, + 'mode' => 1, + 'start' => $years_start, +]; + +if ( opalestate_options( 'currency_position', 'before' ) == 'before' ) { + $data_sale_price['unit_position'] = 'prefix'; + $data_deposit['unit_position'] = 'prefix'; +} + +?> +
            +

            +
            + +
            +
            +
            +
            +
            + + + + + + +
            +
            +
            +
            +
            +
            + + + + / + +
            +
            + + + + +
            +
            +
              +
            • +
            • +
            • +
            +
            +
            +
            +
            +
            + +
            +
            +
            + +
            +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            + +
            +
            +
            +
            +
            +
            diff --git a/templates/parts/not-allowed.php b/templates/parts/not-allowed.php new file mode 100755 index 00000000..193e8329 --- /dev/null +++ b/templates/parts/not-allowed.php @@ -0,0 +1,9 @@ + + +
            + +
            diff --git a/templates/parts/pagination.php b/templates/parts/pagination.php new file mode 100755 index 00000000..bed4d891 --- /dev/null +++ b/templates/parts/pagination.php @@ -0,0 +1,23 @@ +max_num_pages <= 1 ) { + return; +} + +$args = apply_filters( 'opalestate_pagination_args', [ + 'prev_text' => __( '«' ), + 'next_text' => __( '»' ), + 'type' => 'list', +] ); + +?> + + + + diff --git a/templates/parts/property-categories.php b/templates/parts/property-categories.php new file mode 100755 index 00000000..81485e83 --- /dev/null +++ b/templates/parts/property-categories.php @@ -0,0 +1,6 @@ +get_id(), 'property_category', '
            ' . esc_html__( 'Categories:', 'opalestate-pro' + ) . + '', ', ', '
            ' ); diff --git a/templates/parts/property-label.php b/templates/parts/property-label.php new file mode 100755 index 00000000..adb20380 --- /dev/null +++ b/templates/parts/property-label.php @@ -0,0 +1,19 @@ +get_labels(); + +if ( is_wp_error( $labels ) || ! $labels ) { + return; +} +?> + +
              + $value ) : ?> +
            • + name ); ?> +
            • + +
            diff --git a/templates/parts/property-loop-price.php b/templates/parts/property-loop-price.php new file mode 100755 index 00000000..a2b455fa --- /dev/null +++ b/templates/parts/property-loop-price.php @@ -0,0 +1,36 @@ + + +
            + get_price_oncall() ): ?> +
            + get_price() ): ?> + get_before_price_label() ): ?> + get_before_price_label() ); ?> + + + get_sale_price() ): ?> + + get_price() ); ?> + + get_sale_price() ); ?> + + get_price() ); ?> + + + get_price_label() ): ?> + get_price_label() ); ?> + + +
            + +
            diff --git a/templates/parts/property-loop-short-meta.php b/templates/parts/property-loop-short-meta.php new file mode 100755 index 00000000..7180e27f --- /dev/null +++ b/templates/parts/property-loop-short-meta.php @@ -0,0 +1,33 @@ +get_meta_shortinfo(); + ?> +
            +
              + + $info ) : ?> + +
            • + + + +
            • + + + +
            +
            + get_status(); + +if ( is_wp_error( $statuses ) || ! $statuses ) { + return; +} + +?> +
              + $value ) : ?> +
            • + name ); ?> +
            • + +
            diff --git a/templates/parts/property-types.php b/templates/parts/property-types.php new file mode 100755 index 00000000..43dd5b00 --- /dev/null +++ b/templates/parts/property-types.php @@ -0,0 +1,5 @@ +get_id(), 'opalestate_types', '
            ' . esc_html__( 'Types:', 'opalestate-pro' ) . '', + ', ', '
            ' ); diff --git a/templates/parts/search-agency-form-address.php b/templates/parts/search-agency-form-address.php new file mode 100755 index 00000000..1685466d --- /dev/null +++ b/templates/parts/search-agency-form-address.php @@ -0,0 +1,44 @@ + +
            + +
            +
            +

            +
            + +
            + +
            +
            + +
            +
            + + +
            + + +
            + + +
            + + + +
            +
            \ No newline at end of file diff --git a/templates/parts/search-agency-form.php b/templates/parts/search-agency-form.php new file mode 100755 index 00000000..a767ef1e --- /dev/null +++ b/templates/parts/search-agency-form.php @@ -0,0 +1,32 @@ + +
            + +
            +
            + +
            +
            + + +
            + +
            + + +
            +
            +
            diff --git a/templates/parts/search-agents-form-address.php b/templates/parts/search-agents-form-address.php new file mode 100755 index 00000000..25bd7e86 --- /dev/null +++ b/templates/parts/search-agents-form-address.php @@ -0,0 +1,40 @@ + +
            + +
            +
            +

            +
            + +
            + +
            +
            + +
            +
            + +
            + + +
            + + +
            +
            +
            diff --git a/templates/parts/search-agents-form.php b/templates/parts/search-agents-form.php new file mode 100755 index 00000000..fa32d2be --- /dev/null +++ b/templates/parts/search-agents-form.php @@ -0,0 +1,59 @@ + +
            + +
            +
            +

            +
            + +
            + +
            +
            + +
            +
            + +
            + +
            + 'price', + 'unit' => '$ ', + 'ranger_min' => opalestate_options( 'search_agent_min_price',0 ), + 'ranger_max' => opalestate_options( 'search_agent_max_price',10000000 ), + 'input_min' => $search_min_price, + 'input_max' => $search_max_price + ); + opalesate_property_slide_ranger_template( esc_html__("Price:",'opalestate-pro'), $data ); + + ?> +
            + +
            + + +
            +
            +
            diff --git a/templates/rating/opalestate-ratings.php b/templates/rating/opalestate-ratings.php new file mode 100755 index 00000000..a0468f6c --- /dev/null +++ b/templates/rating/opalestate-ratings.php @@ -0,0 +1,294 @@ + 0, + 4 => 0, + 3 => 0, + 2 => 0, + 1 => 0, +]; + +$average_stats = []; +if ( $features ) { + foreach ( $features as $feature_slug => $feature_title ) { + $average_stats[ $feature_slug ] = '0.00'; + } +} + +$count = $object->get_rating_counts(); +$counts = $object->get_rating_count_stats() ? $object->get_rating_count_stats() : $counts; +$average = $object->get_average_rating(); +$average_stats = $object->get_rating_average_stats() ? $object->get_rating_average_stats() : $average_stats; +?> +
            +

            + +

            +
            +
            +
            +
            + + $value ) : ?> + get_rating_counts() ) * 100 ); ?> +
            + + +
            +
            + % +
            +
            + + % + +
            + + +
            + +
            +
            +
            +

            + get_average_rating() ? $object->get_average_rating() : '0.00' ); ?> +

            +
            + +
            +
            + +
            + + + + + + + + + + + +
            +
            + + +
            + $average_stars ) : ?> + $feature_slug, + 'post_type' => $cpt_feature, + 'post_status' => 'publish', + 'numberposts' => 1, + ]; + + $feature = get_posts( $args ); + if ( ! $feature || ! isset( $feature[0] ) ) { + continue; + } + ?> +
            + + +
            + % +
            +
            + +
            + +
            +
            + +
            + get_review_count() ), + 'review numbers', + 'opalestate-pro' + ), + number_format_i18n( absint( $object->get_review_count() ) ) + ); + ?> +
            + + +
              + 'opalestate_comments' ] ) ); ?> +
            + + 1 && get_option( 'page_comments' ) ) : + echo ''; + endif; + ?> + +

            + +
            + + + + post_author ) ) : ?> + $current_user_id, + 'post_id' => $object->get_id(), + 'status' => 'approve', + 'count' => true, + ] ); + ?> + +
            +
            + have_comments() ? esc_html__( 'Add a review', 'opalestate-pro' ) : sprintf( esc_html__( 'Be the first to review “%s”', 'opalestate-pro' ), get_the_title() ), + /* translators: %s is property title */ + 'title_reply_to' => esc_html__( 'Leave a Reply to %s', 'opalestate-pro' ), + 'title_reply_before' => '
            ', + 'title_reply_after' => '
            ', + 'comment_notes_after' => '', + 'fields' => [ + 'author' => '

            ' . + '

            ', + 'email' => '', + ], + 'label_submit' => esc_html__( 'Submit', 'opalestate-pro' ), + 'logged_in_as' => '', + 'comment_field' => '', + ]; + + if ( $features ) { + $feature_inputs = ''; + foreach ( $features as $feature_slug => $feature_title ) { + $feature_inputs .= '
            '; + } + + $comment_form['comment_field'] = $feature_inputs; + } else { + $comment_form['comment_field'] = '
            '; + } + + $comment_form['comment_field'] .= '

            '; + + comment_form( apply_filters( 'opalestate_property_review_comment_form_args', $comment_form ) ); + ?> +
            +
            + +

            + + +

            + + + + + +
            +
            +
            diff --git a/templates/rating/review-meta.php b/templates/rating/review-meta.php new file mode 100755 index 00000000..7d6a5f91 --- /dev/null +++ b/templates/rating/review-meta.php @@ -0,0 +1,27 @@ +comment_approved ) { ?> + +

            + + + +

            + + + +

            + + +

            + + + +
            +
            + +
            + +
            +
              + $feature_title ) : $feature_key = $cpt_feature . '_' . $feature_slug; ?> +
            • + + +
            • + +
            +
            +
            + + + diff --git a/templates/rating/review.php b/templates/rating/review.php new file mode 100755 index 00000000..7c642546 --- /dev/null +++ b/templates/rating/review.php @@ -0,0 +1,53 @@ + +
          • id="li-comment-"> + +
            + + + +
            + + + +
            +
            diff --git a/templates/search-box/advanced-v2.php b/templates/search-box/advanced-v2.php new file mode 100755 index 00000000..641a776c --- /dev/null +++ b/templates/search-box/advanced-v2.php @@ -0,0 +1,89 @@ + 12, + 1 => 0, + ]; +} else { + $grid = [ + 0 => 10, + 1 => 2, + ]; +} + +$display_country = isset( $display_country ) ? $display_country : true; +$display_state = isset( $display_state ) ? $display_state : false; +$display_city = isset( $display_city ) ? $display_city : false; +$display_more_options = isset( $display_more_options ) ? $display_more_options : true; + +$form_classes = [ + 'opalestate-search-form', + 'opalestate-search-form--advanced-2', + isset( $hidden_labels ) && $hidden_labels ? 'hidden-labels' : '', +]; + +?> +
            +
            +
            +
            +
            + +
            + + +
            + +
            + + + +
            + +
            + + + +
            + +
            + + + + +
            + +
            + +
            + +
            +
            + + +
            + + +
            + +
            + +
            + + +
            diff --git a/templates/search-box/advanced-v3.php b/templates/search-box/advanced-v3.php new file mode 100755 index 00000000..55704d41 --- /dev/null +++ b/templates/search-box/advanced-v3.php @@ -0,0 +1,73 @@ + +
            +
            +
            + +
            + + +
            + +
            + + + +
            + +
            + + + +
            + +
            + + + + +
            + +
            + +
            + +
            + + +
            + +
            + +
            + + + + +
            diff --git a/templates/search-box/advanced-v4.php b/templates/search-box/advanced-v4.php new file mode 100755 index 00000000..73ab689b --- /dev/null +++ b/templates/search-box/advanced-v4.php @@ -0,0 +1,83 @@ + +
            +
            +
            + +
            + +
            + +
            + +
            + +
            + +
            + +
            + + +
            + +
            + + + +
            + +
            + + + +
            + +
            + + + + +
            + + + +
            + + +
            + +
            + +
            + + + + +
            diff --git a/templates/search-box/advanced-v5.php b/templates/search-box/advanced-v5.php new file mode 100755 index 00000000..e7d76535 --- /dev/null +++ b/templates/search-box/advanced-v5.php @@ -0,0 +1,70 @@ + 3, + 1 => 3, + 2 => 3, + 3 => 3, + 4 => 0, + ]; +} else { + $grid = [ + 0 => 3, + 1 => 3, + 2 => 3, + 3 => 2, + 4 => 1, + ]; +} + +$display_more_options = isset( $display_more_options ) ? $display_more_options : false; + +$form_classes = [ + 'opalestate-search-form', + 'opalestate-search-form--advanced-5', + isset( $hidden_labels ) && $hidden_labels ? 'hidden-labels' : '', +]; + +?> +
            +
            +
            + +
            + +
            + +
            + +
            + 1 ] ); ?> +
            + +
            + +
            + + +
            + +
            + + + +
            + +
            + +
            + + +
            diff --git a/templates/search-box/advanced-v6.php b/templates/search-box/advanced-v6.php new file mode 100755 index 00000000..18896d40 --- /dev/null +++ b/templates/search-box/advanced-v6.php @@ -0,0 +1,42 @@ + + +
            +
            + +
            + +
            + +
            + + + + + + + + +
            diff --git a/templates/search-box/collapse-city.php b/templates/search-box/collapse-city.php new file mode 100755 index 00000000..8c834cf2 --- /dev/null +++ b/templates/search-box/collapse-city.php @@ -0,0 +1,87 @@ + 7, + 1 => 4, + 2 => 1, + 3 => 0, + ]; +} else { + $grid = [ + 0 => 6, + 1 => 3, + 2 => 1, + 3 => 2, + ]; +} + +$display_more_options = isset( $display_more_options ) ? $display_more_options : true; + +$form_classes = [ + 'opalestate-search-form', + 'opalestate-search-form--collapse-city', + isset( $hidden_labels ) && $hidden_labels ? 'hidden-labels' : '', +]; + +?> + +
            +
            +
            + +
            + +
            + +
            + +
            + +
            + + +
            + +
            + +
            + +
            +
            +
            + +
            + + + +
            + +
            + +
            + +
            +
            + + +
            + + +
            diff --git a/templates/search-box/collapse-keyword.php b/templates/search-box/collapse-keyword.php new file mode 100755 index 00000000..7214393f --- /dev/null +++ b/templates/search-box/collapse-keyword.php @@ -0,0 +1,109 @@ + 5, + 1 => 3, + 2 => 3, + 3 => 1, + 4 => 0, + ]; +} else { + $grid = [ + 0 => 5, + 1 => 2, + 2 => 2, + 3 => 1, + 4 => 2, + ]; +} + +$display_country = isset( $display_country ) ? $display_country : true; +$display_state = isset( $display_state ) ? $display_state : false; +$display_city = isset( $display_city ) ? $display_city : false; +$display_more_options = isset( $display_more_options ) ? $display_more_options : true; + +$form_classes = [ + 'opalestate-search-form', + 'opalestate-search-form--collapse-keyword', + isset( $hidden_labels ) && $hidden_labels ? 'hidden-labels' : '', +]; + +?> + +
            +
            +
            + +
            + +
            + +
            + +
            + +
            + +
            + +
            + + +
            + +
            + +
            + +
            +
            + +
            + +
            + + + +
            + +
            + + + +
            + +
            + + + + +
            + +
            + +
            + +
            +
            + + +
            + + +
            diff --git a/templates/search-box/fields/areasize.php b/templates/search-box/fields/areasize.php new file mode 100755 index 00000000..47ee4d45 --- /dev/null +++ b/templates/search-box/fields/areasize.php @@ -0,0 +1 @@ + diff --git a/templates/search-box/fields/city-select.php b/templates/search-box/fields/city-select.php new file mode 100755 index 00000000..f8005b29 --- /dev/null +++ b/templates/search-box/fields/city-select.php @@ -0,0 +1,3 @@ + $label ): ?> + +
            + +
            + + diff --git a/templates/search-box/fields/location.php b/templates/search-box/fields/location.php new file mode 100755 index 00000000..3d43d415 --- /dev/null +++ b/templates/search-box/fields/location.php @@ -0,0 +1,2 @@ + + diff --git a/templates/search-box/fields/more-options.php b/templates/search-box/fields/more-options.php new file mode 100755 index 00000000..c297e8df --- /dev/null +++ b/templates/search-box/fields/more-options.php @@ -0,0 +1,33 @@ + +
            + + +
            +
            + +
            + +
            + +
            +
            +
            diff --git a/templates/search-box/fields/price.php b/templates/search-box/fields/price.php new file mode 100755 index 00000000..d8b6aabf --- /dev/null +++ b/templates/search-box/fields/price.php @@ -0,0 +1,20 @@ + 'price', + 'decimals' => opalestate_get_price_decimals(), + 'unit' => opalestate_currency_symbol() . ' ', + 'ranger_min' => opalestate_options( 'search_min_price', 0 ), + 'ranger_max' => opalestate_options( 'search_max_price', 10000000 ), + 'input_min' => $search_min_price, + 'input_max' => $search_max_price, +]; + +if ( opalestate_options( 'currency_position', 'before' ) == 'before' ) { + $data['unit_position'] = 'prefix'; +} + +?> + diff --git a/templates/search-box/fields/radius.php b/templates/search-box/fields/radius.php new file mode 100755 index 00000000..bc807e83 --- /dev/null +++ b/templates/search-box/fields/radius.php @@ -0,0 +1,15 @@ + 'radius', + 'unit' => 'miles', + 'ranger_min' => opalestate_options( 'search_min_radius', 0 ), + 'ranger_max' => opalestate_options( 'search_max_radius', 10000000 ), + 'input_min' => $search_min_radius, + 'input_max' => $search_max_radius, +]; + +opalesate_property_slide_ranger_template( esc_html__( 'Radius:', 'opalestate-pro' ), $data ); +?> diff --git a/templates/search-box/fields/search-city-text.php b/templates/search-box/fields/search-city-text.php new file mode 100755 index 00000000..a77ca7a3 --- /dev/null +++ b/templates/search-box/fields/search-city-text.php @@ -0,0 +1,44 @@ + 'geo_radius', + 'decimals' => 0, + 'unit' => $unit, + 'ranger_min' => 0, + 'ranger_max' => $max_price, + 'input_min' => 0, + 'input_max' => $max_price, + 'mode' => 1, + 'start' => $max_geo_radius, +]; + +?> +
            + + + + +
            +
            + + + +
            +
            diff --git a/templates/search-box/fields/search-text.php b/templates/search-box/fields/search-text.php new file mode 100755 index 00000000..631dacaa --- /dev/null +++ b/templates/search-box/fields/search-text.php @@ -0,0 +1,2 @@ + + diff --git a/templates/search-box/fields/state-select.php b/templates/search-box/fields/state-select.php new file mode 100755 index 00000000..708c2693 --- /dev/null +++ b/templates/search-box/fields/state-select.php @@ -0,0 +1,3 @@ + + +
            +
              + +
            • + +
            • + + + +
            • + name ); ?> +
            • + +
            + +
            diff --git a/templates/search-box/fields/status.php b/templates/search-box/fields/status.php new file mode 100755 index 00000000..fb64c6ee --- /dev/null +++ b/templates/search-box/fields/status.php @@ -0,0 +1,4 @@ + diff --git a/templates/search-box/fields/submit-button.php b/templates/search-box/fields/submit-button.php new file mode 100755 index 00000000..ba997687 --- /dev/null +++ b/templates/search-box/fields/submit-button.php @@ -0,0 +1,3 @@ + diff --git a/templates/search-box/fields/types.php b/templates/search-box/fields/types.php new file mode 100755 index 00000000..0da24748 --- /dev/null +++ b/templates/search-box/fields/types.php @@ -0,0 +1,9 @@ + diff --git a/templates/search-box/search-form-h.php b/templates/search-box/search-form-h.php new file mode 100755 index 00000000..36aac049 --- /dev/null +++ b/templates/search-box/search-form-h.php @@ -0,0 +1,77 @@ + + +
            +
            + 2 ] ); ?> +
            + +
            + +
            + +
            + + + +
            + +
            + + + +
            + +
            + + +
            +
            + +
            +
            + +
            + +
            + +
            + +
            + +
            + +
            + +
            + +
            + +
            + + + +
            diff --git a/templates/search-box/search-form-v.php b/templates/search-box/search-form-v.php new file mode 100755 index 00000000..e6913ac1 --- /dev/null +++ b/templates/search-box/search-form-v.php @@ -0,0 +1,58 @@ + + +
            + + + + + 'input' ] ); ?> + + + + + + + + + + +
            + diff --git a/templates/search-box/search-form-v2.php b/templates/search-box/search-form-v2.php new file mode 100755 index 00000000..248cc36f --- /dev/null +++ b/templates/search-box/search-form-v2.php @@ -0,0 +1,63 @@ + + +
            +
            +
            + +
            + +
            +
            + true ) ); ?> +
            + +
            +
            + 'input' ) ); ?> +
            + +
            +
            + +
            + +
            +
            + +
            + + + + +
            + +
            + +
            + + +
            + diff --git a/templates/search-box/search-form-v3.php b/templates/search-box/search-form-v3.php new file mode 100755 index 00000000..23e7000f --- /dev/null +++ b/templates/search-box/search-form-v3.php @@ -0,0 +1,80 @@ + + +
            +
            + +
            +
            + +
            + + +
            +
            + true ] ); ?> +
            + +
            +
            + 'input' ] ); ?> +
            + +
            +
            + +
            + +
            +
            + +
            + + + + +
            + +
            + +
            + + +
            + diff --git a/templates/search-box/simple-city.php b/templates/search-box/simple-city.php new file mode 100755 index 00000000..5537749f --- /dev/null +++ b/templates/search-box/simple-city.php @@ -0,0 +1,64 @@ + 6, + 1 => 3, + 2 => 3, + 3 => 3, + ]; +} else { + $grid = [ + 0 => 6, + 1 => 2, + 2 => 2, + 3 => 2, + ]; +} + +$display_more_options = isset( $display_more_options ) ? $display_more_options : false; + +$form_classes = [ + 'opalestate-search-form', + 'opalestate-search-form--simple-city', + isset( $hidden_labels ) && $hidden_labels ? 'hidden-labels' : '', +]; + +?> + +
            +
            +
            + +
            + +
            + +
            + +
            + +
            + + +
            + +
            + +
            + + + + +
            diff --git a/templates/search-box/simple-keyword.php b/templates/search-box/simple-keyword.php new file mode 100755 index 00000000..c445afe6 --- /dev/null +++ b/templates/search-box/simple-keyword.php @@ -0,0 +1,64 @@ + 6, + 1 => 3, + 2 => 3, + 3 => 3, + ]; +} else { + $grid = [ + 0 => 6, + 1 => 2, + 2 => 2, + 3 => 2, + ]; +} + +$display_more_options = isset( $display_more_options ) ? $display_more_options : false; + +$form_classes = [ + 'opalestate-search-form', + 'opalestate-search-form--simple-keyword', + isset( $hidden_labels ) && $hidden_labels ? 'hidden-labels' : '', +]; + +?> + +
            +
            +
            + +
            + +
            + +
            + +
            + +
            + + +
            + +
            + +
            + + + + +
            diff --git a/templates/shortcodes/ajax-map-quick-search.php b/templates/shortcodes/ajax-map-quick-search.php new file mode 100755 index 00000000..ae9fa437 --- /dev/null +++ b/templates/shortcodes/ajax-map-quick-search.php @@ -0,0 +1,53 @@ + + diff --git a/templates/shortcodes/ajax-map-search-result.php b/templates/shortcodes/ajax-map-search-result.php new file mode 100755 index 00000000..3935eb7a --- /dev/null +++ b/templates/shortcodes/ajax-map-search-result.php @@ -0,0 +1,75 @@ + +
            +
            +
            +
            +
            + found_posts ): ?> + found_posts ); ?> + +
            +
            +
            +
            + +
            + +
            + +
            +
            +
            + +
            + have_posts() ): ?> +
            + + have_posts() ) : $query->the_post(); ?> +
            + +
            + + + have_posts() ) : $query->the_post(); + $cls = ''; + if ( $cnt++ % $column == 0 ) { + $cls .= ' first-child'; + } + ?> +
            + +
            + + +
            + + + + +
            +
            +max_num_pages > 1 ): ?> +
            max_num_pages ); ?>
            + + + diff --git a/templates/shortcodes/search-agents.php b/templates/shortcodes/search-agents.php new file mode 100755 index 00000000..2cf3e17e --- /dev/null +++ b/templates/shortcodes/search-agents.php @@ -0,0 +1,44 @@ + +
            + + have_posts() ): ?> +
            + +
            +
            +

            ' . $query->found_posts . '' ) ?>

            +
            + +
            + +
            +
            + +
            + have_posts() ): $query->the_post(); ?> +
            + +
            + +
            + max_num_pages ): ?> +
            + max_num_pages ); ?> +
            + +
            + + +
            + +
            + +
            + diff --git a/templates/shortcodes/search-map-properties.php b/templates/shortcodes/search-map-properties.php new file mode 100755 index 00000000..033d49bd --- /dev/null +++ b/templates/shortcodes/search-map-properties.php @@ -0,0 +1,8 @@ + +
            +
            + +
            +
            diff --git a/templates/shortcodes/search-properties-result.php b/templates/shortcodes/search-properties-result.php new file mode 100755 index 00000000..b8d148e9 --- /dev/null +++ b/templates/shortcodes/search-properties-result.php @@ -0,0 +1,73 @@ + +
            +
            +
            +
            + +
            + +
            +
            + +
            +
            +
            +
            + +
            + +
            + found_posts ); ?> +
            +
            +
            + +
            +
            + +
            + have_posts() ): ?> +
            + + have_posts() ) : $query->the_post(); ?> +
            + +
            + + + have_posts() ) : $query->the_post(); + $cls = ''; + $layout = isset( $style ) ? 'content-property-' . $style : $grid_layout; + + if ( $cnt++ % $column == 0 ) { + $cls .= ' first-child'; + } + ?> +
            + +
            + + +
            + + + +
            +
            +max_num_pages > 1 ): ?> +
            max_num_pages ); ?>
            + + +
            + +
            +
          • diff --git a/templates/shortcodes/search-properties.php b/templates/shortcodes/search-properties.php new file mode 100755 index 00000000..28453fa8 --- /dev/null +++ b/templates/shortcodes/search-properties.php @@ -0,0 +1,20 @@ + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            +
            diff --git a/templates/shortcodes/submission-form.php b/templates/shortcodes/submission-form.php new file mode 100755 index 00000000..84c74be3 --- /dev/null +++ b/templates/shortcodes/submission-form.php @@ -0,0 +1,61 @@ + +
            +
            +
            + + +
            + + + + +
            + +
            + + +
            + + +
            + +

            + +

            + +
            + + + +
            +
            + $value ): ?> + + + + + + +
            +
            + '
            %3$s'.$nonce.'
            ', + 'save_button' => esc_html__( 'Save property', 'opalestate-pro' ), + ] ); ?> +
            +
            + + + +
            +
            +
            diff --git a/templates/single-agency/author-box.php b/templates/single-agency/author-box.php new file mode 100755 index 00000000..0175093a --- /dev/null +++ b/templates/single-agency/author-box.php @@ -0,0 +1,162 @@ +get_meta( 'address' ); ?> +
            + +
            +
            +
            +
            + +
            +
            + + + + + + + +
            + is_featured() ): ?> +
            + + + +
            + + + get_trusted() ): ?> + + + + +
            + +
            +
            + +
            +
            + +
            +

            +

            + +

            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            +
            + ', '' ); ?> + +

            +
            + +
            + + +
            + + + +
            + + + + +
            + + + + + +
            + +
            + + + + +
            + +
            + + + + +
            + +
            + + + + +
            + + + + +
            + + +
            + + +
            + +
            + + + + + + + + + + + + + + + + + + + + + +
            +
            +
            +
            + + diff --git a/templates/single-agency/gallery.php b/templates/single-agency/gallery.php new file mode 100755 index 00000000..9b289547 --- /dev/null +++ b/templates/single-agency/gallery.php @@ -0,0 +1,17 @@ +get_gallery(); + +if ( ! $gallery ) { + return; +} +?> + + diff --git a/templates/single-agency/index.html b/templates/single-agency/index.html new file mode 100755 index 00000000..dcaf7169 --- /dev/null +++ b/templates/single-agency/index.html @@ -0,0 +1 @@ +index.html diff --git a/templates/single-agency/properties.php b/templates/single-agency/properties.php new file mode 100755 index 00000000..7d129c70 --- /dev/null +++ b/templates/single-agency/properties.php @@ -0,0 +1,39 @@ +have_posts() ) : + $id = rand(); +?> +
            +
            +

            found_posts );?>

            +
            +
            + have_posts() ) : $query->the_post(); ?> +
            + +
            + +
            + max_num_pages > 1 ): ?> +
            max_num_pages; // opalestate_pagination( $query->max_num_pages ); ?>
            +
            + + +
            +
            + +
            + +
            + + + diff --git a/templates/single-agency/summary.php b/templates/single-agency/summary.php new file mode 100755 index 00000000..badd962b --- /dev/null +++ b/templates/single-agency/summary.php @@ -0,0 +1,53 @@ +
            + +
            +
            +
            + +
            + + + +
            + + +
            + + + +
            + + + +
            + + + + +
            + +
            + + + + +
            + + + +
            + +
            +
            + +
            +
            +
            +

            + +

            +
            + +
            +
            +
            \ No newline at end of file diff --git a/templates/single-agency/tabs.php b/templates/single-agency/tabs.php new file mode 100755 index 00000000..e91a49c7 --- /dev/null +++ b/templates/single-agency/tabs.php @@ -0,0 +1,40 @@ + +
            + +
            +
            + +
            + + +
            + +
            + + +
            + +
            + +
            + +
            + diff --git a/templates/single-agency/team.php b/templates/single-agency/team.php new file mode 100755 index 00000000..81248482 --- /dev/null +++ b/templates/single-agency/team.php @@ -0,0 +1,26 @@ + +
            + +
            + +
            + $user_id ] ); ?> +
            + +
            + + + + +
            + + diff --git a/templates/single-agent/author-box.php b/templates/single-agent/author-box.php new file mode 100755 index 00000000..e0787999 --- /dev/null +++ b/templates/single-agent/author-box.php @@ -0,0 +1,130 @@ + +
            +
            +
            + +
            + + + + render_level(); ?> + is_featured() ): ?> + + + + + + + + get_trusted() ): ?> + + + + +
            + +
            +
            +

            + +

            + + get_meta( 'job' ); ?> +

            + + get_meta( 'email' ); ?> + +
            + + + + +
            + + + get_meta( 'phone' ); ?> + +
            + + + + +
            + + + get_meta( 'mobile' ); ?> + +
            + + + + +
            + + + get_meta( 'fax' ); ?> + +
            + +
            + + + get_meta( 'web' ); ?> + +
            + + + + +
            + + + get_socials(); ?> + + +
            + + + + + + + + + + + + + + + + + + + + + + + +
            + +
            + + + +
            + +
            +

            + + + +

            + +
            +
            diff --git a/templates/single-agent/box.php b/templates/single-agent/box.php new file mode 100755 index 00000000..6d540e54 --- /dev/null +++ b/templates/single-agent/box.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/single-agent/featured-properties.php b/templates/single-agent/featured-properties.php new file mode 100755 index 00000000..c1740645 --- /dev/null +++ b/templates/single-agent/featured-properties.php @@ -0,0 +1,33 @@ +have_posts() ) : + + $data = [ + 'slidesPerView' => 1, + 'spaceBetween' => 0, + 'effect' => 'slide', + 'loop' => true, + 'breakpoints' => [ 1024 => [ "slidesPerView" => 1 ] ], + ]; + ?> + + + get_the_ID() ); + + if( isset($author_id) && $author_id ){ + + $args = array( + 'post_id' => get_the_ID(), + 'id' => $author_id, + 'email' => $email, + 'message' => '', + 'type' => 'user', + ); + echo opalestate_load_template_path( 'messages/contact-form', $args ); + }else { + $email = get_post_meta( get_the_ID(), OPALESTATE_AGENT_PREFIX . 'email', true ); + $args = array( + 'post_id' => get_the_ID(), + 'id' => get_the_ID(), + 'email' => $email, + 'message' => '', + 'type' => 'agent', + ); + + echo opalestate_load_template_path( 'messages/contact-form', $args ); + } \ No newline at end of file diff --git a/templates/single-agent/properties.php b/templates/single-agent/properties.php new file mode 100755 index 00000000..cc681382 --- /dev/null +++ b/templates/single-agent/properties.php @@ -0,0 +1,29 @@ +have_posts() ) : +?> +
            +
            +

            found_posts );?>

            +
            +
            +
            + have_posts() ) : $query->the_post(); ?> +
            + +
            + +
            +
            + max_num_pages > 1 ): ?> +
            max_num_pages ); ?>
            + +
            +
            + diff --git a/templates/single-agent/summary.php b/templates/single-agent/summary.php new file mode 100755 index 00000000..8d1e8135 --- /dev/null +++ b/templates/single-agent/summary.php @@ -0,0 +1,54 @@ +
            + +
            +
            +
            + +
            + + + +
            + + +
            + + + +
            + + + + +
            + + + + +
            + +
            + + + + +
            + + + +
            + +
            +
            + +
            +
            +
            +

            + +

            +
            + +
            +
            +
            \ No newline at end of file diff --git a/templates/single-opalestate_agency.php b/templates/single-opalestate_agency.php new file mode 100755 index 00000000..5237431d --- /dev/null +++ b/templates/single-opalestate_agency.php @@ -0,0 +1,25 @@ + +
            + +
            +
            +
            + + + + + + + + + + +
            +
            + + diff --git a/templates/single-opalestate_agent.php b/templates/single-opalestate_agent.php new file mode 100755 index 00000000..58f7eb0d --- /dev/null +++ b/templates/single-opalestate_agent.php @@ -0,0 +1,32 @@ + +
            +
            +
            +
            +
            + ', '' ); ?> +
            +
            +
            +
            +
            +
            + + + + + + + + + + +
            +
            + + diff --git a/templates/single-opalestate_property.php b/templates/single-opalestate_property.php new file mode 100755 index 00000000..a818fefd --- /dev/null +++ b/templates/single-opalestate_property.php @@ -0,0 +1,33 @@ + + +
            +
            +
            + + + + + +
            +
            + +
            +
            + + + + +
            +
            +
            + + diff --git a/templates/single-property/amenities.php b/templates/single-property/amenities.php new file mode 100755 index 00000000..d44fddc7 --- /dev/null +++ b/templates/single-property/amenities.php @@ -0,0 +1,25 @@ +get_amenities(); + +?> +get_block_setting( 'amenities' ) && $amenities ): ?> +
            +
            +
            +
            + +
            + term_id, 'opalestate_amt_image_id', true )) { + echo wp_get_attachment_image( $image_id ); + } + ?> + name ); ?> +
            + +
            +
            +
            + diff --git a/templates/single-property/apartments.php b/templates/single-property/apartments.php new file mode 100755 index 00000000..6fa46331 --- /dev/null +++ b/templates/single-property/apartments.php @@ -0,0 +1,55 @@ +get_block_setting( 'apartments' ) ) { + return; +} + +$apartments = $property->get_apartments(); +if ( ! $apartments ) { + return; +} + +?> +
            +

            +
            +
            +
            +
            + + + + + + + + + + + + + + $apartment ) : ?> + + + + + + + + + + + +
            + + + + + +
            +
            +
            +
            +
            +
            diff --git a/templates/single-property/attachments.php b/templates/single-property/attachments.php new file mode 100755 index 00000000..f90784e5 --- /dev/null +++ b/templates/single-property/attachments.php @@ -0,0 +1,27 @@ +get_block_setting( 'attachments' ) ) { + return; +} + +$attachments = $property->get_attachments(); +?> + +
            +
            +
            +
            + $attachment ) : + $attachment_title = get_the_title( $id ); + ?> +
            + + + +
            + +
            +
            +
            + diff --git a/templates/single-property/author-v2.php b/templates/single-property/author-v2.php new file mode 100755 index 00000000..39b26974 --- /dev/null +++ b/templates/single-property/author-v2.php @@ -0,0 +1,51 @@ +get_author_type(); +$data = get_userdata( $post->post_author ); +$layout = ''; +switch ( $type ) { + case 'hide': + return ; + break; + case 'agent' : + $agent_id = $property->get_metabox_value( 'agent' ); + + $author_info = opalestate_load_template_path( 'single-property/user/author-member-box', + array( 'author' => $data, + 'id' => $agent_id , + 'prefix' => OPALESTATE_AGENT_PREFIX, + 'picture' => '', + 'type' => 'agent', + 'hide_description' => true ) ); + break; + case 'agency' : + $agency_id = $property->get_metabox_value( 'agency' ); + $author_info = opalestate_load_template_path( 'single-property/user/author-member-box', + array( 'author' => $data, + 'id' => $agency_id , + 'picture' => '', + 'type' => 'agency', + 'hide_description' => true ) ); + break; + default: + + $author_info = opalestate_load_template_path( 'single-property/user/author-user-box', array('author' => $data , 'hide_description' => true ), $layout ); + + break; +} +?> +
            +
            +
            +
            + +
            +
            +
            +
            + + diff --git a/templates/single-property/author-v3.php b/templates/single-property/author-v3.php new file mode 100755 index 00000000..18392991 --- /dev/null +++ b/templates/single-property/author-v3.php @@ -0,0 +1,50 @@ +get_author_type(); +$data = get_userdata( $post->post_author ); +$layout = 'list'; +switch ( $type ) { + case 'hide': + return ; + break; + case 'agent' : + $agent_id = $property->get_metabox_value( 'agent' ); + + $author_info = opalestate_load_template_path( 'single-property/user/author-member-box', + array( 'author' => $data, + 'id' => $agent_id , + 'prefix' => OPALESTATE_AGENT_PREFIX, + 'picture' => '', + 'type' => 'agent', + 'hide_description' => true ) ); + break; + case 'agency' : + $agency_id = $property->get_metabox_value( 'agency' ); + $author_info = opalestate_load_template_path( 'single-property/user/author-member-box', + array( 'author' => $data, + 'id' => $agency_id , + 'picture' => '', + 'type' => 'agency', + 'hide_description' => true ) ); + break; + default: + + $author_info = opalestate_load_template_path( 'single-property/user/author-user-box', array('author' => $data , 'hide_description' => true ), $layout ); + + break; +} +?> +
            +
            +
            +
            + +
            +
            + true) ); ?> +
            +
            diff --git a/templates/single-property/author.php b/templates/single-property/author.php new file mode 100755 index 00000000..7555ecf0 --- /dev/null +++ b/templates/single-property/author.php @@ -0,0 +1,60 @@ +get_author_type(); +$data = get_userdata( $post->post_author ); +$layout = 'list'; +switch ( $type ) { + case 'hide': + return; + break; + case 'agent' : + $agent_id = $property->get_metabox_value( 'agent' ); + + $author_info = opalestate_load_template_path( 'single-property/user/author-member-box', + [ + 'author' => $data, + 'id' => $agent_id, + 'prefix' => OPALESTATE_AGENT_PREFIX, + 'picture' => '', + 'type' => 'agent', + 'hide_description' => true, + ] ); + break; + case 'agency' : + $agency_id = $property->get_metabox_value( 'agency' ); + $author_info = opalestate_load_template_path( 'single-property/user/author-member-box', + [ + 'author' => $data, + 'id' => $agency_id, + 'picture' => '', + 'type' => 'agency', + 'hide_description' => true, + ] ); + break; + default: + + $author_info = opalestate_load_template_path( 'single-property/user/author-user-box', [ 'author' => $data, 'hide_description' => true ], $layout ); + + break; +} +?> +
            +
            +
            +
            +
            +
            + +
            +
            +
            + true ] ); ?> +
            +
            +
            +
            +
            diff --git a/templates/single-property/content.php b/templates/single-property/content.php new file mode 100755 index 00000000..7de5db14 --- /dev/null +++ b/templates/single-property/content.php @@ -0,0 +1,17 @@ +
            +
            + ', '', false ) + ) ); + + wp_link_pages( array( + 'before' => '', + 'link_before' => '', + 'link_after' => '', + ) ); + ?> +
            \ No newline at end of file diff --git a/templates/single-property/facilities.php b/templates/single-property/facilities.php new file mode 100755 index 00000000..8fa1d5ab --- /dev/null +++ b/templates/single-property/facilities.php @@ -0,0 +1,26 @@ +get_facilities(); + +?> + +get_block_setting( 'facilities' ) && $facilities && isset( $facilities[0] ) && ! empty( $facilities[0] ) ): ?> +
            +
            +
            +
            + +
            + + + : + + + +
            + +
            +
            +
            + diff --git a/templates/single-property/features.php b/templates/single-property/features.php new file mode 100755 index 00000000..aede7b7e --- /dev/null +++ b/templates/single-property/features.php @@ -0,0 +1,51 @@ +get_metabox_info(); + +$types = $property->get_types(); +$status = $property->get_status(); + +?> +ha cong +
            +

            +
            + +
            +
            diff --git a/templates/single-property/floor-plans.php b/templates/single-property/floor-plans.php new file mode 100755 index 00000000..3eade2e9 --- /dev/null +++ b/templates/single-property/floor-plans.php @@ -0,0 +1,86 @@ +get_block_setting( 'floor_plans' ) ) { + return; +} + +$floor_plans = $property->get_floor_plans(); +if ( ! $floor_plans ) { + return; +} + +?> +
            +

            +
            +
            +
            +
            + $plan ) : ?> + + + + +
            + +
            + $plan ) : ?> +
            + +

            + +

            + +
              + +
            • + + +
            • + + + +
            • + + +
            • + + + +
            • + + +
            • + + + +
            • + + +
            • + +
            + + +
            + +
            + + + +
            + +
            + +
            + +
            +
            +
            +
            +
            diff --git a/templates/single-property/information.php b/templates/single-property/information.php new file mode 100755 index 00000000..cacc6889 --- /dev/null +++ b/templates/single-property/information.php @@ -0,0 +1,36 @@ +get_meta_fullinfo(); +$taxs = $property->get_types_tax(); + +?> +
            +
            +
            +
              + +
            • +
              +
              + + name ); ?> + +
              +
            • + + + $info ) : ?> + +
            • +
              +
              :
              + +
              +
            • + + + +
            +
            +
            diff --git a/templates/single-property/location.php b/templates/single-property/location.php new file mode 100755 index 00000000..dccb0fd6 --- /dev/null +++ b/templates/single-property/location.php @@ -0,0 +1,19 @@ +getLocations(); + +if ( !empty($locations) ) : +?> + + + + name ); ?> + + + + diff --git a/templates/single-property/map-v2.php b/templates/single-property/map-v2.php new file mode 100755 index 00000000..83f3a7fe --- /dev/null +++ b/templates/single-property/map-v2.php @@ -0,0 +1,95 @@ +get_block_setting( 'map' ) ) { + return; +} + +$maps = $property->get_map(); + +if ( empty( $maps ) ) { + return; +} +?> +
            + +
            +
            +
            + +
            + +
            +
            + +
            +
            +
            +
            +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + + +
            + +
            + +
            +
            + +
            +
            +
            +
            +
            + enable_google_mapview() ) : ?> +
            +
            + +
            +
            +
            +
            diff --git a/templates/single-property/map.php b/templates/single-property/map.php new file mode 100755 index 00000000..32ee32b7 --- /dev/null +++ b/templates/single-property/map.php @@ -0,0 +1,98 @@ +get_block_setting( 'map' ) ) { + return; +} + +$maps = $property->get_map(); + +if ( empty( $maps ) ) { + return; +} +$id = time(); +?> +
            +

            +
            +
            + + +
            +
            + + +
            +
            +
            +
            +
            + + +
            + + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + + +
            + +
            + +
            +
            + +
            +
            +
            +
            +
            + + enable_google_mapview() ) : ?> +
            +
            +
            +
            + +
            +
            +
            +
            + + diff --git a/templates/single-property/meta.php b/templates/single-property/meta.php new file mode 100755 index 00000000..ac048cd5 --- /dev/null +++ b/templates/single-property/meta.php @@ -0,0 +1,37 @@ +get_meta_shortinfo(); +?> +
            +
            +
            +
            + get_price() ); ?> + + get_sale_price() ): ?> + get_sale_price() ); ?> + + + get_price_label() ): ?> + get_price_label() ); ?> + +
            +
            +
            +
              + + $info ) : ?> +
            • + + +
            • + + +
            +
            +
            +
            diff --git a/templates/single-property/nearby.php b/templates/single-property/nearby.php new file mode 100755 index 00000000..863b7aa2 --- /dev/null +++ b/templates/single-property/nearby.php @@ -0,0 +1,53 @@ +get_block_setting( 'nearby' ) ) { + return; +} + +if ( ! Opalestate_Yelp::get_client_id() || ! Opalestate_Yelp::get_app_key() ) { + return; +} + +$categories = Opalestate_Yelp::get_categories(); +if ( ! $categories ) { + return; +} + +$map = $property->get_map(); + +$latitude = $map['latitude']; +$longitude = $map['longitude']; +if ( ! $latitude || ! $longitude ) { + return; +} + +?> +
            +

            +
            +
            +
            + +
            +
            +
            \ No newline at end of file diff --git a/templates/single-property/preview.php b/templates/single-property/preview.php new file mode 100755 index 00000000..0d4f4409 --- /dev/null +++ b/templates/single-property/preview.php @@ -0,0 +1,100 @@ +
            + get_gallery(); + $image_size = opalestate_get_option( 'opalestate_thumbnail_size', 'medium' ); + if ( isset( $galleries ) && $galleries ): + ?> + 1, + 'spaceBetween' => 0, + 'loop' => true, + 'autoHeight' => 1, + 'pagination' => 0, + 'effect' => 'slide', + 'breakpoints' => [ 1024 => [ "slidesPerView" => 1 ] ], + 'thumbnails_nav' => "#swiper-pagination-images", + ]; + + $columns = apply_filters( 'opalestate_thumbnail_nav_column', 5 ); + + $datanav = [ + 'slidesPerView' => $columns, + 'spaceBetween' => 10, + 'effect' => 'slide', + + 'slideToClickedSlide' => true, + 'touchRatio' => 0.2, + 'loop' => false, + 'breakpoints' => [ 1024 => [ "slidesPerView" => 5 ], 768 => [ "slidesPerView" => 3 ] ], + 'navigation' => [ + 'nextEl' => '.swiper-button-next', + 'prevEl' => '.swiper-button-prev', + ], + ]; + ?> + +
            +
            + +
            + +
            + + $columns ) : ?> +
            +
            + + +
            + +
            +
            +
            + + + + $src ): ?> +
            +
            +
            + + +
            +
            +
            + + +
            + +
            + + +
            diff --git a/templates/single-property/preview/gallery-metro.php b/templates/single-property/preview/gallery-metro.php new file mode 100755 index 00000000..dfbaf1d1 --- /dev/null +++ b/templates/single-property/preview/gallery-metro.php @@ -0,0 +1,87 @@ +
            + get_gallery(); + + + $image_size = opalestate_get_option( 'opalestate_thumbnail_size' ); + if ( ! empty( $galleries ) && isset( $galleries ) ): + ?> + 1, + 'spaceBetween' => 0, + 'effect' => 'fade', + 'loop' => true, + 'pagination' => 0, + 'breakpoints' => [ 1024 => [ "slidesPerView" => 1 ] ], + ]; + + $columns = apply_filters( 'opalestate_thumbnail_nav_column', 5 ); + $src = wp_get_attachment_url( get_post_thumbnail_id() ); + + $show = 9; + $items = array_chunk( $galleries, $show ); + + if ( count( $items[0] ) < $show ) { + for ( $i = count( $items[0] ); $i < $show; $i++ ) { + $items[0][ $i ] = 'none'; + } + $hasMore = false; + } else { + $hasMore = true; + } + + // echo '
            ' . print_r( $items,1 );die;
            +		?>
            +
            +
            +        
            +
            +	
            +
            +		
            +            
            + +
            + + + + +
            diff --git a/templates/single-property/preview/gallery-slider.php b/templates/single-property/preview/gallery-slider.php new file mode 100755 index 00000000..b9e6804c --- /dev/null +++ b/templates/single-property/preview/gallery-slider.php @@ -0,0 +1,78 @@ +
            + +
            diff --git a/templates/single-property/preview/map.php b/templates/single-property/preview/map.php new file mode 100755 index 00000000..747d0477 --- /dev/null +++ b/templates/single-property/preview/map.php @@ -0,0 +1,56 @@ +get_map(); + +if ( !empty($maps) ): +$id = time(); +?> +
            + +
            + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            + + +
            + +
            + +
            +
            + +
            +
            +
            + +
            + diff --git a/templates/single-property/preview/mark-picture.php b/templates/single-property/preview/mark-picture.php new file mode 100755 index 00000000..917af35a --- /dev/null +++ b/templates/single-property/preview/mark-picture.php @@ -0,0 +1,32 @@ + +
            + + +
            + +
            + +
            +
            +
            + ', '' ); ?> + + +
            +
            +
            + latitude && $property->longitude ) : ?> + + + + + get_address() ); ?> +
            +
            +
            +
            + +
            +
            +
            +
            diff --git a/templates/single-property/preview/tabs.php b/templates/single-property/preview/tabs.php new file mode 100755 index 00000000..a6a114d5 --- /dev/null +++ b/templates/single-property/preview/tabs.php @@ -0,0 +1,97 @@ +get_map(); + +if ( ! empty( $maps ) ): + + $id = time(); + + ?> +
            +
            +
            + + +
            + +
            + + +
            +
            + +
            + + +
            +
            + +
            + +
            +
            + +
            +
            + +
            +
            + + +
            + +
            + +
            +
            + +
            +
            +
            + +
            +
            + enable_google_mapview() ) : ?> + +
            +
            +
            +
            + + +
            +
            +
            + + diff --git a/templates/single-property/preview/virtualtour.php b/templates/single-property/preview/virtualtour.php new file mode 100755 index 00000000..620bb114 --- /dev/null +++ b/templates/single-property/preview/virtualtour.php @@ -0,0 +1,15 @@ +get_virtual_tour(); +?> + +
            + +
            + + +
            + +
            + + diff --git a/templates/single-property/price.php b/templates/single-property/price.php new file mode 100755 index 00000000..932dd269 --- /dev/null +++ b/templates/single-property/price.php @@ -0,0 +1,13 @@ +get_format_price(); +?> +
            + get_price() ); ?> +
            +
            + get_sale_price() ); ?> +
            diff --git a/templates/single-property/sameagent.php b/templates/single-property/sameagent.php new file mode 100755 index 00000000..9572f468 --- /dev/null +++ b/templates/single-property/sameagent.php @@ -0,0 +1,21 @@ +ID); +$properties = Opalestate_Query::get_agent_property( get_the_ID(), $agent_id, 3 ); +if( $properties->have_posts() ) : +?> +
            +

            +
            +
            + have_posts() ) : $properties->the_post(); ?> +
            + +
            + +
            +
            +
            + + + diff --git a/templates/single-property/sharebox.php b/templates/single-property/sharebox.php new file mode 100755 index 00000000..45eeae05 --- /dev/null +++ b/templates/single-property/sharebox.php @@ -0,0 +1,81 @@ + + * @copyright Copyright (C) 2015 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/questions/ + */ +/** + * Enable/distable share box + */ + +global $post; +$args = array( 'position' => 'top', 'animation' => 'true' ); +?> +
            +
            +
            + + +
            +
            diff --git a/templates/single-property/short-meta.php b/templates/single-property/short-meta.php new file mode 100755 index 00000000..e46869e8 --- /dev/null +++ b/templates/single-property/short-meta.php @@ -0,0 +1,31 @@ +get_meta_shortinfo(); + ?> + +
              + + $info ) : ?> + +
            • +
              + +
              +
              + + + + +
              +
            • + + + +
            + + +
            + +
            +
            + +
            + + + + + + + + + + + +
            + +
            + +
            + +
            +
            +

            + + post_title ); ?> + +

            + + + + +
            + + + + +
            + + + + + +
            + +
            + + + + +
            + +
            + + + + +
            + +
            + + + + +
            + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + + + +
            + +
            +
            +
            diff --git a/templates/single-property/user/author-user-box-list.php b/templates/single-property/user/author-user-box-list.php new file mode 100755 index 00000000..719cc9be --- /dev/null +++ b/templates/single-property/user/author-user-box-list.php @@ -0,0 +1,110 @@ + +
            + ID; + $is_sticky = get_user_meta( $user_id, $prefix . 'sticky', true ); + $picture = OpalEstate_User::get_author_picture( $user_id ); + + $desciption = get_user_meta( $user_id, 'description', true ); + + + $roles = opalestate_user_roles_by_user_id( $user_id ); + + if ( ! is_array( $roles ) ) { + $roles = [ $roles ]; + } + + $related = get_user_meta( $user_id, $prefix . 'related_id', true ); + $trusted = false; + if ( in_array( 'opalestate_agency', $roles ) || in_array( 'opalestate_agent', $roles ) ) { + $link = get_permalink( $related ); + $author_name = get_the_title( $related ); + $trusted = get_post_meta( $related, $prefix . 'trusted', true ); + } elseif ( $related ) { + + $link = get_permalink( $related ); + $author_name = get_the_title( $related ); + $trusted = get_user_meta( $user_id, $prefix . 'trusted', true ); + + } else { + $link = get_author_posts_url( $user_id ); + $author_name = $author->display_name; + $trusted = get_user_meta( $user_id, $prefix . 'trusted', true ); + } + + ?> +
            +
            +
            + + + +
            +
            +

            + + + + + + + +

            + + +

            + + +
            + +
            + +
            + + + + +
            + +
            + + + + + + + + + + + + + + + + + + + + +
            + + +
            +
            + diff --git a/templates/single-property/user/author-user-box.php b/templates/single-property/user/author-user-box.php new file mode 100755 index 00000000..c2e9759d --- /dev/null +++ b/templates/single-property/user/author-user-box.php @@ -0,0 +1,153 @@ + +
            + ID; + $is_sticky = get_user_meta( $user_id, $prefix . 'sticky', true ); + + + $desciption = get_user_meta( $user_id, 'description', true ); + + $roles = opalestate_user_roles_by_user_id( $user_id ); + + if ( ! is_array( $roles ) ) { + $roles = [ $roles ]; + } + + $related = get_user_meta( $user_id, $prefix . 'related_id', true ); + $trusted = false; + if ( in_array( 'opalestate_agency', $roles ) || in_array( 'opalestate_agent', $roles ) ) { + $post = get_post( $related ); + $link = get_permalink( $related ); + $author_name = $post->post_title; + + if ( $post->post_type == 'opalestate_agency' ) { + $prefixs = OPALESTATE_AGENCY_PREFIX; + $picture = OpalEstate_Agency::get_avatar_url( $post->ID ); + } else { + $prefixs = OPALESTATE_AGENT_PREFIX; + $picture = OpalEstate_Agent::get_avatar_url( $post->ID ); + } + + $trusted = get_post_meta( $related, $prefixs . 'trusted', true ); + } elseif ( $related ) { + $post = get_post( $related ); + $link = get_permalink( $related ); + $author_name = $post->post_title; + + if ( $post->post_type == 'opalestate_agency' ) { + $prefixs = OPALESTATE_AGENCY_PREFIX; + $picture = OpalEstate_Agency::get_avatar_url( $post->ID ); + } else { + $prefixs = OPALESTATE_AGENT_PREFIX; + $picture = OpalEstate_Agent::get_avatar_url( $post->ID ); + } + + $trusted = get_post_meta( $related, $prefixs . 'trusted', true ); + } else { + $link = get_author_posts_url( $user_id ); + $author_name = $author->display_name; + $trusted = get_user_meta( $user_id, $prefix . 'trusted', true ); + $picture = OpalEstate_User::get_author_picture( $user_id ); + } + + ?> +
            + +
            +
            + + + + + + + + + +
            +
            + + +
            +

            + +

            + + +

            + + + +
            + + + + +
            + + + + +
            + +
            + + + + +
            + + + + +
            + + + + +
            + + + + + + + + + + + + + + + + + + + + + +
            + +
            + +
            +
            + diff --git a/templates/single-property/video.php b/templates/single-property/video.php new file mode 100755 index 00000000..ccf3a903 --- /dev/null +++ b/templates/single-property/video.php @@ -0,0 +1,19 @@ +get_block_setting( 'video' ) ) { + return; +} + +$videoURL = $property->get_video_url(); +?> + +
            +

            +
            +
            + +
            +
            +
            + diff --git a/templates/single-property/views-statistics.php b/templates/single-property/views-statistics.php new file mode 100755 index 00000000..2f1b537b --- /dev/null +++ b/templates/single-property/views-statistics.php @@ -0,0 +1,83 @@ +get_block_setting( 'views_statistics' ) ) { + return; +} + +$limit = opalestate_get_option( 'single_views_statistics_limit', 8 ); + +$stats = new Opalestate_View_Stats( $property->get_id(), $limit ); +$array_label = json_encode( $stats->get_traffic_labels() ); +$array_values = json_encode( $stats->get_traffic_data_accordion() ); + +?> +
            +

            +
            +
            + +
            +
            +
            + diff --git a/templates/single-property/virtualtour.php b/templates/single-property/virtualtour.php new file mode 100755 index 00000000..af49dc23 --- /dev/null +++ b/templates/single-property/virtualtour.php @@ -0,0 +1,15 @@ +get_virtual_tour(); +?> + +
            +

            +
            +
            + +
            +
            +
            + diff --git a/templates/single-property/walkscore.php b/templates/single-property/walkscore.php new file mode 100755 index 00000000..1b9293e9 --- /dev/null +++ b/templates/single-property/walkscore.php @@ -0,0 +1,56 @@ +get_block_setting( 'walkscores' ) ) { + return; +} + +$walkscore = opalestate_get_property_walkscore_results( $property ); + +?> +
            +

            + +
            +
            + walkscore ) ) : ?> +
            +
            +

            walkscore ); ?>

            +
            +
            +
            + description ); ?> +
            + +
            + + + transit ) && $walkscore->transit->score ) : ?> +
            +
            +

            transit->score ); ?>

            +
            +
            +
            + transit->description ); ?> +
            + +
            + + + bike ) ) : ?> +
            +
            +

            bike->score ); ?>

            +
            +
            +
            + bike->description ); ?> +
            + +
            + +
            +
            +
            diff --git a/templates/submission/completed.php b/templates/submission/completed.php new file mode 100755 index 00000000..43f0780a --- /dev/null +++ b/templates/submission/completed.php @@ -0,0 +1,27 @@ +session->get( 'submission' ); +?> +
            +
            + +
            +
            + ', '', + '', '' + ); ?> +
            + +
            + + ', '', + '', '' + ); ?> +
            + +
            +
            +session->set( 'submission', null ); ?> \ No newline at end of file diff --git a/templates/submission/require-login.php b/templates/submission/require-login.php new file mode 100755 index 00000000..2b146f20 --- /dev/null +++ b/templates/submission/require-login.php @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/templates/submission/submission-completed.php b/templates/submission/submission-completed.php new file mode 100755 index 00000000..9a2f4254 --- /dev/null +++ b/templates/submission/submission-completed.php @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/templates/submission/submission-form.php b/templates/submission/submission-form.php new file mode 100755 index 00000000..c5a793ab --- /dev/null +++ b/templates/submission/submission-form.php @@ -0,0 +1,49 @@ + +
            +
            +
            + + +
            + +

            +

            + +

            +

            + +
            + + + +
            +
            + $value ): ?> + + + + + + +
            +
            + '
            %3$s'.$nonce.'
            ', + 'save_button' => esc_html__( 'Save property', 'opalestate-pro' ), + ] ); ?> +
            +
            + + + +
            +
            +
            diff --git a/templates/user-management.php b/templates/user-management.php new file mode 100755 index 00000000..48e81e68 --- /dev/null +++ b/templates/user-management.php @@ -0,0 +1,125 @@ + + +
            +
            + + +
            + + +
            +
            +
            + +
            +
            +
            +
            +
            + + +
            + +
            +
            + +
            + +
            +
            +
            + +
            + + + + + + + + +
            +
            +
            +
            +
            + + +
            +
            +
            +
            +

            +

            +
            + +
            +
            +
            + + diff --git a/templates/user-search/content-savedsearch.php b/templates/user-search/content-savedsearch.php new file mode 100755 index 00000000..ea694e08 --- /dev/null +++ b/templates/user-search/content-savedsearch.php @@ -0,0 +1,43 @@ +get_list(); +// echo '
            '.print_r( $data,  1 );die;
            +?>
            +
            +
            +
            +	
            +
            +
            +

            +

            +
            +
            +
            + + \ No newline at end of file diff --git a/templates/user-search/render-form.php b/templates/user-search/render-form.php new file mode 100755 index 00000000..fd87314b --- /dev/null +++ b/templates/user-search/render-form.php @@ -0,0 +1,41 @@ + +
            + + + + + + +
            + diff --git a/templates/user/agency/agency-team.php b/templates/user/agency/agency-team.php new file mode 100755 index 00000000..48f3ff51 --- /dev/null +++ b/templates/user/agency/agency-team.php @@ -0,0 +1,79 @@ +get_members(); + +$sender_id = ''; +$prefix = ''; + +$fields = array( + + array( + 'id' => "sender_id", + 'name' => esc_html__( 'Sender ID', 'opalestate-pro' ), + 'type' => 'hidden', + 'default' => "", + 'description' => "", + ), + array( + 'id' => "{$prefix}user_id", + 'name' => esc_html__( 'Name', 'opalestate-pro' ), + 'type' => 'select', + 'class' => 'form-control opalesate-find-user', + 'default' => "", + 'required' => 'required', + 'description' => "", + ), + + + ); +$form = OpalEstate()->html->render_form( $fields ); +$id = 'agency-add-member'; +?> +
            + +

            +
            +
            +
            +

            +

            +
            + + + +
            +
            +
            + +
            +
            + + + + + + + ' . print_r( $user, 1);die; ?> + + + + + + +
            +
            + +
            ( )
            +
            +
            + "> + + +
            +
            +
            + +
            +
            diff --git a/templates/user/agency/profile-agency.php b/templates/user/agency/profile-agency.php new file mode 100755 index 00000000..cb0617d5 --- /dev/null +++ b/templates/user/agency/profile-agency.php @@ -0,0 +1,40 @@ + +
            + + + +
            + + + + +
            + +
            + + +
            + + + +
            + +
            +

            + + '.print_r( $metaboxes ,1 );die; + + if ( function_exists( 'cmb2_get_metabox_form' ) ) { + echo cmb2_get_metabox_form( $metaboxes[OPALESTATE_AGENCY_PREFIX.'front'], $post_id, array( + 'form_format' => '
            %3$s
            ', + 'save_button' => esc_html__( 'Save Change', 'opalestate-pro' ), + ) ); + } + + do_action( 'opalestate_profile_agency_form_after' ); + ?> +
            +
            +
            diff --git a/templates/user/agent/profile-agent.php b/templates/user/agent/profile-agent.php new file mode 100755 index 00000000..a187bceb --- /dev/null +++ b/templates/user/agent/profile-agent.php @@ -0,0 +1,27 @@ + +
            + +
            + +
            +

            + + + '
            %3$s
            ', + 'save_button' => esc_html__( 'Save Change', 'opalestate-pro' ), + ] ); + } + + do_action( 'opalestate_profile_agency_form_after' ); + ?> + +
            + +
            +
            +
            diff --git a/templates/user/content-property.php b/templates/user/content-property.php new file mode 100755 index 00000000..565d70db --- /dev/null +++ b/templates/user/content-property.php @@ -0,0 +1,100 @@ +get_meta_shortinfo(); +?> +
            > +
            +
            +
            + + featured != 1 ): ?> + + +
            + + +
            + +
            +
            +
            +
            + + + ', '' ); ?> + +
            + get_address(); ?> +
            + +
            + get_price() ); ?> + + get_sale_price() ): ?> + get_sale_price() ); ?> + + + get_price_label() ): ?> + get_price_label() ); ?> + +
            + +
            + +
            +
            +
              + + $info ) : ?> +
            • + + + +
            • + + +
            +
            +
            +
            + featured != 1 ): ?> + + + + + + + + + + ID, '', true ); + if ( ! empty( $delete_post_link ) ) { + ?> + + + + + +
            +
            + + +
            +
            diff --git a/templates/user/dashboard.php b/templates/user/dashboard.php new file mode 100755 index 00000000..5d4e5699 --- /dev/null +++ b/templates/user/dashboard.php @@ -0,0 +1,146 @@ +
            +
            + + + 'fa fa-list', + 'count' => $statistics->get_count_properties(), + 'label' => esc_html__( 'My Properties', 'opalestate-pro' ), + 'class' => 'bg-primary text-white', + ]; + + $properties_count[] = [ + 'icon' => 'fa fa-star', + 'count' => $statistics->get_count_featured(), + 'label' => esc_html__( 'Featured Properties', 'opalestate-pro' ), + 'class' => 'bg-info text-white', + ]; + + $properties_count[] = [ + 'icon' => 'fa fa-file', + 'count' => $statistics->get_count_pending_properties(), + 'label' => esc_html__( 'Pending Properties', 'opalestate-pro' ), + 'class' => 'bg-warning text-white', + ]; + ?> + + +
            +
            +

            +
            +
            +
            + + + + [ $current_user_id ], + 'status' => 'approve', + 'type' => 'property_review', + 'number' => 2, + ]; + + $comments = get_comments( $args ); + ?> + +
            +
            +

            + + +

            + +
            +
              + +
            1. +
              +
              + + +
              + +
              +

              + comment_author ); ?> + + +

              + + + +
              +
              + +
              + +
              +
                + $feature_title ) : $feature_key = $cpt_feature . '_' . $feature_slug; ?> +
              • + + comment_ID, $feature_key, true ) ); ?> +
              • + +
              +
              +
              + + + +
              + +
              +

              comment_content ); ?>

              +
              +
              +
              + +
              + comment_post_ID ); ?> + +
              + + + +
              + + +
              + + + +
              +
              +
              +
            2. + +
            +
            + + +
            +
            + + +
            +
            diff --git a/templates/user/favorite-button.php b/templates/user/favorite-button.php new file mode 100755 index 00000000..82499ee7 --- /dev/null +++ b/templates/user/favorite-button.php @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/templates/user/favorite-properties.php b/templates/user/favorite-properties.php new file mode 100755 index 00000000..77c77f6d --- /dev/null +++ b/templates/user/favorite-properties.php @@ -0,0 +1,29 @@ +have_posts() ): ?> +
            +
            + +
            +
            + have_posts() ) : $loop->the_post(); global $post; ?> + +
            + +
            + + +
            +
            + max_num_pages ); ?> +
            +
            + +
            +
            +
            +

            No Item In Favorite

            +

            +
            +
            +
            + + \ No newline at end of file diff --git a/templates/user/login-form.php b/templates/user/login-form.php new file mode 100755 index 00000000..fac0ffab --- /dev/null +++ b/templates/user/login-form.php @@ -0,0 +1,63 @@ + + +
            + +

            + + + +

            + + + +
            diff --git a/templates/user/messages.php b/templates/user/messages.php new file mode 100755 index 00000000..23d1f045 --- /dev/null +++ b/templates/user/messages.php @@ -0,0 +1,46 @@ + isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1, + 'items_per_page' => 10 +); +$messages = opalestate_get_message_by_user( $args ); +?> +
            +

            +
            +
            + + + + + + + + + +
            + <?php esc_attr_e( 'User Avatar', 'opalestate-pro' ); ?> + sender_id ); ?> + + +
            subject ); ?>
            +

            message ); ?>

            +
            +
            created ); ?>
            +
            + +
            + add_query_arg( 'cpage', '%#%' ), + 'format' => '', + 'prev_text' => esc_html__('«'), + 'next_text' => esc_html__('»'), + 'total' => ceil( $messages['total'] / $args['items_per_page'] ), + 'current' => $args['cpage'] + )); + ?> +
            +
            +
            diff --git a/templates/user/my-account-popup.php b/templates/user/my-account-popup.php new file mode 100755 index 00000000..0e65432f --- /dev/null +++ b/templates/user/my-account-popup.php @@ -0,0 +1,30 @@ +
            +
            + +
            +
            + '', + 'redirect' => '', + 'hide_title' => false + ); + echo opalestate_load_template_path( 'user/login-form', $atts ); + ?> +
            +
            + '', + 'redirect' => '', + 'hide_title' => false + ); + echo opalestate_load_template_path( 'user/register-form', $atts ); + ?> +
            +
            +
            +
            \ No newline at end of file diff --git a/templates/user/my-account.php b/templates/user/my-account.php new file mode 100755 index 00000000..a8a3fa18 --- /dev/null +++ b/templates/user/my-account.php @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/templates/user/my-properties.php b/templates/user/my-properties.php new file mode 100755 index 00000000..eff4dfa1 --- /dev/null +++ b/templates/user/my-properties.php @@ -0,0 +1,54 @@ + esc_html__( 'All' ,'opalestate-pro' ), + 'published' => esc_html__( 'Published' ,'opalestate-pro' ), + 'pending' => esc_html__( 'Pending' ,'opalestate-pro' ), + 'expired' => esc_html__( 'Expired' ,'opalestate-pro' ), + ); + + $gstatus = isset( $_GET['status'] )? $_GET['status']:'all'; +?> + +
            + +
            +
            +
              + $label ): ?> +
            • class="active" > + +
            • + +
            +
            +
            + +
            + +
            + + have_posts() ): ?> +
            +
            + have_posts() ) : $loop->the_post(); global $post; ?> + + +
            + +
            + + +
            +
            + max_num_pages ); ?> + + +
            + +
            + +
            +
            +
            + + \ No newline at end of file diff --git a/templates/user/profile.php b/templates/user/profile.php new file mode 100755 index 00000000..fbc48578 --- /dev/null +++ b/templates/user/profile.php @@ -0,0 +1,60 @@ +
            + + + +
            + + + + +
            + +
            + + +
            + + + +
            + +
            +

            + + '
            %3$s
            ', + 'save_button' => esc_html__( 'Save Change', 'opalestate-pro' ), + ) ); + } + + do_action( 'opalestate_profile_form_after' ); + ?> +
            +
            + +
            +
            +

            + + + '
            %3$s
            ', + 'save_button' => esc_html__( 'Save Change', 'opalestate-pro' ), + ] ); + } + + do_action( 'opalestate_profile_form_after' ); + ?> + + +
            +
            +
            diff --git a/templates/user/property-ratings.php b/templates/user/property-ratings.php new file mode 100755 index 00000000..37cdc78c --- /dev/null +++ b/templates/user/property-ratings.php @@ -0,0 +1,99 @@ +' . esc_html__( 'You have not written any reviews yet.', 'opalestate-pro' ) . '

            '; + + return; +} + +wp_enqueue_style( "tooltipster" ); +wp_enqueue_script( "tooltipster" ); +?> + +
            +
              + +
            1. +
              +
              + + +
              + +
              +

              + comment_author ); ?> + + +

              + + + +
              +
              + +
              + +
              +
                + $feature_title ) : $feature_key = $cpt_feature . '_' . $feature_slug; ?> +
              • + + comment_ID, $feature_key, true ) ); ?> +
              • + +
              +
              +
              + + + +
              + +
              +

              comment_content ); ?>

              +
              +
              +
              + +
              + comment_post_ID ); ?> + +
              + + + +
              + + +
              + + + +
              +
              +
              +
            2. + +
            +
            diff --git a/templates/user/read-messages.php b/templates/user/read-messages.php new file mode 100755 index 00000000..6c84c868 --- /dev/null +++ b/templates/user/read-messages.php @@ -0,0 +1,50 @@ +html->render_form( $fields ); +$id = 'message-reply'; +?> +
            + +
            / + subject ); ?> +
            + +
            +
            + +
            +
            + <?php esc_attr_e( 'User Avatar', 'opalestate-pro' ); ?> +
            +
            +
            created ); ?>
            + message ); ?> +
            +
            + + + +
            +
            + <?php esc_attr_e( 'User Avatar', 'opalestate-pro' ); ?> +
            +
            +
            created; ?>
            + message; ?> +
            +
            + + + +
            +
            +
            + + +
            + + +
            +
            +
            + + diff --git a/templates/user/register-form.php b/templates/user/register-form.php new file mode 100755 index 00000000..ef1f3407 --- /dev/null +++ b/templates/user/register-form.php @@ -0,0 +1,98 @@ + + * @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/support/forum.html + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +opalestate_print_notices(); + +if ( is_user_logged_in() ) { + _e( 'You are currently logged in.', 'opalestate-pro' ); + + return; +} + +$types = OpalEstate_User::get_user_types(); +?> +
            + +

            + + + +

            + + +
            + + + +

            + + +

            + + + +

            + + +

            + +

            + + +

            + + + +

            + + +

            + + + +

            + + + +

            + + + + +

            + + + + + +

            + + +
            +
            diff --git a/templates/user/share-search-form.php b/templates/user/share-search-form.php new file mode 100755 index 00000000..28ad0826 --- /dev/null +++ b/templates/user/share-search-form.php @@ -0,0 +1,58 @@ + + +
            + + + + +
            + diff --git a/templates/user/social-login/facebook-button.php b/templates/user/social-login/facebook-button.php new file mode 100755 index 00000000..da4ceae6 --- /dev/null +++ b/templates/user/social-login/facebook-button.php @@ -0,0 +1,21 @@ + + + diff --git a/templates/user/social-login/google-button.php b/templates/user/social-login/google-button.php new file mode 100755 index 00000000..6715d45d --- /dev/null +++ b/templates/user/social-login/google-button.php @@ -0,0 +1,21 @@ + + diff --git a/templates/user/social-login/social-login.php b/templates/user/social-login/social-login.php new file mode 100755 index 00000000..5580215b --- /dev/null +++ b/templates/user/social-login/social-login.php @@ -0,0 +1,22 @@ + + + diff --git a/templates/widgets/featured-properties.php b/templates/widgets/featured-properties.php new file mode 100755 index 00000000..660afbbb --- /dev/null +++ b/templates/widgets/featured-properties.php @@ -0,0 +1,73 @@ + + * @copyright Copyright (C) 2015 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/questions/ + */ +if ( ! defined( 'ABSPATH' ) ) { + exit; +} + +$query = Opalestate_Query::get_featured_properties_query( [ "posts_per_page" => $num ] ); + +if ( $query->have_posts() ): + + echo trim( $before_widget ); + //Our variables from the widget settings. + $title = apply_filters( 'widget_title', esc_attr( $instance['title'] ) ); + if ( $title ) { + echo ( $before_title ) . trim( $title ) . $after_title; + } + ?> + +
            + have_posts() ): $query->the_post(); + $property = opalesetate_property( get_the_ID() ); + $meta = $property->get_meta_shortinfo(); + ?> +
            > +
            +
            + +
            + + + +
            + +
            + +
            +
            + ', '' ); ?> + +
            + get_price() ); ?> + + get_sale_price() ): ?> + + get_sale_price() ); ?> + + + + get_price_label() ): ?> + + get_price_label(); ?> + + +
            +
            +
            +
            +
            + +
            + + + diff --git a/templates/widgets/sameprice-properties.php b/templates/widgets/sameprice-properties.php new file mode 100755 index 00000000..46f4502b --- /dev/null +++ b/templates/widgets/sameprice-properties.php @@ -0,0 +1,126 @@ + + * @copyright Copyright (C) 2015 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/questions/ + */ +if ( ! defined( 'ABSPATH' ) ) { + exit; +} + + +$args = [ + 'post_type' => 'opalestate_property', + 'posts_per_page' => $num, + 'post__not_in' => [ get_the_ID() ], +]; +$price = get_post_meta( get_the_ID(), OPALESTATE_PROPERTY_PREFIX . 'price', true ); + +$status = wp_get_post_terms( get_the_ID(), 'opalestate_status' ); + +$args['meta_query'] = []; + +$tax_query = []; + +if ( ! is_wp_error( $status ) && $status ) { + + $tax_query[] = + [ + 'taxonomy' => 'opalestate_status', + 'field' => 'slug', + 'terms' => $status[0]->slug, + ]; +} + +if ( $tax_query ) { + $args['tax_query'] = [ 'relation' => 'AND' ]; + $args['tax_query'] = array_merge( $args['tax_query'], $tax_query ); +} + +$search_min_price = floatval( $price ) - floatval( $range_price ); +$search_max_price = floatval( $price ) + floatval( $range_price ); + +if ( $search_min_price != '' && $search_min_price != '' && is_numeric( $search_min_price ) && is_numeric( $search_max_price ) ) { + array_push( $args['meta_query'], [ + 'key' => OPALESTATE_PROPERTY_PREFIX . 'price', + 'value' => [ $search_min_price, $search_max_price ], + 'compare' => 'BETWEEN', + 'type' => 'NUMERIC', + ] ); +} elseif ( $search_min_price != '' && is_numeric( $search_min_price ) ) { + array_push( $args['meta_query'], [ + 'key' => OPALESTATE_PROPERTY_PREFIX . 'price', + 'value' => $search_min_price, + 'compare' => '>=', + 'type' => 'NUMERIC', + ] ); +} elseif ( $search_max_price != '' && is_numeric( $search_max_price ) ) { + array_push( $args['meta_query'], [ + 'key' => OPALESTATE_PROPERTY_PREFIX . 'price', + 'value' => $search_max_price, + 'compare' => '<=', + 'type' => 'NUMERIC', + ] ); +} +$query = Opalestate_Query::get_property_query( $args ); +if ( $query->have_posts() ): + echo str_replace( 'widget-style', 'widget-style widget-danger', trim( $before_widget ) ); + //Our variables from the widget settings. + $title = apply_filters( 'widget_title', $title ); + + if ( $title ) { + echo ( $before_title ) . trim( $title ) . $after_title; + } + ?> +
            + have_posts() ): $query->the_post(); + $property = opalesetate_property( get_the_ID() ); + $meta = $property->get_meta_shortinfo(); + ?> +
            > +
            +
            + +
            + + + +
            + +
            +
            +
            + + ', '' ); ?> + +
            + get_price() ); ?> + + get_sale_price() ): ?> + + get_sale_price() ); ?> + + + + get_price_label() ): ?> + + get_price_label(); ?> + + +
            +
            +
            +
            +
            + +
            + + + + diff --git a/templates/widgets/similar-properties.php b/templates/widgets/similar-properties.php new file mode 100755 index 00000000..fc295084 --- /dev/null +++ b/templates/widgets/similar-properties.php @@ -0,0 +1,111 @@ + + * @copyright Copyright (C) 2015 wpopal.com. All Rights Reserved. + * @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html + * + * @website http://www.wpopal.com + * @support http://www.wpopal.com/questions/ + */ +if ( ! defined( 'ABSPATH' ) ) { + exit; +} + + +$args = [ + 'post_type' => 'opalestate_property', + 'posts_per_page' => $num, + 'post__not_in' => [ get_the_ID() ], +]; + +$terms = wp_get_post_terms( get_the_ID(), 'opalestate_types' ); + +$tax_query = []; +if ( $terms ) { + $tax_query[] = [ + [ + 'taxonomy' => 'opalestate_types', + 'field' => 'slug', + 'terms' => $terms[0]->slug, + ], + ]; +} + +$status = wp_get_post_terms( get_the_ID(), 'opalestate_status' ); +if ( ! is_wp_error( $status ) && $status ) { + $tax_query[] = + [ + 'taxonomy' => 'opalestate_status', + 'field' => 'slug', + 'terms' => $status[0]->slug, + + ]; +} + + +if ( $tax_query ) { + $args['tax_query'] = [ 'relation' => 'AND' ]; + $args['tax_query'] = array_merge( $args['tax_query'], $tax_query ); +} +$query = Opalestate_Query::get_property_query( $args ); + +if ( $query->have_posts() ): + + echo trim( $before_widget ); + //Our variables from the widget settings. + $title = apply_filters( 'widget_title', esc_attr( $instance['title'] ) ); + + if ( $title ) { + echo ( $before_title ) . trim( $title ) . $after_title; + } + ?> + +
            + have_posts() ): $query->the_post(); + $property = opalesetate_property( get_the_ID() ); + $meta = $property->get_meta_shortinfo(); + ?> +
            > +
            +
            + +
            + + + +
            + +
            +
            +
            + ', '' ); ?> + +
            + get_price() ); ?> + + get_sale_price() ): ?> + + get_sale_price() ); ?> + + + + get_price_label() ): ?> + + get_price_label(); ?> + + +
            +
            +
            +
            +
            + +
            + + + + diff --git a/uninstall.php b/uninstall.php new file mode 100755 index 00000000..19fd3b34 --- /dev/null +++ b/uninstall.php @@ -0,0 +1,10 @@ + + + opalestate_property + opalestate_agency + opalestate_agent + + + property_category + opalestate_amenities + opalestate_label + opalestate_location + opalestate_state + opalestate_city + opalestate_status + opalestate_types + opalestate_rating_ft + opalestate_agency_ft + opalestate_agent_ft + + + opalestate_ppt_featured + opalestate_ppt_sku + opalestate_ppt_map + opalestate_ppt_zipcode + opalestate_ppt_enablemapview + opalestate_ppt_video + opalestate_ppt_builtyear + opalestate_ppt_parking + opalestate_ppt_bedrooms + opalestate_ppt_bathrooms + opalestate_ppt_plotsize + opalestate_ppt_areasize + opalestate_ppt_orientation + opalestate_ppt_kitchens + opalestate_ppt_livingrooms + opalestate_ppt_amountrooms + opalestate_ppt_gallery + opalestate_ppt_virtual + +

            Vjeck~F=%6;n1Lg{Z)xk1xU*Yu zYZ&Seaq>b{%psS`UZ5$*Q9HD33-07Zz5^Uk+JG${g8Nob8vu#S0gT9JNMxiKlr|`4 zgmd-)k*Tnf6S)EvgX&7vS~qw%C-%F*#k?^CwuU4QHUM&L4q(Ktk=RIaRNFCkn5&o( z&hi0b(`gilodzZC1oR4uQ0ig+^h)FuAeaKMwP?6IaE9A}ND&;!DB=z&0x1S5LNO(r zcP)zex_1oU%SrwoFhJEZYz>*@HUN^C0~m?FLlPs!pemVSMmP^L5?eRI@P)vBJ4tVk z4J{UDZxv-bR>Jp3UzlklEIT8H!r=?^`yeOj1zY)za3-6Zk!k+m8)BvFH*C9}yE$Xt zg;8i8V{3>pZ2*+ZaR6h?gp7$4gWOj!1E)a7n6v?SUvn;;ZGz)k%I0P#Sw#;%;J`bi zatRx1{e^5bFWa*c-W%QgU_^CNAUh+5!r|t>2bv-CV~eNN{G{N3yPre$fcei9K7f&E zK4WXh3T6W!7vKQK1%8)oh7^P5vtmX#zh_*4E^gG8@yw=%pZ4^k_BA*K#80f&YU%%w zdDd!a@s*hwiUs!19A>juFkh!+1PbX z#jfn$F!N>0&;WKe4PXPhSHk-u*_rV6VyTn#?u%CV1l;mTrPvvPJ z!!Q)Wur%7qkjS;(Zxe- z@j6D|&dUZsM&|&==x1LuyBwq#bm34jBb;-uX?Le}>(cU8(s4Uca@hsbU>?%CBAaO3 zw0WRqA^N7rj77jv3)Mp~Xykbl-rL?gc$=^Y@bcB274Kd6z^|Y_@KgU^D5Y($q&rOM zu}!bxANNfgUEtCKXC`Xl`L~K^M6QIgne*yRfT!XrwuT%{*#PKc0S;ii`g8JXq!?6O zRm=#-&v>=2ClC6Hi)9Kk36ufhdQN$K4nFp2< zY(OME2Qt$C21$<;6sx)PiYejzz#{#O`r6ipg-`bAo@$1jp8pW!nZo zNi7F30{=D%j1+?eR?GzOK_jK)_nMTIdQ)yN7r`77Jc<+y_aVL zAaOZ>5%&*CT%;IO9aYQ-=Z`Yt>cYwV#bsaq?uu)+tMd5`6}0u~^JBRxrHj=>3Zd33 zd^2Kvrt@Oixe`9kWjuWY({f0c>pff$@nrl^9Pkwm>a1#o&>UzSzCt_(MbpH?76p~Q z6zKmTZhn^Ytj}P?B@;KXRX;dx+5qSrm;)Hk`Wbl^Qc%5fm;R{dc%UHK6KZAv5c@E$LA2Lyri?O>Tzpn(c5`CEH8oW{$Df8mt zH*MJCCH(UxL5fu+u#yUn@~s-Gx|IJi20`}r|IqWuc|=RH$YC~cQuwBZW8@N?GB!K=ozl>GQ8_A7N<&}EaS}cNSXTy3TM2^&6(kjN8vI? z%W|0&MPPtIOb*|7eLDLu6zXo&SSQwS%AwgDq7!F?l3Bl6t^l v@J~MDBF6CTAsInZ%?w3WBjQW>6MD5u$_jeLP$d=I)l(@aZRyLz>yQ2y|65E> literal 0 HcmV?d00001 diff --git a/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_dashboard.scssc b/.sass-cache/4502ca9378c9dcd7fc7204391f0bf71ee53c5c0b/_dashboard.scssc new file mode 100755 index 0000000000000000000000000000000000000000..f9397324b6f70702b3e5dd07c65fd999839b6d19 GIT binary patch literal 50493 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